@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.
- package/README.md +18 -21
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -38
- package/dist/install/generated-skill-payload-hashes.d.ts +1 -6
- package/dist/install/generated-skill-payload-hashes.js +1 -6
- package/dist/install/skill-catalog.d.ts +1 -1
- package/dist/install/skill-catalog.js +1 -6
- package/dist/install/skill-resource-hashes.d.ts +1 -1
- package/dist/install/skill-resource-hashes.js +1 -1
- package/marketplace/plugins/litcodex/.codex-plugin/plugin.json +1 -1
- package/marketplace/plugins/litcodex/components/auto-update/package.json +1 -1
- package/marketplace/plugins/litcodex/components/comment-checker/package.json +1 -1
- package/marketplace/plugins/litcodex/components/git-bash/package.json +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/dist/cli.js +3 -20
- package/marketplace/plugins/litcodex/components/lit-loop/dist/codex-hook.js +1 -8
- package/marketplace/plugins/litcodex/components/lit-loop/dist/hook-cli.d.ts +2 -1
- package/marketplace/plugins/litcodex/components/lit-loop/dist/hook-cli.js +4 -27
- package/marketplace/plugins/litcodex/components/lit-loop/dist/markers.d.ts +0 -2
- package/marketplace/plugins/litcodex/components/lit-loop/dist/markers.js +0 -2
- package/marketplace/plugins/litcodex/components/lit-loop/dist/modes.d.ts +1 -3
- package/marketplace/plugins/litcodex/components/lit-loop/dist/modes.js +1 -10
- package/marketplace/plugins/litcodex/components/lit-loop/package.json +1 -1
- package/marketplace/plugins/litcodex/components/lsp/package.json +1 -1
- package/marketplace/plugins/litcodex/components/rules/dist/static-injection.js +2 -2
- package/marketplace/plugins/litcodex/components/rules/package.json +1 -1
- package/marketplace/plugins/litcodex/components/start-work-continuation/package.json +1 -1
- package/marketplace/plugins/litcodex/components/telemetry/package.json +1 -1
- package/marketplace/plugins/litcodex/components/wikify-knowledge/package.json +1 -1
- package/marketplace/plugins/litcodex/skills/browser-drive/scripts/capability-probe.mjs +13 -5
- package/node_modules/@litcodex/lit-loop/README.md +1 -7
- package/node_modules/@litcodex/lit-loop/dist/cli.js +3 -20
- package/node_modules/@litcodex/lit-loop/dist/codex-hook.js +1 -8
- package/node_modules/@litcodex/lit-loop/dist/hook-cli.d.ts +2 -1
- package/node_modules/@litcodex/lit-loop/dist/hook-cli.js +4 -27
- package/node_modules/@litcodex/lit-loop/dist/markers.d.ts +0 -2
- package/node_modules/@litcodex/lit-loop/dist/markers.js +0 -2
- package/node_modules/@litcodex/lit-loop/dist/modes.d.ts +1 -3
- package/node_modules/@litcodex/lit-loop/dist/modes.js +1 -10
- package/node_modules/@litcodex/lit-loop/package.json +1 -1
- package/node_modules/@litcodex/lit-loop/skills/browser-drive/scripts/capability-probe.mjs +13 -5
- package/package.json +2 -2
- package/readme-assets/badge-version.svg +1 -1
- package/readme-assets/cover-motion.webp +0 -0
- package/marketplace/plugins/litcodex/components/lit-loop/directives/skill-observer.md +0 -105
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/apply.d.ts +0 -16
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/apply.js +0 -227
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/config.d.ts +0 -13
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/config.js +0 -12
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/curator.d.ts +0 -14
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/curator.js +0 -112
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/hook.d.ts +0 -19
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/hook.js +0 -435
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/ownership.d.ts +0 -6
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/ownership.js +0 -145
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/paths.d.ts +0 -18
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/paths.js +0 -43
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/review.d.ts +0 -28
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/review.js +0 -702
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/store.d.ts +0 -32
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/store.js +0 -667
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/transaction.d.ts +0 -26
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/transaction.js +0 -524
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/types.d.ts +0 -81
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/types.js +0 -246
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/usage.d.ts +0 -6
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop/usage.js +0 -119
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop-cli.d.ts +0 -8
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-loop-cli.js +0 -111
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-cli.d.ts +0 -3
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-cli.js +0 -116
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-route.d.ts +0 -6
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer-route.js +0 -12
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer.d.ts +0 -18
- package/marketplace/plugins/litcodex/components/lit-loop/dist/skill-observer.js +0 -946
- package/marketplace/plugins/litcodex/skills/skill-observer/SKILL.md +0 -215
- package/marketplace/plugins/litcodex/skills/skill-observer/agents/openai.yaml +0 -6
- package/marketplace/plugins/litcodex/skills/skill-observer/references/review-contract.md +0 -77
- package/node_modules/@litcodex/lit-loop/directives/skill-observer.md +0 -105
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/apply.d.ts +0 -16
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/apply.js +0 -227
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/config.d.ts +0 -13
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/config.js +0 -12
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/curator.d.ts +0 -14
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/curator.js +0 -112
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/hook.d.ts +0 -19
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/hook.js +0 -435
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/ownership.d.ts +0 -6
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/ownership.js +0 -145
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/paths.d.ts +0 -18
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/paths.js +0 -43
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/review.d.ts +0 -28
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/review.js +0 -702
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/store.d.ts +0 -32
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/store.js +0 -667
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/transaction.d.ts +0 -26
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/transaction.js +0 -524
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/types.d.ts +0 -81
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/types.js +0 -246
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/usage.d.ts +0 -6
- package/node_modules/@litcodex/lit-loop/dist/skill-loop/usage.js +0 -119
- package/node_modules/@litcodex/lit-loop/dist/skill-loop-cli.d.ts +0 -8
- package/node_modules/@litcodex/lit-loop/dist/skill-loop-cli.js +0 -111
- package/node_modules/@litcodex/lit-loop/dist/skill-observer-cli.d.ts +0 -3
- package/node_modules/@litcodex/lit-loop/dist/skill-observer-cli.js +0 -116
- package/node_modules/@litcodex/lit-loop/dist/skill-observer-route.d.ts +0 -6
- package/node_modules/@litcodex/lit-loop/dist/skill-observer-route.js +0 -12
- package/node_modules/@litcodex/lit-loop/dist/skill-observer.d.ts +0 -18
- package/node_modules/@litcodex/lit-loop/dist/skill-observer.js +0 -946
- package/node_modules/@litcodex/lit-loop/skills/skill-observer/SKILL.md +0 -215
- 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
|
+
<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.
|
|
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.
|
|
36
|
-
<a href="https://github.com/wjgoarxiv/litcodex/blob/main/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litcodex@1.0.
|
|
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.
|
|
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> <a href="#install">Install</a> <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> <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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
119
|
-
`npm exec --yes --package @litfamily/litcodex@1.0.
|
|
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.
|
|
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.
|
|
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.
|
|
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`, `
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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": "
|
|
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": "
|
|
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", "
|
|
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,
|
|
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,
|
|
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,
|
|
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";
|
|
@@ -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
|
-
//
|
|
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,
|
|
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
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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" | "
|
|
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,
|
|
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.
|
|
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,
|
|
@@ -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
|
|
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());
|