@litfamily/litcodex 1.0.1 → 1.0.3
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 +22 -23
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -38
- package/dist/install/generated-skill-payload-hashes.d.ts +12 -17
- package/dist/install/generated-skill-payload-hashes.js +12 -17
- 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/directive.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/browser-drive.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/deep-interview.md +3 -3
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-comprehend.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-crucible.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-handoff.md +2 -2
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-init.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-plan.md +2 -2
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-recap.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-scientific-visualization.md +2 -2
- package/marketplace/plugins/litcodex/components/lit-loop/directives/litgoal.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/litresearch.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/litwork.md +2 -2
- package/marketplace/plugins/litcodex/components/lit-loop/directives/review-work.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/directives/start-work.md +1 -1
- package/marketplace/plugins/litcodex/components/lit-loop/dist/cli.js +3 -20
- package/marketplace/plugins/litcodex/components/lit-loop/dist/codex-hook.d.ts +5 -5
- package/marketplace/plugins/litcodex/components/lit-loop/dist/codex-hook.js +20 -19
- package/marketplace/plugins/litcodex/components/lit-loop/dist/directive.js +1 -1
- 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/lit-mark.d.ts +2 -0
- package/marketplace/plugins/litcodex/components/lit-loop/dist/lit-mark.js +49 -0
- 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/hooks/hooks.json +19 -19
- package/marketplace/plugins/litcodex/skills/autoconference/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/autoresearch/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/browser-drive/SKILL.md +3 -3
- package/marketplace/plugins/litcodex/skills/browser-drive/scripts/capability-probe.mjs +13 -5
- package/marketplace/plugins/litcodex/skills/coding-session-audit/SKILL.md +2 -2
- package/marketplace/plugins/litcodex/skills/comment-checker/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/debugging/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/deep-interview/SKILL.md +3 -3
- package/marketplace/plugins/litcodex/skills/frontend-ui-ux/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/frontend-ui-ux/references/complete-contract.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-burnoff/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-burnoff-file/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-code/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-commit/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-comprehend/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-crucible/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-fetch/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-handoff/SKILL.md +4 -4
- package/marketplace/plugins/litcodex/skills/lit-init/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-korean/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-loop/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-plan/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-recap/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lit-scientific-visualization/SKILL.md +4 -4
- package/marketplace/plugins/litcodex/skills/lit-team/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/litcodex-contribute-bug-fix/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/litcodex-doctor/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/litcodex-report-bug/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/litgoal/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/litresearch/SKILL.md +2 -2
- package/marketplace/plugins/litcodex/skills/litwork/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lsp/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/lsp-setup/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/refactor/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/review-work/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/rules/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/start-work/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/structural-search/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/visual-qa/SKILL.md +1 -1
- package/marketplace/plugins/litcodex/skills/visual-qa/references/complete-contract.md +1 -1
- package/marketplace/plugins/litcodex/skills/wikify/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/README.md +1 -7
- package/node_modules/@litcodex/lit-loop/directive.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/browser-drive.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/deep-interview.md +3 -3
- package/node_modules/@litcodex/lit-loop/directives/lit-comprehend.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/lit-crucible.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/lit-handoff.md +2 -2
- package/node_modules/@litcodex/lit-loop/directives/lit-init.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/lit-plan.md +2 -2
- package/node_modules/@litcodex/lit-loop/directives/lit-recap.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/lit-scientific-visualization.md +2 -2
- package/node_modules/@litcodex/lit-loop/directives/litgoal.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/litresearch.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/litwork.md +2 -2
- package/node_modules/@litcodex/lit-loop/directives/review-work.md +1 -1
- package/node_modules/@litcodex/lit-loop/directives/start-work.md +1 -1
- package/node_modules/@litcodex/lit-loop/dist/cli.js +3 -20
- package/node_modules/@litcodex/lit-loop/dist/codex-hook.d.ts +5 -5
- package/node_modules/@litcodex/lit-loop/dist/codex-hook.js +20 -19
- package/node_modules/@litcodex/lit-loop/dist/directive.js +1 -1
- 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/lit-mark.d.ts +2 -0
- package/node_modules/@litcodex/lit-loop/dist/lit-mark.js +49 -0
- 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/SKILL.md +3 -3
- package/node_modules/@litcodex/lit-loop/skills/browser-drive/scripts/capability-probe.mjs +13 -5
- package/node_modules/@litcodex/lit-loop/skills/deep-interview/SKILL.md +3 -3
- package/node_modules/@litcodex/lit-loop/skills/lit-burnoff/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-burnoff-file/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-code/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-commit/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-comprehend/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-crucible/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-fetch/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-handoff/SKILL.md +4 -4
- package/node_modules/@litcodex/lit-loop/skills/lit-init/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-korean/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-loop/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-plan/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-recap/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/lit-scientific-visualization/SKILL.md +4 -4
- package/node_modules/@litcodex/lit-loop/skills/lit-team/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/litgoal/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/litresearch/SKILL.md +2 -2
- package/node_modules/@litcodex/lit-loop/skills/litwork/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/review-work/SKILL.md +1 -1
- package/node_modules/@litcodex/lit-loop/skills/start-work/SKILL.md +1 -1
- 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
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · lit-plan** 🔥`
|
|
133
133
|
|
|
134
134
|
Print that line verbatim, then begin. You are now in lit-plan: a strategic
|
|
135
135
|
planning consultant running inside Codex. From a vague or large request you
|
|
@@ -451,7 +451,7 @@ returned or been closed as inconclusive. Subagent outputs are claims, not
|
|
|
451
451
|
approval, until independently verified.
|
|
452
452
|
|
|
453
453
|
# Output discipline
|
|
454
|
-
- First line literally:
|
|
454
|
+
- First line literally: `🔥 **LIT IGNITED · lit-plan** 🔥`
|
|
455
455
|
- During exploration: surface active subagent count, agent names, latest
|
|
456
456
|
`WORKING:` phase, and whether you are waiting on mailbox updates.
|
|
457
457
|
- At the gate: present the approval brief (findings + ambiguities + intended
|
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · lit-recap** 🔥`
|
|
133
133
|
|
|
134
134
|
Print that line verbatim, then produce the recap. You are now in lit-recap: the
|
|
135
135
|
read-only work-RECAP surface. Your one job is to merge the durable LitCodex
|
package/marketplace/plugins/litcodex/components/lit-loop/directives/lit-scientific-visualization.md
CHANGED
|
@@ -28,7 +28,7 @@ paths, slash-style text, near misses, and `$litcodex:lit-scientific-visualizatio
|
|
|
28
28
|
hook route. The scoped form and skill-picker selection remain native Codex skill-discovery routes.
|
|
29
29
|
|
|
30
30
|
**MANDATORY:** the exact first user-visible line is
|
|
31
|
-
|
|
31
|
+
`🔥 **LIT IGNITED · lit-scientific-visualization** 🔥`.
|
|
32
32
|
|
|
33
33
|
## #contract.inputs
|
|
34
34
|
|
|
@@ -94,7 +94,7 @@ hook route. The scoped form and skill-picker selection remain native Codex skill
|
|
|
94
94
|
{
|
|
95
95
|
"contract_schema_version": 1,
|
|
96
96
|
"output_schema": {
|
|
97
|
-
"first_visible_line": "
|
|
97
|
+
"first_visible_line": "🔥 **LIT IGNITED · lit-scientific-visualization** 🔥",
|
|
98
98
|
"runtime_status": "ready | degraded | guidance-only | blocked",
|
|
99
99
|
"source_integrity": "verified 16-file manifest | failed",
|
|
100
100
|
"data_contract": ["variables, units, samples, filters, transformations, uncertainty"],
|
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · litgoal** 🔥`
|
|
133
133
|
|
|
134
134
|
Print that line verbatim, then bind the goal. You are now in litgoal: the
|
|
135
135
|
goal-BINDING surface. Your one job is to turn the user's request into a crisp
|
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · litresearch** 🔥`
|
|
133
133
|
|
|
134
134
|
You are in litresearch: exhaustive research is the deliverable. Separate observed facts from ideas,
|
|
135
135
|
sources from interpretations, and uncertainty from conclusions. Do not implement unless the user
|
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · litwork** 🔥`
|
|
133
133
|
|
|
134
134
|
[CODE RED] Maximum precision. Outcome-first. Evidence-driven.
|
|
135
135
|
|
|
@@ -478,7 +478,7 @@ message + present for approval.
|
|
|
478
478
|
- Parallel tool calls for any independent work.
|
|
479
479
|
|
|
480
480
|
# Output discipline
|
|
481
|
-
- First line literally:
|
|
481
|
+
- First line literally: `🔥 **LIT IGNITED · litwork** 🔥`
|
|
482
482
|
- After bootstrap: give the reader a 1-2 paragraph plan summary. Keep the
|
|
483
483
|
exact notepad path in internal state unless the user requests it or it is
|
|
484
484
|
needed to resolve a material blocker.
|
|
@@ -129,7 +129,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
129
129
|
- Do not mark delegated work complete from a worker DoneClaim until an independent verification step confirms it.
|
|
130
130
|
|
|
131
131
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
132
|
-
|
|
132
|
+
`🔥 **LIT IGNITED · review-work** 🔥`
|
|
133
133
|
|
|
134
134
|
You are in review-work. First classify the input as a draft plan or completed work; the two modes have
|
|
135
135
|
different evidence and verdict contracts.
|
|
@@ -130,7 +130,7 @@ This directive is an LLM-facing contract injected by the LitCodex Codex plugin,
|
|
|
130
130
|
- Do not reroute this activation to a same-named skill from another harness.
|
|
131
131
|
|
|
132
132
|
**MANDATORY**: First user-visible line this turn MUST be exactly:
|
|
133
|
-
|
|
133
|
+
`🔥 **LIT IGNITED · start-work** 🔥`
|
|
134
134
|
|
|
135
135
|
# Collision-safe execution
|
|
136
136
|
|
|
@@ -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
|
}
|
|
@@ -18,7 +18,7 @@ export interface LitPreToolUseCreateGoalInput {
|
|
|
18
18
|
export type HookDecision = {
|
|
19
19
|
readonly kind: "inject";
|
|
20
20
|
readonly stdout: string;
|
|
21
|
-
readonly mode
|
|
21
|
+
readonly mode: LitMode;
|
|
22
22
|
} | {
|
|
23
23
|
readonly kind: "noop";
|
|
24
24
|
};
|
|
@@ -37,11 +37,11 @@ export type PreToolUseCreateGoalDecision = {
|
|
|
37
37
|
export declare function isLitUserPromptSubmitInput(value: unknown): value is LitUserPromptSubmitInput;
|
|
38
38
|
export declare function isLitPreToolUseCreateGoalInput(value: unknown): value is LitPreToolUseCreateGoalInput;
|
|
39
39
|
/**
|
|
40
|
-
* Wraps directive text in the Codex output envelope. Returns "" if the
|
|
41
|
-
* (caller treats "" as noop). Output is a single-line JSON + trailing
|
|
42
|
-
*
|
|
40
|
+
* Wraps directive text and the active mode in the Codex output envelope. Returns "" if the
|
|
41
|
+
* normalized context is empty (caller treats "" as noop). Output is a single-line JSON + trailing
|
|
42
|
+
* "\n" with the per-invocation user-visible systemMessage at the top level.
|
|
43
43
|
*/
|
|
44
|
-
export declare function formatAdditionalContextOutput(additionalContext: string): string;
|
|
44
|
+
export declare function formatAdditionalContextOutput(additionalContext: string, mode: LitMode, env?: NodeJS.ProcessEnv): string;
|
|
45
45
|
export declare function applyPreToolUseCreateGoalGuard(input: unknown): PreToolUseCreateGoalDecision;
|
|
46
46
|
/**
|
|
47
47
|
* Pure decision function (multi-mode router). Takes an already-parsed value (NOT a raw string).
|
|
@@ -21,9 +21,9 @@ 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 {
|
|
24
|
+
import { activationMessage } from "./lit-mark.js";
|
|
25
|
+
import { BROWSER_DRIVE_MODE_SPEC, HANDOFF_MODE_SPEC, modeForToken, resolveSkillPath, SCIENTIFIC_VISUALIZATION_MODE_SPEC, } from "./modes.js";
|
|
25
26
|
import { isExactBareScientificVisualizationPrompt, isScientificVisualizationWhitespaceNearMiss, shouldSuppressScientificVisualizationInjection, } from "./scientific-visualization-route.js";
|
|
26
|
-
import { isExactSkillObserverPrompt, shouldSuppressSkillObserverInjection } from "./skill-observer-route.js";
|
|
27
27
|
import { matchRenamedSkillInvocation, skillRenameNote } from "./skill-renames.js";
|
|
28
28
|
import { maskMarkdownCode, matchLitTrigger } from "./trigger.js";
|
|
29
29
|
const HOOK_EVENT_NAME = "UserPromptSubmit";
|
|
@@ -86,16 +86,17 @@ export function isLitPreToolUseCreateGoalInput(value) {
|
|
|
86
86
|
Object.hasOwn(value, "tool_input"));
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
* Wraps directive text in the Codex output envelope. Returns "" if the
|
|
90
|
-
* (caller treats "" as noop). Output is a single-line JSON + trailing
|
|
91
|
-
*
|
|
89
|
+
* Wraps directive text and the active mode in the Codex output envelope. Returns "" if the
|
|
90
|
+
* normalized context is empty (caller treats "" as noop). Output is a single-line JSON + trailing
|
|
91
|
+
* "\n" with the per-invocation user-visible systemMessage at the top level.
|
|
92
92
|
*/
|
|
93
|
-
export function formatAdditionalContextOutput(additionalContext) {
|
|
93
|
+
export function formatAdditionalContextOutput(additionalContext, mode, env = process.env) {
|
|
94
94
|
const normalized = additionalContext.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
|
|
95
95
|
if (normalized.length === 0) {
|
|
96
96
|
return "";
|
|
97
97
|
}
|
|
98
98
|
const output = {
|
|
99
|
+
systemMessage: activationMessage(mode, env),
|
|
99
100
|
hookSpecificOutput: {
|
|
100
101
|
hookEventName: HOOK_EVENT_NAME,
|
|
101
102
|
additionalContext: normalized,
|
|
@@ -173,7 +174,7 @@ export function runUserPromptSubmitHook(input) {
|
|
|
173
174
|
return {
|
|
174
175
|
kind: "inject",
|
|
175
176
|
mode: renamed.skillId,
|
|
176
|
-
stdout: formatAdditionalContextOutput([context, renamed.note].filter(Boolean).join("\n")),
|
|
177
|
+
stdout: formatAdditionalContextOutput([context, renamed.note].filter(Boolean).join("\n"), renamed.skillId),
|
|
177
178
|
};
|
|
178
179
|
}
|
|
179
180
|
catch (error) {
|
|
@@ -185,26 +186,26 @@ export function runUserPromptSubmitHook(input) {
|
|
|
185
186
|
if (isExactBareHandoffPrompt(input.prompt)) {
|
|
186
187
|
if (shouldSuppressHandoffInjection(transcriptPath))
|
|
187
188
|
return { kind: "noop" };
|
|
188
|
-
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(HANDOFF_MODE_SPEC));
|
|
189
|
-
|
|
189
|
+
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(HANDOFF_MODE_SPEC), HANDOFF_MODE_SPEC.mode);
|
|
190
|
+
if (stdout === "")
|
|
191
|
+
return { kind: "noop" };
|
|
192
|
+
return { kind: "inject", stdout, mode: HANDOFF_MODE_SPEC.mode };
|
|
190
193
|
}
|
|
191
194
|
if (isExactBareScientificVisualizationPrompt(input.prompt)) {
|
|
192
195
|
if (shouldSuppressScientificVisualizationInjection(transcriptPath))
|
|
193
196
|
return { kind: "noop" };
|
|
194
|
-
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(SCIENTIFIC_VISUALIZATION_MODE_SPEC));
|
|
195
|
-
|
|
197
|
+
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(SCIENTIFIC_VISUALIZATION_MODE_SPEC), SCIENTIFIC_VISUALIZATION_MODE_SPEC.mode);
|
|
198
|
+
if (stdout === "")
|
|
199
|
+
return { kind: "noop" };
|
|
200
|
+
return { kind: "inject", stdout, mode: SCIENTIFIC_VISUALIZATION_MODE_SPEC.mode };
|
|
196
201
|
}
|
|
197
202
|
if (isExactBrowserDrivePrompt(input.prompt)) {
|
|
198
203
|
if (shouldSuppressBrowserDriveInjection(transcriptPath))
|
|
199
204
|
return { kind: "noop" };
|
|
200
|
-
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(BROWSER_DRIVE_MODE_SPEC));
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
if (isExactSkillObserverPrompt(input.prompt)) {
|
|
204
|
-
if (shouldSuppressSkillObserverInjection(transcriptPath))
|
|
205
|
+
const stdout = formatAdditionalContextOutput(loadDirectiveForModeFailSilent(BROWSER_DRIVE_MODE_SPEC), BROWSER_DRIVE_MODE_SPEC.mode);
|
|
206
|
+
if (stdout === "")
|
|
205
207
|
return { kind: "noop" };
|
|
206
|
-
|
|
207
|
-
return stdout === "" ? { kind: "noop" } : { kind: "inject", stdout };
|
|
208
|
+
return { kind: "inject", stdout, mode: BROWSER_DRIVE_MODE_SPEC.mode };
|
|
208
209
|
}
|
|
209
210
|
if (isScientificVisualizationWhitespaceNearMiss(input.prompt))
|
|
210
211
|
return { kind: "noop" };
|
|
@@ -220,7 +221,7 @@ export function runUserPromptSubmitHook(input) {
|
|
|
220
221
|
const context = loadDirectiveForModeFailSilent(mode);
|
|
221
222
|
const stdout = context === ""
|
|
222
223
|
? ""
|
|
223
|
-
: formatAdditionalContextOutput([context, skillRenameNote(match.raw)].filter(Boolean).join("\n"));
|
|
224
|
+
: formatAdditionalContextOutput([context, skillRenameNote(match.raw)].filter(Boolean).join("\n"), mode.mode);
|
|
224
225
|
if (stdout === "") {
|
|
225
226
|
return { kind: "noop" };
|
|
226
227
|
}
|
|
@@ -99,7 +99,7 @@ export function loadDirectiveWithSkillBodyFrom(resolvedPath, openMarker, closeMa
|
|
|
99
99
|
"Follow the complete installed skill body below. Its referenced workflow files remain available for on-demand reading.",
|
|
100
100
|
"For this hook-routed activation, the first user-visible line must be exactly:",
|
|
101
101
|
"",
|
|
102
|
-
"
|
|
102
|
+
"🔥 **LIT IGNITED · lit-plan** 🔥",
|
|
103
103
|
"",
|
|
104
104
|
].join("\n")
|
|
105
105
|
: directive.slice(0, -closeMarker.length).trimEnd();
|
|
@@ -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);
|
|
@@ -5,6 +5,8 @@ export type ColorMode = "truecolor" | "256" | "none";
|
|
|
5
5
|
/** The standard mark in a 28-column field, with an arbitrary product label alongside. */
|
|
6
6
|
export declare function lockup(productName: string): string[];
|
|
7
7
|
export declare function supportsBlocks(env: NodeJS.ProcessEnv): boolean;
|
|
8
|
+
/** Pipe-safe UserPromptSubmit mark; model-facing additionalContext remains plain text. */
|
|
9
|
+
export declare function activationMessage(discipline: string, env?: NodeJS.ProcessEnv): string;
|
|
8
10
|
export declare function colorMode(opts: {
|
|
9
11
|
readonly isTty: boolean;
|
|
10
12
|
readonly env: NodeJS.ProcessEnv;
|
|
@@ -90,6 +90,55 @@ export function supportsBlocks(env) {
|
|
|
90
90
|
const locale = env["LC_ALL"] || env["LC_CTYPE"] || env["LANG"];
|
|
91
91
|
return env["TERM"] !== "dumb" && (!locale || /utf-?8/i.test(locale));
|
|
92
92
|
}
|
|
93
|
+
const ACTIVATION_GRADIENT = [
|
|
94
|
+
[255, 99, 55],
|
|
95
|
+
[255, 45, 149],
|
|
96
|
+
[0, 229, 255],
|
|
97
|
+
];
|
|
98
|
+
const ACTIVATION_MARK_WIDTH = 12;
|
|
99
|
+
function activationColoursEnabled(env) {
|
|
100
|
+
// UserPromptSubmit stdout is always piped, so this deliberately does not inspect a TTY.
|
|
101
|
+
return !Object.hasOwn(env, "NO_COLOR") && !Object.hasOwn(env, "CI") && supportsBlocks(env);
|
|
102
|
+
}
|
|
103
|
+
function interpolateActivation(stops, progress) {
|
|
104
|
+
const segment = Math.min(stops.length - 2, Math.floor(progress * (stops.length - 1)));
|
|
105
|
+
const fraction = progress * (stops.length - 1) - segment;
|
|
106
|
+
const start = stops[segment];
|
|
107
|
+
const end = stops[segment + 1];
|
|
108
|
+
if (!start || !end)
|
|
109
|
+
throw new Error("activation gradient requires at least two stops");
|
|
110
|
+
return [
|
|
111
|
+
Math.round(start[0] + (end[0] - start[0]) * fraction),
|
|
112
|
+
Math.round(start[1] + (end[1] - start[1]) * fraction),
|
|
113
|
+
Math.round(start[2] + (end[2] - start[2]) * fraction),
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
function paintActivation(text, enabled) {
|
|
117
|
+
if (!enabled)
|
|
118
|
+
return text;
|
|
119
|
+
const chars = [...text];
|
|
120
|
+
const last = chars.length - 1;
|
|
121
|
+
const painted = chars
|
|
122
|
+
.map((character, index) => {
|
|
123
|
+
if (character === " ")
|
|
124
|
+
return character;
|
|
125
|
+
const [red, green, blue] = interpolateActivation(ACTIVATION_GRADIENT, last === 0 ? 0 : index / last);
|
|
126
|
+
return `\x1b[38;2;${red};${green};${blue}m${character}`;
|
|
127
|
+
})
|
|
128
|
+
.join("");
|
|
129
|
+
return `\x1b[1m${painted}\x1b[0m`;
|
|
130
|
+
}
|
|
131
|
+
/** Pipe-safe UserPromptSubmit mark; model-facing additionalContext remains plain text. */
|
|
132
|
+
export function activationMessage(discipline, env = process.env) {
|
|
133
|
+
const enabled = activationColoursEnabled(env);
|
|
134
|
+
const rows = micro.map((row) => row.trimEnd());
|
|
135
|
+
const width = Math.max(ACTIVATION_MARK_WIDTH, ...rows.map((row) => [...row].length));
|
|
136
|
+
const paddedRows = rows.map((row) => row.padEnd(width));
|
|
137
|
+
const label = `🔥 ${paintActivation(`LIT IGNITED · ${discipline}`, enabled)} 🔥`;
|
|
138
|
+
return `\n${paddedRows
|
|
139
|
+
.map((row, index) => `${paintActivation(row, enabled)}${index === 2 ? ` ${label}` : ""}`)
|
|
140
|
+
.join("\n")}`;
|
|
141
|
+
}
|
|
93
142
|
export function colorMode(opts) {
|
|
94
143
|
const { env } = opts;
|
|
95
144
|
if (!opts.isTty || opts.json || env["NO_COLOR"] !== undefined || env["CI"] !== undefined || !supportsBlocks(env)) {
|
|
@@ -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.3",
|
|
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());
|