litclaude-ai 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +50 -22
  3. package/README_ko-KR.md +45 -21
  4. package/RELEASE_CHECKLIST.md +12 -8
  5. package/bin/litclaude-ai.js +103 -3
  6. package/docs/agents.md +6 -0
  7. package/docs/hooks.md +18 -26
  8. package/package.json +1 -1
  9. package/plugins/litclaude/.claude-plugin/plugin.json +4 -4
  10. package/plugins/litclaude/agents/boulder-executor.md +5 -2
  11. package/plugins/litclaude/agents/prometheus-planner.md +3 -1
  12. package/plugins/litclaude/bin/litclaude-hook.js +117 -13
  13. package/plugins/litclaude/commands/dynamic-workflow.md +6 -3
  14. package/plugins/litclaude/commands/lit-loop.md +4 -2
  15. package/plugins/litclaude/commands/lit-plan.md +5 -0
  16. package/plugins/litclaude/commands/litgoal.md +4 -0
  17. package/plugins/litclaude/commands/litresearch.md +3 -0
  18. package/plugins/litclaude/commands/review-work.md +1 -1
  19. package/plugins/litclaude/commands/start-work.md +5 -0
  20. package/plugins/litclaude/skills/debugging/SKILL.md +152 -15
  21. package/plugins/litclaude/skills/lit-loop/SKILL.md +27 -3
  22. package/plugins/litclaude/skills/lit-plan/SKILL.md +174 -1
  23. package/plugins/litclaude/skills/litgoal/SKILL.md +4 -0
  24. package/plugins/litclaude/skills/litresearch/SKILL.md +105 -21
  25. package/plugins/litclaude/skills/programming/SKILL.md +382 -51
  26. package/plugins/litclaude/skills/refactor/SKILL.md +390 -26
  27. package/plugins/litclaude/skills/remove-ai-slops/SKILL.md +328 -33
  28. package/plugins/litclaude/skills/review-work/SKILL.md +221 -29
  29. package/plugins/litclaude/skills/rules/SKILL.md +6 -4
  30. package/plugins/litclaude/skills/start-work/SKILL.md +144 -18
  31. package/scripts/validate-plugin.mjs +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.9 - 2026-06-19 — hook activation and mode-discipline parity
4
+
5
+ - Port the LitOpenCode v0.1.17 workflow contract into Claude Code-native surfaces without copying
6
+ OpenCode-only hooks or permission objects.
7
+ - Rework `UserPromptSubmit` activation so natural language routes `lit`, `litwork`, `lit plan`,
8
+ `lit review`, `lit research`, `lit goal`, and `lit start work` to distinct mode contracts while
9
+ ignoring slash commands/mentions, code spans/fences, substrings, and compound tokens.
10
+ - Add safe natural-language `lit start work` behavior: the hook emits a `BLOCKED:` handoff that tells
11
+ the user to run `/start-work` or `/litclaude:start-work` instead of pretending a prompt hook can
12
+ switch Claude Code agents.
13
+ - Strengthen prompt contracts across lit-loop, lit-plan, start-work, review-work, litresearch, and
14
+ litgoal; document primary order as `lit-loop`, `lit-plan`/`prometheus-planner`, then
15
+ `start-work`/`boulder-executor`.
16
+ - Add installer permission preferences (`safe`, `balanced`, `yolo`) as Claude-native recorded
17
+ settings. Balanced records routine automation preference while preserving dangerous-shell deny
18
+ boundaries and planner read-only safeguards.
19
+
20
+ ## 0.3.8 - 2026-06-16 — sibling-parity skill depth + goal/workflow feasibility reflection
21
+
22
+ - **Deepen eight skills to sibling parity.** A cross-sibling audit found several skill prompts were
23
+ materially thinner than their counterparts. Re-authored brand-clean, in LitClaude's own Claude Code
24
+ idiom (no foreign naming):
25
+ - `refactor` (73 → ~437 lines) — a phased behavior-preserving playbook: intent gate → codebase
26
+ analysis (LSP + read-only subagents) → codemap/impact zones → coverage-gated strategy
27
+ (run/add-characterization/PAUSE/BLOCK) → per-step execute-verify-revert with a Failure Recovery
28
+ Protocol → final regression sweep.
29
+ - `remove-ai-slops` (52 → ~347) — a 10-category slop taxonomy with KEEP/REMOVE rules, a **test-first
30
+ behavior-lock** safety invariant (pin behavior green *before* removing), a 5-gate quality table,
31
+ risk-ordered cleanup, and a "when in doubt, SKIP" rule.
32
+ - `programming` (106 → ~437) — a language gate that routes to the already-shipped per-language
33
+ `references/`, a cross-language iron-list table, canonical-library/toolchain tables, a TDD pyramid
34
+ + Given/When/Then + mock ladder, the 250-LOC ceiling with measurement, and a post-write self-review
35
+ loop into `refactor` / `remove-ai-slops`.
36
+ - `debugging` (70 → ~207) — now **activates the previously-orphaned `references/` library** (~1,500
37
+ lines of runtime/tool/methodology depth) via routing tables, a phase loop with a ≥3-hypothesis
38
+ floor + oracle-triple escalation, safety invariants, and a `.debug-journal.md` revert discipline.
39
+ - `litresearch` (148 → ~228) — durable on-disk session journaling (wave digests + expansion-log +
40
+ `SYNTHESIS.md`) for recovery-after-compaction, a search-craft operator playbook (≥10-query floor,
41
+ English-first-then-local), and a richer worker roster.
42
+ - `lit-plan` (125 → ~291) — task-tier classification, explore-first grounding, interview-the-unknowns,
43
+ an approval gate, a templated success-criteria block, and a pre-finalize two-pass review.
44
+ - `start-work` (131 → ~252) — LIGHT/HEAVY tiering, a per-checkbox A–E gate loop with a 9-class
45
+ adversarial-QA taxonomy, a baseline-characterization gate, and an independent-verifier completion
46
+ contract.
47
+ - `review-work` (331 → ~519) — a Phase-0 context-gathering preamble, ready-to-paste per-lane launch
48
+ prompts with fixed output schemas, the QA brainstorm-before-execute scenario method, and an
49
+ expanded 10-category security checklist.
50
+ - **Add a LIGHT/HEAVY effort tier to `lit-loop`** — classify the task once at bootstrap and size the
51
+ process to match (ratchet up only; when uncertain, treat as HEAVY). This closes the one litwork-tier
52
+ gap relative to siblings without adding a duplicate skill.
53
+ - **Reflect the goal / dynamic-workflow feasibility finding.** Investigation confirmed: entering Claude
54
+ Code's native `/goal` state from a plugin is **functionally impossible** (the host exposes no
55
+ model-facing goal tools and a hook cannot type a slash command) — the litgoal **autoloop** remains the
56
+ correct plugin-owned equivalent and is verified working. The Dynamic workflow path, by contrast, was
57
+ **partially implemented**: the guidance told the model to call `Workflow` unconditionally, but the
58
+ tool requires explicit user opt-in. The hook context, the `lit-loop` skill, the `dynamic-workflow` /
59
+ `lit-loop` commands, and the README now **propose a Dynamic workflow and call `Workflow` only once the
60
+ user opts in** — clarifying that this opt-in gate (not a host limitation) is why a Dynamic workflow
61
+ starts only after the proposal.
62
+
3
63
  ## 0.3.7 - 2026-06-14 — litresearch skill + LITBURN ignition banner
4
64
 
5
65
  - Add the **`litresearch`** skill (`plugins/litclaude/skills/litresearch/`) + command
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
  <p align="center">
11
11
  <img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" />
12
- <img src="https://img.shields.io/badge/version-0.3.7-2ea44f" />
12
+ <img src="https://img.shields.io/badge/version-0.3.9-2ea44f" />
13
13
  <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
14
  <img src="https://img.shields.io/badge/license-MIT-blue" />
15
15
  </p>
@@ -22,18 +22,20 @@
22
22
  > `litclaude@litclaude-ai`, so normal `claude` launches can load the
23
23
  > LitClaude skills and hooks without a long `--plugin-dir` command.
24
24
 
25
- This checkout is prepared as `litclaude-ai@0.3.7` for personal install
25
+ This checkout is prepared as `litclaude-ai@0.3.9` for personal install
26
26
  convenience. The repo can remain quiet; preparing npm package metadata here does
27
27
  not imply public repo promotion, marketplace publication, or advertisement.
28
- Future package releases still require explicit user approval. The v0.3.7
29
- release materials preserve the v0.2.2 Dynamic workflow hardening work, add the
30
- lit-family vocab rename and neon HUD on top of v0.2.2, describe LitClaude in
31
- its own terms, and do not claim that npm publication has completed.
28
+ Future package releases still require explicit user approval. The v0.3.9
29
+ release materials preserve the v0.3.8 skill-depth work and add Claude-native
30
+ hook activation, prompt/mode contract, safe mode-transition, primary-order, and
31
+ installer permission-preference discipline.
32
32
 
33
33
  ## Features
34
34
 
35
35
  - **Natural Claude launch** - install once with `npx`, then run plain `claude`
36
- - **LIT prompt hooks** - type `lit`, `litwork`, `$lit-plan`, or `$lit-loop`
36
+ - **LIT prompt hooks** - type `lit`, `litwork`, `lit plan`, `lit review`,
37
+ `lit research`, `lit goal`, or `lit start work`; slash commands stay on
38
+ Claude Code's native command surface and do not double-activate the hook
37
39
  - **Deep interview mode** - type `/deep-interview` or `$deep-interview` to
38
40
  turn broad intent into a spec before planning or implementation
39
41
  - **v0.2.0 workflow parity** - adds `review-work` 5-lane review discipline and
@@ -93,7 +95,7 @@ directory, the normal install command works:
93
95
 
94
96
  ```bash
95
97
  cd /tmp
96
- npx --yes litclaude-ai@0.3.7 install
98
+ npx --yes litclaude-ai@0.3.9 install
97
99
  ```
98
100
 
99
101
  Validate the installed plugin:
@@ -106,7 +108,7 @@ The installer also sets Claude Code's `statusLine` command to the packaged
106
108
  LitClaude HUD. A typical no-color render starts like:
107
109
 
108
110
  ```text
109
- [🔥LITCLAUDE v0.3.7] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
111
+ [🔥LITCLAUDE v0.3.9] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
110
112
  ```
111
113
 
112
114
  The `↻` suffix is a compact rate-limit reset countdown. It is separated from
@@ -160,6 +162,21 @@ the skill and hook inventory in `claude plugin details`.
160
162
  Use `CLAUDE_CONFIG_DIR=/some/path` and `LITCLAUDE_HOME=/some/path` only for
161
163
  isolated tests.
162
164
 
165
+ Installer permission preference can be recorded without copying OpenCode's
166
+ permission model:
167
+
168
+ ```bash
169
+ npx --yes litclaude-ai install --permission-mode safe
170
+ npx --yes litclaude-ai install --permission-mode balanced
171
+ npx --yes litclaude-ai install --yolo
172
+ ```
173
+
174
+ `safe` is conservative. `balanced` records that routine automation guidance is
175
+ acceptable while preserving dangerous-shell deny boundaries and planner
176
+ read-only safeguards. `yolo` records explicit user preference, but the installer
177
+ does not rewrite Claude agent frontmatter or weaken `prometheus-planner`'s
178
+ `permissionMode: plan` boundary.
179
+
163
180
  ## LIT Usage
164
181
 
165
182
  After install, start Claude Code:
@@ -173,6 +190,11 @@ Then type one of these prompts:
173
190
  ```text
174
191
  lit
175
192
  litwork
193
+ lit plan <what you want planned>
194
+ lit review <scope to review>
195
+ lit research <research question>
196
+ lit goal <outcome and criteria>
197
+ lit start work <approved plan>
176
198
  $lit-plan <what you want planned>
177
199
  /lit-plan <what you want planned>
178
200
  $lit-loop <what you want executed with evidence>
@@ -189,15 +211,17 @@ $start-work plans/example-plan.md
189
211
  /start-work plans/example-plan.md
190
212
  ```
191
213
 
192
- Expected behavior: LitClaude's prompt hook adds `LITWORK MODE ENABLED`
193
- context for LIT routes and shows `LitClaude lit hook active` as a visible hook
194
- message. For `/deep-interview`, the hook adds `DEEP INTERVIEW MODE ENABLED`
195
- context and routes Claude toward `/litclaude:deep-interview` /
196
- `Skill(deep-interview)`. Plain `lit` still maps to `/litclaude:lit-loop` /
197
- `Skill(lit-loop)` semantics before ordinary task execution, then the matching
198
- skill and agent instructions steer Claude toward test-first work, native goal
199
- handling, manual QA evidence, cleanup receipts, and explicit approval before
200
- future release steps.
214
+ Expected behavior: LitClaude's prompt hook adds mode-specific `LITWORK MODE
215
+ ENABLED` context for natural LIT routes and shows `LitClaude lit hook active` as
216
+ a visible hook message. Slash commands such as `/lit-plan` are handled by Claude
217
+ Code's native command surface and should not double-activate the hook. Natural
218
+ `lit start work` is a safe handoff: it emits `BLOCKED:` and tells the user to
219
+ run `/start-work` or `/litclaude:start-work` with the approved plan because a
220
+ prompt hook cannot switch Claude Code agents. Plain `lit` still maps to
221
+ `/litclaude:lit-loop` / `Skill(lit-loop)` semantics before ordinary task
222
+ execution, then the matching skill and agent instructions steer Claude toward
223
+ test-first work, native goal handling, manual QA evidence, cleanup receipts, and
224
+ explicit approval before future release steps.
201
225
 
202
226
  LitClaude does not auto-type `/goal` or send slash command text for you.
203
227
  Instead, the hook and LIT skills add run-context guidance: use Claude Code's
@@ -208,8 +232,12 @@ LitClaude keeps the local evidence ledger authoritative and may suggest an
208
232
  exact `/goal <completion condition>` before long execution without repeatedly
209
233
  printing fallback chatter.
210
234
  For large independent work, LitClaude applies the same principle to Claude
211
- Code's available orchestration surfaces: when `Workflow` is exposed, call the
212
- `Workflow` tool; when isolated edits need a model-facing worktree lane, use
235
+ Code's available orchestration surfaces: when `Workflow` is exposed and the task
236
+ is broad, risky, parallel, or long-running, LitClaude **proposes a Dynamic
237
+ workflow and calls the `Workflow` tool once you opt in**. The tool can fan out
238
+ many subagents and spend a large token budget, so it asks first — this opt-in
239
+ gate (not a host limitation) is why a Dynamic workflow only starts after the
240
+ proposal. When isolated edits need a model-facing worktree lane, use
213
241
  `EnterWorktree`. If only the CLI surface is available for a fresh isolated lane,
214
242
  use `claude --worktree <short-name> --tmux`.
215
243
 
@@ -280,8 +308,8 @@ namespaced commands when you want explicit LitClaude skill activation:
280
308
  Those namespaced commands are shipped as real Claude Code command files under
281
309
  `plugins/litclaude/commands/`, so `/litclaude:lit-loop` should load the
282
310
  command body, then the matching skill guidance.
283
- The shorter slash aliases above are also recognized by the prompt hook and
284
- route to the matching discipline instead of the plain `lit` loop fallback.
311
+ Slash commands and their shorter aliases are handled by Claude Code's native
312
+ command surface; the prompt hook no longer double-activates them.
285
313
 
286
314
  Use `/deep-interview` before `/lit-plan` when the request is broad,
287
315
  underspecified, or missing non-goals and acceptance criteria. It writes a
package/README_ko-KR.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
  <p align="center">
11
11
  <img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" />
12
- <img src="https://img.shields.io/badge/version-0.3.7-2ea44f" />
12
+ <img src="https://img.shields.io/badge/version-0.3.9-2ea44f" />
13
13
  <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
14
  <img src="https://img.shields.io/badge/license-MIT-blue" />
15
15
  </p>
@@ -26,19 +26,21 @@
26
26
  > 설치되므로, 매번 긴 `--plugin-dir` 없이 일반 `claude` 실행에서
27
27
  > LitClaude skill과 hook을 불러올 수 있습니다.
28
28
 
29
- 현재 checkout은 `litclaude-ai@0.3.7` 배포 준비용으로 정리되어 있습니다. 목적은
29
+ 현재 checkout은 `litclaude-ai@0.3.9` 배포 준비용으로 정리되어 있습니다. 목적은
30
30
  다른 PC에서도 빠르게 설치하기 위한 개인용 package metadata를 갖추는 것입니다.
31
31
  npm package metadata를 준비했다고 해서 홍보, 공개 저장소 운영, Claude
32
32
  marketplace 등록을 의미하지는 않습니다. 새 버전 배포는 항상 별도의 명시적
33
- 승인 후에 진행합니다. v0.3.7 release material은 v0.2.2 Dynamic workflow
34
- hardening을 보존하고, lit-family vocab rename과 neon HUD를 추가하며,
35
- LitClaude 자체의 표현으로 정리되어 있습니다. npm publish가 완료됐다고
36
- 주장하지 않습니다.
33
+ 승인 후에 진행합니다. v0.3.9 release material은 v0.3.8 skill-depth 작업을
34
+ 보존하고, Claude-native hook activation, prompt/mode contract, safe
35
+ mode-transition, primary-order, installer permission preference discipline을
36
+ 추가합니다.
37
37
 
38
38
  ## 기능
39
39
 
40
40
  - **자연스러운 Claude 실행** - 한 번 `npx`로 설치한 뒤에는 plain `claude`
41
- - **LIT prompt hook** - `lit`, `litwork`, `$lit-plan`, `$lit-loop` 트리거
41
+ - **LIT prompt hook** - `lit`, `litwork`, `lit plan`, `lit review`,
42
+ `lit research`, `lit goal`, `lit start work` 자연어 트리거. slash command는
43
+ Claude Code native command surface에서 처리되어 hook이 중복 활성화하지 않습니다.
42
44
  - **Deep interview mode** - `/deep-interview` 또는 `$deep-interview`로 넓고
43
45
  모호한 의도를 먼저 spec으로 정리한 뒤 계획/구현으로 넘김
44
46
  - **v0.2.0 workflow parity** - package publish가 끝났다고 말하지 않으면서
@@ -98,7 +100,7 @@ checkout을 먼저 해석해서 `sh: litclaude-ai: command not found`로 실패
98
100
 
99
101
  ```bash
100
102
  cd /tmp
101
- npx --yes litclaude-ai@0.3.7 install
103
+ npx --yes litclaude-ai@0.3.9 install
102
104
  ```
103
105
 
104
106
  설치 상태를 확인합니다.
@@ -111,7 +113,7 @@ installer는 Claude Code의 `statusLine` command도 packaged LitClaude HUD로
111
113
  설정합니다. 색상을 제거한 예시는 다음처럼 시작합니다.
112
114
 
113
115
  ```text
114
- [🔥LITCLAUDE v0.3.7] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
116
+ [🔥LITCLAUDE v0.3.9] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
115
117
  ```
116
118
 
117
119
  `↻` 표시는 rate-limit reset까지 남은 시간을 짧게 보여주는 countdown입니다.
@@ -164,6 +166,20 @@ LitClaude 전용 local marketplace 항목, `known_marketplaces.json`을 함께
164
166
  격리 테스트가 필요할 때만 `CLAUDE_CONFIG_DIR=/some/path`와
165
167
  `LITCLAUDE_HOME=/some/path`를 지정하세요.
166
168
 
169
+ installer permission preference는 OpenCode permission model을 그대로 복사하지
170
+ 않고 Claude-native 설정으로 기록합니다.
171
+
172
+ ```bash
173
+ npx --yes litclaude-ai install --permission-mode safe
174
+ npx --yes litclaude-ai install --permission-mode balanced
175
+ npx --yes litclaude-ai install --yolo
176
+ ```
177
+
178
+ `safe`는 보수적 기본값입니다. `balanced`는 routine automation guidance를
179
+ 허용한다는 선호만 기록하되 dangerous-shell deny boundary와 planner read-only
180
+ safeguard를 유지합니다. `yolo`도 명시적 선호를 기록할 뿐,
181
+ `prometheus-planner`의 `permissionMode: plan` boundary를 약화하지 않습니다.
182
+
167
183
  ## LIT 사용법
168
184
 
169
185
  설치 후에는 일반적인 `claude` 명령에서 LitClaude를 사용할 수 있습니다.
@@ -177,6 +193,11 @@ claude
177
193
  ```text
178
194
  lit
179
195
  litwork
196
+ lit plan <계획이 필요한 작업>
197
+ lit review <검토할 범위>
198
+ lit research <조사할 질문>
199
+ lit goal <목표와 기준>
200
+ lit start work <승인된 계획>
180
201
  $lit-plan <계획이 필요한 작업>
181
202
  /lit-plan <계획이 필요한 작업>
182
203
  $lit-loop <증거 기반으로 실행할 작업>
@@ -193,15 +214,17 @@ $start-work plans/example-plan.md
193
214
  /start-work plans/example-plan.md
194
215
  ```
195
216
 
196
- 기대 동작은 LitClaude prompt hook이 LIT route에는 `LITWORK MODE ENABLED`
197
- 컨텍스트를 추가하고 `LitClaude lit hook active`라는 visible hook message를
198
- 보여주는 것입니다. `/deep-interview`에는 `DEEP INTERVIEW MODE ENABLED`
199
- 컨텍스트를 추가하고 Claude를 `/litclaude:deep-interview` /
200
- `Skill(deep-interview)` 쪽으로 라우팅합니다. 또한 plain `lit`는 일반 작업
201
- 실행 `/litclaude:lit-loop` / `Skill(lit-loop)` semantics로 처리됩니다.
202
- skill 및 agent 지시문이 Claude를 test-first 작업, native goal 처리,
203
- 실제 수동 QA 증거, cleanup receipt, 향후 release step의 명시적 승인 쪽으로
204
- 유도합니다.
217
+ 기대 동작은 LitClaude prompt hook이 자연어 LIT route mode-specific
218
+ `LITWORK MODE ENABLED` 컨텍스트를 추가하고 `LitClaude lit hook active`라는
219
+ visible hook message를 보여주는 것입니다. `/lit-plan` 같은 slash command는
220
+ Claude Code native command surface에서 처리되며 hook을 중복 활성화하지
221
+ 않습니다. 자연어 `lit start work`는 안전한 handoff로 `BLOCKED:`를 내고,
222
+ prompt hook이 Claude Code agent를 전환할 수 없으므로 승인된 plan과 함께
223
+ `/start-work` 또는 `/litclaude:start-work`를 실행하라고 안내합니다. plain
224
+ `lit`는 일반 작업 실행 `/litclaude:lit-loop` / `Skill(lit-loop)` semantics로
225
+ 처리됩니다. 그 뒤 skill 및 agent 지시문이 Claude를 test-first 작업, native
226
+ goal 처리, 실제 수동 QA 증거, cleanup receipt, 향후 release step의 명시적 승인
227
+ 쪽으로 유도합니다.
205
228
 
206
229
  LitClaude는 `/goal`을 대신 입력하거나 slash command text를 자동 전송하지
207
230
  않습니다. 대신 hook과 LIT skill이 run context를 보강합니다. Claude Code의
@@ -212,9 +235,10 @@ goal이 없을 때만 `create_goal`을 호출하며, `update_goal`은 검증 완
212
235
  로컬 evidence ledger를 기준으로 계속 진행하고, 긴 실행 전에 필요한 경우에만
213
236
  정확한 `/goal <completion condition>`를 제안합니다. 큰 독립 작업에서는
214
237
  같은 원칙을 Claude Code가 노출한 orchestration surface에 적용합니다.
215
- `Workflow`가 노출되면 `Workflow` tool을 호출하고, isolated edit lane이
216
- model-facing worktree를 필요로 하면 `EnterWorktree`를 사용합니다. CLI surface만
217
- 가능한 격리 lane에서는 `claude --worktree <short-name> --tmux`를 사용합니다.
238
+ `Workflow`가 노출되면 먼저 제안하고 사용자 opt-in 또는 이미 허용된 orchestration
239
+ 상태에서만 `Workflow` tool을 호출합니다. isolated edit lane이 model-facing
240
+ worktree를 필요로 하면 `EnterWorktree`를 사용합니다. CLI surface만 가능한 새 격리
241
+ lane에서는 `claude --worktree <short-name> --tmux`를 사용합니다.
218
242
 
219
243
  v0.2.2 Dynamic workflow hardening에서 `/dynamic-workflow`는 넓은 위임 작업을
220
244
  위한 통합 bootstrap route입니다. `/goal`은 user-controlled 상태로 두고,
@@ -1,11 +1,13 @@
1
1
  # LitClaude Release Checklist
2
2
 
3
- Status: `litclaude-ai@0.3.7` is the current release candidate — adds the **`litresearch`** skill +
4
- command (Claude-native maximum-saturation research orchestrator over the Workflow tool + `litclaude:`
5
- subagents + `/deep-research`) and a **`🔥 LITBURN IGNITED 🔥`** activation banner shouted on every
6
- litwork ignition.
7
- `package.json` is aligned to `0.3.7`, and
8
- `plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.3.7`.
3
+ Status: `litclaude-ai@0.3.9` is the current release candidate — a Claude-native
4
+ hook activation and mode-discipline parity pass based on LitOpenCode v0.1.17.
5
+ It routes natural `lit` prompts by mode, blocks natural-language start-work with
6
+ a safe handoff, reinforces planning/execution/review/research/goal contracts,
7
+ documents primary role order, and records installer permission preferences
8
+ without copying OpenCode-only permission objects.
9
+ `package.json` is aligned to `0.3.9`, and
10
+ `plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.3.9`.
9
11
 
10
12
  This release carries the v0.2.2 Dynamic workflow hardening surfaces:
11
13
  `/dynamic-workflow`, `workflow-check --json`, native `/goal` fallback guidance,
@@ -54,8 +56,8 @@ No npm publication is required for this track.
54
56
  Before requesting publication approval, confirm these artifacts from the current
55
57
  checkout:
56
58
 
57
- - `package.json` version is `0.3.7`.
58
- - `plugins/litclaude/.claude-plugin/plugin.json` version is `0.3.7`.
59
+ - `package.json` version is `0.3.9`.
60
+ - `plugins/litclaude/.claude-plugin/plugin.json` version is `0.3.9`.
59
61
  - `plugins/litclaude/commands/dynamic-workflow.md` documents subagent delegation.
60
62
  - `node bin/litclaude-ai.js workflow-check --json` reports `status: pass`.
61
63
  - `node bin/litclaude-ai.js workflow-check --json` reports
@@ -68,6 +70,8 @@ checkout:
68
70
  - `plugins/litclaude/commands/litgoal.md` documents durable goal state.
69
71
  - `plugins/litclaude/lib/litgoal/` ships the runtime CLI/state modules.
70
72
  - `node bin/litclaude-ai.js litgoal --help` prints durable state commands.
73
+ - `node bin/litclaude-ai.js --dry-run install --permission-mode balanced` reports
74
+ the balanced preference while preserving dangerous-shell deny boundaries.
71
75
  - `npm pack --dry-run --json` includes runtime payloads and excludes local
72
76
  `.litclaude/`, `.omc/`, and `evidence/` state.
73
77
  - `.litclaude/lit-loop/evidence/v020-red-contracts.txt` or equivalent RED evidence
@@ -36,6 +36,15 @@ Commands:
36
36
  start-work-next Print the next active start-work continuation directive.
37
37
  update Reinstall this package version and refresh the Claude plugin registry.
38
38
  uninstall Remove LitClaude-managed install state.
39
+
40
+ Install options:
41
+ --permission-mode <safe|balanced|yolo>
42
+ Record a Claude-native LitClaude automation preference.
43
+ safe keeps conservative defaults; balanced allows routine
44
+ automation guidance while preserving dangerous-shell deny
45
+ boundaries; yolo records an explicit user preference without
46
+ weakening planner/read-only agent safeguards.
47
+ --yolo Shorthand for --permission-mode yolo.
39
48
  `;
40
49
 
41
50
  const parseArgs = (argv) => {
@@ -71,6 +80,74 @@ const knownExternalLspPlugins = {
71
80
  };
72
81
  const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
73
82
  const hudAccentThemes = HUD_ACCENT_THEMES;
83
+ const permissionModes = new Set(["safe", "balanced", "yolo"]);
84
+
85
+ const parsePermissionMode = (value) => {
86
+ if (!permissionModes.has(value)) fail("--permission-mode must be one of safe, balanced, yolo", 64);
87
+ return value;
88
+ };
89
+
90
+ const parseInstallOptions = (rest) => {
91
+ let permissionMode = parsePermissionMode(process.env.LITCLAUDE_PERMISSION_MODE || "safe");
92
+ let permissionExplicit = Boolean(process.env.LITCLAUDE_PERMISSION_MODE);
93
+
94
+ for (let index = 0; index < rest.length; index += 1) {
95
+ const arg = rest[index];
96
+ if (arg === "--permission-mode") {
97
+ const value = rest[index + 1];
98
+ if (!value) fail("--permission-mode requires a value", 64);
99
+ permissionMode = parsePermissionMode(value);
100
+ permissionExplicit = true;
101
+ index += 1;
102
+ continue;
103
+ }
104
+ if (arg === "--yolo") {
105
+ permissionMode = "yolo";
106
+ permissionExplicit = true;
107
+ continue;
108
+ }
109
+ if (arg === "--permission-prompt" || arg === "--select-permissions") {
110
+ permissionExplicit = true;
111
+ continue;
112
+ }
113
+ if (arg === "--no-permission-prompt") {
114
+ continue;
115
+ }
116
+ fail(`Unknown install option: ${arg}`, 64);
117
+ }
118
+
119
+ return { permissionMode, permissionExplicit };
120
+ };
121
+
122
+ const permissionProfile = (mode) => {
123
+ switch (mode) {
124
+ case "balanced":
125
+ return {
126
+ mode,
127
+ description: "routine automation guidance allowed; dangerous shell patterns and existing deny rules preserved",
128
+ routineAutomation: true,
129
+ dangerousShellDenyPreserved: true,
130
+ plannerSafeguard: "prometheus-planner remains permissionMode: plan",
131
+ };
132
+ case "yolo":
133
+ return {
134
+ mode,
135
+ description: "explicit user preference recorded; Claude agent safeguards are not weakened by the installer",
136
+ routineAutomation: true,
137
+ dangerousShellDenyPreserved: true,
138
+ plannerSafeguard: "prometheus-planner remains permissionMode: plan",
139
+ };
140
+ case "safe":
141
+ default:
142
+ return {
143
+ mode: "safe",
144
+ description: "conservative automation guidance; no permission broadening",
145
+ routineAutomation: false,
146
+ dangerousShellDenyPreserved: true,
147
+ plannerSafeguard: "prometheus-planner remains permissionMode: plan",
148
+ };
149
+ }
150
+ };
74
151
 
75
152
  const printUsage = () => {
76
153
  process.stderr.write(usage);
@@ -327,6 +404,9 @@ const uninstallHudStatusLine = (home = claudeHome()) => {
327
404
  "statusLineInstalledAt",
328
405
  "statusLineUpdatedAt",
329
406
  "previousStatusLine",
407
+ "permissionPreference",
408
+ "permissionMode",
409
+ "permissionUpdatedAt",
330
410
  ]) {
331
411
  delete remainingLitClaude[key];
332
412
  }
@@ -356,7 +436,19 @@ const unregisterMarketplace = (home = claudeHome()) => {
356
436
  }
357
437
  };
358
438
 
359
- const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome(), hudAccent = "cyan") => {
439
+ const recordPermissionPreference = (mode, home = claudeHome()) => {
440
+ const settings = readClaudeSettings(home);
441
+ const existingLitClaude = settings[litClaudeSettingsKey] ?? {};
442
+ settings[litClaudeSettingsKey] = {
443
+ ...existingLitClaude,
444
+ permissionPreference: permissionProfile(mode),
445
+ permissionMode: mode,
446
+ permissionUpdatedAt: new Date().toISOString(),
447
+ };
448
+ writeClaudeSettings(settings, home);
449
+ };
450
+
451
+ const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome(), hudAccent = "cyan", permissionMode = "safe") => {
360
452
  const registry = readInstalledPlugins(home);
361
453
  const now = new Date().toISOString();
362
454
  const existing = registry.plugins[pluginKey]?.[0] ?? {};
@@ -374,6 +466,7 @@ const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome(),
374
466
  writeInstalledPlugins(registry, home);
375
467
  registerMarketplace(marketplacePath, home);
376
468
  installHudStatusLine(installRoot, home, hudAccent);
469
+ recordPermissionPreference(permissionMode, home);
377
470
  };
378
471
 
379
472
  const unregisterClaudePlugin = (home = claudeHome()) => {
@@ -440,7 +533,8 @@ const resetCurrentPointer = (home, target) => {
440
533
  }
441
534
  };
442
535
 
443
- const install = async ({ dryRun }) => {
536
+ const install = async ({ dryRun, rest }) => {
537
+ const { permissionMode, permissionExplicit } = parseInstallOptions(rest);
444
538
  const home = claudeHome();
445
539
  const litClaudeHome = litHome();
446
540
  const targetPlugin = claudePluginRoot(home);
@@ -454,6 +548,8 @@ const install = async ({ dryRun }) => {
454
548
  process.stdout.write(`Would create local marketplace: ${targetMarketplace}\n`);
455
549
  process.stdout.write(`Would register Claude plugin: ${pluginKey}\n`);
456
550
  process.stdout.write(`Would set Claude statusLine HUD: ${hudCommandForPlugin(targetPlugin)}\n`);
551
+ process.stdout.write(`Would record permission preference: ${permissionMode}${permissionExplicit ? " (explicit)" : " (default)"}\n`);
552
+ process.stdout.write(`Permission profile: ${permissionProfile(permissionMode).description}\n`);
457
553
  process.stdout.write("Launch with: claude\n");
458
554
  return;
459
555
  }
@@ -471,7 +567,7 @@ const install = async ({ dryRun }) => {
471
567
  progress.step("Marketplace: writing local Claude marketplace");
472
568
  const localMarketplace = writeLocalMarketplace(litClaudeHome);
473
569
  progress.step("Claude registry: enabling plugin and HUD");
474
- registerClaudePlugin(targetPlugin, localMarketplace, home, hudAccent);
570
+ registerClaudePlugin(targetPlugin, localMarketplace, home, hudAccent, permissionMode);
475
571
 
476
572
  progress.step("Compatibility cache: refreshing local current pointer");
477
573
  const litRoot = versionRoot(litClaudeHome);
@@ -486,6 +582,7 @@ const install = async ({ dryRun }) => {
486
582
  process.stdout.write(`Marketplace: ${localMarketplace}\n`);
487
583
  process.stdout.write(`Plugin path: ${intendedPluginPath(home)}\n`);
488
584
  process.stdout.write(`HUD: LitClaude statusLine installed (${hudAccent})\n`);
585
+ process.stdout.write(`Permission preference: ${permissionMode} — ${permissionProfile(permissionMode).description}\n`);
489
586
  process.stdout.write("Launch with: claude\n");
490
587
  };
491
588
 
@@ -545,6 +642,9 @@ const doctor = ({ dryRun }) => {
545
642
 
546
643
  process.stdout.write(`Plugin path: ${pluginPath}\n`);
547
644
  const settings = readClaudeSettings();
645
+ const permissionMode = settings[litClaudeSettingsKey]?.permissionMode ?? "safe";
646
+ process.stdout.write(`PERMISSION_MODE: ${permissionMode}\n`);
647
+ process.stdout.write(`PERMISSION_PROFILE: ${permissionProfile(permissionMode).description}\n`);
548
648
  if (settings.statusLine?.command === hudCommandForPlugin(pluginPath, settings[litClaudeSettingsKey]?.hudAccent)) {
549
649
  process.stdout.write("HUD_STATUSLINE_PASS\n");
550
650
  } else {
package/docs/agents.md CHANGED
@@ -3,6 +3,12 @@
3
3
  LitClaude agents map the LitClaude team workflow into Claude Code subagents
4
4
  with bounded responsibilities.
5
5
 
6
+ Primary order:
7
+
8
+ 1. `lit-loop` — the default execution-loop skill for direct, evidence-driven work.
9
+ 2. `lit-plan` → `prometheus-planner` — planning-only, read-only, approval-gated.
10
+ 3. `start-work` → `boulder-executor` — approved-plan execution-only; no redesign.
11
+
6
12
  | Agent | Responsibility | Boundary |
7
13
  | --- | --- | --- |
8
14
  | `prometheus-planner` | Build implementation plans and identify risks. | Read-only tools, no write/edit/bash tools. |
package/docs/hooks.md CHANGED
@@ -14,41 +14,35 @@ events while keeping execution local and bounded.
14
14
 
15
15
  ## Workflow Trigger Phrases
16
16
 
17
- The `UserPromptSubmit` hook activates on any of these phrases:
17
+ The `UserPromptSubmit` hook activates on these natural-language phrases and
18
+ legacy dollar shorthands:
18
19
 
19
20
  ```text
20
21
  lit
21
22
  litwork
23
+ lit plan
24
+ lit review
25
+ lit research
26
+ lit goal
27
+ lit start work
22
28
  $lit-plan
23
- /lit-plan
24
- /litclaude:lit-plan
25
29
  $lit-loop
26
- /lit-loop
27
- /litclaude:lit-loop
28
30
  $deep-interview
29
- /deep-interview
30
- /litclaude:deep-interview
31
31
  $dynamic-workflow
32
- /dynamic-workflow
33
- /litclaude:dynamic-workflow
34
32
  $review-work
35
- /review-work
36
- /litclaude:review-work
37
33
  $litgoal
38
- /litgoal
39
- /litclaude:litgoal
40
34
  $start-work
41
- /start-work
42
- /litclaude:start-work
43
35
  ```
44
36
 
45
37
  When a LIT trigger is present, the hook returns additional context containing
46
38
  `LITWORK MODE ENABLED` and a visible `LitClaude lit hook active` system
47
- message. For `/deep-interview`, it returns `DEEP INTERVIEW MODE ENABLED` while
48
- still routing to `/litclaude:deep-interview` / `Skill(deep-interview)`.
49
- That context is guidance for Claude Code; it is not executed as a command. The
50
- guidance tells Claude to treat plain `lit` as `/litclaude:lit-loop` /
51
- `Skill(lit-loop)` semantics before ordinary task execution.
39
+ message. That context is guidance for Claude Code; it is not executed as a
40
+ command. Slash commands and slash-command mentions are native Claude Code
41
+ surfaces and do not activate this prompt hook; code spans, code fences,
42
+ substrings, and compound tokens are also ignored. Natural `lit start work`
43
+ returns a `BLOCKED:` handoff that tells the user to run `/start-work` or
44
+ `/litclaude:start-work` with the approved plan, because a prompt hook cannot
45
+ switch Claude Code agents.
52
46
 
53
47
  LitClaude follows the LitClaude goal pattern as model-facing run context, not
54
48
  as slash-command injection. If Claude Code exposes the native goal surface, the
@@ -63,9 +57,9 @@ the hook context keeps the local evidence ledger authoritative. It may suggest
63
57
  fallback chatter on every LIT turn.
64
58
 
65
59
  For broad work, the same context ports the LitClaude model-facing principle to
66
- Claude Code's exposed orchestration surfaces: if `Workflow` is available, call
67
- the `Workflow` tool before serial execution and bind every lane to evidence and
68
- cleanup. If isolated edits need a model-facing worktree lane, use
60
+ Claude Code's exposed orchestration surfaces: if `Workflow` is available,
61
+ propose it first and call the `Workflow` tool only after user opt-in or existing
62
+ session permission, binding every lane to evidence and cleanup. If isolated edits need a model-facing worktree lane, use
69
63
  `EnterWorktree`; when only the CLI surface is available, the actionable launch
70
64
  form is `claude --worktree <short-name> --tmux`.
71
65
 
@@ -86,9 +80,7 @@ ledger, Boulder state, and `git status --short` before edits.
86
80
 
87
81
  Plain `lit` therefore activates hook context, not a visible Skill tool call.
88
82
  For a visible LitClaude command/skill invocation, use the namespaced Claude
89
- Code commands. The shorter slash aliases above are also recognized by the prompt
90
- hook so they route to the same discipline instead of falling through to plain
91
- `lit` loop activation:
83
+ Code commands:
92
84
 
93
85
  ```text
94
86
  /litclaude:lit-loop <goal>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litclaude-ai",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "Claude Code-native workflow distribution.",
5
5
  "type": "module",
6
6
  "bin": {