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 +131 -79
- package/README_ko-KR.md +132 -77
- package/RELEASE_CHECKLIST.md +12 -4
- package/cover.png +0 -0
- package/docs/hooks.md +16 -2
- package/docs/migration.md +17 -0
- package/generate_cover.py +123 -0
- package/package.json +3 -1
- package/plugins/lazyclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/lazyclaude/bin/lazyclaude-hook.js +23 -9
- package/plugins/lazyclaude/skills/start-work/SKILL.md +13 -0
- package/plugins/lazyclaude/skills/ulw-loop/SKILL.md +15 -0
- package/plugins/lazyclaude/skills/ulw-plan/SKILL.md +9 -0
package/README.md
CHANGED
|
@@ -1,22 +1,62 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
43
|
-
confuse the registry package with
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
102
|
-
|
|
103
|
-
before
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
npx --yes lazyclaude-ai
|
|
120
|
-
npx --yes lazyclaude-ai
|
|
121
|
-
npx --yes lazyclaude-ai
|
|
122
|
-
npx --yes lazyclaude-ai
|
|
123
|
-
npx --yes lazyclaude-ai
|
|
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
|
-
|
|
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
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
LazyClaude
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
때는
|
|
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
|
-
기록합니다.
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
LazyClaude
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
npx --yes lazyclaude-ai
|
|
124
|
-
npx --yes lazyclaude-ai
|
|
125
|
-
npx --yes lazyclaude-ai
|
|
126
|
-
npx --yes lazyclaude-ai
|
|
127
|
-
npx --yes lazyclaude-ai
|
|
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
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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`를 참고하세요.
|
package/RELEASE_CHECKLIST.md
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# LazyClaude Release Checklist
|
|
2
2
|
|
|
3
|
-
Status: quiet public npm package `lazyclaude-ai@0.1.
|
|
4
|
-
personal install convenience after explicit user approval.
|
|
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
|
|
29
|
-
executed as a
|
|
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.
|
|
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"
|
|
@@ -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("
|
|
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.
|