@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # @neurodock/cli changelog
2
2
 
3
+ ## 0.7.2
4
+
5
+ ### Fixed — `npx @neurodock/cli install-all` failed on `init` with "Could not locate template: profile.example.yaml"
6
+
7
+ The 0.7.x tarball only shipped `dist/`, but `init`, `validate`, and
8
+ `plugin validate` all resolved their templates and JSON schemas through
9
+ relative paths into the workspace `packages/core/schemas/` folder. That
10
+ folder is not part of the cli tarball, so every fresh `npx` install
11
+ failed the moment `install-all` finished wiring the MCP servers and
12
+ tried to scaffold a profile.
13
+
14
+ Fix: `scripts/copy-assets.mjs` now also copies `packages/core/schemas/`
15
+ into `dist/assets/schemas/` at build time, and the three resolvers
16
+ (`commands/init.ts`, `profile/validator.ts`, `lib/plugin-schema.ts`)
17
+ check that bundled location first before falling back to the workspace
18
+ candidates used during local development. No behaviour change in the
19
+ monorepo; published tarball now contains the schemas required by every
20
+ first-run code path.
21
+
22
+ ## 0.7.1
23
+
24
+ ### Fixed — Windows: daemon autostart no longer flashes a black console window
25
+
26
+ The 0.7.0 HKCU Run entry used `python.exe` (console subsystem) which
27
+ flashed a visible terminal window on every Windows login. Switched to
28
+ `pythonw.exe` (windows subsystem — same interpreter, no console).
29
+ The post-install detached spawn in `install-hooks` does the same and
30
+ also passes `windowsHide: true` on the spawn options. No behavioural
31
+ change on macOS or Linux. Existing 0.7.0 installs should re-run
32
+ `neurodock install-hooks --install-daemon` to refresh the Run entry.
33
+
3
34
  ## 0.7.0
4
35
 
5
36
  ### Fixed — proactive-guardrail wiring after 2026-05-26 silent-failure incident
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+ # Copyright (c) 2026 NeuroDock contributors.
2
4
  """NeuroDock proactive-guardrail daemon (Phase 3).
3
5
 
4
6
  A long-running poller that watches the same state files the Phase 1
@@ -342,7 +344,14 @@ def _uninstall_autostart() -> int:
342
344
  def _install_windows_autostart(daemon_script: Path) -> int:
343
345
  # Register an HKCU Run entry so the daemon launches at user logon.
344
346
  # No admin rights required.
345
- cmd = f'python "{str(daemon_script).replace(chr(92), "/")}" run'
347
+ #
348
+ # Use `pythonw.exe` (windows-subsystem) not `python.exe` (console-
349
+ # subsystem) so the daemon runs invisibly. With `python.exe` the
350
+ # Run-key launch flashes a black console window on every login
351
+ # because the binary is linked against the console subsystem.
352
+ # `pythonw.exe` ships alongside `python.exe` in every Windows
353
+ # Python install — same interpreter, same site-packages, no console.
354
+ cmd = f'pythonw "{str(daemon_script).replace(chr(92), "/")}" run'
346
355
  try:
347
356
  subprocess.run(
348
357
  [
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+ # Copyright (c) 2026 NeuroDock contributors.
2
4
  """NeuroDock proactive guardrail — Claude Code hook (self-contained).
3
5
 
4
6
  Bundled with `@neurodock/cli`; copied to `~/.neurodock/hooks/` by
@@ -1,3 +1,5 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # Copyright (c) 2026 NeuroDock contributors.
1
3
  """Tests for the M5 notification-text escape functions in neurodock_daemon.py.
2
4
 
3
5
  Security regression test: verify that shell-injection characters in title/
@@ -0,0 +1,193 @@
1
+ # ==============================================================================
2
+ # WELCOME — THIS IS A WORKED EXAMPLE OF A PLUGIN MANIFEST
3
+ # ==============================================================================
4
+ # Plugins are how NeuroDock grows without us having to change the core. This
5
+ # file shows every field you can put in your own plugin's "plugin.yaml" file.
6
+ #
7
+ # You don't need to use every field. Most of them are optional. Copy this
8
+ # file as a starting point and delete anything you don't need.
9
+ #
10
+ # WHERE THE CONTRACT LIVES (for the curious):
11
+ # packages/core/schemas/plugin.schema.json — the machine-checkable rules
12
+ # docs/decisions/0007-plugin-protocol.md — the "why" behind the rules
13
+ #
14
+ # HOW PLUGINS GET FOUND:
15
+ # When NeuroDock starts, it looks in two places for plugins:
16
+ # 1. plugins/<your-plugin>/plugin.yaml (lives inside this repo)
17
+ # 2. ~/.local/share/neurodock/plugins/<your-plugin>/plugin.yaml
18
+ # (lives on your own computer, just for you)
19
+ # No central server. No sign-up. No registry to publish to.
20
+ #
21
+ # WILL UPGRADING BREAK MY PLUGIN?
22
+ # No. If we add new fields in a future version, older versions of NeuroDock
23
+ # will leave them alone instead of stripping them out. You can edit your
24
+ # plugin on a new install, swap back to an old one, and not lose anything.
25
+ # ==============================================================================
26
+
27
+ # Leave this as "0.1.0". It just tells NeuroDock which version of the plugin
28
+ # format you're using. If you're newer than NeuroDock, you'll get a warning,
29
+ # not an error.
30
+ schema_version: "0.1.0"
31
+
32
+ # ------------------------------------------------------------------------------
33
+ # 1. WHO THIS PLUGIN IS (Required)
34
+ # ------------------------------------------------------------------------------
35
+ # A short, unique name. Lowercase, dashes between words.
36
+ # Tip: starting it with your handle (e.g. "org-eobrien-...") helps avoid
37
+ # clashes with other contributors' plugins. Not required.
38
+ name: "ie-corporate-translation"
39
+
40
+ # What kind of plugin is this? Pick one:
41
+ # skill — adds a Claude skill (a markdown file with triggers)
42
+ # mcp-server — adds a new MCP server with new tools
43
+ # profile — adds a profile preset users can copy
44
+ # translation-pack — adds translation prompts for a domain (legal, sales...)
45
+ # language-pack — adds prompts for a non-US-English workplace culture
46
+ # theme — adds a visual theme for UI surfaces
47
+ type: "language-pack"
48
+
49
+ # Your plugin's version number. Use semver (e.g. "0.2.1"). Bumping the
50
+ # patch (third) number means "small fix, nothing broke". Bumping the minor
51
+ # (middle) means "added a new feature, nothing broke". Bumping the major
52
+ # (first) means "I changed something that might break people". Try not to
53
+ # bump the major in 0.1.x unless you really have to.
54
+ version: "0.2.1"
55
+
56
+ # A one-sentence description of what this plugin does. This is what people
57
+ # see in plugin listings. Don't make clinical claims here — say what the
58
+ # plugin DOES, not what it TREATS.
59
+ description: "Hiberno-English to neutral corporate English for ND professionals — direct decoding of indirect Irish workplace register without flattening voice."
60
+
61
+ # ------------------------------------------------------------------------------
62
+ # 2. WHO MADE IT (Optional but appreciated)
63
+ # ------------------------------------------------------------------------------
64
+ # Listing at least one maintainer helps when something needs fixing.
65
+ # "role" is whatever makes sense — maintainer, reviewer, lived-experience reviewer.
66
+ authors:
67
+ - name: "Eoin O'Brien"
68
+ handle: "@eobrien"
69
+ role: "maintainer"
70
+ - name: "Síofra Ní Bhriain"
71
+ handle: "@sionb"
72
+ role: "reviewer" # lived-experience reviewer
73
+
74
+ # ------------------------------------------------------------------------------
75
+ # 3. WHO IS THIS PLUGIN FOR? (Optional)
76
+ # ------------------------------------------------------------------------------
77
+ # Which neurotypes does this plugin help? Leave the list empty (or remove
78
+ # this block) if it works for everyone — most plugins do.
79
+ #
80
+ # If a user's profile lists any of these neurotypes, NeuroDock turns this
81
+ # plugin on for them automatically. If not, they can still turn it on by
82
+ # hand — your plugin isn't blocked, just not on by default.
83
+ neurotypes:
84
+ - "adhd"
85
+ - "audhd"
86
+ - "asd"
87
+
88
+ # Which spoken-language / workplace cultures is this plugin for?
89
+ # REQUIRED if type is "language-pack" or "translation-pack".
90
+ # Use BCP 47 tags ("en-IE" = Irish English, "ja-JP" = Japanese, etc.)
91
+ locale:
92
+ - "en-IE"
93
+ - "en-GB" # Irish-English register often shows up in UK workplaces too
94
+
95
+ # ------------------------------------------------------------------------------
96
+ # 4. WHAT THIS PLUGIN NEEDS TO RUN (Optional)
97
+ # ------------------------------------------------------------------------------
98
+ # If your plugin needs a specific version of NeuroDock or another MCP server,
99
+ # say so here. NeuroDock will skip loading your plugin (cleanly) if any of
100
+ # these aren't around.
101
+ requires:
102
+ substrate_version: ">=0.1.0"
103
+ mcp_servers:
104
+ - name: "mcp-translation"
105
+ version: ">=0.1.0"
106
+ skills: []
107
+ plugins: []
108
+
109
+ # ------------------------------------------------------------------------------
110
+ # 5. WHAT YOUR PLUGIN PROVIDES
111
+ # ------------------------------------------------------------------------------
112
+ # This is the actual content your plugin ships. Each entry points at a file
113
+ # inside your plugin's directory. All paths are relative — your plugin can't
114
+ # reach outside its own folder. That's a deliberate safety rule.
115
+ provides:
116
+ - type: "language-prompt-override"
117
+ id: "translate-incoming-en-ie"
118
+ path: "./prompts/translate-incoming.md"
119
+ # You can narrow when a single file applies, separate from the
120
+ # whole-plugin neurotypes/locale settings above.
121
+ applies_to:
122
+ locale: ["en-IE", "en-GB"]
123
+
124
+ - type: "language-prompt-override"
125
+ id: "check-tone-en-ie"
126
+ path: "./prompts/check-tone.md"
127
+
128
+ - type: "language-prompt-override"
129
+ id: "brief-meeting-en-ie"
130
+ path: "./prompts/brief-meeting.md"
131
+
132
+ - type: "translation-prompt"
133
+ id: "decode-grand"
134
+ path: "./prompts/idioms/decode-grand.md"
135
+ # "Grand" in Hiberno-English can mean anything from "excellent" to
136
+ # "this is not fine and we are not going to discuss it further." It
137
+ # earns its own prompt.
138
+
139
+ # ------------------------------------------------------------------------------
140
+ # 6. WHERE THIS PLUGIN CAME FROM (Required)
141
+ # ------------------------------------------------------------------------------
142
+ # This is the "trust" block. It tells NeuroDock how much social process has
143
+ # touched this plugin so it knows whether to prompt the user before activating.
144
+ #
145
+ # Levels:
146
+ # official — published by the NeuroDock maintainer; installs silently
147
+ # verified — signed against the maintainer keyring; installs silently
148
+ # community — your own plugin, author-signed; user gets a one-time prompt
149
+ # experimental — unsigned; NeuroDock refuses by default unless user opts in
150
+ #
151
+ # Most contributor plugins are "community". That's a good thing.
152
+ trust:
153
+ level: "community"
154
+ signature: |
155
+ -----BEGIN PGP SIGNATURE-----
156
+ (detached signature over sha256(plugin.yaml + provides[].path contents))
157
+ -----END PGP SIGNATURE-----
158
+ keyring_fingerprint: "A1B2 C3D4 E5F6 7890 1234 5678 9ABC DEF0 1234 5678"
159
+ source_url: "https://github.com/eobrien/ie-corporate-translation"
160
+
161
+ # ------------------------------------------------------------------------------
162
+ # 7. LICENSE (Required)
163
+ # ------------------------------------------------------------------------------
164
+ # Your plugin's licence. Must be one of the allowed-list licences (they all
165
+ # play nicely with AGPL-3.0). If you pick one that isn't on the list,
166
+ # NeuroDock will refuse to load the plugin with a clear "license_not_allowed"
167
+ # error so nothing silently fails.
168
+ license: "AGPL-3.0-or-later"
169
+
170
+ # ------------------------------------------------------------------------------
171
+ # 8. WHERE PEOPLE CAN LEARN MORE (Optional)
172
+ # ------------------------------------------------------------------------------
173
+ homepage: "https://hiberno-translate.example.org"
174
+ repository: "https://github.com/eobrien/ie-corporate-translation"
175
+ keywords:
176
+ - "translation"
177
+ - "hiberno-english"
178
+ - "corporate"
179
+ - "indirect-speech"
180
+
181
+ # ------------------------------------------------------------------------------
182
+ # 9. LIFECYCLE HOOKS (Optional, advanced)
183
+ # ------------------------------------------------------------------------------
184
+ # Scripts that run on install/uninstall. For safety, NeuroDock will only
185
+ # run these for "official" or "verified" plugins right now. You can declare
186
+ # them for a community plugin — they'll just sit there politely ignored
187
+ # until the safer hook sandbox lands.
188
+ hooks:
189
+ on_install: "./install.sh" # idempotent; no network, no writing outside the plugin dir
190
+ on_uninstall: "./uninstall.sh" # clean up anything you created locally
191
+
192
+ # Reserved for future use. Leave empty.
193
+ compatibility: {}
@@ -0,0 +1,30 @@
1
+ # ==============================================================================
2
+ # THE SMALLEST POSSIBLE PLUGIN MANIFEST
3
+ # ==============================================================================
4
+ # This file contains ONLY the required fields for a NeuroDock plugin. Every
5
+ # other field is optional. If you're just starting out, this is the shape to
6
+ # copy.
7
+ #
8
+ # For the full version with every option explained, see:
9
+ # packages/core/schemas/plugin.example.yaml
10
+ #
11
+ # For the design rationale behind why these fields exist:
12
+ # docs/decisions/0007-plugin-protocol.md
13
+ #
14
+ # The "neurodock plugin scaffold" command would write something close to
15
+ # this file. Every required field is present, no optional ones are.
16
+ # ==============================================================================
17
+
18
+ schema_version: "0.1.0"
19
+ name: "minimal-example"
20
+ type: "skill"
21
+ version: "0.1.0"
22
+ description: "Minimal valid plugin manifest — replace with your one-sentence summary."
23
+ license: "AGPL-3.0-or-later"
24
+ trust:
25
+ level: "experimental"
26
+ # Heads up: with trust.level = "experimental" NeuroDock will refuse to
27
+ # load this plugin by default — that's a safety feature, not a bug.
28
+ # To get it loading, do one of:
29
+ # (a) bump trust.level to "community" and add a "source_url", or
30
+ # (b) opt in just this once: `neurodock plugin trust <name> --once`