@neurodock/cli 0.7.0 → 0.7.2

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.
Files changed (84) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/assets/hooks/neurodock_daemon.py +10 -1
  3. package/dist/assets/hooks/proactive_guardrail.py +2 -0
  4. package/dist/assets/hooks/test_daemon_escape.py +2 -0
  5. package/dist/assets/schemas/plugin.example.yaml +193 -0
  6. package/dist/assets/schemas/plugin.minimal.yaml +30 -0
  7. package/dist/assets/schemas/plugin.schema.json +391 -0
  8. package/dist/assets/schemas/profile.example.yaml +151 -0
  9. package/dist/assets/schemas/profile.minimal.yaml +34 -0
  10. package/dist/assets/schemas/profile.schema.json +211 -0
  11. package/dist/clients/claude-code.d.ts.map +1 -1
  12. package/dist/clients/claude-code.js.map +1 -1
  13. package/dist/clients/claude-desktop.d.ts.map +1 -1
  14. package/dist/clients/claude-desktop.js.map +1 -1
  15. package/dist/clients/cursor.d.ts.map +1 -1
  16. package/dist/clients/cursor.js.map +1 -1
  17. package/dist/clients/index.d.ts.map +1 -1
  18. package/dist/clients/index.js.map +1 -1
  19. package/dist/commands/doctor.d.ts.map +1 -1
  20. package/dist/commands/doctor.js +4 -0
  21. package/dist/commands/doctor.js.map +1 -1
  22. package/dist/commands/examples.d.ts.map +1 -1
  23. package/dist/commands/examples.js +4 -0
  24. package/dist/commands/examples.js.map +1 -1
  25. package/dist/commands/host.d.ts.map +1 -1
  26. package/dist/commands/host.js +4 -0
  27. package/dist/commands/host.js.map +1 -1
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +8 -0
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/install-all.d.ts.map +1 -1
  32. package/dist/commands/install-all.js +4 -0
  33. package/dist/commands/install-all.js.map +1 -1
  34. package/dist/commands/install-hooks.d.ts.map +1 -1
  35. package/dist/commands/install-hooks.js +13 -1
  36. package/dist/commands/install-hooks.js.map +1 -1
  37. package/dist/commands/plugin.d.ts.map +1 -1
  38. package/dist/commands/plugin.js +4 -0
  39. package/dist/commands/plugin.js.map +1 -1
  40. package/dist/commands/profile.d.ts.map +1 -1
  41. package/dist/commands/profile.js +4 -0
  42. package/dist/commands/profile.js.map +1 -1
  43. package/dist/commands/sync.d.ts.map +1 -1
  44. package/dist/commands/sync.js +4 -0
  45. package/dist/commands/sync.js.map +1 -1
  46. package/dist/commands/uninstall.d.ts.map +1 -1
  47. package/dist/commands/uninstall.js +4 -0
  48. package/dist/commands/uninstall.js.map +1 -1
  49. package/dist/commands/update.d.ts.map +1 -1
  50. package/dist/commands/update.js +4 -0
  51. package/dist/commands/update.js.map +1 -1
  52. package/dist/commands/validate.d.ts.map +1 -1
  53. package/dist/commands/validate.js +4 -0
  54. package/dist/commands/validate.js.map +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +4 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/lib/env.d.ts.map +1 -1
  59. package/dist/lib/env.js +4 -0
  60. package/dist/lib/env.js.map +1 -1
  61. package/dist/lib/json-patch.d.ts.map +1 -1
  62. package/dist/lib/json-patch.js.map +1 -1
  63. package/dist/lib/mcp-entries.d.ts.map +1 -1
  64. package/dist/lib/mcp-entries.js +4 -0
  65. package/dist/lib/mcp-entries.js.map +1 -1
  66. package/dist/lib/paths.d.ts.map +1 -1
  67. package/dist/lib/paths.js +4 -0
  68. package/dist/lib/paths.js.map +1 -1
  69. package/dist/lib/plugin-schema.d.ts.map +1 -1
  70. package/dist/lib/plugin-schema.js +7 -0
  71. package/dist/lib/plugin-schema.js.map +1 -1
  72. package/dist/profile/defaults.d.ts.map +1 -1
  73. package/dist/profile/defaults.js +4 -0
  74. package/dist/profile/defaults.js.map +1 -1
  75. package/dist/profile/loader.d.ts.map +1 -1
  76. package/dist/profile/loader.js +4 -0
  77. package/dist/profile/loader.js.map +1 -1
  78. package/dist/profile/validator.d.ts.map +1 -1
  79. package/dist/profile/validator.js +7 -1
  80. package/dist/profile/validator.js.map +1 -1
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +4 -0
  83. package/dist/types.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,391 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.neurodock.org/plugin/v0.1.0/plugin.schema.json",
4
+ "title": "NeuroDock Plugin Manifest",
5
+ "description": "Manifest contract for every plugin discovered under plugins/<name>/plugin.yaml or ~/.neurodock/plugins/<name>/plugin.yaml. Declares plugin type, version, neurotype targeting, dependencies, provided assets, trust level, license, and lifecycle hooks. Forward-compatible: unknown keys at every nesting level MUST be preserved by loaders.",
6
+ "$comment": "Discovery is filesystem-based in v0.1.0: the substrate walks plugins/*/plugin.yaml (in-repo) and $XDG_DATA_HOME/neurodock/plugins/*/plugin.yaml (per-user) at init. The Phase 3 federated registry at plugins.neurodock.org is opt-in and indexes signed manifests; the protocol does NOT depend on a central registry. Loaders MUST preserve unknown top-level and nested keys when round-tripping a manifest so a v0.1.0 install can read and re-emit a v0.2.0 manifest without data loss. Asset paths in `provides[].path` and `hooks.*` are sandboxed: the resolved absolute path MUST remain inside the plugin's directory after normalisation. Symlinks pointing outside the plugin dir MUST be rejected by the loader.",
7
+ "type": "object",
8
+ "additionalProperties": true,
9
+ "required": [
10
+ "schema_version",
11
+ "name",
12
+ "type",
13
+ "version",
14
+ "description",
15
+ "license",
16
+ "trust"
17
+ ],
18
+ "properties": {
19
+ "schema_version": {
20
+ "type": "string",
21
+ "description": "Required. Plugin manifest schema version this file targets. Loaders SHOULD warn but never fail when the version is newer than what they understand; they MUST still load known fields and preserve unknown ones. Use the same semver shape as the profile schema.",
22
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
23
+ "examples": ["0.1.0"]
24
+ },
25
+ "name": {
26
+ "type": "string",
27
+ "description": "Required. Globally unique within the plugin's `type`. Kebab-case, ASCII lowercase, digits, and hyphens. MUST start with a letter. Reverse-DNS prefixes (e.g. 'org-eobrien-') are RECOMMENDED for community plugins to avoid collisions; not enforced in v0.1.0 to keep contribution friction low.",
28
+ "pattern": "^[a-z][a-z0-9-]{1,62}[a-z0-9]$",
29
+ "minLength": 3,
30
+ "maxLength": 64,
31
+ "examples": ["ie-corporate-translation", "adhd-pomodoro", "mcp-calendar"]
32
+ },
33
+ "type": {
34
+ "type": "string",
35
+ "description": "Required. Plugin type. Six values in v0.1.0. New types are an ADDITIVE forward-compat change (no major bump); v0.1.0 loaders encountering an unknown type MUST skip the plugin with a structured 'unknown_plugin_type' warning rather than erroring.",
36
+ "enum": [
37
+ "skill",
38
+ "mcp-server",
39
+ "profile",
40
+ "translation-pack",
41
+ "language-pack",
42
+ "theme"
43
+ ],
44
+ "examples": ["language-pack", "skill"]
45
+ },
46
+ "version": {
47
+ "type": "string",
48
+ "description": "Required. Plugin version. Strict semver (no pre-release qualifiers in v0.1.0). Patch and minor bumps within v0.1.x MUST be additive-only; renames, removals, and required-field additions are major bumps.",
49
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
50
+ "examples": ["0.2.1", "1.0.0"]
51
+ },
52
+ "description": {
53
+ "type": "string",
54
+ "description": "Required. One-sentence human description shown in plugin listings. Must not make clinical claims (per ETHICS commitment 1).",
55
+ "minLength": 10,
56
+ "maxLength": 280,
57
+ "examples": [
58
+ "Hiberno-English to neutral corporate English translation prompts for ND professionals."
59
+ ]
60
+ },
61
+ "authors": {
62
+ "type": "array",
63
+ "description": "Optional. Plugin authors. At least one entry with role 'maintainer' is RECOMMENDED for community plugins so the substrate can surface a contact in trust prompts. Empty / absent is acceptable for in-repo first-party plugins authored by the maintainer.",
64
+ "minItems": 0,
65
+ "items": {
66
+ "type": "object",
67
+ "additionalProperties": true,
68
+ "required": ["name"],
69
+ "properties": {
70
+ "name": {
71
+ "type": "string",
72
+ "minLength": 1,
73
+ "maxLength": 120,
74
+ "description": "Display name or handle."
75
+ },
76
+ "handle": {
77
+ "type": "string",
78
+ "maxLength": 64,
79
+ "description": "Optional. GitHub-style '@handle' (or other platform-prefixed handle).",
80
+ "examples": ["@eobrien"]
81
+ },
82
+ "email": {
83
+ "type": "string",
84
+ "format": "email",
85
+ "description": "Optional. Contact email. Plugins published through the federated registry MAY omit this; in-repo plugins SHOULD omit it (use the GitHub handle instead). Never required."
86
+ },
87
+ "role": {
88
+ "type": "string",
89
+ "enum": ["maintainer", "contributor", "reviewer"],
90
+ "default": "contributor",
91
+ "description": "Role in this plugin's authorship. 'maintainer' = accepts issues, signs releases; 'contributor' = wrote part of it; 'reviewer' = clinical or who signed off."
92
+ }
93
+ }
94
+ }
95
+ },
96
+ "neurotypes": {
97
+ "type": "array",
98
+ "description": "Subset of the values allowed by profile.identity.neurotypes that this plugin targets. The substrate auto-activates a plugin only when this array intersects the user's profile.identity.neurotypes (non-empty intersection). Empty array (the default when omitted) means the plugin is neurotype-agnostic and auto-activates for every user.",
99
+ "minItems": 0,
100
+ "uniqueItems": true,
101
+ "items": {
102
+ "type": "string",
103
+ "enum": [
104
+ "adhd",
105
+ "asd",
106
+ "audhd",
107
+ "ocd",
108
+ "dyslexia",
109
+ "dyspraxia",
110
+ "tourette",
111
+ "other"
112
+ ]
113
+ },
114
+ "default": [],
115
+ "examples": [["adhd"], ["adhd", "audhd"], []]
116
+ },
117
+ "locale": {
118
+ "type": "array",
119
+ "description": "BCP 47 locale tags this plugin targets. REQUIRED for type 'language-pack' and 'translation-pack' (loader rejects manifest when empty for those types); ignored for other types. Substrate prefers locale-matched plugins over locale-agnostic ones when both apply.",
120
+ "minItems": 0,
121
+ "uniqueItems": true,
122
+ "items": {
123
+ "type": "string",
124
+ "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{2,4})*(-[a-zA-Z0-9]{1,8})*$"
125
+ },
126
+ "examples": [["en-IE", "en-GB"], ["ja-JP"], ["de-DE"]]
127
+ },
128
+ "requires": {
129
+ "type": "object",
130
+ "description": "Optional. Hard runtime requirements. The substrate refuses to activate the plugin when any requirement is unmet; refusal is loud (structured warning + log entry) rather than silent. Circular requirement chains (A requires B requires A) MUST be detected at load time and reported via the 'plugin_requirement_cycle' error.",
131
+ "additionalProperties": true,
132
+ "properties": {
133
+ "substrate_version": {
134
+ "type": "string",
135
+ "description": "Required substrate (`@neurodock/core`) version range. Standard semver-range syntax (`>=`, `<`, `~`, `^`, `||`). Defaults to '>=0.1.0' when omitted.",
136
+ "examples": [">=0.1.0", ">=0.1.0 <0.3.0"]
137
+ },
138
+ "mcp_servers": {
139
+ "type": "array",
140
+ "description": "MCP servers the plugin's assets call into. Each entry is matched against the substrate's installed-server registry by name; the version range is matched against the server's package version.",
141
+ "items": {
142
+ "type": "object",
143
+ "additionalProperties": true,
144
+ "required": ["name"],
145
+ "properties": {
146
+ "name": {
147
+ "type": "string",
148
+ "description": "MCP server name as published, e.g. 'mcp-translation'.",
149
+ "examples": ["mcp-translation", "mcp-cognitive-graph"]
150
+ },
151
+ "version": {
152
+ "type": "string",
153
+ "description": "Semver range. Defaults to '>=0.1.0' when omitted.",
154
+ "examples": [">=0.1.0"]
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "skills": {
160
+ "type": "array",
161
+ "description": "Other skills this plugin depends on at runtime (by skill name as declared in the depended-on skill's SKILL.md frontmatter or plugin.yaml `name`).",
162
+ "items": {
163
+ "type": "object",
164
+ "additionalProperties": true,
165
+ "required": ["name"],
166
+ "properties": {
167
+ "name": {
168
+ "type": "string",
169
+ "examples": ["adhd-daily-planner"]
170
+ },
171
+ "version": {
172
+ "type": "string",
173
+ "examples": [">=0.1.0"]
174
+ }
175
+ }
176
+ }
177
+ },
178
+ "plugins": {
179
+ "type": "array",
180
+ "description": "Other plugins this plugin depends on. By `name` (and optional `type` disambiguator when the name is reused across types). Circular `requires.plugins` chains are rejected at load.",
181
+ "items": {
182
+ "type": "object",
183
+ "additionalProperties": true,
184
+ "required": ["name"],
185
+ "properties": {
186
+ "name": { "type": "string" },
187
+ "type": {
188
+ "type": "string",
189
+ "enum": [
190
+ "skill",
191
+ "mcp-server",
192
+ "profile",
193
+ "translation-pack",
194
+ "language-pack",
195
+ "theme"
196
+ ]
197
+ },
198
+ "version": { "type": "string" }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ },
204
+ "provides": {
205
+ "type": "array",
206
+ "description": "Assets this plugin exposes to the substrate. Every entry has an `id` (unique within the manifest), a sub-`type` describing what kind of asset it is, and a `path` relative to the plugin's directory. Paths are sandboxed: after normalisation the resolved absolute path MUST remain inside the plugin's directory; '..' traversal and absolute paths are rejected by the loader.",
207
+ "minItems": 0,
208
+ "items": {
209
+ "type": "object",
210
+ "additionalProperties": true,
211
+ "required": ["type", "id", "path"],
212
+ "properties": {
213
+ "type": {
214
+ "type": "string",
215
+ "description": "Asset sub-type. The substrate dispatches discovery on this value: 'skill' → registered with the skill loader; 'mcp-server-binary' → registered with the MCP supervisor; 'translation-prompt' → registered with mcp-translation's prompt library; 'language-prompt-override' → shadows the matching default prompt for the manifest's `locale`; 'profile-preset' → exposed under `profiles/presets/`; 'theme-bundle' → registered with the design system. Unknown values are preserved on round-trip but skipped by the registrar with a structured 'unknown_asset_type' warning.",
216
+ "enum": [
217
+ "skill",
218
+ "mcp-server-binary",
219
+ "translation-prompt",
220
+ "language-prompt-override",
221
+ "profile-preset",
222
+ "theme-bundle"
223
+ ]
224
+ },
225
+ "id": {
226
+ "type": "string",
227
+ "description": "Identifier unique within this manifest's `provides[]`. Kebab-case. The substrate exposes the asset under '<plugin.name>/<provides.id>'.",
228
+ "pattern": "^[a-z][a-z0-9-]{0,62}[a-z0-9]$",
229
+ "examples": ["translate-hiberno-direct", "tone-keigo-customer"]
230
+ },
231
+ "path": {
232
+ "type": "string",
233
+ "description": "Path to the asset, RELATIVE to the plugin directory. MUST start with './' or a non-leading-slash subdirectory. Loader normalises and rejects any path resolving outside the plugin directory or pointing through a symlink that does so.",
234
+ "pattern": "^(\\./)?[^/\\\\][^\\\\:*?\"<>|]*$",
235
+ "examples": [
236
+ "./prompts/translate-hiberno-direct.md",
237
+ "prompts/tone-warm.md"
238
+ ]
239
+ },
240
+ "applies_to": {
241
+ "type": "object",
242
+ "description": "Optional. Activation predicate for this specific asset, evaluated against the user's profile. Defaults to inheriting the manifest-level `neurotypes` + `locale`. An asset's predicate, when present, overrides the manifest-level intersection for that asset only.",
243
+ "additionalProperties": true,
244
+ "properties": {
245
+ "neurotypes": {
246
+ "type": "array",
247
+ "uniqueItems": true,
248
+ "items": { "type": "string" }
249
+ },
250
+ "locale": {
251
+ "type": "array",
252
+ "uniqueItems": true,
253
+ "items": { "type": "string" }
254
+ }
255
+ }
256
+ }
257
+ }
258
+ }
259
+ },
260
+ "trust": {
261
+ "type": "object",
262
+ "description": "Required. Provenance and trust declaration. Four-tier ladder. 'official' (NeuroDock Maintainer-published) and 'verified' (signed by a verified contributor whose key sits in the maintainer-maintained keyring) install without user prompting. 'community' (author-signed; provenance recorded but not vouched) and 'experimental' (unsigned) prompt the user per profile preference. The substrate's default profile setting is 'prompt for community, refuse for experimental'.",
263
+ "additionalProperties": true,
264
+ "required": ["level"],
265
+ "properties": {
266
+ "level": {
267
+ "type": "string",
268
+ "enum": ["official", "verified", "community", "experimental"],
269
+ "description": "Trust tier. See trust ladder above."
270
+ },
271
+ "signature": {
272
+ "type": "string",
273
+ "description": "Optional in v0.1.0; required for 'official' and 'verified' once signature verification ships in Phase 3. ASCII-armored PGP detached signature over sha256(plugin.yaml + concatenation of provides[].path file contents in declaration order). Verification implementation is deferred; v0.1.0 schemas reserve the field and store it on round-trip.",
274
+ "examples": ["-----BEGIN PGP SIGNATURE----- ..."]
275
+ },
276
+ "keyring_fingerprint": {
277
+ "type": "string",
278
+ "description": "Optional. PGP fingerprint of the key that produced `signature`. Lets the substrate look the key up in the maintainer keyring (for 'verified') or in a local trust-on-first-use store (for 'community').",
279
+ "pattern": "^[A-F0-9 ]{40,60}$",
280
+ "examples": ["A1B2 C3D4 E5F6 7890 1234 5678 9ABC DEF0 1234 5678"]
281
+ },
282
+ "source_url": {
283
+ "type": "string",
284
+ "format": "uri",
285
+ "description": "Required for 'community' and 'experimental'. URL of the canonical source the user can audit before trusting the plugin (typically the public repository).",
286
+ "examples": ["https://github.com/eobrien/ie-corporate-translation"]
287
+ }
288
+ }
289
+ },
290
+ "license": {
291
+ "type": "string",
292
+ "description": "Required. SPDX license identifier. v0.1.0 whitelist enforces AGPL-3.0-or-later-compatible licenses ONLY. Plugins with a non-listed license refuse to load and surface a 'license_not_allowed' error. The whitelist is conservative on purpose: the substrate is AGPL-3.0-or-later and plugins are distributed alongside it, so we keep license boundaries clean. The whitelist may be extended in additive minor bumps via ADR.",
293
+ "enum": [
294
+ "AGPL-3.0-or-later",
295
+ "AGPL-3.0-only",
296
+ "GPL-3.0-or-later",
297
+ "GPL-3.0-only",
298
+ "LGPL-3.0-or-later",
299
+ "MIT",
300
+ "Apache-2.0",
301
+ "BSD-3-Clause",
302
+ "BSD-2-Clause",
303
+ "ISC",
304
+ "MPL-2.0",
305
+ "CC0-1.0"
306
+ ],
307
+ "examples": ["AGPL-3.0-or-later", "MIT"]
308
+ },
309
+ "homepage": {
310
+ "type": "string",
311
+ "format": "uri",
312
+ "description": "Optional. Public homepage for the plugin (project page, docs site, etc.)."
313
+ },
314
+ "repository": {
315
+ "type": "string",
316
+ "format": "uri",
317
+ "description": "Optional. Source-code repository. RECOMMENDED for any plugin with trust level 'community' or 'experimental' so users can audit the source."
318
+ },
319
+ "keywords": {
320
+ "type": "array",
321
+ "description": "Optional. Discovery keywords. Federated registry surfaces these in search.",
322
+ "items": { "type": "string", "maxLength": 32 },
323
+ "maxItems": 16,
324
+ "examples": [["translation", "hiberno-english", "corporate"]]
325
+ },
326
+ "hooks": {
327
+ "type": "object",
328
+ "description": "Optional. Lifecycle hooks. Constrained: hooks may invoke ONLY shell scripts shipped inside the plugin directory, and those scripts run under an allow-list of operations (read-only filesystem access inside the plugin dir; no network; no writes outside the plugin dir; no privilege escalation; no fork/exec of unallowed binaries). The substrate's hook executor enforces the sandbox; manifests that declare hooks but whose scripts violate the allow-list at runtime have their hooks aborted and a structured 'hook_sandbox_violation' error logged. v0.1.0 ships with an executor that simply REFUSES to run hooks unless trust.level in {'official', 'verified'}; community plugins MAY declare hooks but they will be ignored until the sandbox lands in Phase 3.",
329
+ "additionalProperties": true,
330
+ "properties": {
331
+ "on_install": {
332
+ "type": "string",
333
+ "description": "Path (relative to plugin directory) to a shell script run once after plugin discovery. Same sandboxing as `provides[].path`. Idempotent: the substrate may re-run on_install if the previous run failed or if the plugin version changed.",
334
+ "pattern": "^(\\./)?[^/\\\\][^\\\\:*?\"<>|]*$",
335
+ "examples": ["./install.sh"]
336
+ },
337
+ "on_uninstall": {
338
+ "type": "string",
339
+ "description": "Path to a shell script run before plugin removal. Same sandboxing as `on_install`. The substrate runs the hook even when the user is uninstalling because a previous install failed.",
340
+ "pattern": "^(\\./)?[^/\\\\][^\\\\:*?\"<>|]*$"
341
+ }
342
+ }
343
+ },
344
+ "compatibility": {
345
+ "type": "object",
346
+ "description": "Optional. Forward-compatibility declarations. Reserved for future use; v0.1.0 loaders ignore unknown sub-keys but preserve them on round-trip.",
347
+ "additionalProperties": true
348
+ }
349
+ },
350
+ "examples": [
351
+ {
352
+ "schema_version": "0.1.0",
353
+ "name": "ie-corporate-translation",
354
+ "type": "language-pack",
355
+ "version": "0.2.1",
356
+ "description": "Hiberno-English to neutral corporate English translation prompts for ND professionals.",
357
+ "authors": [
358
+ { "name": "Eoin O'Brien", "handle": "@eobrien", "role": "maintainer" }
359
+ ],
360
+ "neurotypes": ["adhd", "audhd", "asd"],
361
+ "locale": ["en-IE", "en-GB"],
362
+ "requires": {
363
+ "substrate_version": ">=0.1.0",
364
+ "mcp_servers": [{ "name": "mcp-translation", "version": ">=0.1.0" }]
365
+ },
366
+ "provides": [
367
+ {
368
+ "type": "language-prompt-override",
369
+ "id": "translate-incoming-en-ie",
370
+ "path": "./prompts/translate-incoming.md"
371
+ }
372
+ ],
373
+ "trust": {
374
+ "level": "community",
375
+ "source_url": "https://github.com/eobrien/ie-corporate-translation"
376
+ },
377
+ "license": "AGPL-3.0-or-later",
378
+ "repository": "https://github.com/eobrien/ie-corporate-translation",
379
+ "keywords": ["translation", "hiberno-english", "corporate"]
380
+ },
381
+ {
382
+ "schema_version": "0.1.0",
383
+ "name": "minimal-example",
384
+ "type": "skill",
385
+ "version": "0.1.0",
386
+ "description": "Minimal valid plugin manifest example.",
387
+ "trust": { "level": "official" },
388
+ "license": "AGPL-3.0-or-later"
389
+ }
390
+ ]
391
+ }
@@ -0,0 +1,151 @@
1
+ # ==============================================================================
2
+ # WELCOME TO YOUR NEURODOCK PROFILE
3
+ # ==============================================================================
4
+ # Think of this as a quick instruction manual to teach the app how your brain works.
5
+ #
6
+ # TIPS FOR FILLING THIS OUT:
7
+ # - Take your time. You don't have to finish it all at once.
8
+ # - Almost everything is OPTIONAL. If you aren't sure, just leave it as is.
9
+ # - Your data is safe. Nothing leaves your computer without your permission.
10
+ # - You can always come back and change these later. You can't break anything.
11
+ #
12
+ # Where does this file live?
13
+ # ~/.neurodock/profile.yaml (your machine, your private copy)
14
+ #
15
+ # How to check it's valid after editing:
16
+ # neurodock profile validate
17
+ # ==============================================================================
18
+
19
+ # Leave this exactly as "0.1.0". It just helps the app read this file.
20
+ schema_version: "0.1.0"
21
+
22
+ # ------------------------------------------------------------------------------
23
+ # 1. WHO YOU ARE (Required)
24
+ # ------------------------------------------------------------------------------
25
+ identity:
26
+ # What should we call you? A nickname or even just a single letter is totally fine.
27
+ display_name: "T"
28
+
29
+ # Which of these describe you?
30
+ # Self-ID is enough — you do NOT need a diagnosis to use any feature.
31
+ # Skills targeted at a neurotype activate when the tag appears here.
32
+ # Allowed: adhd | asd | audhd | ocd | dyslexia | dyspraxia | tourette | other
33
+ neurotypes:
34
+ - "adhd"
35
+ - "asd"
36
+
37
+ # Is there anything else you want the app to know about how to talk to you?
38
+ # (For example: "I get overwhelmed by long paragraphs" or "Please be direct".)
39
+ # Only surfaced when a skill explicitly asks; never logged or transmitted.
40
+ # additional_notes: "sensory-sensitive to motion; prefers terse output"
41
+
42
+ # ------------------------------------------------------------------------------
43
+ # 2. HOW YOU LIKE TO READ & WORK (Optional)
44
+ # ------------------------------------------------------------------------------
45
+ preferences:
46
+ # How do you want the AI to structure its answers?
47
+ # Options:
48
+ # answer_first — verdict first, reasoning after. Good for ADHD triage.
49
+ # conventional — explanation first, then verdict.
50
+ # bullet_first — verdict as a bullet list.
51
+ output_format: "answer_first"
52
+
53
+ # Max items shown in any list / group / step sequence.
54
+ # Range 1..20. Default 7 (Miller's number).
55
+ # 5 is the ADHD-tuned manifesto value — change to your comfort.
56
+ max_chunk_size: 5
57
+
58
+ # Which font style is easiest for your eyes?
59
+ # Options:
60
+ # atkinson_hyperlegible — evidence-based for dyslexia (default)
61
+ # lexend — evidence-based for ADHD readability
62
+ # system_default — your OS choice
63
+ reading_font_hint: "atkinson_hyperlegible"
64
+
65
+ # Do you want visual animations turned on?
66
+ # Options:
67
+ # reduced — no animations (default; safest for vestibular sensitivity)
68
+ # system — match your OS prefers-reduced-motion setting
69
+ # full — animations on
70
+ motion: "reduced"
71
+
72
+ # ------------------------------------------------------------------------------
73
+ # 3. TIME & FOCUS ALERTS (Optional)
74
+ # ------------------------------------------------------------------------------
75
+ # Helps if you tend to hyperfocus or lose track of time.
76
+ chronometric:
77
+ # How many minutes of straight work before we gently remind you to take a break?
78
+ # Range 15..240. Default 90.
79
+ # The 60/+30/+60 escalation ladder shape itself is fixed; this only
80
+ # re-anchors the 'nudge' rung in the ladder.
81
+ hyperfocus_break_minutes: 90
82
+
83
+ # What time do you want to officially "clock out" for the day?
84
+ # 24-hour clock (e.g. "18:30" for 6:30 PM, "22:00" for 10 PM).
85
+ # When set, the hyperfocus nudge gets stricter after this time.
86
+ end_of_day_local: "18:30"
87
+
88
+ # (Advanced) Re-draw your personal energy bands during the day.
89
+ # Leave commented out unless you specifically want to override
90
+ # the default clock-band heuristic.
91
+ # zones:
92
+ # morning_peak: "06:00-10:30"
93
+ # afternoon_dip: "14:00-16:00"
94
+
95
+ # What should the app do if you start a new work session but forgot
96
+ # to close your last one?
97
+ # Options:
98
+ # auto_close — safely closes the old one for you (default, charitable)
99
+ # error — stops and tells you the old session is still open
100
+ session_overlap_policy: "auto_close"
101
+
102
+ # ------------------------------------------------------------------------------
103
+ # 4. GENTLE NUDGES (Optional)
104
+ # ------------------------------------------------------------------------------
105
+ # Helps the app notice if you are getting stuck in a loop or overthinking.
106
+ # Heuristics are public and auditable in ETHICS.md; detection never blocks
107
+ # silently.
108
+ guardrails:
109
+ # How many semantically-similar questions in the window before we gently
110
+ # check in on you?
111
+ # Range 1..20. Default 3.
112
+ rumination_threshold: 3
113
+
114
+ # Over how many minutes do we count those repeated questions?
115
+ # Range 5..1440. Default 90.
116
+ rumination_window_minutes: 90
117
+
118
+ # Should we warn you if the AI is just agreeing with you too much instead
119
+ # of being helpful?
120
+ # Options:
121
+ # off — never flag sycophancy
122
+ # warn — flag it, you decide (default)
123
+ # refuse — refuse to send the over-validating draft
124
+ sycophancy_check: "warn"
125
+
126
+ # ------------------------------------------------------------------------------
127
+ # 5. PRIVACY (Optional)
128
+ # ------------------------------------------------------------------------------
129
+ # You are in complete control. By default, everything stays on your computer.
130
+ privacy:
131
+ # Where should the cognitive-graph compute embeddings (for fuzzy recall)?
132
+ # Options:
133
+ # local — on your machine (default; uses fastembed)
134
+ # cloud_voyage — Voyage AI (opt-in; triggers a visible "cloud" notice)
135
+ # cloud_openai — OpenAI embeddings (opt-in)
136
+ embeddings: "local"
137
+
138
+ # Do you want to send anonymous crash/bug reports to help improve the app?
139
+ # Options:
140
+ # off — nothing collected (default)
141
+ # local_otel_only — local-only OpenTelemetry traces; nothing leaves
142
+ # full — reserved for a future ADR; do not use yet
143
+ telemetry: "off"
144
+
145
+ # Can the app check if your computer mouse/keyboard has been completely
146
+ # still? This helps it automatically pause your focus timers if you walk
147
+ # away from your desk.
148
+ # Options:
149
+ # false — no (default; idle_status returns consent_granted=false)
150
+ # true — yes, share OS idle time with the chronometric server
151
+ os_idle_consent: false
@@ -0,0 +1,34 @@
1
+ # ==============================================================================
2
+ # YOUR NEURODOCK PROFILE — minimal starter
3
+ # ==============================================================================
4
+ # This is the smallest valid profile. The app fills in safe defaults for
5
+ # everything else. Open profile.example.yaml if you want to see all the
6
+ # knobs you CAN tune.
7
+ #
8
+ # Safe defaults applied when you leave the other blocks out:
9
+ # preferences.output_format = "answer_first"
10
+ # preferences.max_chunk_size = 7
11
+ # preferences.reading_font_hint = "atkinson_hyperlegible"
12
+ # preferences.motion = "reduced"
13
+ # chronometric.hyperfocus_break_minutes = 90
14
+ # chronometric.session_overlap_policy = "auto_close"
15
+ # guardrails.rumination_threshold = 3
16
+ # guardrails.rumination_window_minutes = 90
17
+ # guardrails.sycophancy_check = "warn"
18
+ # privacy.embeddings = "local"
19
+ # privacy.telemetry = "off"
20
+ # privacy.os_idle_consent = false
21
+ #
22
+ # To check it's valid after editing: neurodock profile validate
23
+ # ==============================================================================
24
+
25
+ identity:
26
+ # What should we call you? A nickname or even just a single letter is fine.
27
+ display_name: "your-name"
28
+
29
+ # Which of these describe you?
30
+ # Self-ID is enough — no diagnosis required.
31
+ # Any subset of: adhd | asd | audhd | ocd | dyslexia | dyspraxia | tourette | other
32
+ # An empty list [] is valid and opts out of neurotype-tagged skill activation.
33
+ neurotypes:
34
+ - "adhd"