lazycodex-ai 5.0.0-beta.87 → 5.0.0-beta.89
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.ja.md +1 -11
- package/README.ko.md +1 -11
- package/README.md +1 -1
- package/README.ru.md +1 -11
- package/README.zh-cn.md +1 -11
- package/dist/cli/index.js +90 -73
- package/dist/cli-node/index.js +90 -73
- package/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +16 -3
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +2 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +30 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +17 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +2 -1
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +30 -7
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +17 -5
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +13 -9
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/shared-skills/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// plan-templates.mjs - the draft and plan skeleton text that scaffold-plan.mjs emits.
|
|
2
|
+
//
|
|
3
|
+
// Text only: no filesystem access, no path policy (scaffold-plan.mjs owns the write
|
|
4
|
+
// boundary). Zero external dependencies so it runs byte-identically under `node` and `bun`.
|
|
5
|
+
|
|
6
|
+
// The canonical AI-plan section headers, in order. references/full-workflow.md
|
|
7
|
+
// documents this exact list; the two must never drift.
|
|
8
|
+
export const PLAN_SECTION_HEADERS = [
|
|
9
|
+
"## TL;DR (For humans)",
|
|
10
|
+
"## Scope",
|
|
11
|
+
"## Verification strategy",
|
|
12
|
+
"## Execution strategy",
|
|
13
|
+
"## Todos",
|
|
14
|
+
"## Final verification wave",
|
|
15
|
+
"## Commit strategy",
|
|
16
|
+
"## Success criteria",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export const FINAL_VERIFICATION_ITEMS = [
|
|
20
|
+
"F1. Plan compliance audit",
|
|
21
|
+
"F2. Code quality review",
|
|
22
|
+
"F3. Real manual QA",
|
|
23
|
+
"F4. Ideal-state fidelity",
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
|
|
27
|
+
const assumptionsNote =
|
|
28
|
+
intent === "unclear"
|
|
29
|
+
? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
|
|
30
|
+
: "Record any default you adopt instead of asking, so the user can veto it at the gate.";
|
|
31
|
+
const reviewState = reviewRequired
|
|
32
|
+
? `review_required: true
|
|
33
|
+
plan_path: .omo/plans/${slug}.md
|
|
34
|
+
plan_sha256: null
|
|
35
|
+
review_round_id: null
|
|
36
|
+
pending-action: write and review .omo/plans/${slug}.md
|
|
37
|
+
review:
|
|
38
|
+
momus:
|
|
39
|
+
status: pending
|
|
40
|
+
workspace_root: null
|
|
41
|
+
runtime_home: null
|
|
42
|
+
target: .omo/plans/${slug}.md
|
|
43
|
+
round_id: null
|
|
44
|
+
plan_sha256: null
|
|
45
|
+
launch_id: null
|
|
46
|
+
session: null
|
|
47
|
+
result: null
|
|
48
|
+
independent:
|
|
49
|
+
status: pending
|
|
50
|
+
workspace_root: null
|
|
51
|
+
runtime_home: null
|
|
52
|
+
target: .omo/plans/${slug}.md
|
|
53
|
+
round_id: null
|
|
54
|
+
plan_sha256: null
|
|
55
|
+
launch_id: null
|
|
56
|
+
session: null
|
|
57
|
+
result: null`
|
|
58
|
+
: `review_required: false
|
|
59
|
+
pending-action: write .omo/plans/${slug}.md`;
|
|
60
|
+
return `---
|
|
61
|
+
slug: ${slug}
|
|
62
|
+
status: drafting
|
|
63
|
+
intent: ${intent}
|
|
64
|
+
${reviewState}
|
|
65
|
+
approach: <fill: the approach you intend to plan>
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
# Draft: ${slug}
|
|
69
|
+
|
|
70
|
+
## Affected user and ideal state
|
|
71
|
+
<!-- Who this output touches (a customer, another programmer, a program or agent consuming it - often more than one) and how each uses it today and will use it after. -->
|
|
72
|
+
<!-- IS-n | property of the ideal state: nothing snags, feels odd, regresses, or degrades for them | reason -->
|
|
73
|
+
<!-- GAP-n | difference between IS-n and today | reason | closed by todo(s) -->
|
|
74
|
+
|
|
75
|
+
## Components (topology ledger)
|
|
76
|
+
<!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
|
|
77
|
+
<!-- id | outcome (one line) | status: active|deferred | evidence path -->
|
|
78
|
+
|
|
79
|
+
## Open assumptions (announced defaults)
|
|
80
|
+
<!-- ${assumptionsNote} -->
|
|
81
|
+
<!-- assumption | adopted default | rationale | reversible? -->
|
|
82
|
+
|
|
83
|
+
## Findings (cited - path:lines)
|
|
84
|
+
|
|
85
|
+
## Decisions (with rationale)
|
|
86
|
+
|
|
87
|
+
## Scope IN
|
|
88
|
+
|
|
89
|
+
## Scope OUT (Must NOT have)
|
|
90
|
+
|
|
91
|
+
## Open questions
|
|
92
|
+
|
|
93
|
+
## Approval gate
|
|
94
|
+
status: drafting
|
|
95
|
+
<!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
|
|
96
|
+
<!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function buildPlanSkeleton(slug, intent) {
|
|
101
|
+
const decisionsLine =
|
|
102
|
+
intent === "unclear"
|
|
103
|
+
? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
|
|
104
|
+
: "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
|
|
105
|
+
return `# ${slug} - Work Plan
|
|
106
|
+
|
|
107
|
+
## TL;DR (For humans)
|
|
108
|
+
<!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
|
|
109
|
+
<!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
|
|
110
|
+
|
|
111
|
+
**Who this is for and what changes for them:** <fill last - the affected user and their experience after, 1-2 sentences>
|
|
112
|
+
|
|
113
|
+
**What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
|
|
114
|
+
|
|
115
|
+
**Why this approach:** <fill last - the one or two load-bearing decisions and why>
|
|
116
|
+
|
|
117
|
+
**What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
|
|
118
|
+
|
|
119
|
+
**Effort:** <Quick | Short | Medium | Large | XL>
|
|
120
|
+
<!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
|
|
121
|
+
**Risk:** <Low | Medium | High> - <one-line driver>
|
|
122
|
+
${decisionsLine}
|
|
123
|
+
|
|
124
|
+
Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
> TL;DR (machine): <1 line - effort, risk, deliverables>
|
|
129
|
+
|
|
130
|
+
## Scope
|
|
131
|
+
### Affected user and ideal state
|
|
132
|
+
<!-- From the draft ledger: who this touches and how they use the result, then one IS row per property with its reason, then one GAP row per difference with its reason. Every todo below closes a GAP row; ## Success criteria proves every IS row. -->
|
|
133
|
+
**Affected user:** <who, and how they use it today and after>
|
|
134
|
+
|
|
135
|
+
| Row | Statement | Reason |
|
|
136
|
+
| --- | --- | --- |
|
|
137
|
+
| IS-1 | <what the user does, sees, or never has break> | <why this is the ideal for them> |
|
|
138
|
+
| GAP-1 | <how today differs from IS-1> | <why it matters to them> |
|
|
139
|
+
|
|
140
|
+
### Must have
|
|
141
|
+
### Must NOT have (guardrails, anti-slop, scope boundaries)
|
|
142
|
+
|
|
143
|
+
## Verification strategy
|
|
144
|
+
> Zero human intervention - all verification is agent-executed.
|
|
145
|
+
- Test decision: <TDD | tests-after | none> + framework
|
|
146
|
+
- Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from the ulw-loop status operation - on Senpi the eval SDK import, const { agentToolkit } = await import(\`\${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js\`) then agentToolkit.status(), on Codex the omo-agent-toolkit CLI, .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
|
|
147
|
+
|
|
148
|
+
## Execution strategy
|
|
149
|
+
### Parallel execution waves
|
|
150
|
+
> Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
|
|
151
|
+
|
|
152
|
+
### Dependency matrix
|
|
153
|
+
| Todo | Depends on | Blocks | Can parallelize with |
|
|
154
|
+
| --- | --- | --- | --- |
|
|
155
|
+
|
|
156
|
+
## Todos
|
|
157
|
+
> Implementation + Test = ONE todo. Never separate.
|
|
158
|
+
<!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
|
|
159
|
+
- [ ] 1. <title>
|
|
160
|
+
What to do / Must NOT do: <...>
|
|
161
|
+
Closes: GAP-<n>
|
|
162
|
+
Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
|
|
163
|
+
References (executor has NO interview context - be exhaustive): <src/path:lines>
|
|
164
|
+
Acceptance criteria (agent-executable): <exact command or assertion>
|
|
165
|
+
QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
|
|
166
|
+
Commit: <Y/N> | <type>(<scope>): <summary>
|
|
167
|
+
|
|
168
|
+
## Final verification wave
|
|
169
|
+
> Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
|
|
170
|
+
${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
|
|
171
|
+
|
|
172
|
+
## Commit strategy
|
|
173
|
+
|
|
174
|
+
## Success criteria
|
|
175
|
+
> One row per IS row. The plan is complete only when every IS row has a delivering todo and a proving QA scenario; F4 checks the delivered behavior against these rows 1:1, and a shortfall becomes new \`- [ ] N.\` rows, never a note.
|
|
176
|
+
| IS | Delivering todo(s) | Proving QA scenario | Evidence |
|
|
177
|
+
| --- | --- | --- | --- |
|
|
178
|
+
| IS-1 | <N> | <scenario name from todo N> | <attemptDir>/task-<N>-${slug}.<ext> |
|
|
179
|
+
`;
|
|
180
|
+
}
|
|
@@ -23,26 +23,10 @@
|
|
|
23
23
|
import { lstat, mkdir, writeFile, readFile, realpath } from "node:fs/promises";
|
|
24
24
|
import { dirname, join, relative, resolve, isAbsolute } from "node:path";
|
|
25
25
|
import { pathToFileURL } from "node:url";
|
|
26
|
+
import { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton } from "./plan-templates.mjs";
|
|
26
27
|
|
|
27
|
-
// The
|
|
28
|
-
|
|
29
|
-
export const PLAN_SECTION_HEADERS = [
|
|
30
|
-
"## TL;DR (For humans)",
|
|
31
|
-
"## Scope",
|
|
32
|
-
"## Verification strategy",
|
|
33
|
-
"## Execution strategy",
|
|
34
|
-
"## Todos",
|
|
35
|
-
"## Final verification wave",
|
|
36
|
-
"## Commit strategy",
|
|
37
|
-
"## Success criteria",
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
export const FINAL_VERIFICATION_ITEMS = [
|
|
41
|
-
"F1. Plan compliance audit",
|
|
42
|
-
"F2. Code quality review",
|
|
43
|
-
"F3. Real manual QA",
|
|
44
|
-
"F4. Scope fidelity",
|
|
45
|
-
];
|
|
28
|
+
// The emitted text lives in plan-templates.mjs; re-exported so importers keep one entry point.
|
|
29
|
+
export { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton };
|
|
46
30
|
|
|
47
31
|
const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,79}$/;
|
|
48
32
|
|
|
@@ -151,141 +135,6 @@ export function isUlwArtifact(content) {
|
|
|
151
135
|
return isPlan || isDraft;
|
|
152
136
|
}
|
|
153
137
|
|
|
154
|
-
export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
|
|
155
|
-
const assumptionsNote =
|
|
156
|
-
intent === "unclear"
|
|
157
|
-
? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
|
|
158
|
-
: "Record any default you adopt instead of asking, so the user can veto it at the gate.";
|
|
159
|
-
const reviewState = reviewRequired
|
|
160
|
-
? `review_required: true
|
|
161
|
-
plan_path: .omo/plans/${slug}.md
|
|
162
|
-
plan_sha256: null
|
|
163
|
-
review_round_id: null
|
|
164
|
-
pending-action: write and review .omo/plans/${slug}.md
|
|
165
|
-
review:
|
|
166
|
-
momus:
|
|
167
|
-
status: pending
|
|
168
|
-
workspace_root: null
|
|
169
|
-
runtime_home: null
|
|
170
|
-
target: .omo/plans/${slug}.md
|
|
171
|
-
round_id: null
|
|
172
|
-
plan_sha256: null
|
|
173
|
-
launch_id: null
|
|
174
|
-
session: null
|
|
175
|
-
result: null
|
|
176
|
-
independent:
|
|
177
|
-
status: pending
|
|
178
|
-
workspace_root: null
|
|
179
|
-
runtime_home: null
|
|
180
|
-
target: .omo/plans/${slug}.md
|
|
181
|
-
round_id: null
|
|
182
|
-
plan_sha256: null
|
|
183
|
-
launch_id: null
|
|
184
|
-
session: null
|
|
185
|
-
result: null`
|
|
186
|
-
: `review_required: false
|
|
187
|
-
pending-action: write .omo/plans/${slug}.md`;
|
|
188
|
-
return `---
|
|
189
|
-
slug: ${slug}
|
|
190
|
-
status: drafting
|
|
191
|
-
intent: ${intent}
|
|
192
|
-
${reviewState}
|
|
193
|
-
approach: <fill: the approach you intend to plan>
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
# Draft: ${slug}
|
|
197
|
-
|
|
198
|
-
## Components (topology ledger)
|
|
199
|
-
<!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
|
|
200
|
-
<!-- id | outcome (one line) | status: active|deferred | evidence path -->
|
|
201
|
-
|
|
202
|
-
## Open assumptions (announced defaults)
|
|
203
|
-
<!-- ${assumptionsNote} -->
|
|
204
|
-
<!-- assumption | adopted default | rationale | reversible? -->
|
|
205
|
-
|
|
206
|
-
## Findings (cited - path:lines)
|
|
207
|
-
|
|
208
|
-
## Decisions (with rationale)
|
|
209
|
-
|
|
210
|
-
## Scope IN
|
|
211
|
-
|
|
212
|
-
## Scope OUT (Must NOT have)
|
|
213
|
-
|
|
214
|
-
## Open questions
|
|
215
|
-
|
|
216
|
-
## Approval gate
|
|
217
|
-
status: drafting
|
|
218
|
-
<!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
|
|
219
|
-
<!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
|
|
220
|
-
`;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export function buildPlanSkeleton(slug, intent) {
|
|
224
|
-
const decisionsLine =
|
|
225
|
-
intent === "unclear"
|
|
226
|
-
? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
|
|
227
|
-
: "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
|
|
228
|
-
return `# ${slug} - Work Plan
|
|
229
|
-
|
|
230
|
-
## TL;DR (For humans)
|
|
231
|
-
<!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
|
|
232
|
-
<!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
|
|
233
|
-
|
|
234
|
-
**What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
|
|
235
|
-
|
|
236
|
-
**Why this approach:** <fill last - the one or two load-bearing decisions and why>
|
|
237
|
-
|
|
238
|
-
**What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
|
|
239
|
-
|
|
240
|
-
**Effort:** <Quick | Short | Medium | Large | XL>
|
|
241
|
-
<!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
|
|
242
|
-
**Risk:** <Low | Medium | High> - <one-line driver>
|
|
243
|
-
${decisionsLine}
|
|
244
|
-
|
|
245
|
-
Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
> TL;DR (machine): <1 line - effort, risk, deliverables>
|
|
250
|
-
|
|
251
|
-
## Scope
|
|
252
|
-
### Must have
|
|
253
|
-
### Must NOT have (guardrails, anti-slop, scope boundaries)
|
|
254
|
-
|
|
255
|
-
## Verification strategy
|
|
256
|
-
> Zero human intervention - all verification is agent-executed.
|
|
257
|
-
- Test decision: <TDD | tests-after | none> + framework
|
|
258
|
-
- Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from the ulw-loop status operation - on Senpi the eval SDK import, const { agentToolkit } = await import(\`\${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js\`) then agentToolkit.status(), on Codex the omo-agent-toolkit CLI, .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
|
|
259
|
-
|
|
260
|
-
## Execution strategy
|
|
261
|
-
### Parallel execution waves
|
|
262
|
-
> Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
|
|
263
|
-
|
|
264
|
-
### Dependency matrix
|
|
265
|
-
| Todo | Depends on | Blocks | Can parallelize with |
|
|
266
|
-
| --- | --- | --- | --- |
|
|
267
|
-
|
|
268
|
-
## Todos
|
|
269
|
-
> Implementation + Test = ONE todo. Never separate.
|
|
270
|
-
<!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
|
|
271
|
-
- [ ] 1. <title>
|
|
272
|
-
What to do / Must NOT do: <...>
|
|
273
|
-
Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
|
|
274
|
-
References (executor has NO interview context - be exhaustive): <src/path:lines>
|
|
275
|
-
Acceptance criteria (agent-executable): <exact command or assertion>
|
|
276
|
-
QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
|
|
277
|
-
Commit: <Y/N> | <type>(<scope>): <summary>
|
|
278
|
-
|
|
279
|
-
## Final verification wave
|
|
280
|
-
> Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
|
|
281
|
-
${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
|
|
282
|
-
|
|
283
|
-
## Commit strategy
|
|
284
|
-
|
|
285
|
-
## Success criteria
|
|
286
|
-
`;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
138
|
// Resume-safe write: plain re-run on an existing ulw-plan artifact is a no-op
|
|
290
139
|
// success; --reset overwrites but refuses to discard a hand-edited file unless
|
|
291
140
|
// --force is also passed.
|