Initial commit
This commit is contained in:
15
.claude-plugin/plugin.json
Normal file
15
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "datetime",
|
||||||
|
"description": "Natural language date/time parsing and calculations using native date command",
|
||||||
|
"version": "1.1.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Mae Capacite",
|
||||||
|
"email": "cadrianmae@users.noreply.github.com"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills"
|
||||||
|
],
|
||||||
|
"commands": [
|
||||||
|
"./commands"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# datetime
|
||||||
|
|
||||||
|
Natural language date/time parsing and calculations using native date command
|
||||||
129
commands/calc.md
Normal file
129
commands/calc.md
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
description: Calculate date/time differences (Claude should use date command directly)
|
||||||
|
allowed-tools: Bash
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# calc - Calculate date/time differences
|
||||||
|
|
||||||
|
Calculate the difference between two dates or times using natural language expressions.
|
||||||
|
|
||||||
|
## For Claude Code
|
||||||
|
|
||||||
|
**If you are Claude**: DO NOT invoke this slash command. Use unix timestamp arithmetic via Bash tool:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date1=$(date -d "first date" +%s)
|
||||||
|
date2=$(date -d "second date" +%s)
|
||||||
|
diff=$((date2 - date1))
|
||||||
|
echo "Difference: $diff seconds"
|
||||||
|
```
|
||||||
|
|
||||||
|
See the Implementation section below for the full calculation pattern.
|
||||||
|
|
||||||
|
## For Users
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/datetime:calc
|
||||||
|
```
|
||||||
|
|
||||||
|
The command will interactively ask for two date/time expressions, then calculate the difference.
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
1. **Asks for first date/time**: Accepts natural language expression (e.g., "tomorrow", "2024-12-01", "next Monday")
|
||||||
|
2. **Asks for second date/time**: Accepts natural language expression
|
||||||
|
3. **Calculates difference**: Shows the time between the two dates in multiple units
|
||||||
|
4. **Human-readable output**: Displays results as days, hours, minutes, and seconds
|
||||||
|
|
||||||
|
The calculation uses unix timestamps internally for accuracy across timezones and DST boundaries.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
**Convert dates to unix timestamps:**
|
||||||
|
```bash
|
||||||
|
date1_ts=$(date -d "first expression" +%s)
|
||||||
|
date2_ts=$(date -d "second expression" +%s)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Calculate difference:**
|
||||||
|
```bash
|
||||||
|
diff_seconds=$((date2_ts - date1_ts))
|
||||||
|
diff_days=$((diff_seconds / 86400))
|
||||||
|
diff_hours=$(((diff_seconds % 86400) / 3600))
|
||||||
|
diff_minutes=$(((diff_seconds % 3600) / 60))
|
||||||
|
diff_secs=$((diff_seconds % 60))
|
||||||
|
```
|
||||||
|
|
||||||
|
**Display result:**
|
||||||
|
```bash
|
||||||
|
echo "Difference: ${diff_days}d ${diff_hours}h ${diff_minutes}m ${diff_secs}s"
|
||||||
|
echo "Total: ${diff_seconds} seconds"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Days until deadline
|
||||||
|
/datetime:calc
|
||||||
|
→ First date/time: today
|
||||||
|
→ Second date/time: 2024-12-15
|
||||||
|
→ Difference: 32d 0h 0m 0s (32 days)
|
||||||
|
→ Total: 2764800 seconds
|
||||||
|
|
||||||
|
# Time since event
|
||||||
|
/datetime:calc
|
||||||
|
→ First date/time: 2024-11-01
|
||||||
|
→ Second date/time: today
|
||||||
|
→ Difference: 12d 0h 0m 0s (12 days)
|
||||||
|
→ Total: 1036800 seconds
|
||||||
|
|
||||||
|
# Hours between meetings
|
||||||
|
/datetime:calc
|
||||||
|
→ First date/time: today 14:00
|
||||||
|
→ Second date/time: tomorrow 10:30
|
||||||
|
→ Difference: 0d 20h 30m 0s
|
||||||
|
→ Total: 73800 seconds
|
||||||
|
|
||||||
|
# Working days remaining
|
||||||
|
/datetime:calc
|
||||||
|
→ First date/time: today
|
||||||
|
→ Second date/time: next Friday
|
||||||
|
→ Difference: 2d 0h 0m 0s (2 days)
|
||||||
|
→ Total: 172800 seconds
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common calculations
|
||||||
|
|
||||||
|
**Academic deadlines:**
|
||||||
|
- "today" to "2024-12-20" - Days until assignment due
|
||||||
|
- "today" to "next Friday 23:59" - Time to weekly submission
|
||||||
|
|
||||||
|
**Project milestones:**
|
||||||
|
- "2024-11-13" to "2024-12-01" - Sprint duration
|
||||||
|
- "last Monday" to "today" - Week progress
|
||||||
|
|
||||||
|
**Event planning:**
|
||||||
|
- "today" to "25 Dec" - Days until event
|
||||||
|
- "9:00" to "17:00" - Meeting duration (same day)
|
||||||
|
|
||||||
|
**Time tracking:**
|
||||||
|
- "yesterday" to "today" - Daily intervals
|
||||||
|
- "1 week ago" to "today" - Weekly reviews
|
||||||
|
|
||||||
|
## When to use
|
||||||
|
|
||||||
|
- Calculate days remaining until assignment deadlines
|
||||||
|
- Track time elapsed on projects or sprints
|
||||||
|
- Plan event schedules and milestones
|
||||||
|
- Verify working time between meetings
|
||||||
|
- Calculate age or duration of events
|
||||||
|
- Estimate remaining time for deliverables
|
||||||
|
- Academic semester/week planning
|
||||||
|
|
||||||
|
## Related commands
|
||||||
|
|
||||||
|
- `/datetime:now` - Get current date/time
|
||||||
|
- `/datetime:parse` - Parse natural language date expressions
|
||||||
92
commands/now.md
Normal file
92
commands/now.md
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
description: Get current date and time (Claude should use date command directly)
|
||||||
|
argument-hint: [format]
|
||||||
|
allowed-tools: Bash
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# now - Get current date and time
|
||||||
|
|
||||||
|
Get the current date and time in a standardized format.
|
||||||
|
|
||||||
|
## For Claude Code
|
||||||
|
|
||||||
|
**If you are Claude**: DO NOT invoke this slash command. Use the `date` command directly via Bash tool:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
See the Implementation section below for the exact command pattern.
|
||||||
|
|
||||||
|
## For Users
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/datetime:now
|
||||||
|
/datetime:now [format]
|
||||||
|
```
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
1. **No arguments**: Returns current date/time in standard format
|
||||||
|
- Format: `YYYY-MM-DD HH:MM:SS (DayName)`
|
||||||
|
- Example: `2024-11-13 16:45:30 (Wednesday)`
|
||||||
|
|
||||||
|
2. **With format argument**: Returns current date/time in custom format
|
||||||
|
- Uses `date` command format strings
|
||||||
|
- Example: `/datetime:now "%B %d, %Y"` → `November 13, 2024`
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
**Standard format:**
|
||||||
|
```bash
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Custom format:**
|
||||||
|
```bash
|
||||||
|
date '+[format-string]'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common format strings
|
||||||
|
|
||||||
|
- `%Y-%m-%d` - Date only (2024-11-13)
|
||||||
|
- `%H:%M:%S` - Time only (16:45:30)
|
||||||
|
- `%A` - Full day name (Wednesday)
|
||||||
|
- `%B %d, %Y` - Formatted date (November 13, 2024)
|
||||||
|
- `%V` - Week number (45)
|
||||||
|
- `+%s` - Unix timestamp (1699896330)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Standard output
|
||||||
|
/datetime:now
|
||||||
|
→ 2024-11-13 16:45:30 (Wednesday)
|
||||||
|
|
||||||
|
# Custom format - date only
|
||||||
|
/datetime:now "%Y-%m-%d"
|
||||||
|
→ 2024-11-13
|
||||||
|
|
||||||
|
# Week number
|
||||||
|
/datetime:now "%V"
|
||||||
|
→ 45
|
||||||
|
|
||||||
|
# Unix timestamp
|
||||||
|
/datetime:now "+%s"
|
||||||
|
→ 1699896330
|
||||||
|
```
|
||||||
|
|
||||||
|
## When to use
|
||||||
|
|
||||||
|
- Verify current date/time before making temporal decisions
|
||||||
|
- Get current week number for academic week mapping
|
||||||
|
- Generate timestamps for logging or calculations
|
||||||
|
- When <env> context date may be outdated
|
||||||
|
|
||||||
|
## Related commands
|
||||||
|
|
||||||
|
- `/datetime:parse` - Parse natural language date expressions
|
||||||
|
- `/datetime:calc` - Calculate date differences
|
||||||
135
commands/parse.md
Normal file
135
commands/parse.md
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
---
|
||||||
|
description: Parse natural language date/time expressions (Claude should use date command directly)
|
||||||
|
argument-hint: <expression> [format]
|
||||||
|
allowed-tools: Bash
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# parse - Parse natural language date/time expressions
|
||||||
|
|
||||||
|
Parse natural language date and time expressions into standardized format.
|
||||||
|
|
||||||
|
## For Claude Code
|
||||||
|
|
||||||
|
**If you are Claude**: DO NOT invoke this slash command. Use the `date` command directly via Bash tool:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date -d "expression" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
See the Implementation section below for the exact command pattern.
|
||||||
|
|
||||||
|
## For Users
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/datetime:parse <expression>
|
||||||
|
/datetime:parse <expression> [format]
|
||||||
|
```
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
1. **Standard format**: Parses natural language and returns standardized date/time
|
||||||
|
- Format: `YYYY-MM-DD HH:MM:SS (DayName)`
|
||||||
|
- Example: `/datetime:parse "tomorrow"` → `2025-11-14 00:00:00 (Friday)`
|
||||||
|
|
||||||
|
2. **Custom format**: Parse and return in custom format
|
||||||
|
- Uses `date` command format strings
|
||||||
|
- Example: `/datetime:parse "next Monday" "%Y-%m-%d"` → `2025-11-17`
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
**Standard format:**
|
||||||
|
```bash
|
||||||
|
date -d "<expression>" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Custom format:**
|
||||||
|
```bash
|
||||||
|
date -d "<expression>" '+[format-string]'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important: "in" prefix handling**
|
||||||
|
- User says: "in 3 days"
|
||||||
|
- Command needs: `date -d "3 days"`
|
||||||
|
- Strip "in" prefix before passing to `date -d`
|
||||||
|
|
||||||
|
## Natural language expressions
|
||||||
|
|
||||||
|
**Relative dates:**
|
||||||
|
- `tomorrow`, `yesterday`
|
||||||
|
- `3 days`, `2 weeks`, `1 month`, `6 months`
|
||||||
|
- `next Monday`, `last Friday`
|
||||||
|
- `next week`, `last month`
|
||||||
|
|
||||||
|
**Specific dates:**
|
||||||
|
- `Nov 13`, `November 13`, `13 Nov 2025`
|
||||||
|
- `2025-11-13`, `13/11/2025`
|
||||||
|
|
||||||
|
**Combined expressions:**
|
||||||
|
- `tomorrow at 3pm` → `2025-11-14 15:00:00 (Friday)`
|
||||||
|
- `next Monday at 14:30` → `2025-11-17 14:30:00 (Monday)`
|
||||||
|
- `3 days at noon` → `2025-11-16 12:00:00 (Sunday)`
|
||||||
|
|
||||||
|
**Week navigation:**
|
||||||
|
- `monday`, `tuesday` (next occurrence)
|
||||||
|
- `next monday`, `last tuesday`
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tomorrow
|
||||||
|
/datetime:parse "tomorrow"
|
||||||
|
→ 2025-11-14 00:00:00 (Friday)
|
||||||
|
|
||||||
|
# Relative days (strip "in" if present)
|
||||||
|
/datetime:parse "3 days"
|
||||||
|
→ 2025-11-16 00:00:00 (Sunday)
|
||||||
|
|
||||||
|
# Next week day
|
||||||
|
/datetime:parse "next Monday"
|
||||||
|
→ 2025-11-17 00:00:00 (Monday)
|
||||||
|
|
||||||
|
# With time
|
||||||
|
/datetime:parse "tomorrow at 3pm"
|
||||||
|
→ 2025-11-14 15:00:00 (Friday)
|
||||||
|
|
||||||
|
# Specific date
|
||||||
|
/datetime:parse "Nov 15"
|
||||||
|
→ 2025-11-15 00:00:00 (Saturday)
|
||||||
|
|
||||||
|
# Custom format - date only
|
||||||
|
/datetime:parse "next week" "%Y-%m-%d"
|
||||||
|
→ 2025-11-20
|
||||||
|
|
||||||
|
# Unix timestamp for calculations
|
||||||
|
/datetime:parse "3 days" "+%s"
|
||||||
|
→ 1731715200
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error handling
|
||||||
|
|
||||||
|
If the expression is invalid, `date` will return an error:
|
||||||
|
```bash
|
||||||
|
date -d "invalid expression"
|
||||||
|
→ date: invalid date 'invalid expression'
|
||||||
|
```
|
||||||
|
|
||||||
|
Common mistakes:
|
||||||
|
- `in 3 days` → Remove "in", use `3 days`
|
||||||
|
- `3d` → Use full words: `3 days`
|
||||||
|
- `next week monday` → Use `next monday` or `monday next week`
|
||||||
|
|
||||||
|
## When to use
|
||||||
|
|
||||||
|
- ANY time user mentions dates, times, or temporal concepts
|
||||||
|
- Converting user's natural language into concrete dates
|
||||||
|
- Calculating deadlines from relative expressions
|
||||||
|
- Validating date inputs before processing
|
||||||
|
- Don't guess dates - always verify with this command
|
||||||
|
|
||||||
|
## Related commands
|
||||||
|
|
||||||
|
- `/datetime:now` - Get current date and time
|
||||||
|
- `/datetime:calc` - Calculate date differences
|
||||||
61
plugin.lock.json
Normal file
61
plugin.lock.json
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:cadrianmae/claude-marketplace:plugins/datetime",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "3e81a7b3707353c2a4e6803ef170e18317507e63",
|
||||||
|
"treeHash": "3e326de9f209fafbe76c3970031242bd8ee53c9181c699d6e6262157dd5dae6d",
|
||||||
|
"generatedAt": "2025-11-28T10:14:27.856151Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "datetime",
|
||||||
|
"description": "Natural language date/time parsing and calculations using native date command",
|
||||||
|
"version": "1.1.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "d9393800b8ae0048479a4672fe7dddc8f4fea987f7245c06d4f1422e0b67f076"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "06c5cee893e29df4acf483654288eafedc67c7d766b5c170ef53f168803fd3fc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/calc.md",
|
||||||
|
"sha256": "c55f0c2f2cf3881140d5486db6183f0a0a387e7af0ee5fdee1b51d3c950caa07"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/parse.md",
|
||||||
|
"sha256": "bef5bca97a26083e6415300ed1d7056d49caf64fef86beb73ac004626b2b3e6e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/now.md",
|
||||||
|
"sha256": "0969d2058b2b9c6bb04f1f9515ee0192744afd23f4d27782eeb13e7d11ee5d42"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/datetime/SKILL.md",
|
||||||
|
"sha256": "51345c8aa3f97c8d65299a176efc485e44a012734e328cb9388906802f9d8b57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/datetime/references/reference.md",
|
||||||
|
"sha256": "83a8ecc1430759a7ac1073153545459fd8c64e21b8e4c0f56013bcf2790f32c2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "3e326de9f209fafbe76c3970031242bd8ee53c9181c699d6e6262157dd5dae6d"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
93
skills/datetime/SKILL.md
Normal file
93
skills/datetime/SKILL.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
name: datetime
|
||||||
|
description: Use the `date` command via Bash tool whenever you or the user mention time, dates, or temporal concepts. Verify current date/time before ANY temporal response, as environment context may be outdated. Parse expressions like "tomorrow", "next week", "3 days", "in 2 weeks", "next Monday at 3pm". Proactively invoke for deadlines, schedules, time-sensitive tasks, week numbers, or any date/time reference.
|
||||||
|
allowed-tools: Bash
|
||||||
|
---
|
||||||
|
|
||||||
|
# DateTime Natural Language Parser
|
||||||
|
|
||||||
|
Parse natural language date and time expressions using GNU `date` command (native Linux utility).
|
||||||
|
|
||||||
|
## IMPORTANT: For Claude Code
|
||||||
|
|
||||||
|
**DO NOT invoke slash commands** (`/datetime:parse`, `/datetime:now`, `/datetime:calc`) - those are for users only.
|
||||||
|
|
||||||
|
**Instead, use the `date` command directly via the Bash tool:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get current date/time
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
|
||||||
|
# Parse natural language
|
||||||
|
date -d "tomorrow" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "next monday at 9am" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "3 days" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
This skill provides the command patterns and when to use them. The slash commands are for users to invoke manually.
|
||||||
|
|
||||||
|
## When to Use This Skill
|
||||||
|
|
||||||
|
Automatically invoke when:
|
||||||
|
- User mentions temporal expressions: "tomorrow", "next week", "in 3 days"
|
||||||
|
- Need to verify current date/time
|
||||||
|
- User references deadlines or time-sensitive tasks
|
||||||
|
- <env> context shows incorrect dates
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
Use the Bash tool with `date -d` command:
|
||||||
|
|
||||||
|
**Get current date/time:**
|
||||||
|
```bash
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parse natural language:**
|
||||||
|
```bash
|
||||||
|
date -d "tomorrow" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "next wednesday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "3 days" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "next monday 9am" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important**: The `date` command doesn't understand "in" keyword. When user says "in 3 days", use `"3 days"` instead.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
Returns single line: `YYYY-MM-DD HH:MM:SS (DayName)`
|
||||||
|
|
||||||
|
Example: `2024-10-29 14:23:45 (Tuesday)`
|
||||||
|
|
||||||
|
## Supported Expressions
|
||||||
|
|
||||||
|
- Relative: "today", "tomorrow", "yesterday"
|
||||||
|
- Named days: "next monday", "this wednesday", "last friday"
|
||||||
|
- Offsets: "3 days", "2 weeks", "5 months ago"
|
||||||
|
- Complex: "tomorrow 3pm", "next monday at 9am"
|
||||||
|
- Past: "3 days ago", "last week"
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
If `date -d` fails with an invalid expression:
|
||||||
|
|
||||||
|
1. **Recognize the failure**: If the command returns an error, inform the user the expression couldn't be parsed
|
||||||
|
2. **Try alternative approaches**: Check `references/reference.md` for:
|
||||||
|
- Date arithmetic examples (if user wants relative calculations)
|
||||||
|
- Complex expression syntax (if user wants compound dates)
|
||||||
|
- Unix timestamp calculations (if user wants day differences)
|
||||||
|
3. **Fallback to current date**: If no alternative works:
|
||||||
|
```bash
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example error handling:**
|
||||||
|
```bash
|
||||||
|
# Try parsing
|
||||||
|
date -d "user expression" '+%Y-%m-%d %H:%M:%S (%A)' 2>&1
|
||||||
|
# If error message appears, tell user and suggest checking references/reference.md for advanced patterns
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
For relative calculations, week numbers, and complex date arithmetic, see `references/reference.md`.
|
||||||
302
skills/datetime/references/reference.md
Normal file
302
skills/datetime/references/reference.md
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
# DateTime Natural - Technical Reference
|
||||||
|
|
||||||
|
## For Claude Code
|
||||||
|
|
||||||
|
**This reference is for technical details only.** When you need to work with dates/times:
|
||||||
|
|
||||||
|
1. **DO NOT** invoke slash commands (`/datetime:parse`, `/datetime:now`, `/datetime:calc`)
|
||||||
|
2. **DO** use the `date` command directly via Bash tool as shown in examples below
|
||||||
|
|
||||||
|
The slash commands are for users only. This reference provides the command patterns you should use directly.
|
||||||
|
|
||||||
|
## GNU date Command Reference
|
||||||
|
|
||||||
|
The `date` command is a native Linux utility that parses natural language date/time expressions without requiring external dependencies.
|
||||||
|
|
||||||
|
### Basic Syntax
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date [OPTION]... [+FORMAT]
|
||||||
|
date -d STRING [+FORMAT]
|
||||||
|
```
|
||||||
|
|
||||||
|
- `-d STRING`: Display time described by STRING instead of 'now'
|
||||||
|
- `+FORMAT`: Control the output format
|
||||||
|
|
||||||
|
### Recommended Format String
|
||||||
|
|
||||||
|
Always use this format for consistency:
|
||||||
|
```bash
|
||||||
|
'+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
Output: `2025-11-06 14:30:00 (Wednesday)`
|
||||||
|
|
||||||
|
## Natural Language Parsing Examples
|
||||||
|
|
||||||
|
### Current Time
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-06 14:30:00 (Wednesday)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Relative Dates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tomorrow
|
||||||
|
date -d "tomorrow" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-07 14:30:00 (Thursday)
|
||||||
|
|
||||||
|
# Yesterday
|
||||||
|
date -d "yesterday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-05 14:30:00 (Tuesday)
|
||||||
|
|
||||||
|
# Next week
|
||||||
|
date -d "next week" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-13 14:30:00 (Wednesday)
|
||||||
|
|
||||||
|
# Last week
|
||||||
|
date -d "last week" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-10-30 14:30:00 (Wednesday)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Offset Expressions
|
||||||
|
|
||||||
|
**Important**: Remove "in" prefix - user says "in 3 days" → use `"3 days"`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User says "in 3 days" (remove "in")
|
||||||
|
date -d "3 days" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-09 14:30:00 (Saturday)
|
||||||
|
|
||||||
|
# 2 weeks
|
||||||
|
date -d "2 weeks" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-20 14:30:00 (Wednesday)
|
||||||
|
|
||||||
|
# 5 months
|
||||||
|
date -d "5 months" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-04-06 14:30:00 (Wednesday)
|
||||||
|
|
||||||
|
# Past dates
|
||||||
|
date -d "3 days ago" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-03 14:30:00 (Monday)
|
||||||
|
|
||||||
|
date -d "2 weeks ago" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-10-23 14:30:00 (Thursday)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Named Days
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Next monday
|
||||||
|
date -d "next monday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-10 14:30:00 (Monday)
|
||||||
|
|
||||||
|
# This wednesday
|
||||||
|
date -d "this wednesday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-12 14:30:00 (Wednesday)
|
||||||
|
|
||||||
|
# Last friday
|
||||||
|
date -d "last friday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-10-31 14:30:00 (Friday)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Complex Expressions with Times
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tomorrow at specific time
|
||||||
|
date -d "tomorrow 3pm" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-07 15:00:00 (Thursday)
|
||||||
|
|
||||||
|
# Next monday at 9am
|
||||||
|
date -d "next monday 9am" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-10 09:00:00 (Monday)
|
||||||
|
|
||||||
|
# Tomorrow at 3:30pm
|
||||||
|
date -d "tomorrow 15:30" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-07 15:30:00 (Thursday)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Relative Calculations
|
||||||
|
|
||||||
|
### Date Arithmetic
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Calculate deadline: 3 days from tomorrow
|
||||||
|
date -d "tomorrow + 3 days" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-11-10 14:30:00 (Sunday)
|
||||||
|
|
||||||
|
# Calculate 2 weeks before a date
|
||||||
|
date -d "2025-12-25 - 2 weeks" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# → 2025-12-11 00:00:00 (Thursday)
|
||||||
|
|
||||||
|
# Add/subtract time units
|
||||||
|
date -d "now + 2 hours" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "tomorrow - 3 hours" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
date -d "next monday + 2 days" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Calculate Days Between Dates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Calculate days until deadline
|
||||||
|
DEADLINE=$(date -d "Nov 13" +%s)
|
||||||
|
NOW=$(date +%s)
|
||||||
|
DAYS=$(( ($DEADLINE - $NOW) / 86400 ))
|
||||||
|
echo "$DAYS days remaining"
|
||||||
|
# → 7 days remaining
|
||||||
|
|
||||||
|
# Time between two specific dates (in days)
|
||||||
|
DATE1=$(date -d "2025-11-06" +%s)
|
||||||
|
DATE2=$(date -d "2025-11-13" +%s)
|
||||||
|
DIFF=$(( ($DATE2 - $DATE1) / 86400 ))
|
||||||
|
echo "$DIFF days between dates"
|
||||||
|
# → 7 days between dates
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note**: `+%s` format gives Unix timestamp (seconds since epoch), then divide difference by 86400 (seconds in a day).
|
||||||
|
|
||||||
|
## Week Number Calculations
|
||||||
|
|
||||||
|
### Get Current Week Number
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ISO week number (1-53)
|
||||||
|
date +%V
|
||||||
|
# → 45
|
||||||
|
|
||||||
|
# Get week number for a specific date
|
||||||
|
date -d "2025-12-25" +%V
|
||||||
|
# → 52
|
||||||
|
```
|
||||||
|
|
||||||
|
### Academic Week Mapping
|
||||||
|
|
||||||
|
Use in conjunction with project-specific week mapping scripts to translate calendar weeks to academic weeks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get calendar week
|
||||||
|
CALENDAR_WEEK=$(date +%V)
|
||||||
|
|
||||||
|
# Map to academic week (example from tu856-4-claude)
|
||||||
|
ACADEMIC_WEEK=$(~/.claude/skills/week-mapping.sh)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Use Cases
|
||||||
|
|
||||||
|
### Pattern 1: Verify Current Date Before Responding
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ALWAYS verify current date before responding with temporal information
|
||||||
|
date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Why**: The `<env>` context may show incorrect dates, leading to wrong responses.
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
- User asks: "When is next Friday?"
|
||||||
|
- Action: Check current date first → Parse "next friday"
|
||||||
|
|
||||||
|
### Pattern 2: Parse Deadline Mentions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User: "I have a deadline on Tuesday"
|
||||||
|
date -d "next tuesday" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern 3: Calculate Relative Dates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User: "Is tomorrow a weekend?"
|
||||||
|
date -d "tomorrow" '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
# Check day name in output
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern 4: Calculate Days Until Event
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User: "How many days until November 13?"
|
||||||
|
DEADLINE=$(date -d "Nov 13" +%s)
|
||||||
|
NOW=$(date +%s)
|
||||||
|
DAYS=$(( ($DEADLINE - $NOW) / 86400 ))
|
||||||
|
echo "$DAYS days remaining"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### Fallback Pattern
|
||||||
|
|
||||||
|
If date parsing fails, fall back to current date/time:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
date -d "invalid expression" '+%Y-%m-%d %H:%M:%S (%A)' 2>/dev/null || date '+%Y-%m-%d %H:%M:%S (%A)'
|
||||||
|
```
|
||||||
|
|
||||||
|
This pattern:
|
||||||
|
1. Attempts to parse the expression
|
||||||
|
2. Suppresses error messages with `2>/dev/null`
|
||||||
|
3. Falls back to current date with `|| date ...`
|
||||||
|
|
||||||
|
### Common Parsing Issues
|
||||||
|
|
||||||
|
1. **"in X days" doesn't work**: Remove "in" prefix
|
||||||
|
- ❌ `date -d "in 3 days"`
|
||||||
|
- ✅ `date -d "3 days"`
|
||||||
|
|
||||||
|
2. **Always quote expressions**: Prevents shell parsing issues
|
||||||
|
- ❌ `date -d next monday`
|
||||||
|
- ✅ `date -d "next monday"`
|
||||||
|
|
||||||
|
3. **Use consistent format**: Always use the recommended format string
|
||||||
|
- ✅ `'+%Y-%m-%d %H:%M:%S (%A)'`
|
||||||
|
|
||||||
|
## Format String Reference
|
||||||
|
|
||||||
|
The recommended format string components:
|
||||||
|
|
||||||
|
- `%Y`: 4-digit year (2025)
|
||||||
|
- `%m`: 2-digit month (01-12)
|
||||||
|
- `%d`: 2-digit day (01-31)
|
||||||
|
- `%H`: 2-digit hour, 24-hour format (00-23)
|
||||||
|
- `%M`: 2-digit minute (00-59)
|
||||||
|
- `%S`: 2-digit second (00-59)
|
||||||
|
- `%A`: Full weekday name (Monday, Tuesday, etc.)
|
||||||
|
|
||||||
|
Other useful format codes:
|
||||||
|
|
||||||
|
- `%V`: ISO week number (01-53)
|
||||||
|
- `%s`: Unix timestamp (seconds since 1970-01-01 00:00:00 UTC)
|
||||||
|
- `%z`: Timezone offset (+0100)
|
||||||
|
- `%Z`: Timezone name (EST, PST, etc.)
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The `date` command uses:
|
||||||
|
- **Language**: System locale (usually English)
|
||||||
|
- **Timezone**: System timezone
|
||||||
|
- **Date handling**: Correctly interprets "next" vs "this" for weekdays
|
||||||
|
|
||||||
|
## ADHD/Neurodivergent Support
|
||||||
|
|
||||||
|
This skill is particularly useful for:
|
||||||
|
- Track time meticulously for executive function support
|
||||||
|
- Parse time mentions in user messages automatically
|
||||||
|
- Verify temporal context when planning tasks
|
||||||
|
- Support deadline tracking with natural language
|
||||||
|
- Calculate available time between events
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
- **v3.0.0** (2025-11-06): Native GNU date command
|
||||||
|
- Removed Python dependency entirely
|
||||||
|
- Uses native Linux `date` command with `-d` flag
|
||||||
|
- Progressive disclosure: moved technical details to reference.md
|
||||||
|
- Lean SKILL.md with reference to this file
|
||||||
|
|
||||||
|
- **v2.0.0** (2025-10-29): Switched to parsedatetime
|
||||||
|
- Replaced dateparser with parsedatetime for better "next/this" handling
|
||||||
|
- Added isolated virtual environment for dependency management
|
||||||
|
|
||||||
|
- **v1.0.0** (2024-10-29): Initial Python version with dateparser
|
||||||
|
- Migrated from Node.js/chrono-node to Python/dateparser
|
||||||
Reference in New Issue
Block a user