@neurodock/cli 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +45 -11
- package/dist/assets/schemas/neurotype-addenda.schema.json +167 -0
- package/dist/assets/schemas/profile.example.yaml +9 -0
- package/dist/assets/schemas/profile.schema.json +116 -0
- package/dist/assets/skills/adhd-daily-planner/SKILL.md +131 -0
- package/dist/assets/skills/asd-meeting-translator/SKILL.md +177 -0
- package/dist/assets/skills/audhd-context-recovery/SKILL.md +93 -0
- package/dist/assets/skills/dyspraxia-task-pacer/SKILL.md +174 -0
- package/dist/assets/skills/hyperfocus-formatter/SKILL.md +89 -0
- package/dist/assets/skills/ocd-decision-finalizer/SKILL.md +109 -0
- package/dist/assets/skills/visual-organizer/SKILL.md +94 -0
- package/dist/commands/install-all.d.ts +21 -0
- package/dist/commands/install-all.d.ts.map +1 -1
- package/dist/commands/install-all.js +52 -0
- package/dist/commands/install-all.js.map +1 -1
- package/dist/commands/install-skills.d.ts +26 -0
- package/dist/commands/install-skills.d.ts.map +1 -0
- package/dist/commands/install-skills.js +164 -0
- package/dist/commands/install-skills.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +1 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/skills.d.ts +40 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +115 -0
- package/dist/lib/skills.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @neurodock/cli changelog
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1c76c2c: add `neurodock install-skills` and bundle the per-neurotype skills into the cli
|
|
8
|
+
|
|
9
|
+
the cli now ships the six per-neurotype skills (their `SKILL.md` files,
|
|
10
|
+
generated into `dist/assets/skills/` at build time from `packages/skills/`).
|
|
11
|
+
the new `neurodock install-skills` command copies them into the client's
|
|
12
|
+
personal skills directory (`~/.claude/skills/neurodock-<name>/` for claude code
|
|
13
|
+
and claude desktop; cursor is skipped). it supports `--client`, `--dry-run`,
|
|
14
|
+
and `--yes`, and is idempotent.
|
|
15
|
+
|
|
16
|
+
`install-all`, `setup`, and `update` now install the skills as part of the
|
|
17
|
+
one-command happy path; opt out with `--no-skills` (mirrors `--no-native-host`).
|
|
18
|
+
the skills step is best-effort — a failure warns but does not fail the command.
|
|
19
|
+
|
|
3
20
|
## 0.8.2
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The `neurodock` installer and diagnostic CLI for [NeuroDock](https://neurodock.org/) — a local-first cognitive substrate for neurodivergent professionals.
|
|
4
4
|
|
|
5
|
-
Status: **v0.
|
|
5
|
+
Status: **v0.8.2**.
|
|
6
6
|
|
|
7
7
|
## Quickstart
|
|
8
8
|
|
|
@@ -34,8 +34,9 @@ install, `install-all` runs the `pip install` step automatically.
|
|
|
34
34
|
|
|
35
35
|
| Command | What it does |
|
|
36
36
|
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
37
|
-
| `neurodock install-all` | One-command first-time install: pip-install the six servers, wire every detected client, copy the starter profile.
|
|
37
|
+
| `neurodock install-all` | One-command first-time install: pip-install the six servers, wire every detected client, copy the starter profile, install the per-neurotype skills. |
|
|
38
38
|
| `neurodock init` | Install MCP servers into Claude Desktop / Claude Code / Cursor (the wiring half of `install-all`). |
|
|
39
|
+
| `neurodock install-skills` | Copy the per-neurotype skills into your client's personal skills directory (`~/.claude/skills` for Claude Code / Claude Desktop). Cursor is skipped. |
|
|
39
40
|
| `neurodock doctor` | Diagnose your install — profile validity, client wiring, tool availability. |
|
|
40
41
|
| `neurodock validate` | Schema-validate a profile file (`~/.neurodock/profile.yaml` by default). |
|
|
41
42
|
| `neurodock update` | Upgrade NeuroDock to the latest version — re-installs the six MCP servers via pip/uv and re-wires client configs. |
|
|
@@ -60,16 +61,47 @@ install, `install-all` runs the `pip install` step automatically.
|
|
|
60
61
|
neurodock install-all [--client=claude-desktop|claude-code|cursor|all] \
|
|
61
62
|
[--profile=minimal|example] \
|
|
62
63
|
[--installer=uv|pip|auto] \
|
|
63
|
-
[--skip-install] [--yes] [--dry-run]
|
|
64
|
+
[--skip-install] [--yes] [--dry-run] \
|
|
65
|
+
[--no-native-host] [--no-skills]
|
|
64
66
|
```
|
|
65
67
|
|
|
66
68
|
Single-command first-time install. Prefers `uv` if it is on PATH; falls
|
|
67
69
|
back to `python -m pip`. After install, verifies each server entrypoint
|
|
68
|
-
is on PATH with `<command> --help`,
|
|
69
|
-
|
|
70
|
+
is on PATH with `<command> --help`, delegates to `init` to wire clients,
|
|
71
|
+
registers the optional native-messaging host, and installs the
|
|
72
|
+
per-neurotype skills into `~/.claude/skills`.
|
|
70
73
|
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
- `--no-native-host` skips registering the native-messaging host.
|
|
75
|
+
- `--no-skills` skips copying the per-neurotype skills.
|
|
76
|
+
|
|
77
|
+
Both steps are best-effort: a failure in either emits a warning but does
|
|
78
|
+
not fail the command (the six MCP servers are the core). Exit codes:
|
|
79
|
+
`0` ok, `1` an entrypoint is missing from PATH after install, `2` init
|
|
80
|
+
failed.
|
|
81
|
+
|
|
82
|
+
### `neurodock install-skills`
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
neurodock install-skills [--client=claude-desktop|claude-code|cursor|all] \
|
|
86
|
+
[--dry-run] [--yes]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Copies the six per-neurotype skills bundled in the CLI tarball into the
|
|
90
|
+
client's personal skills directory so Claude Code / Claude Desktop
|
|
91
|
+
discover them. Each skill installs as
|
|
92
|
+
`~/.claude/skills/neurodock-<name>/SKILL.md` (namespaced so it is
|
|
93
|
+
collision-free and recognisably NeuroDock's).
|
|
94
|
+
|
|
95
|
+
- Claude Code and Claude Desktop share `~/.claude/skills`; the command
|
|
96
|
+
de-duplicates so the files are written once.
|
|
97
|
+
- Cursor has no skills system today and is skipped with a notice (never
|
|
98
|
+
an error).
|
|
99
|
+
- `--dry-run` prints the planned targets and exits 0 without writing.
|
|
100
|
+
- Idempotent: re-running refreshes each `SKILL.md` in place.
|
|
101
|
+
|
|
102
|
+
This is also run automatically by `install-all` / `setup` / `update`
|
|
103
|
+
unless you pass `--no-skills`. Exit codes: `0` ok, `1` no bundled skills
|
|
104
|
+
were found (a packaging bug).
|
|
73
105
|
|
|
74
106
|
### `neurodock init`
|
|
75
107
|
|
|
@@ -100,14 +132,16 @@ key are skipped unless `--yes` is supplied.
|
|
|
100
132
|
neurodock update [--client=claude-desktop|claude-code|cursor|all] \
|
|
101
133
|
[--profile=minimal|example] \
|
|
102
134
|
[--installer=uv|pip|auto] \
|
|
103
|
-
[--skip-install] [--yes] [--dry-run]
|
|
135
|
+
[--skip-install] [--yes] [--dry-run] \
|
|
136
|
+
[--no-native-host] [--no-skills]
|
|
104
137
|
```
|
|
105
138
|
|
|
106
139
|
One-command upgrade. Same code path as `install-all` — re-runs
|
|
107
140
|
`pip install --upgrade` (or `uv tool install`) for every NeuroDock MCP
|
|
108
|
-
server, re-wires the detected MCP clients,
|
|
109
|
-
|
|
110
|
-
`0` ok, `1` an
|
|
141
|
+
server, re-wires the detected MCP clients, re-registers the optional
|
|
142
|
+
native-messaging host, and refreshes the per-neurotype skills (skip with
|
|
143
|
+
`--no-skills`). Exit codes match `install-all`: `0` ok, `1` an
|
|
144
|
+
entrypoint is missing from PATH, `2` init failed.
|
|
111
145
|
|
|
112
146
|
### `neurodock sync`
|
|
113
147
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schemas.neurodock.org/neurotype-addenda/v1/neurotype-addenda.schema.json",
|
|
4
|
+
"title": "NeuroDock Neurotype Addenda Artifact",
|
|
5
|
+
"description": "Validates the language-neutral, enum-keyed prompt-shaping content artifact (data/neurotype-addenda/v1.json). This artifact is CONTENT, not schema shape (ADR 0011): it carries the per-(tool x neurotype) prose blocks that NeuroDock surfaces append to a model prompt, plus the fusion rule, priority ordering, framing, output-format guidance, and the cross-cutting voice-input / tourette / other / generic-fallback blocks. Additive-only versioning: new tools, new neurotypes, and new optional top-level keys are non-breaking. Unknown keys are permitted for forward-compatibility where appropriate.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": true,
|
|
8
|
+
"required": [
|
|
9
|
+
"artifact_version",
|
|
10
|
+
"fusion",
|
|
11
|
+
"priority",
|
|
12
|
+
"framing",
|
|
13
|
+
"output_format",
|
|
14
|
+
"voice_input",
|
|
15
|
+
"tourette",
|
|
16
|
+
"other",
|
|
17
|
+
"generic",
|
|
18
|
+
"tools"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"$schema": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Optional pointer back to this schema's $id."
|
|
24
|
+
},
|
|
25
|
+
"artifact_version": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Semantic version of the artifact content. Additive changes bump minor; a breaking re-shape forks to a new vN.json + a new schema $id.",
|
|
28
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
29
|
+
"examples": ["1.0.0"]
|
|
30
|
+
},
|
|
31
|
+
"description": {
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
"tokens": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"description": "The complete set of interpolation tokens any block may contain. Documentation only; the assembler is the authority.",
|
|
37
|
+
"items": { "type": "string" }
|
|
38
|
+
},
|
|
39
|
+
"fusion": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"description": "The AuDHD substitution rule. When the input set lists the `result` neurotype directly, OR lists every neurotype in `all_of`, the `result` block is substituted and every neurotype in `remove` is dropped.",
|
|
42
|
+
"additionalProperties": true,
|
|
43
|
+
"required": ["result", "all_of", "remove"],
|
|
44
|
+
"properties": {
|
|
45
|
+
"description": { "type": "string" },
|
|
46
|
+
"result": { "type": "string" },
|
|
47
|
+
"any_of": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": { "type": "string" }
|
|
50
|
+
},
|
|
51
|
+
"all_of": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"items": { "type": "string" }
|
|
54
|
+
},
|
|
55
|
+
"remove": {
|
|
56
|
+
"type": "array",
|
|
57
|
+
"items": { "type": "string" }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"priority": {
|
|
62
|
+
"type": "array",
|
|
63
|
+
"description": "Neurotype ordering. Higher-priority addenda are placed LATER in the assembled prompt (recency bias). Neurotypes are sorted by their index in this list.",
|
|
64
|
+
"items": { "type": "string" },
|
|
65
|
+
"minItems": 1
|
|
66
|
+
},
|
|
67
|
+
"framing": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"description": "The wrapper, header, footer, separators, and conflict footer that surround the per-neurotype blocks.",
|
|
70
|
+
"additionalProperties": true,
|
|
71
|
+
"required": [
|
|
72
|
+
"wrapper_prefix",
|
|
73
|
+
"wrapper_suffix",
|
|
74
|
+
"section_separator",
|
|
75
|
+
"block_line_separator",
|
|
76
|
+
"header",
|
|
77
|
+
"footer",
|
|
78
|
+
"conflict_footer_min_neurotypes",
|
|
79
|
+
"conflict_footer"
|
|
80
|
+
],
|
|
81
|
+
"properties": {
|
|
82
|
+
"wrapper_prefix": { "type": "string" },
|
|
83
|
+
"wrapper_suffix": { "type": "string" },
|
|
84
|
+
"section_separator": { "type": "string" },
|
|
85
|
+
"block_line_separator": { "type": "string" },
|
|
86
|
+
"header": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": { "type": "string" }
|
|
89
|
+
},
|
|
90
|
+
"footer": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"items": { "type": "string" }
|
|
93
|
+
},
|
|
94
|
+
"conflict_footer_min_neurotypes": {
|
|
95
|
+
"type": "integer",
|
|
96
|
+
"minimum": 1
|
|
97
|
+
},
|
|
98
|
+
"conflict_footer": { "type": "string" }
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"output_format": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"description": "Per-output-format guidance. The assembler renders `prefix + format + separator + descriptions[format]`.",
|
|
104
|
+
"additionalProperties": true,
|
|
105
|
+
"required": ["prefix", "separator", "descriptions", "default"],
|
|
106
|
+
"properties": {
|
|
107
|
+
"prefix": { "type": "string" },
|
|
108
|
+
"separator": { "type": "string" },
|
|
109
|
+
"descriptions": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"description": "Map of output-format enum value to its one-line description.",
|
|
112
|
+
"additionalProperties": { "type": "string" },
|
|
113
|
+
"minProperties": 1
|
|
114
|
+
},
|
|
115
|
+
"default": { "type": "string" }
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"voice_input": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"description": "Cross-cutting voice-input block. Emitted when voice input is preferred, before the per-neurotype blocks.",
|
|
121
|
+
"additionalProperties": true,
|
|
122
|
+
"required": ["block"],
|
|
123
|
+
"properties": {
|
|
124
|
+
"block": { "$ref": "#/$defs/block" }
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"tourette": {
|
|
128
|
+
"type": "object",
|
|
129
|
+
"description": "Tourette special block. Tool-independent; rendered whenever `tourette` is in the effective set.",
|
|
130
|
+
"additionalProperties": true,
|
|
131
|
+
"required": ["block"],
|
|
132
|
+
"properties": {
|
|
133
|
+
"block": { "$ref": "#/$defs/block" }
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"other": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"description": "Self-described block. Carries the {notes} interpolation token; rendered when `other` is selected with notes, or appended as a footer when notes are present without `other`.",
|
|
139
|
+
"additionalProperties": true,
|
|
140
|
+
"required": ["block"],
|
|
141
|
+
"properties": {
|
|
142
|
+
"block": { "$ref": "#/$defs/block" }
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"generic": {
|
|
146
|
+
"type": "object",
|
|
147
|
+
"description": "Generic per-neurotype fallback blocks (no tool context, or no concrete per-tool block for the pair). Keyed by neurotype enum value.",
|
|
148
|
+
"additionalProperties": { "$ref": "#/$defs/block" }
|
|
149
|
+
},
|
|
150
|
+
"tools": {
|
|
151
|
+
"type": "object",
|
|
152
|
+
"description": "Per-tool matrices of concrete per-neurotype blocks. Keyed by tool name, then by neurotype enum value. Additive: a new tool or a new neurotype within a tool is non-breaking.",
|
|
153
|
+
"additionalProperties": {
|
|
154
|
+
"type": "object",
|
|
155
|
+
"additionalProperties": { "$ref": "#/$defs/block" }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"$defs": {
|
|
160
|
+
"block": {
|
|
161
|
+
"type": "array",
|
|
162
|
+
"description": "A prose block: an ordered list of lines joined with the framing block_line_separator. Lines may contain {max_chunk_size} and/or {notes} interpolation tokens.",
|
|
163
|
+
"items": { "type": "string" },
|
|
164
|
+
"minItems": 1
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -62,6 +62,15 @@ preferences:
|
|
|
62
62
|
# system_default — your OS choice
|
|
63
63
|
reading_font_hint: "atkinson_hyperlegible"
|
|
64
64
|
|
|
65
|
+
# How much space do you want between lines of text?
|
|
66
|
+
# This is a hint for apps that show NeuroDock's output as styled text.
|
|
67
|
+
# Options:
|
|
68
|
+
# compact — lines sit closer together (more text fits on screen)
|
|
69
|
+
# default — the app's own everyday spacing
|
|
70
|
+
# relaxed — extra space between lines; pairs with atkinson_hyperlegible
|
|
71
|
+
# Leave it out and the app just uses its own spacing.
|
|
72
|
+
line_height_hint: "relaxed"
|
|
73
|
+
|
|
65
74
|
# Do you want visual animations turned on?
|
|
66
75
|
# Options:
|
|
67
76
|
# reduced — no animations (default; safest for vestibular sensitivity)
|
|
@@ -90,6 +90,17 @@
|
|
|
90
90
|
"enum": ["reduced", "system", "full"],
|
|
91
91
|
"default": "reduced",
|
|
92
92
|
"description": "Animation policy hint. 'reduced' = no animation, no transitions, no auto-scroll (default). 'system' = follow the OS prefers-reduced-motion setting. 'full' = animations allowed."
|
|
93
|
+
},
|
|
94
|
+
"line_height_hint": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"enum": ["compact", "default", "relaxed"],
|
|
97
|
+
"description": "Optional (added v0.1.x per ADR 0011). Line-height hint for any client that renders NeuroDock output as HTML or rich text, sitting alongside 'reading_font_hint'. A categorical band rather than a raw multiplier so each client maps it to its own CSS line-height. CONFORMANCE FLOOR: clients MUST NOT render body-paragraph line spacing below 1.5 regardless of band (WCAG 1.4.8 Visual Presentation / 1.4.12 Text Spacing). The bands are advisory line-height ratios relative to font size for body paragraphs; headings and other non-body text MAY be tighter. Per-band anchors: 'compact' ≈ 1.5 — the floor itself, a power-user opt-in for more text per viewport that still respects the 1.5 minimum (for readers who find generous spacing scatters their eye-line and prefer denser text, the dual of why 'relaxed' exists); 'default' ≈ 1.5–1.6 — the client's own comfortable default within the conformant range; 'relaxed' ≈ 1.65–1.8 — generous line spacing (~1.65 is the project body line-height) and the evidence-based pairing with 'atkinson_hyperlegible' for dyslexia, which is why dyslexia-aware presets set it. Read-when-present, neutral-when-absent: an untailored client ignores it; absence is NOT an error. The loader applies no value when absent. Self-ID never gates this (ADR 0004/0011).",
|
|
98
|
+
"examples": ["relaxed", "default"]
|
|
99
|
+
},
|
|
100
|
+
"voice_input_preferred": {
|
|
101
|
+
"type": "boolean",
|
|
102
|
+
"description": "Optional (added v0.1.x per ADR 0011). When true, the user predominantly dictates rather than types for sustained work (common for dyspraxic users). Downstream skills that emit code or structured text MUST NOT assume the user can hand-edit fiddly punctuation cheaply: keep examples copy-pasteable as a single block rather than scattered across inline edits. Read by the shaping layer; absence means 'no preference' and is the same as today's behaviour. Consumer pending; schema-only in this release.",
|
|
103
|
+
"examples": [true]
|
|
93
104
|
}
|
|
94
105
|
}
|
|
95
106
|
},
|
|
@@ -121,6 +132,62 @@
|
|
|
121
132
|
"enum": ["auto_close", "error"],
|
|
122
133
|
"default": "auto_close",
|
|
123
134
|
"description": "Behaviour of mark_session_start when a prior session is still open. 'auto_close' (default, charitable) closes the prior session and returns its metadata so the skill can surface it. 'error' refuses to start a new session until the prior one is explicitly closed. See ADR 0001, open question 3."
|
|
135
|
+
},
|
|
136
|
+
"calendar_phase": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"enum": ["teaching", "marking", "exam", "deadlines", "break"],
|
|
139
|
+
"description": "Optional (added v0.1.x per ADR 0011). Self-declared phase of the user's term/semester so skills can shift defaults across the calendar: tighter break cadence during 'marking' / 'exam', deadline-cluster awareness during 'deadlines' (e.g. week 12), looser during 'break'. Surfaced by the educator-semester and student-university presets. The neurotype is never a branch point (ADR 0004/0011); this is a user input the shaping layer reads, neutral-when-absent. Consumer pending (mcp-chronometric); schema-only in this release.",
|
|
140
|
+
"examples": ["teaching", "marking"]
|
|
141
|
+
},
|
|
142
|
+
"weekday_overrides": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"description": "Optional (added v0.1.x per ADR 0011). Per-weekday overrides for 'end_of_day_local' and 'hyperfocus_break_minutes', covering late-office-hours, Wednesday-afternoon-class, and library-day-vs-lecture-day patterns without forcing a whole-profile swap. Keys are lowercase English weekday names; only the seven weekdays are accepted (a misspelt key is a silent no-op, so unknown keys are rejected here rather than preserved). Each value is an override object reusing the same patterns/ranges as the top-level chronometric fields; an empty override object is valid. A weekday absent from the map inherits the top-level chronometric values. Consumer pending (mcp-chronometric); schema-only in this release.",
|
|
145
|
+
"additionalProperties": false,
|
|
146
|
+
"properties": {
|
|
147
|
+
"monday": { "$ref": "#/$defs/weekdayOverride" },
|
|
148
|
+
"tuesday": { "$ref": "#/$defs/weekdayOverride" },
|
|
149
|
+
"wednesday": { "$ref": "#/$defs/weekdayOverride" },
|
|
150
|
+
"thursday": { "$ref": "#/$defs/weekdayOverride" },
|
|
151
|
+
"friday": { "$ref": "#/$defs/weekdayOverride" },
|
|
152
|
+
"saturday": { "$ref": "#/$defs/weekdayOverride" },
|
|
153
|
+
"sunday": { "$ref": "#/$defs/weekdayOverride" }
|
|
154
|
+
},
|
|
155
|
+
"examples": [
|
|
156
|
+
{
|
|
157
|
+
"wednesday": { "end_of_day_local": "18:30" },
|
|
158
|
+
"saturday": { "hyperfocus_break_minutes": 120 }
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
"protected_windows": {
|
|
163
|
+
"type": "array",
|
|
164
|
+
"description": "Optional (added v0.1.x per ADR 0011). Local-time ranges (lunch, post-EOD evening, scheduled lectures, lab times) where the hyperfocus monitor should HARD-SURFACE rather than nudge — the strict rung of the escalation ladder, applied because the window itself is protected, not because a session has run long. Each entry is a 'HH:MM'-'HH:MM' range with an optional human label; ranges are interpreted in the user's local timezone and a range whose 'end' is earlier than its 'start' is treated as wrapping past midnight by the consumer. An empty list is valid. Consumer pending (mcp-chronometric); schema-only in this release.",
|
|
165
|
+
"items": { "$ref": "#/$defs/protectedWindow" },
|
|
166
|
+
"examples": [
|
|
167
|
+
[
|
|
168
|
+
{ "start": "12:00", "end": "12:30", "label": "lunch" },
|
|
169
|
+
{ "start": "17:00", "end": "23:59", "label": "evening" }
|
|
170
|
+
]
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
"deadline_cluster_awareness": {
|
|
174
|
+
"type": "boolean",
|
|
175
|
+
"description": "Optional (added v0.1.x per ADR 0011). When true, planning skills surface deadline proximity and shift the break-cadence math when work clusters (e.g. three assignments due in a single week). Set by the student-university preset. Read by planning skills; absence means today's behaviour (no clustering adjustment). Consumer pending (task-fractionator); schema-only in this release.",
|
|
176
|
+
"examples": [true]
|
|
177
|
+
},
|
|
178
|
+
"time_buffer_multiplier": {
|
|
179
|
+
"type": "number",
|
|
180
|
+
"minimum": 1.0,
|
|
181
|
+
"maximum": 3.0,
|
|
182
|
+
"default": 1.0,
|
|
183
|
+
"description": "Optional (added v0.1.x per ADR 0011). Multiplier that pads presented time estimates because real-world execution time for motor-heavy tasks is systematically underestimated (e.g. 1.3 = +30%, the value the dyspraxia preset sets). Range 1.0..3.0; the neutral default 1.0 reproduces today's unpadded behaviour so an untouched profile is unchanged. Read by planning skills to scale the estimates they present; the underlying estimate is not altered. Consumer pending (task-fractionator); schema-only in this release.",
|
|
184
|
+
"examples": [1.0, 1.3]
|
|
185
|
+
},
|
|
186
|
+
"motor_fatigue_aware": {
|
|
187
|
+
"type": "boolean",
|
|
188
|
+
"default": false,
|
|
189
|
+
"description": "Optional (added v0.1.x per ADR 0011). When true, the hyperfocus monitor weights motor activity (click / keystroke / window-switch volume) into the fatigue signal rather than relying on continuous-session length alone — cognitive sharpness and motor exhaustion can coexist (set by the dyspraxia preset). The neutral default false reproduces today's session-length-only behaviour. Reading motor activity is still gated by 'privacy.os_idle_consent' and the relevant OS-input consents; this flag only declares the preference. Consumer pending (mcp-chronometric); schema-only in this release.",
|
|
190
|
+
"examples": [true]
|
|
124
191
|
}
|
|
125
192
|
}
|
|
126
193
|
},
|
|
@@ -176,6 +243,55 @@
|
|
|
176
243
|
}
|
|
177
244
|
}
|
|
178
245
|
},
|
|
246
|
+
"$defs": {
|
|
247
|
+
"weekdayOverride": {
|
|
248
|
+
"type": "object",
|
|
249
|
+
"description": "Per-weekday override for the chronometric fields that vary by day. Both members are optional and reuse the same validation as their top-level counterparts; an empty object means 'this weekday is named but inherits the top-level values'. additionalProperties is false because an unknown key here is almost always a typo that would silently do nothing.",
|
|
250
|
+
"additionalProperties": false,
|
|
251
|
+
"properties": {
|
|
252
|
+
"end_of_day_local": {
|
|
253
|
+
"type": "string",
|
|
254
|
+
"pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
|
|
255
|
+
"description": "Override of 'chronometric.end_of_day_local' for this weekday, as 'HH:MM' (24h) in the user's local timezone. Same pattern as the top-level field.",
|
|
256
|
+
"examples": ["17:00", "18:30"]
|
|
257
|
+
},
|
|
258
|
+
"hyperfocus_break_minutes": {
|
|
259
|
+
"type": "integer",
|
|
260
|
+
"minimum": 15,
|
|
261
|
+
"maximum": 240,
|
|
262
|
+
"description": "Override of 'chronometric.hyperfocus_break_minutes' for this weekday. Same 15..240 range as the top-level field; re-anchors the 'nudge' rung for this day only.",
|
|
263
|
+
"examples": [60, 120]
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"protectedWindow": {
|
|
268
|
+
"type": "object",
|
|
269
|
+
"description": "A single local-time range where the hyperfocus monitor hard-surfaces. 'start' and 'end' are required 'HH:MM' (24h) strings; 'label' is an optional human-readable name. additionalProperties is false to catch typos in this small, fixed shape.",
|
|
270
|
+
"additionalProperties": false,
|
|
271
|
+
"required": ["start", "end"],
|
|
272
|
+
"properties": {
|
|
273
|
+
"start": {
|
|
274
|
+
"type": "string",
|
|
275
|
+
"pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
|
|
276
|
+
"description": "Window start, 'HH:MM' (24h), local timezone.",
|
|
277
|
+
"examples": ["12:00", "17:00"]
|
|
278
|
+
},
|
|
279
|
+
"end": {
|
|
280
|
+
"type": "string",
|
|
281
|
+
"pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
|
|
282
|
+
"description": "Window end, 'HH:MM' (24h), local timezone. An 'end' earlier than 'start' is treated by the consumer as wrapping past midnight.",
|
|
283
|
+
"examples": ["12:30", "23:59"]
|
|
284
|
+
},
|
|
285
|
+
"label": {
|
|
286
|
+
"type": "string",
|
|
287
|
+
"minLength": 1,
|
|
288
|
+
"maxLength": 80,
|
|
289
|
+
"description": "Optional human-readable label for the window, surfaced in any notice the monitor emits.",
|
|
290
|
+
"examples": ["lunch", "evening", "lecture"]
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
},
|
|
179
295
|
"examples": [
|
|
180
296
|
{
|
|
181
297
|
"identity": {
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adhd-daily-planner
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: Morning brief — what changed overnight, what matters today, one next-action per project.
|
|
5
|
+
neurotypes: ["adhd", "audhd"]
|
|
6
|
+
status: stable
|
|
7
|
+
triggers:
|
|
8
|
+
- command: "/resume monday"
|
|
9
|
+
- command: "/morning-brief"
|
|
10
|
+
- phrase: "what's on today"
|
|
11
|
+
- phrase: "plan my day"
|
|
12
|
+
- phrase: "what should I do today"
|
|
13
|
+
mcp_dependencies:
|
|
14
|
+
- server: mcp-chronometric
|
|
15
|
+
tools: [get_time_context]
|
|
16
|
+
- server: mcp-cognitive-graph
|
|
17
|
+
tools: [weekly_rollup, recall_decisions]
|
|
18
|
+
- server: mcp-task-fractionator
|
|
19
|
+
tools: [next_one]
|
|
20
|
+
profile_dependencies:
|
|
21
|
+
- identity.neurotypes
|
|
22
|
+
- preferences.output_format
|
|
23
|
+
- preferences.max_chunk_size
|
|
24
|
+
- chronometric.end_of_day_local
|
|
25
|
+
license: AGPL-3.0-or-later
|
|
26
|
+
authors:
|
|
27
|
+
- neurodock-core
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# adhd-daily-planner
|
|
31
|
+
|
|
32
|
+
This skill produces a morning brief: what changed overnight in the user's projects, what matters today, and one concrete next-action per project. On Monday it is the full weekly stack. On other weekdays it is a lighter daily-pulse.
|
|
33
|
+
|
|
34
|
+
## Activation criteria
|
|
35
|
+
|
|
36
|
+
Activate when any of the following is true:
|
|
37
|
+
|
|
38
|
+
- The user types `/resume monday` or `/morning-brief`.
|
|
39
|
+
- The user's message contains one of: `what's on today`, `plan my day`, `what should I do today`, `monday morning`.
|
|
40
|
+
- This is the user's first interaction of a new local day AND `preferences.output_format` is `answer_first` (treat as an implicit invitation, not an obligation — see "Do not" below).
|
|
41
|
+
|
|
42
|
+
Do not activate inside a session that has already been running for more than thirty minutes; that conversation has its own context already.
|
|
43
|
+
|
|
44
|
+
## Operating instructions
|
|
45
|
+
|
|
46
|
+
Follow these steps in order. Do not skip steps. Do not improvise additional tool calls.
|
|
47
|
+
|
|
48
|
+
1. **Anchor the day.** Call `mcp-chronometric.get_time_context()`. Note `day_of_week`, `energy_zone`, and `current_session_length`. If `day_of_week` is `Monday`, this is a **weekly brief**. Otherwise it is a **daily-light brief**.
|
|
49
|
+
|
|
50
|
+
2. **Pull the weekly rollup, scoped or unscoped.**
|
|
51
|
+
|
|
52
|
+
- For a weekly brief: call `mcp-cognitive-graph.weekly_rollup()` with no project filter to discover which projects had activity in the trailing seven days. Rank projects by the most recent `decisions[].decided_on` (falling back to most recent `blockers[].recorded_at` when there are no decisions).
|
|
53
|
+
- For a daily-light brief: same call, same ranking.
|
|
54
|
+
- Cap the project list at `preferences.max_chunk_size` (default 5). If more projects had activity, note the count of elided projects in the closing line — do not name them.
|
|
55
|
+
|
|
56
|
+
3. **For each retained project, get its rollup.** Call `mcp-cognitive-graph.weekly_rollup(project=<name>)` once per project. Use the returned `decisions`, `blockers`, and `next_actions` fields verbatim. Do not paraphrase decision names.
|
|
57
|
+
|
|
58
|
+
4. **Decide whether to surface decision detail.** If a project has decisions in the last seven days but `weekly_rollup.next_actions` is empty for that project, call `mcp-cognitive-graph.recall_decisions(project=<name>, since=<thirty days ago>)` once to surface up to two recent decisions that may need follow-up. Skip this call when `next_actions` is already populated.
|
|
59
|
+
|
|
60
|
+
5. **Get one concrete next-action per project.** Call `mcp-task-fractionator.next_one(project=<name>)` for each project. Three outcomes:
|
|
61
|
+
|
|
62
|
+
- Success with `confidence >= 0.7` — quote the task title and the confidence value.
|
|
63
|
+
- Success with `confidence < 0.7` — quote the title and explicitly say "low confidence" with the value. Do not pretend certainty.
|
|
64
|
+
- Error `NO_TASKS_AVAILABLE` — say "no decomposed tasks for this project; consider `decompose` if it's time to plan it." Do not fabricate a task.
|
|
65
|
+
- Any other error — note the error code in the project section and move on.
|
|
66
|
+
|
|
67
|
+
6. **Render the brief.** See "Output format" below.
|
|
68
|
+
|
|
69
|
+
7. **Stop.** Do not propose a calendar rearrangement, a follow-up question, or "shall I start the first task?". The brief is the deliverable.
|
|
70
|
+
|
|
71
|
+
## Output format
|
|
72
|
+
|
|
73
|
+
Strict "Answer First" structure. The first sentence must fit in 80 characters and must name the day's shape in plain prose.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
<One paragraph, ≤ 80 chars in the first sentence, plain prose. State which day it is,
|
|
77
|
+
the brief type (weekly or daily-light), and the count of projects covered. No
|
|
78
|
+
exclamation marks. No "let's crush it" register.>
|
|
79
|
+
|
|
80
|
+
### <Project name>
|
|
81
|
+
- Most recent decision: <decision name> (<decided_on>, conf <confidence>)
|
|
82
|
+
- Blocker: <blocker literal or "none">
|
|
83
|
+
- Next: <next_one.task.title> (<estimated_minutes> min, conf <confidence>)
|
|
84
|
+
|
|
85
|
+
### <Project name>
|
|
86
|
+
- ...
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
Elided <N> further projects with activity this week.
|
|
90
|
+
Energy zone right now: <energy_zone>. End-of-day stated as <chronometric.end_of_day_local>.
|
|
91
|
+
This brief is not a productivity scorecard. Yesterday's incomplete items are not graded.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Rules:
|
|
95
|
+
|
|
96
|
+
- Maximum three bullets per project. If a project has no blocker, write `Blocker: none` — do not invent one.
|
|
97
|
+
- Project sections appear in the order produced by step 2's ranking.
|
|
98
|
+
- Confidence is always rendered as a number with two decimal places, never as a word.
|
|
99
|
+
- The closing block is mandatory. The "not a scorecard" line grounds the LLM and the user.
|
|
100
|
+
|
|
101
|
+
If `weekly_rollup()` returned zero projects in the trailing seven days, emit the empty-graph response instead:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
No projects in the last 30 days. Nothing to brief against.
|
|
105
|
+
|
|
106
|
+
If you'd like to start one, the next step is `mark_session_start(intent=<your intent>)`
|
|
107
|
+
in mcp-chronometric — that anchors today and gives tomorrow's brief something to draw on.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Distress signal handling
|
|
111
|
+
|
|
112
|
+
If the user's invoking message contains overwhelm phrases — `I can't`, `too much`, `everything is on fire`, `I'm stuck`, `exhausted`, `burned out` — reduce the project cap to **3** instead of `preferences.max_chunk_size`, omit the confidence numbers (state "high" / "medium" / "low" instead), and append one sentence to the closing block: `If three is still too many right now, ask for "just one project" and I'll narrow further.` Do not lecture. Do not diagnose.
|
|
113
|
+
|
|
114
|
+
## Do not
|
|
115
|
+
|
|
116
|
+
- Do not use the words "superpower", "crusher", "smash", "let's go", "you got this", "differently abled".
|
|
117
|
+
- Do not enumerate yesterday's incomplete items.
|
|
118
|
+
- Do not compute or display a productivity score.
|
|
119
|
+
- Do not propose calendar buffer transitions unless the user's MCP environment surfaces calendar data through a tool you can call. **Calendar integration is not in scope for v0.1.0 of this skill** — if no calendar tool is wired, omit the "buffer transitions" feature silently.
|
|
120
|
+
- Do not call `next_one` for a project with no decisions and no blockers — that project does not need a next-action surfaced, it needs the user to decide whether to retire it.
|
|
121
|
+
- Do not invent project names. Only use names that came back from `weekly_rollup`.
|
|
122
|
+
- Do not exceed three bullets per project even if more data exists.
|
|
123
|
+
- Do not activate inside an ongoing >30 min session.
|
|
124
|
+
|
|
125
|
+
## What this skill is not
|
|
126
|
+
|
|
127
|
+
It is not a productivity maximiser. It is not a guilt trip about yesterday. It is a once-a-day surface area for projects, decisions, and one tangible next thing.
|
|
128
|
+
|
|
129
|
+
## Examples
|
|
130
|
+
|
|
131
|
+
See `tests/01-monday-morning-brief.md`, `tests/02-empty-graph-fallback.md`, and `tests/03-multi-project-stack.md` for the full invocation traces.
|