lazyclaude-ai 0.1.2 → 0.1.4

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 CHANGED
@@ -1,22 +1,62 @@
1
- # LazyClaude
1
+ <p align="center"><img src="./cover.png" width="100%" /></p>
2
+
3
+ <h1 align="center">LazyClaude</h1>
4
+ <p align="center">
5
+ <em>Claude Code-native LazyCodex workflows: prompt hooks, ultrawork skills, agents, MCP, and LSP helpers.</em>
6
+ </p>
7
+ <p align="center">
8
+ <a href="#quick-start">Quick Start</a> · <a href="#ulw-usage">ULW Usage</a> · <a href="#commands">Commands</a> · <a href="./README_ko-KR.md">한국어</a>
9
+ </p>
10
+ <p align="center">
11
+ <img src="https://img.shields.io/badge/npm-lazyclaude--ai-cb3837" />
12
+ <img src="https://img.shields.io/badge/version-0.1.3-2ea44f" />
13
+ <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
+ <img src="https://img.shields.io/badge/license-MIT-blue" />
15
+ </p>
16
+
17
+ ---
18
+
19
+ > [!NOTE]
20
+ > LazyClaude is a quiet personal distribution for bringing LazyCodex-style prompt engineering into Claude Code. It installs as `lazyclaude@lazyclaude-ai`, so normal `claude` launches can load the LazyClaude skills and hooks without a long `--plugin-dir` command.
21
+
22
+ The current public package is `lazyclaude-ai@0.1.3` for personal install
23
+ convenience. The repo can remain private and quiet; publishing to npm here does
24
+ not imply public repo promotion, marketplace publication, or advertisement.
25
+ Future package releases still require explicit user approval.
26
+
27
+ ## Features
28
+
29
+ - **Natural Claude launch** - install once with `npx`, then run plain `claude`
30
+ - **ULW prompt hooks** - type `ulw`, `ultrawork`, `$ulw-plan`, or `$ulw-loop`
31
+ - **Native goal guidance** - ULW context points Claude toward `/goal` or
32
+ model-facing `get_goal`, `create_goal`, and delayed `update_goal` when those
33
+ surfaces exist
34
+ - **Dynamic workflow/worktree guidance** - large or parallel tasks are steered
35
+ toward Claude Code Dynamic workflow orchestration and Dynamic worktree
36
+ isolation
37
+ - **Claude skills** - `ulw-plan`, `ulw-loop`, `start-work`, `rules`, `lsp`, `programming`, and `review-work`
38
+ - **Workflow agents** - planner, executor, verifier, reviewer, librarian, and QA runner
39
+ - **Local marketplace registration** - Claude can resolve `claude plugin details lazyclaude@lazyclaude-ai`
40
+ - **MCP and LSP helpers** - plugin-local stdio MCP plus TypeScript-family LSP doctor
41
+ - **Safe uninstall** - removes only LazyClaude-managed state
42
+
43
+ ## Quick Start
44
+
45
+ ### Install
2
46
 
3
- LazyClaude is a Claude Code-native retrofit of the LazyCodex workflow style:
4
- simple local activation, prompt-triggered ultrawork discipline,
5
- planner/executor/reviewer agents, lifecycle hooks, MCP scaffolding, and
6
- LSP-backed code checks.
7
-
8
- The current public package is `lazyclaude-ai@0.1.1`, and this checkout prepares
9
- the next `0.1.2` patch for personal install convenience. The repo can remain
10
- private and quiet; publishing to npm here does not imply public repo promotion,
11
- marketplace publication, or advertisement. Future package releases still require
12
- explicit user approval.
13
-
14
- ## Quick Install
47
+ ```bash
48
+ npx --yes lazyclaude-ai install
49
+ ```
15
50
 
16
- Use the npm package from any machine:
51
+ If you are currently inside this repository checkout, which has the same
52
+ package name as the registry package, `npx --yes lazyclaude-ai@0.1.3 install`
53
+ can resolve the local same-name source checkout and fail with
54
+ `sh: lazyclaude-ai: command not found`. From a fresh directory, the normal
55
+ install command works:
17
56
 
18
57
  ```bash
19
- npx --yes lazyclaude-ai install
58
+ cd /tmp
59
+ npx --yes lazyclaude-ai@0.1.3 install
20
60
  ```
21
61
 
22
62
  Validate the installed plugin:
@@ -31,7 +71,7 @@ Launch Claude Code normally:
31
71
  claude
32
72
  ```
33
73
 
34
- Alternative entrypoints:
74
+ ### Alternative Entrypoints
35
75
 
36
76
  ```bash
37
77
  bunx lazyclaude-ai install
@@ -39,8 +79,9 @@ npm install -g lazyclaude-ai
39
79
  lazyclaude install
40
80
  ```
41
81
 
42
- If you need the explicit `npm exec` form, use a fresh prefix so npm does not
43
- confuse the registry package with a same-name source checkout:
82
+ If you need the explicit `npm exec` form while standing inside the source
83
+ checkout, use a fresh prefix so npm does not confuse the registry package with
84
+ a same-name source checkout:
44
85
 
45
86
  ```bash
46
87
  npm exec --prefix "$(mktemp -d)" --yes --package lazyclaude-ai -- lazyclaude install
@@ -52,42 +93,26 @@ Remove only LazyClaude-managed install state:
52
93
  npx --yes lazyclaude-ai uninstall
53
94
  ```
54
95
 
55
- The installer registers `lazyclaude@lazyclaude-ai` in Claude Code's user plugin
56
- registry under `~/.claude/plugins` and enables it in `settings.json`
57
- `enabledPlugins`, so you do not need to type a long `--plugin-dir` command every
58
- time. Set `CLAUDE_CONFIG_DIR=/some/path` and `LAZYCLAUDE_HOME=/some/path` only
59
- for isolated tests.
60
-
61
- ## Local Development
96
+ ## How Install Works
62
97
 
63
- Use the plugin directly from this checkout while editing it:
64
-
65
- ```bash
66
- claude --plugin-dir ./plugins/lazyclaude
67
- ```
68
-
69
- Inside Claude Code, reload local plugin metadata after edits:
70
-
71
- ```text
72
- /reload-plugins
73
- ```
98
+ The installer registers `lazyclaude@lazyclaude-ai` in Claude Code's user plugin
99
+ registry under `~/.claude/plugins`, enables it in `settings.json`
100
+ `enabledPlugins`, and writes a LazyClaude-managed local marketplace entry in
101
+ `known_marketplaces.json`. That marketplace metadata is what lets Claude show
102
+ the skill and hook inventory in `claude plugin details`.
74
103
 
75
- If an OMC/omc Claude plugin is installed, do not co-load it with LazyClaude
76
- while testing this MVP. Local checkout tests use `--plugin-dir`, and npm installs
77
- create only a LazyClaude-managed local marketplace under the user's LazyClaude
78
- home. The checkout does not ship a root Claude marketplace skeleton. If
79
- user-level OMC creates a local `.omc/` state directory during smoke tests,
80
- LazyClaude ignores and excludes that directory from git and npm package surfaces.
104
+ Use `CLAUDE_CONFIG_DIR=/some/path` and `LAZYCLAUDE_HOME=/some/path` only for
105
+ isolated tests.
81
106
 
82
107
  ## ULW Usage
83
108
 
84
- LazyClaude is available in normal Claude Code sessions after install:
109
+ After install, start Claude Code:
85
110
 
86
111
  ```bash
87
112
  claude
88
113
  ```
89
114
 
90
- Then type one of these prompts in Claude Code:
115
+ Then type one of these prompts:
91
116
 
92
117
  ```text
93
118
  ulw
@@ -98,13 +123,24 @@ $start-work plans/lazyclaude-retrofit.md
98
123
  ```
99
124
 
100
125
  Expected behavior: LazyClaude's prompt hook adds `ULTRAWORK MODE ENABLED`
101
- context, then the matching skill and agent instructions steer Claude toward
102
- test-first work, manual QA evidence, cleanup receipts, and explicit approval
103
- before future release steps.
104
-
105
- Plain `ulw` is hook context activation, so it may not show a separate Skill
106
- tool invocation in Claude Code history. Use visible namespaced commands when
107
- you want explicit LazyClaude skill or command activation:
126
+ context and shows `LazyClaude ULW hook active` as a visible hook message. The
127
+ hook also tells Claude to treat plain `ulw` as `/lazyclaude:ulw-loop` /
128
+ `Skill(ulw-loop)` semantics before ordinary task execution, then the matching
129
+ skill and agent instructions steer Claude toward test-first work, native goal
130
+ handling, manual QA evidence, cleanup receipts, and explicit approval before
131
+ future release steps.
132
+
133
+ LazyClaude does not auto-type `/goal` or send slash command text for you.
134
+ Instead, the hook and ULW skills add run-context guidance: use Claude Code's
135
+ native goal surface when available, inspect `get_goal`, call `create_goal` only
136
+ when no matching goal is active, and reserve `update_goal` for verified
137
+ completion or a genuine blocker. For large independent work, the guidance also
138
+ points Claude toward Dynamic workflow orchestration and Dynamic worktree
139
+ isolation.
140
+
141
+ Plain `ulw` is hook context activation. Claude may still show it as hook
142
+ guidance rather than a separate Skill tool invocation in history. Use visible
143
+ namespaced commands when you want explicit LazyClaude skill activation:
108
144
 
109
145
  ```text
110
146
  /lazyclaude:ulw-loop <what you want executed with evidence>
@@ -114,14 +150,14 @@ you want explicit LazyClaude skill or command activation:
114
150
 
115
151
  ## Commands
116
152
 
117
- ```bash
118
- npx --yes lazyclaude-ai install
119
- npx --yes lazyclaude-ai doctor
120
- npx --yes lazyclaude-ai path
121
- npx --yes lazyclaude-ai run -- --help
122
- npx --yes lazyclaude-ai update
123
- npx --yes lazyclaude-ai uninstall
124
- ```
153
+ | Command | Purpose |
154
+ | --- | --- |
155
+ | `npx --yes lazyclaude-ai install` | Install and enable the Claude Code plugin |
156
+ | `npx --yes lazyclaude-ai doctor` | Validate files, Claude plugin validation, and plugin details |
157
+ | `npx --yes lazyclaude-ai path` | Print the installed Claude plugin path |
158
+ | `npx --yes lazyclaude-ai run -- --help` | Run plain `claude` after verifying install state |
159
+ | `npx --yes lazyclaude-ai update` | Reinstall the current package version |
160
+ | `npx --yes lazyclaude-ai uninstall` | Remove LazyClaude-managed install state |
125
161
 
126
162
  The package alias can be inspected without installing anything globally:
127
163
 
@@ -130,6 +166,27 @@ node bin/lazyclaude-ai.js --dry-run install
130
166
  node bin/lazyclaude-ai.js --dry-run doctor
131
167
  ```
132
168
 
169
+ ## Local Development
170
+
171
+ Use the plugin directly from this checkout while editing it:
172
+
173
+ ```bash
174
+ claude --plugin-dir ./plugins/lazyclaude
175
+ ```
176
+
177
+ Inside Claude Code, reload local plugin metadata after edits:
178
+
179
+ ```text
180
+ /reload-plugins
181
+ ```
182
+
183
+ If an OMC/omc Claude plugin is installed, do not co-load it with LazyClaude
184
+ while testing. Local checkout tests use `--plugin-dir`, and npm installs create
185
+ only a LazyClaude-managed local marketplace under the user's LazyClaude home.
186
+ The checkout does not ship a root Claude marketplace skeleton. If user-level
187
+ OMC creates a local `.omc/` state directory during smoke tests, LazyClaude
188
+ ignores and excludes that directory from git and npm package surfaces.
189
+
133
190
  ## Verification
134
191
 
135
192
  ```bash
@@ -146,30 +203,25 @@ version probe evidence instead of failing mysteriously.
146
203
 
147
204
  ## Safety Model
148
205
 
149
- LazyClaude is intentionally local-first:
150
-
151
206
  - Hooks read Claude Code event JSON from stdin and return bounded JSON context.
152
207
  - Hooks do not execute user prompt text.
153
- - The ultrawork prompt hook returns constant guidance and does not echo prompt
154
- text back into the context.
155
- - Any `.omc/`, `.omo/`, or `evidence/` local state is ignored and is not
156
- included in the LazyClaude npm package.
208
+ - The ultrawork prompt hook returns constant guidance and does not echo prompt text.
209
+ - `.omc/`, `.omo/`, and `evidence/` local state are ignored and excluded from the npm package.
157
210
  - The planner agent is read-only and has no edit tools.
158
211
  - MCP and LSP helpers are local stdio commands.
159
- - Future publication, remote marketplace mutation, and package release all
160
- require explicit user approval.
161
-
162
- ## MVP Scope
163
-
164
- - Package/bin: `lazyclaude-ai`
165
- - Friendly bin alias: `lazyclaude`
166
- - Plugin namespace: `lazyclaude`
167
- - Claude Code platform: `claude-code`
168
- - Skills: ultrawork planning, ultrawork loop, start-work, rules, LSP,
169
- programming, review-work
170
- - Agents: planner, executor, verifier, reviewer, librarian, QA runner
171
- - Hooks: session-start, user-prompt-submit, post-tool-use, post-compact
172
- - Config: local MCP server and TypeScript-family LSP doctor
212
+ - Future publication, remote marketplace mutation, and package releases require explicit user approval.
213
+
214
+ ## Project Map
215
+
216
+ | Surface | Path |
217
+ | --- | --- |
218
+ | CLI | `bin/lazyclaude-ai.js` |
219
+ | Claude plugin | `plugins/lazyclaude/` |
220
+ | Skills | `plugins/lazyclaude/skills/` |
221
+ | Agents | `plugins/lazyclaude/agents/` |
222
+ | Hooks | `plugins/lazyclaude/hooks/hooks.json` |
223
+ | MCP | `plugins/lazyclaude/.mcp.json` |
224
+ | LSP | `plugins/lazyclaude/.lsp.json` |
173
225
 
174
226
  See `README_ko-KR.md` for Korean setup notes, `REFERENCE.md` for the pinned
175
227
  LazyCodex source, and `docs/migration.md` for the Codex-to-Claude migration
package/README_ko-KR.md CHANGED
@@ -1,25 +1,68 @@
1
- # LazyClaude
2
-
3
- LazyClaude는 LazyCodex 스타일의 작업 흐름을 Claude Code에 맞게 옮긴
4
- 개인용 배포판입니다. 간단한 프롬프트 트리거, ultrawork 규칙, 플래너와
5
- 실행자 에이전트, hooks, MCP scaffold, LSP doctor를 Claude Code 플러그인
6
- 형태로 제공합니다.
7
-
8
- 현재 공개 npm 패키지는 `lazyclaude-ai@0.1.1`이고, checkout은 다음
9
- `0.1.2` 패치 배포 후보를 준비합니다. 목적은 다른 PC에서도 빠르게
10
- 설치하기 위한 개인용 배포물입니다. 저장소는 비공개 저장소로 유지할 수
11
- 있고, npm 배포가 곧 홍보, 공개 저장소 운영, Claude marketplace 등록을
12
- 의미하지는 않습니다. 새 버전 배포는 항상 별도의 명시적 승인 후에
1
+ <p align="center"><img src="./cover.png" width="100%" /></p>
2
+
3
+ <h1 align="center">LazyClaude</h1>
4
+ <p align="center">
5
+ <em>Claude Code 안에서 쓰는 LazyCodex 스타일 워크플로우: prompt hook, ultrawork skill, agent, MCP, LSP helper.</em>
6
+ </p>
7
+ <p align="center">
8
+ <a href="#빠른-시작">빠른 시작</a> · <a href="#ulw-사용법">ULW 사용법</a> · <a href="#명령어">명령어</a> · <a href="./README.md">English</a>
9
+ </p>
10
+ <p align="center">
11
+ <img src="https://img.shields.io/badge/npm-lazyclaude--ai-cb3837" />
12
+ <img src="https://img.shields.io/badge/version-0.1.3-2ea44f" />
13
+ <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
+ <img src="https://img.shields.io/badge/license-MIT-blue" />
15
+ </p>
16
+
17
+ ---
18
+
19
+ [English](./README.md) | **한국어**
20
+
21
+ ---
22
+
23
+ > [!NOTE]
24
+ > LazyClaude는 LazyCodex 스타일의 prompt engineering을 Claude Code로 가져오기 위한 조용한 개인용 배포판입니다. `lazyclaude@lazyclaude-ai`로 설치되므로, 매번 긴 `--plugin-dir` 없이 일반 `claude` 실행에서 LazyClaude skill과 hook을 불러올 수 있습니다.
25
+
26
+ 현재 공개 npm 패키지는 `lazyclaude-ai@0.1.3`입니다. 목적은 다른 PC에서도
27
+ 빠르게 설치하기 위한 개인용 배포물입니다. 저장소는 비공개 저장소로
28
+ 유지할 수 있고, npm 배포가 곧 홍보, 공개 저장소 운영, Claude marketplace
29
+ 등록을 의미하지는 않습니다. 새 버전 배포는 항상 별도의 명시적 승인 후에
13
30
  진행합니다.
14
31
 
15
- ## 빠른 설치
32
+ ## 기능
16
33
 
17
- 환경에서는 아래줄을 사용합니다.
34
+ - **자연스러운 Claude 실행** - `npx`로 설치한 뒤에는 plain `claude`
35
+ - **ULW prompt hook** - `ulw`, `ultrawork`, `$ulw-plan`, `$ulw-loop` 트리거
36
+ - **Native goal guidance** - Claude Code가 `/goal` 또는 `get_goal`,
37
+ `create_goal`, `update_goal` 같은 goal surface를 제공하면 이를 우선
38
+ 사용하도록 유도
39
+ - **Dynamic workflow/worktree guidance** - 크거나 병렬적인 작업은 Claude
40
+ Code Dynamic workflow와 Dynamic worktree 격리 쪽으로 유도
41
+ - **Claude skills** - `ulw-plan`, `ulw-loop`, `start-work`, `rules`, `lsp`, `programming`, `review-work`
42
+ - **워크플로우 agents** - planner, executor, verifier, reviewer, librarian, QA runner
43
+ - **Local marketplace 등록** - `claude plugin details lazyclaude@lazyclaude-ai`에서 inventory 확인
44
+ - **MCP와 LSP helper** - plugin-local stdio MCP와 TypeScript 계열 LSP doctor
45
+ - **안전한 uninstall** - LazyClaude가 관리한 상태만 제거
46
+
47
+ ## 빠른 시작
48
+
49
+ ### 설치
18
50
 
19
51
  ```bash
20
52
  npx --yes lazyclaude-ai install
21
53
  ```
22
54
 
55
+ 현재 위치가 이 저장소 checkout이면, registry package와 같은 package name을
56
+ 가진 same-name source checkout 안에 있는 상태입니다. 이 경우
57
+ `npx --yes lazyclaude-ai@0.1.3 install`이 local checkout을 먼저 해석해서
58
+ `sh: lazyclaude-ai: command not found`로 실패할 수 있습니다. 새 폴더에서는
59
+ 일반 설치 명령이 정상 동작합니다.
60
+
61
+ ```bash
62
+ cd /tmp
63
+ npx --yes lazyclaude-ai@0.1.3 install
64
+ ```
65
+
23
66
  설치 상태를 확인합니다.
24
67
 
25
68
  ```bash
@@ -32,7 +75,7 @@ npx --yes lazyclaude-ai doctor
32
75
  claude
33
76
  ```
34
77
 
35
- 대체 진입점은 다음과 같습니다.
78
+ ### 대체 진입점
36
79
 
37
80
  ```bash
38
81
  bunx lazyclaude-ai install
@@ -41,7 +84,8 @@ lazyclaude install
41
84
  ```
42
85
 
43
86
  현재 checkout처럼 package 이름이 같은 폴더 안에서 `npm exec`를 직접 쓸
44
- 때는 fresh prefix를 주는 편이 안전합니다.
87
+ 때는 registry package와 same-name source checkout이 섞이지 않도록 fresh
88
+ prefix를 주는 편이 안전합니다.
45
89
 
46
90
  ```bash
47
91
  npm exec --prefix "$(mktemp -d)" --yes --package lazyclaude-ai -- lazyclaude install
@@ -53,35 +97,16 @@ LazyClaude가 관리한 설치 상태만 제거하려면 다음을 사용합니
53
97
  npx --yes lazyclaude-ai uninstall
54
98
  ```
55
99
 
100
+ ## 설치 방식
101
+
56
102
  installer는 `lazyclaude@lazyclaude-ai`를 Claude Code user plugin registry
57
- 아래의 `~/.claude/plugins`에 등록하고 `settings.json`의 `enabledPlugins`와
103
+ 아래의 `~/.claude/plugins`에 등록하고 `settings.json`의 `enabledPlugins`,
58
104
  LazyClaude 전용 local marketplace 항목, `known_marketplaces.json`을 함께
59
- 기록합니다. 따라서 매번 `--plugin-dir` 명령을 입력할 필요가 없습니다.
60
- 격리 테스트가 필요할 때만
61
- `CLAUDE_CONFIG_DIR=/some/path`와 `LAZYCLAUDE_HOME=/some/path`를 지정하세요.
105
+ 기록합니다. marketplace metadata가 있어야 Claude가
106
+ `claude plugin details`에서 skill과 hook inventory를 해석합니다.
62
107
 
63
- ## 로컬 개발
64
-
65
- 이 저장소에서 바로 플러그인을 테스트할 때는 다음처럼 실행합니다.
66
-
67
- ```bash
68
- claude --plugin-dir ./plugins/lazyclaude
69
- ```
70
-
71
- Claude Code 안에서 플러그인 메타데이터를 다시 읽고 싶으면 다음 명령을
72
- 사용합니다.
73
-
74
- ```text
75
- /reload-plugins
76
- ```
77
-
78
- 기존 OMC/omc Claude 플러그인이 설치되어 있다면 MVP 테스트 중에는
79
- LazyClaude와 함께 co-load하지 않는 것을 권장합니다. 로컬 checkout 테스트는
80
- `--plugin-dir`로 직접 로드하고, npm 설치는 사용자 홈 아래에 LazyClaude가
81
- 관리하는 local marketplace만 만듭니다. root Claude marketplace skeleton은
82
- 저장소 checkout에 배포하지 않습니다. user-level OMC가 검증 중 `.omc/`
83
- 상태 디렉터리를 만들더라도 LazyClaude는 이를 git 및 npm package surface에서
84
- 제외합니다.
108
+ 격리 테스트가 필요할 때만 `CLAUDE_CONFIG_DIR=/some/path`와
109
+ `LAZYCLAUDE_HOME=/some/path`를 지정하세요.
85
110
 
86
111
  ## ULW 사용법
87
112
 
@@ -102,13 +127,24 @@ $start-work plans/lazyclaude-retrofit.md
102
127
  ```
103
128
 
104
129
  기대 동작은 LazyClaude prompt hook이 `ULTRAWORK MODE ENABLED` 컨텍스트를
105
- 추가하고, skill agent 지시문이 Claude를 test-first 작업, 실제 수동 QA
106
- 증거, cleanup receipt, 향후 release step의 명시적 승인 쪽으로 유도하는
107
- 것입니다.
108
-
109
- 단순히 `ulw`라고 입력하는 것은 hook context activation이므로 Claude Code
110
- history에 별도 Skill tool invocation으로 보이지 않을 수 있습니다. 명시적인
111
- LazyClaude command activation을 보고 싶다면 namespaced command사용합니다.
130
+ 추가하고 `LazyClaude ULW hook active`라는 visible hook message를 보여주는
131
+ 것입니다. 또한 plain `ulw`를 일반 작업 실행 `/lazyclaude:ulw-loop` /
132
+ `Skill(ulw-loop)` semantics로 처리하라고 Claude에게 지시합니다. 그 뒤 skill
133
+ 및 agent 지시문이 Claude를 test-first 작업, native goal 처리, 실제 수동 QA
134
+ 증거, cleanup receipt, 향후 release step의 명시적 승인 쪽으로 유도합니다.
135
+
136
+ LazyClaude `/goal`을 대신 입력하거나 slash command text자동 전송하지
137
+ 않습니다. 대신 hook과 ULW skill이 run context를 보강합니다. Claude Code의
138
+ native goal surface가 있으면 `get_goal`을 먼저 확인하고, matching active
139
+ goal이 없을 때만 `create_goal`을 호출하며, `update_goal`은 검증 완료 또는
140
+ 진짜 blocker가 있을 때까지 미루도록 안내합니다. 큰 독립 작업에서는 Dynamic
141
+ workflow orchestration과 Dynamic worktree isolation도 함께 고려하도록
142
+ 유도합니다.
143
+
144
+ 단순히 `ulw`라고 입력하는 것은 hook context activation입니다. Claude Code
145
+ history에는 별도 Skill tool invocation이 아니라 hook guidance로 보일 수
146
+ 있습니다. 명시적인 LazyClaude skill activation을 보고 싶다면 namespaced
147
+ command를 사용합니다.
112
148
 
113
149
  ```text
114
150
  /lazyclaude:ulw-loop <증거 기반으로 실행할 작업>
@@ -118,14 +154,14 @@ LazyClaude command activation을 보고 싶다면 namespaced command를 사용
118
154
 
119
155
  ## 명령어
120
156
 
121
- ```bash
122
- npx --yes lazyclaude-ai install
123
- npx --yes lazyclaude-ai doctor
124
- npx --yes lazyclaude-ai path
125
- npx --yes lazyclaude-ai run -- --help
126
- npx --yes lazyclaude-ai update
127
- npx --yes lazyclaude-ai uninstall
128
- ```
157
+ | 명령어 | 용도 |
158
+ | --- | --- |
159
+ | `npx --yes lazyclaude-ai install` | Claude Code plugin 설치 및 활성화 |
160
+ | `npx --yes lazyclaude-ai doctor` | 파일, Claude validation, plugin details 검증 |
161
+ | `npx --yes lazyclaude-ai path` | 설치된 Claude plugin 경로 출력 |
162
+ | `npx --yes lazyclaude-ai run -- --help` | 설치 상태를 확인한 뒤 plain `claude` 실행 |
163
+ | `npx --yes lazyclaude-ai update` | 현재 package version 재설치 |
164
+ | `npx --yes lazyclaude-ai uninstall` | LazyClaude가 관리한 설치 상태 제거 |
129
165
 
130
166
  전역 설치 없이 checkout 내부 bin을 확인할 수도 있습니다.
131
167
 
@@ -134,6 +170,29 @@ node bin/lazyclaude-ai.js --dry-run install
134
170
  node bin/lazyclaude-ai.js --dry-run doctor
135
171
  ```
136
172
 
173
+ ## 로컬 개발
174
+
175
+ 이 저장소에서 바로 플러그인을 테스트할 때는 다음처럼 실행합니다.
176
+
177
+ ```bash
178
+ claude --plugin-dir ./plugins/lazyclaude
179
+ ```
180
+
181
+ Claude Code 안에서 플러그인 메타데이터를 다시 읽고 싶으면 다음 명령을
182
+ 사용합니다.
183
+
184
+ ```text
185
+ /reload-plugins
186
+ ```
187
+
188
+ 기존 OMC/omc Claude 플러그인이 설치되어 있다면 테스트 중에는 LazyClaude와
189
+ 함께 co-load하지 않는 것을 권장합니다. 로컬 checkout 테스트는
190
+ `--plugin-dir`로 직접 로드하고, npm 설치는 사용자 홈 아래에 LazyClaude가
191
+ 관리하는 local marketplace만 만듭니다. root Claude marketplace skeleton은
192
+ 저장소 checkout에 배포하지 않습니다. user-level OMC가 검증 중 `.omc/`
193
+ 상태 디렉터리를 만들더라도 LazyClaude는 이를 git 및 npm package surface에서
194
+ 제외합니다.
195
+
137
196
  ## 검증
138
197
 
139
198
  ```bash
@@ -150,29 +209,25 @@ probe evidence를 남깁니다.
150
209
 
151
210
  ## 안전 모델
152
211
 
153
- - Hook은 Claude Code event JSON을 stdin으로 읽고 제한된 JSON context를
154
- 반환합니다.
212
+ - Hook은 Claude Code event JSON을 stdin으로 읽고 제한된 JSON context를 반환합니다.
155
213
  - Hook은 사용자 프롬프트 텍스트를 실행하지 않습니다.
156
- - ultrawork prompt hook은 고정된 guidance를 반환하며 prompt text를 다시
157
- echo하지 않습니다.
158
- - `.omc/`, `.omo/`, `evidence/` 같은 로컬 상태는 ignore되며 npm 패키지에
159
- 포함되지 않습니다.
214
+ - ultrawork prompt hook은 고정된 guidance를 반환하며 prompt text를 다시 echo하지 않습니다.
215
+ - `.omc/`, `.omo/`, `evidence/` 같은 로컬 상태는 ignore되며 npm 패키지에 포함되지 않습니다.
160
216
  - planner agent는 read-only이며 edit tool을 갖지 않습니다.
161
217
  - MCP와 LSP helper는 local stdio command입니다.
162
- - 향후 publish, remote marketplace 변경, 새 package release는 모두 명시적
163
- 승인 후 진행합니다.
164
-
165
- ## 범위
166
-
167
- - Package/bin: `lazyclaude-ai`
168
- - Friendly bin alias: `lazyclaude`
169
- - Plugin namespace: `lazyclaude`
170
- - Claude Code platform: `claude-code`
171
- - Skills: ultrawork planning, ultrawork loop, start-work, rules, LSP,
172
- programming, review-work
173
- - Agents: planner, executor, verifier, reviewer, librarian, QA runner
174
- - Hooks: session-start, user-prompt-submit, post-tool-use, post-compact
175
- - Config: local MCP server and TypeScript-family LSP doctor
218
+ - 향후 publish, remote marketplace 변경, 새 package release는 모두 명시적 승인 후 진행합니다.
219
+
220
+ ## 프로젝트 지도
221
+
222
+ | Surface | Path |
223
+ | --- | --- |
224
+ | CLI | `bin/lazyclaude-ai.js` |
225
+ | Claude plugin | `plugins/lazyclaude/` |
226
+ | Skills | `plugins/lazyclaude/skills/` |
227
+ | Agents | `plugins/lazyclaude/agents/` |
228
+ | Hooks | `plugins/lazyclaude/hooks/hooks.json` |
229
+ | MCP | `plugins/lazyclaude/.mcp.json` |
230
+ | LSP | `plugins/lazyclaude/.lsp.json` |
176
231
 
177
232
  영문 설명은 `README.md`, LazyCodex 출처 고정 정보는 `REFERENCE.md`,
178
233
  Codex-to-Claude 변환 표는 `docs/migration.md`를 참고하세요.
@@ -1,9 +1,7 @@
1
1
  # LazyClaude Release Checklist
2
2
 
3
- Status: quiet public npm package `lazyclaude-ai@0.1.1` is published for
4
- personal install convenience after explicit user approval. This checkout is
5
- prepared as the next `0.1.2` patch candidate until the user explicitly approves
6
- another publish.
3
+ Status: quiet public npm package `lazyclaude-ai@0.1.3` is published for
4
+ personal install convenience after explicit user approval.
7
5
 
8
6
  DO NOT publish a new version of LazyClaude, run `npm publish`, push release
9
7
  tags, or add a remote Claude Code marketplace entry without explicit user
@@ -45,6 +43,16 @@ local marketplace metadata needed by `claude plugin details`. Do not ask users
45
43
  to type a generated command that shells out to `npx --yes lazyclaude-ai path` for
46
44
  normal npm installs.
47
45
 
46
+ Run fresh-machine QA from a fresh directory, not from this repository checkout.
47
+ Inside the same-name source checkout, `npx --yes lazyclaude-ai@0.1.3 install`
48
+ can resolve the local package and fail with `sh: lazyclaude-ai: command not
49
+ found`. Use `cd /tmp` for the fresh directory scenario, or use the explicit
50
+ fresh-prefix form:
51
+
52
+ ```bash
53
+ npm exec --prefix "$(mktemp -d)" --yes --package lazyclaude-ai -- lazyclaude install
54
+ ```
55
+
48
56
  ## Quiet Public NPM Package Release Or Update
49
57
 
50
58
  Use this track only when the user explicitly approves making a new package
package/cover.png ADDED
Binary file
package/docs/hooks.md CHANGED
@@ -25,8 +25,22 @@ $start-work
25
25
  ```
26
26
 
27
27
  When a trigger is present, the hook returns additional context containing
28
- `ULTRAWORK MODE ENABLED`. That context is guidance for Claude Code; it is not
29
- executed as a command.
28
+ `ULTRAWORK MODE ENABLED` and a visible `LazyClaude ULW hook active` system
29
+ message. That context is guidance for Claude Code; it is not executed as a
30
+ command. The guidance tells Claude to treat plain `ulw` as
31
+ `/lazyclaude:ulw-loop` / `Skill(ulw-loop)` semantics before ordinary task
32
+ execution.
33
+
34
+ LazyClaude follows the LazyCodex goal pattern as model-facing run context, not
35
+ as slash-command injection. If Claude Code exposes the native goal surface, the
36
+ guidance tells Claude to inspect `get_goal`, call `create_goal` only when no
37
+ matching goal is active, and delay `update_goal` until verified completion or a
38
+ genuine blocker. It may also point Claude toward the user-visible `/goal`
39
+ surface, but it does not auto-type `/goal` or send slash command text.
40
+
41
+ For broad work, the same context can steer Claude toward Dynamic workflow
42
+ orchestration and Dynamic worktree isolation so independent work proceeds with
43
+ bounded evidence paths and without mutating unrelated workspace state.
30
44
 
31
45
  Plain `ulw` therefore activates hook context, not a visible Skill tool call.
32
46
  For a visible LazyClaude command/skill invocation, use the namespaced Claude
package/docs/migration.md CHANGED
@@ -9,6 +9,8 @@ of surface, and a conservative local fallback where it does not.
9
9
  | Codex CLI prompt engineering | Claude Code skills | `plugins/lazyclaude/skills/*/SKILL.md` |
10
10
  | Codex ultrawork plan mode | Claude Code skill plus planner agent | `ulw-plan` and `prometheus-planner` |
11
11
  | Codex execution loop | Claude Code skill plus executor agent | `ulw-loop`, `start-work`, and `boulder-executor` |
12
+ | Codex goal-tool guidance | Claude Code native goal surface | `/goal` when user-selected, or model-facing `get_goal`, `create_goal`, and verified-final `update_goal` guidance when exposed |
13
+ | Codex parallel orchestration | Claude Code Dynamic workflow and Dynamic worktree surfaces | Use Dynamic workflow for broad independent work and Dynamic worktree isolation for risky or parallel edits |
12
14
  | Codex hooks | Claude Code hooks | `plugins/lazyclaude/hooks/hooks.json` |
13
15
  | Codex MCP helpers | Claude Code plugin MCP config | `plugins/lazyclaude/.mcp.json` |
14
16
  | Codex LSP integration | Claude Code plugin LSP config | `plugins/lazyclaude/.lsp.json` |
@@ -43,6 +45,21 @@ a LazyClaude-managed local marketplace entry in `known_marketplaces.json`.
43
45
  This keeps installation convenient without requiring public repo promotion,
44
46
  manual `--plugin-dir` launch commands, or a remote Claude marketplace entry.
45
47
 
48
+ ## Goal And Dynamic Workflow Parity
49
+
50
+ LazyCodex goal integration is model-facing guidance around goal tools; it does
51
+ not type a `/goal` slash command for the user. LazyClaude mirrors that contract:
52
+ ULW hook context and ULW skills mention Claude Code's native goal surface, ask
53
+ Claude to inspect `get_goal`, create a goal with `create_goal` only when no
54
+ matching active goal exists, and defer `update_goal` until the evidence gate has
55
+ passed or a real blocker is recorded.
56
+
57
+ When the user explicitly chooses Claude Code `/goal`, that native session goal
58
+ remains user-visible and user-controlled. LazyClaude does not auto-type
59
+ `/goal`. For multi-lane work, LazyClaude should prefer Dynamic workflow
60
+ orchestration where available and Dynamic worktree isolation when parallel or
61
+ risky edits might otherwise collide.
62
+
46
63
  If OMC/omc is already installed in Claude Code, keep it disabled or start a
47
64
  separate Claude Code session without OMC while testing LazyClaude. This repo no
48
65
  longer ships a root marketplace skeleton; direct `--plugin-dir` loading avoids
@@ -0,0 +1,123 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import TypeAlias
6
+
7
+ import numpy as np
8
+ from PIL import Image, ImageDraw, ImageFilter, ImageFont
9
+
10
+ WIDTH = 2560
11
+ HEIGHT = 1280
12
+ CORNER_RADIUS = 80
13
+ ROOT = Path(__file__).resolve().parent
14
+ OUT_PATH = ROOT / "cover.png"
15
+ ReadableFont: TypeAlias = ImageFont.FreeTypeFont | ImageFont.ImageFont
16
+
17
+
18
+ def make_blob(size: tuple[int, int], color: tuple[int, int, int, int], cx: int, cy: int, rx: int, ry: int) -> Image.Image:
19
+ layer = Image.new("RGBA", size, (0, 0, 0, 0))
20
+ draw = ImageDraw.Draw(layer)
21
+ draw.ellipse([cx - rx, cy - ry, cx + rx, cy + ry], fill=color)
22
+ return layer
23
+
24
+
25
+ def load_font(size: int, *, bold: bool) -> ReadableFont:
26
+ candidates = [
27
+ ("/System/Library/Fonts/Menlo.ttc", 1 if bold else 0),
28
+ ("/System/Library/Fonts/Supplemental/Courier New Bold.ttf", 0),
29
+ ("/Library/Fonts/Arial Unicode.ttf", 0),
30
+ ]
31
+ for path, index in candidates:
32
+ try:
33
+ return ImageFont.truetype(path, size, index=index)
34
+ except OSError:
35
+ continue
36
+ return ImageFont.load_default(size=size)
37
+
38
+
39
+ def draw_text_layer(text: str, x: int, y: int, font: ReadableFont, color: tuple[int, int, int, int]) -> Image.Image:
40
+ layer = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0))
41
+ ImageDraw.Draw(layer).text((x, y), text, font=font, fill=color)
42
+ return layer
43
+
44
+
45
+ def centered_position(draw: ImageDraw.ImageDraw, text: str, font: ReadableFont, y: int) -> tuple[int, int, int]:
46
+ bbox = draw.textbbox((0, 0), text, font=font)
47
+ text_width = bbox[2] - bbox[0]
48
+ text_height = bbox[3] - bbox[1]
49
+ return int((WIDTH - text_width) // 2 - bbox[0]), int(y - bbox[1]), int(text_height)
50
+
51
+
52
+ def main() -> None:
53
+ canvas = Image.new("RGBA", (WIDTH, HEIGHT), (9, 12, 18, 255))
54
+
55
+ blobs = [
56
+ ((30, 144, 255, 180), 560, 380, 760, 520, 120),
57
+ ((0, 210, 160, 150), 1880, 820, 820, 480, 120),
58
+ ((160, 80, 255, 140), 1350, 180, 780, 360, 110),
59
+ ((255, 210, 80, 90), 820, 1040, 620, 300, 90),
60
+ ]
61
+ for color, cx, cy, rx, ry, blur in blobs:
62
+ blob = make_blob((WIDTH, HEIGHT), color, cx, cy, rx, ry).filter(ImageFilter.GaussianBlur(radius=blur))
63
+ canvas = Image.alpha_composite(canvas, blob)
64
+
65
+ canvas = canvas.filter(ImageFilter.GaussianBlur(radius=7))
66
+
67
+ rng = np.random.default_rng(42)
68
+ noise = rng.integers(0, 255, (HEIGHT, WIDTH), dtype=np.uint8)
69
+ grain_alpha = (noise * 0.16).astype(np.uint8)
70
+ grain = Image.fromarray(np.stack([noise, noise, noise, grain_alpha], axis=-1).astype(np.uint8), "RGBA")
71
+ canvas = Image.alpha_composite(canvas, grain)
72
+
73
+ title = "LazyClaude"
74
+ subtitle = "Claude Code workflows with hooks, skills, agents, MCP, and LSP"
75
+ title_font = load_font(220, bold=True)
76
+ subtitle_font = load_font(58, bold=False)
77
+
78
+ measure = ImageDraw.Draw(Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)))
79
+ title_x, title_y, title_h = centered_position(measure, title, title_font, 445)
80
+ subtitle_x, subtitle_y, _ = centered_position(measure, subtitle, subtitle_font, title_y + title_h + 88)
81
+
82
+ for color, blur in [
83
+ ((80, 210, 255, 70), 22),
84
+ ((150, 255, 220, 85), 10),
85
+ ((255, 255, 255, 120), 4),
86
+ ]:
87
+ glow = draw_text_layer(title, title_x, title_y, title_font, color).filter(ImageFilter.GaussianBlur(radius=blur))
88
+ canvas = Image.alpha_composite(canvas, glow)
89
+
90
+ canvas = Image.alpha_composite(canvas, draw_text_layer(title, title_x, title_y, title_font, (255, 255, 255, 246)))
91
+ canvas = Image.alpha_composite(canvas, draw_text_layer(subtitle, subtitle_x, subtitle_y, subtitle_font, (218, 232, 240, 220)))
92
+
93
+ label_font = load_font(44, bold=False)
94
+ package = json.loads((ROOT / "package.json").read_text(encoding="utf8"))
95
+ label = f"lazyclaude-ai@{package['version']}"
96
+ label_x, label_y, _ = centered_position(measure, label, label_font, 930)
97
+ pill = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0))
98
+ pill_draw = ImageDraw.Draw(pill)
99
+ label_bbox = pill_draw.textbbox((label_x, label_y), label, font=label_font)
100
+ pad_x = 42
101
+ pad_y = 24
102
+ pill_draw.rounded_rectangle(
103
+ [label_bbox[0] - pad_x, label_bbox[1] - pad_y, label_bbox[2] + pad_x, label_bbox[3] + pad_y],
104
+ radius=42,
105
+ fill=(5, 10, 18, 145),
106
+ outline=(255, 255, 255, 42),
107
+ width=2,
108
+ )
109
+ pill_draw.text((label_x, label_y), label, font=label_font, fill=(232, 244, 247, 230))
110
+ canvas = Image.alpha_composite(canvas, pill)
111
+
112
+ mask = Image.new("L", (WIDTH, HEIGHT), 0)
113
+ ImageDraw.Draw(mask).rounded_rectangle([(0, 0), (WIDTH - 1, HEIGHT - 1)], radius=CORNER_RADIUS, fill=255)
114
+ canvas.putalpha(mask)
115
+ canvas = canvas.filter(ImageFilter.GaussianBlur(radius=1))
116
+ canvas.save(OUT_PATH, "PNG", dpi=(400, 400))
117
+ print(f"Saved: {OUT_PATH}")
118
+ print(f"Size: {canvas.size}")
119
+ print(f"Mode: {canvas.mode}")
120
+
121
+
122
+ if __name__ == "__main__":
123
+ main()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazyclaude-ai",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Claude Code-native LazyCodex-style workflow distribution.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,6 +14,8 @@
14
14
  "scripts",
15
15
  "README.md",
16
16
  "README_ko-KR.md",
17
+ "cover.png",
18
+ "generate_cover.py",
17
19
  "REFERENCE.md",
18
20
  "RELEASE_CHECKLIST.md",
19
21
  "LICENSE"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lazyclaude",
3
3
  "description": "Claude Code-native LazyCodex-style workflow plugin.",
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "author": {
6
6
  "name": "LazyClaude contributors"
7
7
  },
@@ -21,18 +21,32 @@ const hookEventNames = {
21
21
  "post-compact": "PostCompact",
22
22
  };
23
23
 
24
- const writeContext = (additionalContext) => {
24
+ const writeContext = (additionalContext, systemMessage) => {
25
+ const payload = {
26
+ continue: true,
27
+ hookSpecificOutput: {
28
+ hookEventName: hookEventNames[eventName],
29
+ additionalContext,
30
+ },
31
+ };
32
+ if (systemMessage) {
33
+ payload.systemMessage = systemMessage;
34
+ }
25
35
  console.log(
26
- JSON.stringify({
27
- continue: true,
28
- hookSpecificOutput: {
29
- hookEventName: hookEventNames[eventName],
30
- additionalContext,
31
- },
32
- }),
36
+ JSON.stringify(payload),
33
37
  );
34
38
  };
35
39
 
40
+ const ultraworkContext = [
41
+ "ULTRAWORK MODE ENABLED.",
42
+ "Treat this prompt as an explicit request to use LazyClaude ulw-loop discipline now; load or follow /lazyclaude:ulw-loop / Skill(ulw-loop) semantics before ordinary task execution.",
43
+ "Use evidence-bound planning, tests, manual QA, and cleanup receipts.",
44
+ "Native goal integration: when Claude Code exposes /goal or model-facing goal tools, first inspect get_goal, call create_goal with an objective-only payload when no matching goal is active, and reserve update_goal for verified completion or a genuine blocker.",
45
+ "Do not auto-type or inject the user's slash commands; treat /goal as Claude Code's native goal surface, not as prompt text for this hook to send.",
46
+ "Dynamic workflow: for large independent work, prefer Claude Code Dynamic workflows or subagents with explicit criteria and artifacts.",
47
+ "Dynamic worktree: isolate risky or parallel edits in the active Claude Code worktree/workspace and never mutate unrelated user state.",
48
+ ].join(" ");
49
+
36
50
  const input = readInput();
37
51
 
38
52
  switch (eventName) {
@@ -45,7 +59,7 @@ switch (eventName) {
45
59
  const prompt = typeof input.prompt === "string" ? input.prompt : "";
46
60
  const activates = /\b(?:ultrawork|ulw)\b|\$(?:ulw-plan|ulw-loop|start-work)\b/u.test(prompt);
47
61
  if (activates) {
48
- writeContext("ULTRAWORK MODE ENABLED. Use evidence-bound planning, tests, manual QA, and cleanup receipts.");
62
+ writeContext(ultraworkContext, "LazyClaude ULW hook active: ulw-loop guidance injected.");
49
63
  } else {
50
64
  writeContext("LazyClaude prompt hook checked: no workflow activation.");
51
65
  }
@@ -17,3 +17,16 @@ first unchecked top-level checkbox. For every checkbox:
17
17
  7. Mark the checkbox complete only after all evidence is captured.
18
18
 
19
19
  The durable ledger is `.omo/start-work/ledger.jsonl`.
20
+
21
+ ## Native Goal + Dynamic Workflow
22
+
23
+ Before the first checkbox, use Claude Code's native goal surface when available:
24
+ call `get_goal`, call `create_goal` with the plan objective when no matching
25
+ active goal exists, and do not call `update_goal` until all top-level checkboxes
26
+ and verification gates are complete or the plan is genuinely blocked. If the
27
+ user invokes `/goal`, respect that native Claude Code session goal; LazyClaude
28
+ does not auto-type or send `/goal` text.
29
+
30
+ For independent checkbox waves, prefer Dynamic workflow orchestration or
31
+ subagents with explicit evidence paths. For risky or parallel edits, use
32
+ Dynamic worktree isolation and keep every command in the selected worktree.
@@ -12,3 +12,18 @@ automation.
12
12
 
13
13
  Keep a ledger of decisions, evidence, cleanup receipts, and remaining work.
14
14
  Never claim completion from tests alone.
15
+
16
+ ## Native Goal + Dynamic Workflow
17
+
18
+ Use Claude Code's native goal surface when it is available. If the session
19
+ exposes model-facing goal tools, call `get_goal` before execution, call
20
+ `create_goal` only when no matching active goal exists, and call `update_goal`
21
+ only after every success criterion has real evidence or when the work is truly
22
+ blocked. If the user chooses `/goal`, treat it as Claude Code's native session
23
+ goal command; LazyClaude must not auto-type or send `/goal` text for them.
24
+
25
+ For broad work, consider Claude Code Dynamic workflow orchestration before
26
+ serial execution. Keep each worker or workflow branch tied to concrete criteria,
27
+ artifacts, and cleanup receipts. Use Dynamic worktree isolation for risky or
28
+ parallel edits, and keep all mutations inside the active Claude Code
29
+ workspace/worktree.
@@ -12,7 +12,16 @@ Use Claude Code surfaces directly:
12
12
 
13
13
  - read/search files for grounding
14
14
  - use subagents only for read-only research or plan review
15
+ - include native goal handling: `get_goal`, `create_goal`, and delayed
16
+ `update_goal` when Claude Code exposes those tools, or a user-managed `/goal`
17
+ condition when the user chooses that surface
18
+ - include Dynamic workflow and Dynamic worktree guidance for independent,
19
+ parallel, risky, or long-running implementation lanes
15
20
  - write only plan artifacts and drafts
16
21
  - include concrete tests, manual QA, cleanup, and non-publish guardrails
17
22
 
23
+ Do not auto-type or send `/goal` text. LazyClaude plans should describe the
24
+ native goal surface and the exact completion condition the user or Claude Code
25
+ should bind.
26
+
18
27
  When `$ARGUMENTS` is present, treat it as the planning brief.