@litfamily/litcodex 1.0.1 → 1.0.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 (110) hide show
  1. package/README.md +18 -21
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.js +2 -38
  4. package/dist/install/generated-skill-payload-hashes.d.ts +1 -6
  5. package/dist/install/generated-skill-payload-hashes.js +1 -6
  6. package/dist/install/skill-catalog.d.ts +1 -1
  7. package/dist/install/skill-catalog.js +1 -6
  8. package/dist/install/skill-resource-hashes.d.ts +1 -1
  9. package/dist/install/skill-resource-hashes.js +1 -1
  10. package/marketplace/plugins/litcodex/.codex-plugin/plugin.json +1 -1
  11. package/marketplace/plugins/litcodex/components/auto-update/package.json +1 -1
  12. package/marketplace/plugins/litcodex/components/comment-checker/package.json +1 -1
  13. package/marketplace/plugins/litcodex/components/git-bash/package.json +1 -1
  14. package/marketplace/plugins/litcodex/components/lit-loop/dist/cli.js +3 -20
  15. package/marketplace/plugins/litcodex/components/lit-loop/dist/codex-hook.js +1 -8
  16. package/marketplace/plugins/litcodex/components/lit-loop/dist/hook-cli.d.ts +2 -1
  17. package/marketplace/plugins/litcodex/components/lit-loop/dist/hook-cli.js +4 -27
  18. package/marketplace/plugins/litcodex/components/lit-loop/dist/markers.d.ts +0 -2
  19. package/marketplace/plugins/litcodex/components/lit-loop/dist/markers.js +0 -2
  20. package/marketplace/plugins/litcodex/components/lit-loop/dist/modes.d.ts +1 -3
  21. package/marketplace/plugins/litcodex/components/lit-loop/dist/modes.js +1 -10
  22. package/marketplace/plugins/litcodex/components/lit-loop/package.json +1 -1
  23. package/marketplace/plugins/litcodex/components/lsp/package.json +1 -1
  24. package/marketplace/plugins/litcodex/components/rules/dist/static-injection.js +2 -2
  25. package/marketplace/plugins/litcodex/components/rules/package.json +1 -1
  26. package/marketplace/plugins/litcodex/components/start-work-continuation/package.json +1 -1
  27. package/marketplace/plugins/litcodex/components/telemetry/package.json +1 -1
  28. package/marketplace/plugins/litcodex/components/wikify-knowledge/package.json +1 -1
  29. package/marketplace/plugins/litcodex/skills/browser-drive/scripts/capability-probe.mjs +13 -5
  30. package/node_modules/@litcodex/lit-loop/README.md +1 -7
  31. package/node_modules/@litcodex/lit-loop/dist/cli.js +3 -20
  32. package/node_modules/@litcodex/lit-loop/dist/codex-hook.js +1 -8
  33. package/node_modules/@litcodex/lit-loop/dist/hook-cli.d.ts +2 -1
  34. package/node_modules/@litcodex/lit-loop/dist/hook-cli.js +4 -27
  35. package/node_modules/@litcodex/lit-loop/dist/markers.d.ts +0 -2
  36. package/node_modules/@litcodex/lit-loop/dist/markers.js +0 -2
  37. package/node_modules/@litcodex/lit-loop/dist/modes.d.ts +1 -3
  38. package/node_modules/@litcodex/lit-loop/dist/modes.js +1 -10
  39. package/node_modules/@litcodex/lit-loop/package.json +1 -1
  40. package/node_modules/@litcodex/lit-loop/skills/browser-drive/scripts/capability-probe.mjs +13 -5
  41. package/package.json +2 -2
  42. package/readme-assets/badge-version.svg +1 -1
  43. package/readme-assets/cover-motion.webp +0 -0
  44. package/marketplace/plugins/litcodex/components/lit-loop/directives/skill-observer.md +0 -105
  45. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/apply.d.ts +0 -16
  46. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/apply.js +0 -227
  47. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/config.d.ts +0 -13
  48. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/config.js +0 -12
  49. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/curator.d.ts +0 -14
  50. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/curator.js +0 -112
  51. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/hook.d.ts +0 -19
  52. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/hook.js +0 -435
  53. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/ownership.d.ts +0 -6
  54. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/ownership.js +0 -145
  55. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/paths.d.ts +0 -18
  56. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/paths.js +0 -43
  57. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/review.d.ts +0 -28
  58. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/review.js +0 -702
  59. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/store.d.ts +0 -32
  60. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/store.js +0 -667
  61. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/transaction.d.ts +0 -26
  62. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/transaction.js +0 -524
  63. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/types.d.ts +0 -81
  64. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/types.js +0 -246
  65. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/usage.d.ts +0 -6
  66. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/usage.js +0 -119
  67. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop-cli.d.ts +0 -8
  68. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop-cli.js +0 -111
  69. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-cli.d.ts +0 -3
  70. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-cli.js +0 -116
  71. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-route.d.ts +0 -6
  72. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-route.js +0 -12
  73. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer.d.ts +0 -18
  74. package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer.js +0 -946
  75. package/marketplace/plugins/litcodex/skills/skill-observer/SKILL.md +0 -215
  76. package/marketplace/plugins/litcodex/skills/skill-observer/agents/openai.yaml +0 -6
  77. package/marketplace/plugins/litcodex/skills/skill-observer/references/review-contract.md +0 -77
  78. package/node_modules/@litcodex/lit-loop/directives/skill-observer.md +0 -105
  79. package/node_modules/@litcodex/lit-loop/dist/skill-loop/apply.d.ts +0 -16
  80. package/node_modules/@litcodex/lit-loop/dist/skill-loop/apply.js +0 -227
  81. package/node_modules/@litcodex/lit-loop/dist/skill-loop/config.d.ts +0 -13
  82. package/node_modules/@litcodex/lit-loop/dist/skill-loop/config.js +0 -12
  83. package/node_modules/@litcodex/lit-loop/dist/skill-loop/curator.d.ts +0 -14
  84. package/node_modules/@litcodex/lit-loop/dist/skill-loop/curator.js +0 -112
  85. package/node_modules/@litcodex/lit-loop/dist/skill-loop/hook.d.ts +0 -19
  86. package/node_modules/@litcodex/lit-loop/dist/skill-loop/hook.js +0 -435
  87. package/node_modules/@litcodex/lit-loop/dist/skill-loop/ownership.d.ts +0 -6
  88. package/node_modules/@litcodex/lit-loop/dist/skill-loop/ownership.js +0 -145
  89. package/node_modules/@litcodex/lit-loop/dist/skill-loop/paths.d.ts +0 -18
  90. package/node_modules/@litcodex/lit-loop/dist/skill-loop/paths.js +0 -43
  91. package/node_modules/@litcodex/lit-loop/dist/skill-loop/review.d.ts +0 -28
  92. package/node_modules/@litcodex/lit-loop/dist/skill-loop/review.js +0 -702
  93. package/node_modules/@litcodex/lit-loop/dist/skill-loop/store.d.ts +0 -32
  94. package/node_modules/@litcodex/lit-loop/dist/skill-loop/store.js +0 -667
  95. package/node_modules/@litcodex/lit-loop/dist/skill-loop/transaction.d.ts +0 -26
  96. package/node_modules/@litcodex/lit-loop/dist/skill-loop/transaction.js +0 -524
  97. package/node_modules/@litcodex/lit-loop/dist/skill-loop/types.d.ts +0 -81
  98. package/node_modules/@litcodex/lit-loop/dist/skill-loop/types.js +0 -246
  99. package/node_modules/@litcodex/lit-loop/dist/skill-loop/usage.d.ts +0 -6
  100. package/node_modules/@litcodex/lit-loop/dist/skill-loop/usage.js +0 -119
  101. package/node_modules/@litcodex/lit-loop/dist/skill-loop-cli.d.ts +0 -8
  102. package/node_modules/@litcodex/lit-loop/dist/skill-loop-cli.js +0 -111
  103. package/node_modules/@litcodex/lit-loop/dist/skill-observer-cli.d.ts +0 -3
  104. package/node_modules/@litcodex/lit-loop/dist/skill-observer-cli.js +0 -116
  105. package/node_modules/@litcodex/lit-loop/dist/skill-observer-route.d.ts +0 -6
  106. package/node_modules/@litcodex/lit-loop/dist/skill-observer-route.js +0 -12
  107. package/node_modules/@litcodex/lit-loop/dist/skill-observer.d.ts +0 -18
  108. package/node_modules/@litcodex/lit-loop/dist/skill-observer.js +0 -946
  109. package/node_modules/@litcodex/lit-loop/skills/skill-observer/SKILL.md +0 -215
  110. package/node_modules/@litcodex/lit-loop/skills/skill-observer/references/review-contract.md +0 -77
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/cover.webp" width="100%" alt="LitCodex v5 armory cover" /></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/cover.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/cover-motion.webp" width="100%" alt="LitCodex cover art. An orange signal moves through orbital paths above the CODEX CLI wordmark. The static family cover appears for reduced-motion preference." /></picture></p>
2
+ <p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/cover.webp">View the static cover</a></p>
2
3
 
3
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
4
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/ascii-readme.svg" width="480" alt="LIT ASCII B mark" /></p>
4
5
 
5
6
  <details>
6
7
  <summary>Copy ASCII logo</summary>
@@ -32,12 +33,12 @@ LIT · codex
32
33
  </details>
33
34
 
34
35
  <p align="center">
35
- <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/badge-version.svg" alt="1.0.1" /></a>
36
- <a href="https://github.com/wjgoarxiv/litcodex/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/badge-license.svg" alt="MIT license" /></a>
36
+ <a href="#install"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/badge-version.svg" alt="1.0.2" /></a>
37
+ <a href="https://github.com/wjgoarxiv/litcodex/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/badge-license.svg" alt="MIT license" /></a>
37
38
  </p>
38
39
 
39
40
  <p align="center">
40
- <a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/usage.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/lucide-book-open.svg" width="16" alt="" /> Docs</a> &nbsp; <a href="#install">Install</a> &nbsp; <a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition</a> &nbsp; <a href="https://github.com/wjgoarxiv/litcodex/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
41
+ <a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/usage.md"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/lucide-book-open.svg" width="16" alt="" /> Docs</a> &nbsp; <a href="#install">Install</a> &nbsp; <a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/lucide-play.svg" width="16" alt="" /> Ignition</a> &nbsp; <a href="https://github.com/wjgoarxiv/litcodex/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/lucide-shield-check.svg" width="16" alt="" /> MIT</a>
41
42
  </p>
42
43
 
43
44
  # @litfamily/litcodex
@@ -79,7 +80,7 @@ Append `lit` to a prompt to activate the Codex CLI hook. It routes the request i
79
80
 
80
81
  The hook is an entry signal; it does not prove that a model result or visual check completed.
81
82
 
82
- <p align="center"><a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/ignition-poster.png" width="720" alt="Ignition motion poster" /></a></p>
83
+ <p align="center"><a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/ignition-poster.png" width="720" alt="Ignition motion poster" /></a></p>
83
84
 
84
85
  Select the poster for the optional film; this README keeps motion opt-in.
85
86
 
@@ -93,30 +94,30 @@ Host limit: Codex CLI owns hook and agent execution, while authentication, model
93
94
  and any visual check remain host capabilities. A route mark or static editorial image is not completion
94
95
  evidence.
95
96
 
96
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/litcodex-ignition-1600.webp" width="49%" alt="LitCodex ignition editorial cue" /> <img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/litcodex-continuity-1600.webp" width="49%" alt="LitCodex continuity editorial cue" /></p>
97
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/litcodex-ignition-1600.webp" width="49%" alt="LitCodex ignition editorial cue" /> <img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/litcodex-continuity-1600.webp" width="49%" alt="LitCodex continuity editorial cue" /></p>
97
98
 
98
99
  ## What is LitCodex
99
100
 
100
101
  LitCodex adds planning, review, research, and a durable execution loop to Codex CLI. Its `UserPromptSubmit`
101
- hook routes your request into the right discipline; the bundled library provides 39 skills. A goal is complete
102
+ hook routes your request into the right discipline; the bundled library provides 38 skills. A goal is complete
102
103
  only after every success criterion passes. The npm package is self-contained and installs without a GitHub clone.
103
104
 
104
105
  ## Install
105
106
 
106
- > Install `@litfamily/litcodex@1.0.1` with the scoped command below. See [migration guidance](https://github.com/wjgoarxiv/litcodex/blob/main/docs/npm-migration.md).
107
+ > Install `@litfamily/litcodex@1.0.2` with the scoped command below. See [migration guidance](https://github.com/wjgoarxiv/litcodex/blob/main/docs/npm-migration.md).
107
108
 
108
109
  With **Node.js 22+** and **Codex CLI** installed, run:
109
110
 
110
111
  ```sh
111
- npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex install
112
+ npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex install
112
113
  ```
113
114
 
114
115
  The installer registers the plugin, hooks, and agents, then updates managed keys in `~/.codex/config.toml`.
115
116
  It asks for the lead model, helper model, and output style. Codex authentication and model access are required
116
117
  when you run model work; installation itself does not require GitHub credentials.
117
118
 
118
- Preview changes with `npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex --dry-run install`. For unattended setup, use
119
- `npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex install --yes`. An explicit `--style <id>` still applies.
119
+ Preview changes with `npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex --dry-run install`. For unattended setup, use
120
+ `npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex install --yes`. An explicit `--style <id>` still applies.
120
121
 
121
122
  For a persistent command:
122
123
 
@@ -125,7 +126,7 @@ npm install -g @litfamily/litcodex
125
126
  litcodex install
126
127
  ```
127
128
 
128
- > Without a global install, use `npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex <command>`, such as `npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex doctor`.
129
+ > Without a global install, use `npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex <command>`, such as `npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex doctor`.
129
130
 
130
131
  For an isolated trial apart from existing settings, follow the [isolated trial guide](https://github.com/wjgoarxiv/litcodex/blob/main/docs/npm-migration.md#isolated-local-trial).
131
132
  Changing only `CODEX_HOME` can still discover settings in your existing home.
@@ -205,8 +206,6 @@ from the Codex picker or with a scoped mention, including `$litcodex:lit-handoff
205
206
  | `litcodex uninstall` | Remove the plugin and LitCodex-managed config |
206
207
  | `litcodex config migrate` | Preview or apply managed Codex config keys |
207
208
  | `litcodex hook user-prompt-submit` | Run the host hook entrypoint |
208
- | `litcodex observer` | Record one proposal from bounded JSON on stdin |
209
- | `litcodex skill-loop <command>` | Review, approve, reject, roll back, or curate agent-owned skill proposals |
210
209
  | `litcodex loop create` | Derive goals and criteria from a brief |
211
210
  | `litcodex loop status --json` | Inspect loop state as JSON |
212
211
  | `litcodex loop run` | Select the next runnable goal |
@@ -226,7 +225,7 @@ See [state and recovery](https://github.com/wjgoarxiv/litcodex/blob/main/docs/us
226
225
  ## Verify it worked
227
226
 
228
227
  ```sh
229
- npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex doctor
228
+ npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex doctor
230
229
  ```
231
230
 
232
231
  `litcodex doctor` checks registration, hooks, config, and host capabilities. `litcodex loop doctor` checks
@@ -236,8 +235,6 @@ project loop state. A successful installation check does not prove authenticated
236
235
 
237
236
  - Plans and evidence stay reviewable. No criterion is marked complete merely because a test command ran.
238
237
  - Installation preserves unrelated Codex settings. Preview changes before `--reconfigure`.
239
- - Skill learning requires explicit review and apply; `autoApply` stays `false`. Only marked agent-owned skills
240
- may be changed. [Approval, rollback, and recovery rules](https://github.com/wjgoarxiv/litcodex/blob/main/docs/usage.md#skill-learning-loop).
241
238
  - The doctor diagnostic core never modifies Codex config, install state, or plugin state. An eligible interactive
242
239
  doctor may show a cached advisory notice. Its detached worker performs a fixed registry refresh at
243
240
  `~/.litcodex/update-check.json`; that worker never installs packages.
@@ -259,7 +256,7 @@ project loop state. A successful installation check does not prove authenticated
259
256
  ## Uninstall
260
257
 
261
258
  ```sh
262
- npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex uninstall
259
+ npm exec --yes --package @litfamily/litcodex@1.0.2 -- litcodex uninstall
263
260
  ```
264
261
 
265
262
  `litcodex uninstall` removes the plugin and LitCodex-managed config while preserving unrelated settings.
@@ -274,7 +271,7 @@ npm exec --yes --package @litfamily/litcodex@1.0.1 -- litcodex uninstall
274
271
  The bundled skill library also includes `autoconference`, `autoresearch`, `browser-drive`, `coding-session-audit`,
275
272
  `comment-checker`, `debugging`, `frontend-ui-ux`, `lit-commit`, `lit-crucible`, `lit-init`, `lit-korean`, `lit-fetch`,
276
273
  `litcodex-contribute-bug-fix`, `litcodex-doctor`, `litcodex-report-bug`, `lsp`, `lsp-setup`, `lit-code`, `refactor`,
277
- `lit-burnoff`, `skill-observer`, `structural-search`, `lit-team`, `visual-qa`, and `wikify`.
274
+ `lit-burnoff`, `structural-search`, `lit-team`, `visual-qa`, and `wikify`.
278
275
 
279
276
  Tests, fixtures, test helpers, and Vitest configuration remain tracked repository coverage and are excluded from npm and installed marketplace payloads.
280
277
 
@@ -284,7 +281,7 @@ Tests, fixtures, test helpers, and Vitest configuration remain tracked repositor
284
281
 
285
282
  Select the poster to watch the 10-second film.
286
283
 
287
- <p align="center"><a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.1/readme-assets/ignition-poster.png" width="720" alt="Ignition motion graphic poster" /></a></p>
284
+ <p align="center"><a href="https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-film.mp4"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.2/readme-assets/ignition-poster.png" width="720" alt="Ignition motion graphic poster" /></a></p>
288
285
 
289
286
  [Animated GIF](https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/ignition-readme.gif) · [Media and icon credits](https://github.com/wjgoarxiv/litcodex/blob/main/docs/assets/readme/README.md)
290
287
 
package/dist/cli.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare function dispatch(argv: readonly string[]): DispatchResult;
17
17
  /**
18
18
  * Async process entry used by `bin/litcodex.js`. It owns the side-effecting routes: install/doctor/
19
19
  * uninstall (install/* modules, which are the ONLY code that ever spawns `codex`), `config migrate`
20
- * (M13, in-process), and the bundled `@litcodex/lit-loop` runtime routes `loop`/`hook`/`observer`. Returns the
20
+ * (M13, in-process), and the bundled `@litcodex/lit-loop` runtime routes `loop`/`hook`. Returns the
21
21
  * integer exit code; the bin owns `process.exit`. No forwarding, no exec-wrapper, no harness.
22
22
  */
23
23
  export declare function runCli(argv: readonly string[]): Promise<number>;
package/dist/cli.js CHANGED
@@ -55,19 +55,7 @@ const ROUTES = {
55
55
  config: configRouteHandler,
56
56
  loop: () => ok("litcodex loop\n"),
57
57
  hook: () => ok("litcodex hook\n"),
58
- observer: observerRouteHandler,
59
- "skill-loop": () => ok("litcodex skill-loop\n"),
60
58
  };
61
- function observerRouteHandler(rest, dryRun) {
62
- if (dryRun || rest.length > 0) {
63
- return {
64
- stdout: "",
65
- stderr: "litcodex observer: this command accepts no arguments.\n",
66
- exitCode: CONFIG_USAGE_EXIT_CODE,
67
- };
68
- }
69
- return ok("litcodex observer\n");
70
- }
71
59
  /**
72
60
  * Synchronous arm of the `config` route. The real `config migrate` work is async and is run by
73
61
  * `runCli` BEFORE `dispatch`; this sync handler only handles routing-level outcomes: an unknown
@@ -96,8 +84,6 @@ function renderHelp() {
96
84
  " litcodex config migrate Migrate Codex config for LitCodex",
97
85
  " litcodex loop <sub> Run a Lit-Loop subcommand",
98
86
  " litcodex hook user-prompt-submit Run the UserPromptSubmit hook",
99
- " litcodex observer Record one proposal from bounded stdin",
100
- " litcodex skill-loop <sub> Review, apply, reject, or roll back skill proposals",
101
87
  " litcodex --dry-run <command> Resolve a command without applying it",
102
88
  " litcodex --help Show this help",
103
89
  " litcodex --version Show the @litfamily/litcodex version",
@@ -167,7 +153,7 @@ export function dispatch(argv) {
167
153
  /**
168
154
  * Async process entry used by `bin/litcodex.js`. It owns the side-effecting routes: install/doctor/
169
155
  * uninstall (install/* modules, which are the ONLY code that ever spawns `codex`), `config migrate`
170
- * (M13, in-process), and the bundled `@litcodex/lit-loop` runtime routes `loop`/`hook`/`observer`. Returns the
156
+ * (M13, in-process), and the bundled `@litcodex/lit-loop` runtime routes `loop`/`hook`. Returns the
171
157
  * integer exit code; the bin owns `process.exit`. No forwarding, no exec-wrapper, no harness.
172
158
  */
173
159
  export async function runCli(argv) {
@@ -176,28 +162,6 @@ export async function runCli(argv) {
176
162
  const head = rest[0];
177
163
  const isHelp = rest.includes("--help") || rest.includes("-h");
178
164
  const isVersion = rest.includes("--version") || rest.includes("-v");
179
- if (!isHelp && !isVersion && head === "observer") {
180
- const observerResult = observerRouteHandler(rest.slice(1), dryRun);
181
- if (observerResult.exitCode !== 0)
182
- return dispatchExit(observerResult);
183
- const { runSkillObserverCli } = await import("@litcodex/lit-loop/dist/skill-observer-cli.js");
184
- return runSkillObserverCli(process.stdin, process.stdout, process.stderr);
185
- }
186
- if (!isHelp && !isVersion && head === "skill-loop") {
187
- if (dryRun)
188
- return dispatchExit({
189
- stdout: "",
190
- stderr: "litcodex skill-loop: --dry-run is not supported.\n",
191
- exitCode: 64,
192
- });
193
- const { skillLoopCommand } = await import("@litcodex/lit-loop/dist/skill-loop-cli.js");
194
- return skillLoopCommand(rest.slice(1), {
195
- cwd: process.cwd(),
196
- env: process.env,
197
- stdout: process.stdout,
198
- stderr: process.stderr,
199
- });
200
- }
201
165
  if (!isHelp && !isVersion) {
202
166
  if (head === "config" && rest[1] === "migrate") {
203
167
  const passthrough = dryRun ? [...rest.slice(2), "--dry-run"] : rest.slice(2);
@@ -231,7 +195,7 @@ export async function runCli(argv) {
231
195
  }
232
196
  const hooks = await import("@litcodex/lit-loop/dist/hook-cli.js");
233
197
  return rest[1] === "stop"
234
- ? hooks.runStopSkillReviewHookCli(process.stdin, process.stdout, process.stderr)
198
+ ? hooks.runStopPlanPersistenceHookCli(process.stdin, process.stdout, process.stderr)
235
199
  : hooks.runUserPromptSubmitHookCli(process.stdin, process.stdout, process.stderr);
236
200
  }
237
201
  }
@@ -6,12 +6,7 @@ export declare const BROWSER_DRIVE_PAYLOAD_HASHES: {
6
6
  readonly "SKILL.md": "74f89ce0b7462e397952ac9d074b8a29a0133cccbc3e7179e8ec63128d88724f";
7
7
  readonly "agents/openai.yaml": "1b9a859e2da403ffc3a526b3d36e9bd6bfd95af087b7ec4ae71f6b615ced7828";
8
8
  readonly "references/snapshot-act-loop.md": "7aff2f4145413d61aaac577c2e551e3ed11a14b78dd46d047409c91a522ece1f";
9
- readonly "scripts/capability-probe.mjs": "7e8fa7b0c5243c51893c929ecdca4996eae83cad307590c5ac2ae8c34af1625c";
10
- };
11
- export declare const SKILL_OBSERVER_PAYLOAD_HASHES: {
12
- readonly "SKILL.md": "e56a3dd538f2e986f19abbc360f8902551a06e4c38903114ceb2ffba6681458d";
13
- readonly "agents/openai.yaml": "584a177dd2db92fdeb5a742643de035ff0932dd75cb01192953852df02fad3fe";
14
- readonly "references/review-contract.md": "f55dc8334f3b8d8498c84d57725fa03af8fbd689b2dd7cce25e49931629ee54f";
9
+ readonly "scripts/capability-probe.mjs": "95bac59fd820e5a1e1d7f43e984ddf9f8ffdcb10b4803d566afe06be316ad953";
15
10
  };
16
11
  export declare const FRONTEND_UIUX_PAYLOAD_HASHES: {
17
12
  readonly "SKILL.md": "b5fdb88106a0e23112686b120f4da0f250ac66c8909afaafbdf00f0ae823c88b";
@@ -7,12 +7,7 @@ export const BROWSER_DRIVE_PAYLOAD_HASHES = {
7
7
  "SKILL.md": "74f89ce0b7462e397952ac9d074b8a29a0133cccbc3e7179e8ec63128d88724f",
8
8
  "agents/openai.yaml": "1b9a859e2da403ffc3a526b3d36e9bd6bfd95af087b7ec4ae71f6b615ced7828",
9
9
  "references/snapshot-act-loop.md": "7aff2f4145413d61aaac577c2e551e3ed11a14b78dd46d047409c91a522ece1f",
10
- "scripts/capability-probe.mjs": "7e8fa7b0c5243c51893c929ecdca4996eae83cad307590c5ac2ae8c34af1625c",
11
- };
12
- export const SKILL_OBSERVER_PAYLOAD_HASHES = {
13
- "SKILL.md": "e56a3dd538f2e986f19abbc360f8902551a06e4c38903114ceb2ffba6681458d",
14
- "agents/openai.yaml": "584a177dd2db92fdeb5a742643de035ff0932dd75cb01192953852df02fad3fe",
15
- "references/review-contract.md": "f55dc8334f3b8d8498c84d57725fa03af8fbd689b2dd7cce25e49931629ee54f",
10
+ "scripts/capability-probe.mjs": "95bac59fd820e5a1e1d7f43e984ddf9f8ffdcb10b4803d566afe06be316ad953",
16
11
  };
17
12
  export const FRONTEND_UIUX_PAYLOAD_HASHES = {
18
13
  "SKILL.md": "b5fdb88106a0e23112686b120f4da0f250ac66c8909afaafbdf00f0ae823c88b",
@@ -6,7 +6,7 @@ import type { ReadonlyFsLike } from "./codex.js";
6
6
  * marketplace has every supported skill entry point, while the companion test
7
7
  * compares it with the repository's package contract.
8
8
  */
9
- export declare const CANONICAL_SKILL_IDS: readonly ["autoconference", "autoresearch", "browser-drive", "coding-session-audit", "comment-checker", "debugging", "deep-interview", "frontend-ui-ux", "lit-burnoff", "lit-burnoff-file", "lit-code", "lit-commit", "lit-comprehend", "lit-crucible", "lit-fetch", "lit-handoff", "lit-init", "lit-korean", "lit-loop", "lit-plan", "lit-recap", "lit-scientific-visualization", "lit-team", "litcodex-contribute-bug-fix", "litcodex-doctor", "litcodex-report-bug", "litgoal", "litresearch", "litwork", "lsp", "lsp-setup", "refactor", "review-work", "rules", "skill-observer", "start-work", "structural-search", "visual-qa", "wikify"];
9
+ export declare const CANONICAL_SKILL_IDS: readonly ["autoconference", "autoresearch", "browser-drive", "coding-session-audit", "comment-checker", "debugging", "deep-interview", "frontend-ui-ux", "lit-burnoff", "lit-burnoff-file", "lit-code", "lit-commit", "lit-comprehend", "lit-crucible", "lit-fetch", "lit-handoff", "lit-init", "lit-korean", "lit-loop", "lit-plan", "lit-recap", "lit-scientific-visualization", "lit-team", "litcodex-contribute-bug-fix", "litcodex-doctor", "litcodex-report-bug", "litgoal", "litresearch", "litwork", "lsp", "lsp-setup", "refactor", "review-work", "rules", "start-work", "structural-search", "visual-qa", "wikify"];
10
10
  export declare const CANONICAL_SKILL_RESOURCE_PATHS: readonly ["lsp/references/runtime-triage.md", ...string[]];
11
11
  export interface SkillCatalogPayloadReport {
12
12
  readonly complete: boolean;
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import { payloadExact } from "./bundled-skills.js";
3
- import { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, SKILL_OBSERVER_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./skill-resource-hashes.js";
3
+ import { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./skill-resource-hashes.js";
4
4
  /**
5
5
  * The Codex-native skill directories shipped in the LitCodex marketplace payload.
6
6
  *
@@ -43,7 +43,6 @@ export const CANONICAL_SKILL_IDS = [
43
43
  "refactor",
44
44
  "review-work",
45
45
  "rules",
46
- "skill-observer",
47
46
  "start-work",
48
47
  "structural-search",
49
48
  "visual-qa",
@@ -66,9 +65,6 @@ export const CANONICAL_SKILL_RESOURCE_PATHS = [
66
65
  ...Object.keys(FRONTEND_UIUX_PAYLOAD_HASHES)
67
66
  .filter((path) => path !== "SKILL.md")
68
67
  .map((path) => `frontend-ui-ux/${path}`),
69
- ...Object.keys(SKILL_OBSERVER_PAYLOAD_HASHES)
70
- .filter((path) => path !== "SKILL.md")
71
- .map((path) => `skill-observer/${path}`),
72
68
  ...Object.keys(VISUAL_QA_PAYLOAD_HASHES)
73
69
  .filter((path) => path !== "SKILL.md")
74
70
  .map((path) => `visual-qa/${path}`),
@@ -93,7 +89,6 @@ export function probeSkillCatalogPayload(fs, marketplaceRoot) {
93
89
  ["browser-drive", BROWSER_DRIVE_PAYLOAD_HASHES],
94
90
  ["deep-interview", DEEP_INTERVIEW_PAYLOAD_HASHES],
95
91
  ["frontend-ui-ux", FRONTEND_UIUX_PAYLOAD_HASHES],
96
- ["skill-observer", SKILL_OBSERVER_PAYLOAD_HASHES],
97
92
  ["visual-qa", VISUAL_QA_PAYLOAD_HASHES],
98
93
  ["structural-search", STRUCTURAL_SEARCH_PAYLOAD_HASHES],
99
94
  ["coding-session-audit", CODING_SESSION_AUDIT_PAYLOAD_HASHES],
@@ -1 +1 @@
1
- export { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, SKILL_OBSERVER_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./generated-skill-payload-hashes.js";
1
+ export { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./generated-skill-payload-hashes.js";
@@ -1 +1 @@
1
- export { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, SKILL_OBSERVER_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./generated-skill-payload-hashes.js";
1
+ export { AUTOCONFERENCE_PAYLOAD_HASHES, AUTORESEARCH_PAYLOAD_HASHES, BROWSER_DRIVE_PAYLOAD_HASHES, CODING_SESSION_AUDIT_PAYLOAD_HASHES, DEEP_INTERVIEW_PAYLOAD_HASHES, FRONTEND_UIUX_PAYLOAD_HASHES, STRUCTURAL_SEARCH_PAYLOAD_HASHES, VISUAL_QA_PAYLOAD_HASHES, WIKIFY_PAYLOAD_HASHES, } from "./generated-skill-payload-hashes.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litcodex",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex Codex plugin: the lit-loop activation, durable loop runtime, and local review-gated knowledge.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/auto-update",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex foreground update barrier for the SessionStart and management lifecycles.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/comment-checker",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex Comment-Checker hook: flags low-value / AI-slop comments introduced by edits.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/git-bash",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex Git-Bash hook: reminds Windows sessions to prefer the git_bash MCP before the built-in shell.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -2,7 +2,7 @@
2
2
  // src/cli.ts — M06-owned component bin dispatcher (A2 §3/§6.4, A3 addendum A1).
3
3
  //
4
4
  // Bin `litcodex-lit-loop` → dist/cli.js, the target the aggregate hooks.json invokes. Knows exactly
5
- // three route prefixes — `hook`, `loop`, and `observer` — and NO `config` route (config migration is
5
+ // two route prefixes — `hook` and `loop` — and NO `config` route (config migration is
6
6
  // owned by the separate litcodex-ai installer bin, not this dispatcher).
7
7
  //
8
8
  // Exit-code table (A3 addendum A1.2):
@@ -14,10 +14,8 @@
14
14
  //
15
15
  // `main` NEVER calls process.exit (the shebang wrapper does); it resolves exactly one integer, so
16
16
  // the dispatcher is unit-testable with an injected argv array.
17
- import { runPreToolUseCreateGoalGuardCli, runStopSkillReviewHookCli, runUserPromptSubmitHookCli } from "./hook-cli.js";
17
+ import { runPreToolUseCreateGoalGuardCli, runStopPlanPersistenceHookCli, runUserPromptSubmitHookCli, } from "./hook-cli.js";
18
18
  import { loopCommand } from "./loop-cli.js";
19
- import { skillLoopCommand } from "./skill-loop-cli.js";
20
- import { runSkillObserverCli } from "./skill-observer-cli.js";
21
19
  const UNKNOWN_COMMAND = "lit-loop: unknown command\n";
22
20
  /**
23
21
  * Dispatch one argv vector to a route and resolve its exit code. Pure of process.exit; writes only
@@ -32,7 +30,7 @@ export async function main(argv, stdin, stdout, stderr) {
32
30
  if (subcommand === "pre-tool-use")
33
31
  return runPreToolUseCreateGoalGuardCli(stdin, stdout, stderr);
34
32
  if (subcommand === "stop")
35
- return runStopSkillReviewHookCli(stdin, stdout, stderr);
33
+ return runStopPlanPersistenceHookCli(stdin, stdout, stderr);
36
34
  stderr.write(UNKNOWN_COMMAND);
37
35
  return 1;
38
36
  }
@@ -41,21 +39,6 @@ export async function main(argv, stdin, stdout, stderr) {
41
39
  // and never calls process.exit. The `doctor` subcommand is still the M09 stub until M11/T16.
42
40
  return loopCommand(argv.slice(3), { stdout, stderr, stdin });
43
41
  }
44
- if (command === "observer") {
45
- if (argv.length !== 3) {
46
- stderr.write(UNKNOWN_COMMAND);
47
- return 1;
48
- }
49
- return runSkillObserverCli(stdin, stdout, stderr);
50
- }
51
- if (command === "skill-loop") {
52
- return skillLoopCommand(argv.slice(3), {
53
- cwd: process.cwd(),
54
- env: process.env,
55
- stdout,
56
- stderr,
57
- });
58
- }
59
42
  stderr.write(UNKNOWN_COMMAND);
60
43
  return 1;
61
44
  }
@@ -21,9 +21,8 @@ import { isExactBrowserDrivePrompt, shouldSuppressBrowserDriveInjection } from "
21
21
  import { LitLoopDirectiveError, loadDirectiveWithSkillBodyFrom, loadSkillInvocationContext } from "./directive.js";
22
22
  import { hasContextPressureMarker, shouldSuppressInjection, transcriptHasContextPressureMarker, transcriptHasDirectiveMarker, } from "./guards.js";
23
23
  import { isExactBareHandoffPrompt, shouldSuppressHandoffInjection } from "./handoff-route.js";
24
- import { BROWSER_DRIVE_MODE_SPEC, HANDOFF_MODE_SPEC, modeForToken, resolveSkillPath, SCIENTIFIC_VISUALIZATION_MODE_SPEC, SKILL_OBSERVER_MODE_SPEC, } from "./modes.js";
24
+ import { BROWSER_DRIVE_MODE_SPEC, HANDOFF_MODE_SPEC, modeForToken, resolveSkillPath, SCIENTIFIC_VISUALIZATION_MODE_SPEC, } from "./modes.js";
25
25
  import { isExactBareScientificVisualizationPrompt, isScientificVisualizationWhitespaceNearMiss, shouldSuppressScientificVisualizationInjection, } from "./scientific-visualization-route.js";
26
- import { isExactSkillObserverPrompt, shouldSuppressSkillObserverInjection } from "./skill-observer-route.js";
27
26
  import { matchRenamedSkillInvocation, skillRenameNote } from "./skill-renames.js";
28
27
  import { maskMarkdownCode, matchLitTrigger } from "./trigger.js";
29
28
  const HOOK_EVENT_NAME = "UserPromptSubmit";
@@ -200,12 +199,6 @@ export function runUserPromptSubmitHook(input) {
200
199
  const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(BROWSER_DRIVE_MODE_SPEC));
201
200
  return stdout === "" ? { kind: "noop" } : { kind: "inject", stdout };
202
201
  }
203
- if (isExactSkillObserverPrompt(input.prompt)) {
204
- if (shouldSuppressSkillObserverInjection(transcriptPath))
205
- return { kind: "noop" };
206
- const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(SKILL_OBSERVER_MODE_SPEC));
207
- return stdout === "" ? { kind: "noop" } : { kind: "inject", stdout };
208
- }
209
202
  if (isScientificVisualizationWhitespaceNearMiss(input.prompt))
210
203
  return { kind: "noop" };
211
204
  // Guard 0 / routing: which bounded lit-family token matched → which mode + directive.
@@ -15,5 +15,6 @@ export type LitHookErrorCode = "LIT_HOOK_STDIN_INVALID_JSON" | "LIT_HOOK_STDIN_T
15
15
  * line to stderr on malformed / oversized stdin.
16
16
  */
17
17
  export declare function runUserPromptSubmitHookCli(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream, stderr: NodeJS.WritableStream, repoRoot?: string): Promise<number>;
18
- export declare function runStopSkillReviewHookCli(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream, stderr: NodeJS.WritableStream, repoRoot?: string): Promise<number>;
18
+ /** Enforce lit-plan persistence when a Stop hook event arrives. */
19
+ export declare function runStopPlanPersistenceHookCli(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream, stderr: NodeJS.WritableStream, repoRoot?: string): Promise<number>;
19
20
  export declare function runPreToolUseCreateGoalGuardCli(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream, stderr: NodeJS.WritableStream): Promise<number>;
@@ -7,9 +7,8 @@
7
7
  // machine-readable LitHookError JSON line on stderr. NEVER calls process.exit (the dispatcher does)
8
8
  // and NEVER throws.
9
9
  import { isAbsolute } from "node:path";
10
- import { applyPreToolUseCreateGoalGuard, formatAdditionalContextOutput, isLitUserPromptSubmitInput, runUserPromptSubmitHook, } from "./codex-hook.js";
10
+ import { applyPreToolUseCreateGoalGuard, runUserPromptSubmitHook } from "./codex-hook.js";
11
11
  import { evaluatePlanPersistence, formatStopBlockOutput, recordLitPlanActivation } from "./plan-persistence.js";
12
- import { markPendingReviews, pendingReviewNotice } from "./skill-loop/hook.js";
13
12
  /** Hard cap on stdin to bound memory / ReDoS exposure inside the 5 s Codex hook budget. 8 MB. */
14
13
  export const MAX_STDIN_BYTES = 8_000_000;
15
14
  const INVALID_JSON_MESSAGE = "lit hook: stdin was not valid JSON";
@@ -95,25 +94,8 @@ export async function runUserPromptSubmitHookCli(stdin, stdout, stderr, repoRoot
95
94
  if (scope !== null)
96
95
  recordLitPlanActivation(scope.cwd, scope.sessionId);
97
96
  }
98
- let notice = null;
99
- if (isLitUserPromptSubmitInput(parsed)) {
100
- try {
101
- notice = pendingReviewNotice(repoRoot);
102
- }
103
- catch {
104
- // Pending-review surfacing is advisory and may never disable the existing prompt routes.
105
- }
106
- }
107
- if (decision.kind === "inject" && notice !== null) {
108
- const envelope = JSON.parse(decision.stdout);
109
- stdout.write(formatAdditionalContextOutput(`${envelope.hookSpecificOutput.additionalContext}\n\n${notice}`));
110
- }
111
- else if (decision.kind === "inject") {
97
+ if (decision.kind === "inject")
112
98
  stdout.write(decision.stdout);
113
- }
114
- else if (notice !== null) {
115
- stdout.write(formatAdditionalContextOutput(notice));
116
- }
117
99
  return 0;
118
100
  }
119
101
  /** Read `{ session_id, cwd }` from a hook event; `cwd` falls back to `repoRoot` when absent or relative. */
@@ -127,7 +109,8 @@ function hookSessionScope(parsed, repoRoot) {
127
109
  const cwd = record["cwd"];
128
110
  return { sessionId, cwd: typeof cwd === "string" && isAbsolute(cwd) ? cwd : repoRoot };
129
111
  }
130
- export async function runStopSkillReviewHookCli(stdin, stdout, stderr, repoRoot = process.cwd()) {
112
+ /** Enforce lit-plan persistence when a Stop hook event arrives. */
113
+ export async function runStopPlanPersistenceHookCli(stdin, stdout, stderr, repoRoot = process.cwd()) {
131
114
  const decoded = await readStdin(stdin);
132
115
  if (decoded === null) {
133
116
  stderr.write(errorLine("LIT_HOOK_STDIN_TOO_LARGE", TOO_LARGE_MESSAGE));
@@ -146,12 +129,6 @@ export async function runStopSkillReviewHookCli(stdin, stdout, stderr, repoRoot
146
129
  stderr.write(errorLine("LIT_HOOK_STDIN_INVALID_JSON", INVALID_JSON_MESSAGE));
147
130
  return 2;
148
131
  }
149
- try {
150
- markPendingReviews(repoRoot, parsed, { env: process.env });
151
- }
152
- catch {
153
- // Pending-review marking is advisory and never blocks the existing start-work handler.
154
- }
155
132
  const scope = hookSessionScope(parsed, repoRoot);
156
133
  if (scope !== null) {
157
134
  const persistence = evaluatePlanPersistence(scope.cwd, scope.sessionId);
@@ -26,8 +26,6 @@ export declare const SCIENTIFIC_VISUALIZATION_DIRECTIVE_MARKER: "<lit-scientific
26
26
  export declare const SCIENTIFIC_VISUALIZATION_DIRECTIVE_CLOSE: "</lit-scientific-visualization-mode>";
27
27
  export declare const BROWSER_DRIVE_DIRECTIVE_MARKER: "<browser-drive-mode>";
28
28
  export declare const BROWSER_DRIVE_DIRECTIVE_CLOSE: "</browser-drive-mode>";
29
- export declare const SKILL_OBSERVER_DIRECTIVE_MARKER: "<skill-observer-mode>";
30
- export declare const SKILL_OBSERVER_DIRECTIVE_CLOSE: "</skill-observer-mode>";
31
29
  export declare const LIT_COMPREHEND_DIRECTIVE_MARKER: "<lit-comprehend-mode>";
32
30
  export declare const LIT_COMPREHEND_DIRECTIVE_CLOSE: "</lit-comprehend-mode>";
33
31
  export type LitLoopDirectiveMarker = typeof LIT_LOOP_DIRECTIVE_MARKER;
@@ -32,7 +32,5 @@ export const SCIENTIFIC_VISUALIZATION_DIRECTIVE_MARKER = "<lit-scientific-visual
32
32
  export const SCIENTIFIC_VISUALIZATION_DIRECTIVE_CLOSE = "</lit-scientific-visualization-mode>";
33
33
  export const BROWSER_DRIVE_DIRECTIVE_MARKER = "<browser-drive-mode>";
34
34
  export const BROWSER_DRIVE_DIRECTIVE_CLOSE = "</browser-drive-mode>";
35
- export const SKILL_OBSERVER_DIRECTIVE_MARKER = "<skill-observer-mode>";
36
- export const SKILL_OBSERVER_DIRECTIVE_CLOSE = "</skill-observer-mode>";
37
35
  export const LIT_COMPREHEND_DIRECTIVE_MARKER = "<lit-comprehend-mode>";
38
36
  export const LIT_COMPREHEND_DIRECTIVE_CLOSE = "</lit-comprehend-mode>";
@@ -1,7 +1,7 @@
1
1
  import type { RenamedSkillId } from "./skill-renames.js";
2
2
  import type { LitTriggerToken } from "./trigger.js";
3
3
  /** Lit-family modes. Multiple tokens may map to one mode (lit/litcodex/lit-loop → lit-loop). */
4
- export type LitMode = RenamedSkillId | "browser-drive" | "skill-observer" | "lit-handoff" | "lit-scientific-visualization" | "deep-interview" | "lit-crucible" | "lit-init" | "lit-loop" | "litwork" | "lit-plan" | "litgoal" | "review-work" | "litresearch" | "start-work" | "lit-recap" | "lit-comprehend";
4
+ export type LitMode = RenamedSkillId | "browser-drive" | "lit-handoff" | "lit-scientific-visualization" | "deep-interview" | "lit-crucible" | "lit-init" | "lit-loop" | "litwork" | "lit-plan" | "litgoal" | "review-work" | "litresearch" | "start-work" | "lit-recap" | "lit-comprehend";
5
5
  /** Per-mode routing spec: its marker pair (guard) + resolved directive path (loader). */
6
6
  export interface LitModeSpec {
7
7
  readonly mode: LitMode;
@@ -21,8 +21,6 @@ export declare const HANDOFF_MODE_SPEC: LitModeSpec;
21
21
  export declare const SCIENTIFIC_VISUALIZATION_MODE_SPEC: LitModeSpec;
22
22
  /** Exact browser-drive and `$litcodex:browser-drive` are standalone routes outside token matching. */
23
23
  export declare const BROWSER_DRIVE_MODE_SPEC: LitModeSpec;
24
- /** Exact skill-observer and `$litcodex:skill-observer` are standalone routes. */
25
- export declare const SKILL_OBSERVER_MODE_SPEC: LitModeSpec;
26
24
  /** Token → mode spec. Frozen; the single source the hook router branches on. */
27
25
  export declare const MODE_BY_TOKEN: Readonly<Record<LitTriggerToken, LitModeSpec>>;
28
26
  /** The mode spec for a matched token. Total over the token union (every token has a spec). */
@@ -15,7 +15,7 @@
15
15
  // Imports markers + the trigger token type only (no cycle: hook → modes → {markers, trigger}).
16
16
  import { existsSync } from "node:fs";
17
17
  import { fileURLToPath } from "node:url";
18
- import { BROWSER_DRIVE_DIRECTIVE_CLOSE, BROWSER_DRIVE_DIRECTIVE_MARKER, DEEP_INTERVIEW_DIRECTIVE_CLOSE, DEEP_INTERVIEW_DIRECTIVE_MARKER, HANDOFF_DIRECTIVE_CLOSE, HANDOFF_DIRECTIVE_MARKER, LIT_COMPREHEND_DIRECTIVE_CLOSE, LIT_COMPREHEND_DIRECTIVE_MARKER, LIT_CRUCIBLE_DIRECTIVE_CLOSE, LIT_CRUCIBLE_DIRECTIVE_MARKER, LIT_INIT_DIRECTIVE_CLOSE, LIT_INIT_DIRECTIVE_MARKER, LIT_LOOP_DIRECTIVE_CLOSE, LIT_LOOP_DIRECTIVE_MARKER, LIT_PLAN_DIRECTIVE_CLOSE, LIT_PLAN_DIRECTIVE_MARKER, LIT_RECAP_DIRECTIVE_CLOSE, LIT_RECAP_DIRECTIVE_MARKER, LITGOAL_DIRECTIVE_CLOSE, LITGOAL_DIRECTIVE_MARKER, LITRESEARCH_DIRECTIVE_CLOSE, LITRESEARCH_DIRECTIVE_MARKER, LITWORK_DIRECTIVE_CLOSE, LITWORK_DIRECTIVE_MARKER, REVIEW_WORK_DIRECTIVE_CLOSE, REVIEW_WORK_DIRECTIVE_MARKER, SCIENTIFIC_VISUALIZATION_DIRECTIVE_CLOSE, SCIENTIFIC_VISUALIZATION_DIRECTIVE_MARKER, SKILL_OBSERVER_DIRECTIVE_CLOSE, SKILL_OBSERVER_DIRECTIVE_MARKER, START_WORK_DIRECTIVE_CLOSE, START_WORK_DIRECTIVE_MARKER, } from "./markers.js";
18
+ import { BROWSER_DRIVE_DIRECTIVE_CLOSE, BROWSER_DRIVE_DIRECTIVE_MARKER, DEEP_INTERVIEW_DIRECTIVE_CLOSE, DEEP_INTERVIEW_DIRECTIVE_MARKER, HANDOFF_DIRECTIVE_CLOSE, HANDOFF_DIRECTIVE_MARKER, LIT_COMPREHEND_DIRECTIVE_CLOSE, LIT_COMPREHEND_DIRECTIVE_MARKER, LIT_CRUCIBLE_DIRECTIVE_CLOSE, LIT_CRUCIBLE_DIRECTIVE_MARKER, LIT_INIT_DIRECTIVE_CLOSE, LIT_INIT_DIRECTIVE_MARKER, LIT_LOOP_DIRECTIVE_CLOSE, LIT_LOOP_DIRECTIVE_MARKER, LIT_PLAN_DIRECTIVE_CLOSE, LIT_PLAN_DIRECTIVE_MARKER, LIT_RECAP_DIRECTIVE_CLOSE, LIT_RECAP_DIRECTIVE_MARKER, LITGOAL_DIRECTIVE_CLOSE, LITGOAL_DIRECTIVE_MARKER, LITRESEARCH_DIRECTIVE_CLOSE, LITRESEARCH_DIRECTIVE_MARKER, LITWORK_DIRECTIVE_CLOSE, LITWORK_DIRECTIVE_MARKER, REVIEW_WORK_DIRECTIVE_CLOSE, REVIEW_WORK_DIRECTIVE_MARKER, SCIENTIFIC_VISUALIZATION_DIRECTIVE_CLOSE, SCIENTIFIC_VISUALIZATION_DIRECTIVE_MARKER, START_WORK_DIRECTIVE_CLOSE, START_WORK_DIRECTIVE_MARKER, } from "./markers.js";
19
19
  /** Resolve a path relative to this module (percent-decoding, space/#/Hangul-safe). */
20
20
  function resolveFromHere(rel) {
21
21
  return fileURLToPath(new URL(rel, import.meta.url));
@@ -67,15 +67,6 @@ export const BROWSER_DRIVE_MODE_SPEC = Object.freeze({
67
67
  skillName: "browser-drive",
68
68
  skillPath: resolveSkillPath("browser-drive"),
69
69
  });
70
- /** Exact skill-observer and `$litcodex:skill-observer` are standalone routes. */
71
- export const SKILL_OBSERVER_MODE_SPEC = Object.freeze({
72
- mode: "skill-observer",
73
- openMarker: SKILL_OBSERVER_DIRECTIVE_MARKER,
74
- closeMarker: SKILL_OBSERVER_DIRECTIVE_CLOSE,
75
- directivePath: resolveFromHere("../directives/skill-observer.md"),
76
- skillName: "skill-observer",
77
- skillPath: resolveSkillPath("skill-observer"),
78
- });
79
70
  /** Token → mode spec. Frozen; the single source the hook router branches on. */
80
71
  export const MODE_BY_TOKEN = Object.freeze({
81
72
  "lit-crucible": Object.freeze({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/lit-loop",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex Lit-Loop runtime: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/lsp",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex LSP hook (inert placeholder): post-edit diagnostics + cache reset, no-op until an LSP daemon is provided.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -94,13 +94,13 @@ function runPostCompactRecovery(input) {
94
94
  }
95
95
  const fullBodyRules = missingRules.filter((rule) => isNeverTruncatedRule(ruleDisplayPath(rule)));
96
96
  const listedRules = missingRules.filter((rule) => !isNeverTruncatedRule(ruleDisplayPath(rule)));
97
- const directiveCandidate = buildPostCompactReadDirective([...listedRules.map((rule) => rule.path), ...dynamicRulePaths], effectiveConfig.maxResultChars);
97
+ const formatted = fullBodyRules.length === 0 ? { block: "", rules: [] } : engine.formatStaticResult(fullBodyRules);
98
+ const directiveCandidate = buildPostCompactReadDirective([...listedRules.map((rule) => rule.path), ...dynamicRulePaths], Math.max(0, effectiveConfig.maxResultChars - (fullBodyRules.length > 0 ? 2 : 0)));
98
99
  const directiveBudget = withOptionalContextBudget(effectiveConfig, [directiveCandidate], fullBodyRules.length > 0);
99
100
  Object.assign(effectiveConfig, directiveBudget.config);
100
101
  const directive = directiveBudget.blocks[0] ?? "";
101
102
  const contextBudget = withOptionalContextBudget(effectiveConfig, [shellAwareness, outputStyle], fullBodyRules.length > 0 || directive.length > 0);
102
103
  Object.assign(effectiveConfig, contextBudget.config);
103
- const formatted = fullBodyRules.length === 0 ? { block: "", rules: [] } : engine.formatStaticResult(fullBodyRules);
104
104
  const combinedContext = combineStaticContext(formatted.block, directive, ...contextBudget.blocks);
105
105
  const deliveredContext = prepareAdditionalContext(combinedContext);
106
106
  const formattedDelivered = formatted.block.length > 0 && deliveredContext.startsWith(formatted.block.trim());
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litcodex/rules",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "LitCodex rules: injects project rule files (AGENTS.md etc.) into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "private": true,