@slowcook-ai/cli 0.9.1 → 0.11.1
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/dist/commands/refine/agent.d.ts.map +1 -1
- package/dist/commands/refine/agent.js +24 -1
- package/dist/commands/refine/agent.js.map +1 -1
- package/dist/commands/refine/mermaid.d.ts +74 -0
- package/dist/commands/refine/mermaid.d.ts.map +1 -0
- package/dist/commands/refine/mermaid.js +167 -0
- package/dist/commands/refine/mermaid.js.map +1 -0
- package/dist/commands/refine/prompts.d.ts +10 -0
- package/dist/commands/refine/prompts.d.ts.map +1 -1
- package/dist/commands/refine/prompts.js +274 -1
- package/dist/commands/refine/prompts.js.map +1 -1
- package/dist/commands/refine/spec-yaml.d.ts +599 -10
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +54 -0
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/package.json +2 -2
|
@@ -112,6 +112,152 @@ When emitting the spec: output ONLY the YAML, nothing before or after, starting
|
|
|
112
112
|
- acceptance_scenarios: string[] (Given/When/Then form)
|
|
113
113
|
- non_goals: string[]
|
|
114
114
|
- related_specs?: [{ id, relationship: "overlap"|"related"|"superseded", note? }]
|
|
115
|
+
- proposals?: { schema?, ui_layout?, routes?, auth?, perf_budget?, observability?, infra?, api_shape? }
|
|
116
|
+
— see §Proposals below for when to populate this block
|
|
117
|
+
|
|
118
|
+
## Proposals (the ahead-of-spec role — 0.11+)
|
|
119
|
+
|
|
120
|
+
Issue authors rarely think through every dimension a developer has to decide on. Greenfield stories especially tend to leave schema choices, UI layout decisions, routes, auth, perf budgets, observability, infra, and API shapes under-specified. A human developer would PROPOSE defaults and ask for confirmation — "here's the ERD I'd use, here's the tokens I'd reuse, does that work?"
|
|
121
|
+
|
|
122
|
+
Your job as refine agent is to do the same. For each of eight categories below, apply this decision rule:
|
|
123
|
+
|
|
124
|
+
1. **Propose** — you have enough signal (from the issue + project context + related specs) to pick a defensible default. Emit a proposal block with \`status: pending\`, rationale, and the structured payload for that category. Human reviews, approves, or edits.
|
|
125
|
+
2. **Defer** — the gap genuinely doesn't matter for this story (e.g., no perf budget needed for a read-only GET of 5 items). Emit with \`status: deferred\` and a one-line rationale.
|
|
126
|
+
3. **Ask** — you COULD propose but responsibly couldn't without operator input (e.g., "should notifications be per-rewo or rolled up daily?"). Emit a blocker-style clarifying question in the question round; when PM answers, resubmit with a proper proposal. Don't emit \`status: blocked_on_clarification\` on the first round — that's a last-resort marker if an ask loop itself stalls.
|
|
127
|
+
4. **Skip** — the category doesn't apply (e.g., no schema proposal for a pure styling fix). Omit the key entirely.
|
|
128
|
+
|
|
129
|
+
When deciding propose vs ask, err on the side of proposing when the project context provides grounding (naming conventions, existing tables, existing components, design tokens in context.md). PMs correct proposals faster than they answer open questions.
|
|
130
|
+
|
|
131
|
+
### The eight categories + emission shape
|
|
132
|
+
|
|
133
|
+
For each, the YAML shape follows \`{ status, proposed_by, rationale?, ... category-specific fields }\`.
|
|
134
|
+
|
|
135
|
+
**1. \`schema\`** — when the story implies new persisted state (new tables, new columns, indexes) and no migration exists. Payload:
|
|
136
|
+
|
|
137
|
+
\`\`\`yaml
|
|
138
|
+
schema:
|
|
139
|
+
status: pending
|
|
140
|
+
proposed_by: refine-agent
|
|
141
|
+
rationale: "Story implies persistence across sessions; no notifications table exists."
|
|
142
|
+
sql: |
|
|
143
|
+
create table notifications (
|
|
144
|
+
id uuid primary key default gen_random_uuid(),
|
|
145
|
+
recipient_id uuid not null references profiles(id) on delete cascade,
|
|
146
|
+
actor_id uuid not null references profiles(id) on delete cascade,
|
|
147
|
+
rewo_id uuid not null references rewos(id) on delete cascade,
|
|
148
|
+
read_at timestamptz,
|
|
149
|
+
created_at timestamptz default now()
|
|
150
|
+
);
|
|
151
|
+
create index on notifications (recipient_id, created_at desc);
|
|
152
|
+
\`\`\`
|
|
153
|
+
|
|
154
|
+
- Use Postgres syntax matching the consumer's migration style (see existing \`supabase/migrations/*\` if available in project context)
|
|
155
|
+
- Name tables with the plural convention already in use (\`profiles\`, \`rewos\`, \`rewo_reactions\`)
|
|
156
|
+
- Always include FK references with explicit \`on delete\` behaviour
|
|
157
|
+
- Always add read-path indexes for the access patterns the story implies
|
|
158
|
+
|
|
159
|
+
**2. \`ui_layout\`** — when the story has \`ui_behavior\` and the project has design conventions to reuse. Payload:
|
|
160
|
+
|
|
161
|
+
\`\`\`yaml
|
|
162
|
+
ui_layout:
|
|
163
|
+
status: pending
|
|
164
|
+
proposed_by: refine-agent
|
|
165
|
+
rationale: "UI fits the existing mobile + desktop + dark-mode matrix; reuses existing coral + card tokens."
|
|
166
|
+
viewport_coverage: [desktop-light, mobile-light, mobile-dark]
|
|
167
|
+
components_to_reuse:
|
|
168
|
+
- src/components/ui/nav-link.tsx
|
|
169
|
+
- src/components/members/MemberReactionsPage.tsx
|
|
170
|
+
tokens_to_reuse: [bg-card-bg, text-foreground/60, divide-card-border, text-coral]
|
|
171
|
+
tokens_to_add: []
|
|
172
|
+
\`\`\`
|
|
173
|
+
|
|
174
|
+
- NEVER invent design tokens; reuse what's in context.md's Visual Conventions section
|
|
175
|
+
- List existing components to reuse explicitly — helps brew skip redundant scaffolding
|
|
176
|
+
- Default to the full viewport matrix; list only what's NOT covered when narrowing
|
|
177
|
+
|
|
178
|
+
**3. \`routes\`** — when the story implies pages (UI) or API routes without specifying paths. Payload:
|
|
179
|
+
|
|
180
|
+
\`\`\`yaml
|
|
181
|
+
routes:
|
|
182
|
+
status: pending
|
|
183
|
+
proposed_by: refine-agent
|
|
184
|
+
paths:
|
|
185
|
+
- path: /notifications
|
|
186
|
+
file: src/app/(main)/notifications/page.tsx
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
- Follow Next.js App Router conventions; authenticated app pages under \`src/app/(main)/\`
|
|
190
|
+
- Don't re-propose routes the issue already specifies
|
|
191
|
+
|
|
192
|
+
**4. \`auth\`** — when the story implies viewer/ownership checks without spelling them out. Payload:
|
|
193
|
+
|
|
194
|
+
\`\`\`yaml
|
|
195
|
+
auth:
|
|
196
|
+
status: pending
|
|
197
|
+
proposed_by: refine-agent
|
|
198
|
+
rationale: "Notifications are per-viewer private data."
|
|
199
|
+
requirements:
|
|
200
|
+
- "Viewer must be authenticated"
|
|
201
|
+
- "RLS policy: recipient_id = auth.uid()"
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
**5. \`perf_budget\`** — ONLY propose when the story implies scale (e.g., "feed of 1000 items", "realtime updates"). For small reads: defer.
|
|
205
|
+
|
|
206
|
+
\`\`\`yaml
|
|
207
|
+
perf_budget:
|
|
208
|
+
status: pending
|
|
209
|
+
proposed_by: refine-agent
|
|
210
|
+
budgets:
|
|
211
|
+
LCP_ms: 2500
|
|
212
|
+
unread_badge_update_ms: 300
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
**6. \`observability\`** — when the story adds critical paths (writes, mutations, payments, auth flows). Read-only non-critical: defer.
|
|
216
|
+
|
|
217
|
+
\`\`\`yaml
|
|
218
|
+
observability:
|
|
219
|
+
status: pending
|
|
220
|
+
proposed_by: refine-agent
|
|
221
|
+
log_events:
|
|
222
|
+
- notification.created
|
|
223
|
+
- notification.read
|
|
224
|
+
metrics:
|
|
225
|
+
- name: notifications_unread_count
|
|
226
|
+
type: gauge
|
|
227
|
+
\`\`\`
|
|
228
|
+
|
|
229
|
+
**7. \`infra\`** — when the story requires new runtime capability (cron jobs, edge functions, webhooks, external services). For stories that fit the existing stack: defer with a one-line rationale.
|
|
230
|
+
|
|
231
|
+
\`\`\`yaml
|
|
232
|
+
infra:
|
|
233
|
+
status: pending
|
|
234
|
+
proposed_by: refine-agent
|
|
235
|
+
runtime: "Supabase edge function"
|
|
236
|
+
deploy_target: "supabase functions deploy notify-on-reaction"
|
|
237
|
+
notes: "Needed because the notification fan-out should run server-side on trigger; not a client-reachable endpoint."
|
|
238
|
+
\`\`\`
|
|
239
|
+
|
|
240
|
+
**8. \`api_shape\`** — when the story implies API interactions without explicit contract shapes. Don't duplicate what's already in \`api_contract\` on the spec.
|
|
241
|
+
|
|
242
|
+
\`\`\`yaml
|
|
243
|
+
api_shape:
|
|
244
|
+
status: pending
|
|
245
|
+
proposed_by: refine-agent
|
|
246
|
+
endpoints:
|
|
247
|
+
- method: GET
|
|
248
|
+
path: /api/notifications
|
|
249
|
+
responses:
|
|
250
|
+
"200": "{ items: Notification[], next_cursor: string | null }"
|
|
251
|
+
"401": "{ error: string, code: 'unauthenticated' }"
|
|
252
|
+
\`\`\`
|
|
253
|
+
|
|
254
|
+
### When NOT to emit proposals
|
|
255
|
+
|
|
256
|
+
- The issue explicitly specifies the category (e.g., a mockup is attached, or the issue quotes SQL) — honor the explicit input; don't override
|
|
257
|
+
- The story is a bug fix or styling polish with no structural changes — skip the entire \`proposals\` block
|
|
258
|
+
- You're in the question round (not the emit round) — proposals land in the FINAL spec YAML, not in clarifying questions
|
|
259
|
+
|
|
260
|
+
**IMPORTANT**: proposals land INSIDE the spec YAML as a \`proposals:\` block. Do NOT add any prose (summary line, preamble, postscript) around the YAML — the pipeline strictly expects the emit response to start with \`---\` and end with the last YAML field. A prose line above \`---\` will break the parser. The YAML's own top-level fields (title, invariants, acceptance_scenarios, proposals) are the summary.
|
|
115
261
|
|
|
116
262
|
## YAML string hygiene (load-bearing — ignore and the spec fails to parse)
|
|
117
263
|
|
|
@@ -148,16 +294,143 @@ Treat the spec as machine-parsed YAML first, human-readable documentation second
|
|
|
148
294
|
export function draftPrTitle(storyId, title) {
|
|
149
295
|
return `spec: story-${storyId} — ${title}`;
|
|
150
296
|
}
|
|
297
|
+
import { ddlToMermaidErd } from "./mermaid.js";
|
|
298
|
+
/**
|
|
299
|
+
* Render the spec's `proposals` block as a human-readable markdown
|
|
300
|
+
* section for the draft-spec PR body (0.11+). Empty when there are no
|
|
301
|
+
* proposals. Schema proposals get a Mermaid ERD; other categories render
|
|
302
|
+
* as bullet lists. Each proposal shows its status prominently so a human
|
|
303
|
+
* reviewer can tell at a glance what still needs attention.
|
|
304
|
+
*/
|
|
305
|
+
export function renderProposalsSection(spec) {
|
|
306
|
+
if (!spec.proposals)
|
|
307
|
+
return "";
|
|
308
|
+
const p = spec.proposals;
|
|
309
|
+
const parts = ["## Proposals", ""];
|
|
310
|
+
const statusBadge = (status) => {
|
|
311
|
+
switch (status) {
|
|
312
|
+
case "approved":
|
|
313
|
+
return "✅ approved";
|
|
314
|
+
case "rejected":
|
|
315
|
+
return "❌ rejected";
|
|
316
|
+
case "deferred":
|
|
317
|
+
return "🟡 deferred";
|
|
318
|
+
case "blocked_on_clarification":
|
|
319
|
+
return "❓ blocked on clarification";
|
|
320
|
+
case "pending":
|
|
321
|
+
default:
|
|
322
|
+
return "⏳ pending";
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
if (p.schema) {
|
|
326
|
+
parts.push(`### 🗄 Schema — ${statusBadge(p.schema.status)}`, "");
|
|
327
|
+
if (p.schema.rationale)
|
|
328
|
+
parts.push(`_${p.schema.rationale}_`, "");
|
|
329
|
+
if (p.schema.sql.trim()) {
|
|
330
|
+
parts.push(ddlToMermaidErd(p.schema.sql), "", "<details><summary>Raw SQL</summary>", "", "```sql", p.schema.sql.trim(), "```", "</details>", "");
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (p.ui_layout) {
|
|
334
|
+
parts.push(`### 🎨 UI layout — ${statusBadge(p.ui_layout.status)}`, "");
|
|
335
|
+
if (p.ui_layout.rationale)
|
|
336
|
+
parts.push(`_${p.ui_layout.rationale}_`, "");
|
|
337
|
+
if (p.ui_layout.viewport_coverage?.length) {
|
|
338
|
+
parts.push(`**Viewports:** ${p.ui_layout.viewport_coverage.join(", ")}`);
|
|
339
|
+
}
|
|
340
|
+
if (p.ui_layout.components_to_reuse?.length) {
|
|
341
|
+
parts.push(`**Reuse:** ${p.ui_layout.components_to_reuse.map((c) => `\`${c}\``).join(", ")}`);
|
|
342
|
+
}
|
|
343
|
+
if (p.ui_layout.tokens_to_reuse?.length) {
|
|
344
|
+
parts.push(`**Tokens to reuse:** ${p.ui_layout.tokens_to_reuse.map((t) => `\`${t}\``).join(", ")}`);
|
|
345
|
+
}
|
|
346
|
+
if (p.ui_layout.tokens_to_add?.length) {
|
|
347
|
+
parts.push(`**Tokens to add:** ${p.ui_layout.tokens_to_add.map((t) => `\`${t}\``).join(", ")}`);
|
|
348
|
+
}
|
|
349
|
+
parts.push("");
|
|
350
|
+
}
|
|
351
|
+
if (p.routes) {
|
|
352
|
+
parts.push(`### 🛣 Routes — ${statusBadge(p.routes.status)}`, "");
|
|
353
|
+
if (p.routes.rationale)
|
|
354
|
+
parts.push(`_${p.routes.rationale}_`, "");
|
|
355
|
+
if (p.routes.paths.length > 0) {
|
|
356
|
+
parts.push("| Path | File |", "| --- | --- |");
|
|
357
|
+
for (const r of p.routes.paths) {
|
|
358
|
+
parts.push(`| \`${r.path}\` | \`${r.file}\` |`);
|
|
359
|
+
}
|
|
360
|
+
parts.push("");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (p.auth) {
|
|
364
|
+
parts.push(`### 🔐 Auth — ${statusBadge(p.auth.status)}`, "");
|
|
365
|
+
if (p.auth.rationale)
|
|
366
|
+
parts.push(`_${p.auth.rationale}_`, "");
|
|
367
|
+
if (p.auth.requirements?.length) {
|
|
368
|
+
for (const req of p.auth.requirements)
|
|
369
|
+
parts.push(`- ${req}`);
|
|
370
|
+
parts.push("");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (p.perf_budget) {
|
|
374
|
+
parts.push(`### ⚡ Perf budget — ${statusBadge(p.perf_budget.status)}`, "");
|
|
375
|
+
if (p.perf_budget.rationale)
|
|
376
|
+
parts.push(`_${p.perf_budget.rationale}_`, "");
|
|
377
|
+
if (p.perf_budget.budgets) {
|
|
378
|
+
for (const [k, v] of Object.entries(p.perf_budget.budgets)) {
|
|
379
|
+
parts.push(`- \`${k}\`: ${v}`);
|
|
380
|
+
}
|
|
381
|
+
parts.push("");
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (p.observability) {
|
|
385
|
+
parts.push(`### 📈 Observability — ${statusBadge(p.observability.status)}`, "");
|
|
386
|
+
if (p.observability.rationale)
|
|
387
|
+
parts.push(`_${p.observability.rationale}_`, "");
|
|
388
|
+
if (p.observability.log_events?.length) {
|
|
389
|
+
parts.push(`**Events:** ${p.observability.log_events.map((e) => `\`${e}\``).join(", ")}`);
|
|
390
|
+
}
|
|
391
|
+
if (p.observability.metrics?.length) {
|
|
392
|
+
parts.push(`**Metrics:** ${p.observability.metrics.map((m) => `\`${m.name}\` (${m.type})`).join(", ")}`);
|
|
393
|
+
}
|
|
394
|
+
parts.push("");
|
|
395
|
+
}
|
|
396
|
+
if (p.infra) {
|
|
397
|
+
parts.push(`### ☁ Infra — ${statusBadge(p.infra.status)}`, "");
|
|
398
|
+
if (p.infra.rationale)
|
|
399
|
+
parts.push(`_${p.infra.rationale}_`, "");
|
|
400
|
+
if (p.infra.runtime)
|
|
401
|
+
parts.push(`**Runtime:** \`${p.infra.runtime}\``);
|
|
402
|
+
if (p.infra.deploy_target)
|
|
403
|
+
parts.push(`**Deploy target:** \`${p.infra.deploy_target}\``);
|
|
404
|
+
if (p.infra.notes)
|
|
405
|
+
parts.push("", p.infra.notes);
|
|
406
|
+
parts.push("");
|
|
407
|
+
}
|
|
408
|
+
if (p.api_shape) {
|
|
409
|
+
parts.push(`### 🔌 API shape — ${statusBadge(p.api_shape.status)}`, "");
|
|
410
|
+
if (p.api_shape.rationale)
|
|
411
|
+
parts.push(`_${p.api_shape.rationale}_`, "");
|
|
412
|
+
if (p.api_shape.endpoints?.length) {
|
|
413
|
+
for (const e of p.api_shape.endpoints) {
|
|
414
|
+
parts.push(`- \`${e.method} ${e.path}\``);
|
|
415
|
+
}
|
|
416
|
+
parts.push("");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
parts.push("_Resolve each proposal by editing the spec YAML's `status` field (pending → approved/rejected) OR by replying to this PR with prose guidance for refine to iterate._");
|
|
420
|
+
return parts.join("\n");
|
|
421
|
+
}
|
|
151
422
|
export function draftPrBody(args) {
|
|
152
423
|
const supersedesSection = args.supersedes.length > 0
|
|
153
424
|
? `\n## Supersedes\n\nThis spec explicitly supersedes: ${args.supersedes
|
|
154
425
|
.map((id) => `story-${id}`)
|
|
155
426
|
.join(", ")}. The index has been updated to mark those stories as superseded.\n`
|
|
156
427
|
: "";
|
|
428
|
+
const proposalsSection = args.spec ? renderProposalsSection(args.spec) : "";
|
|
429
|
+
const proposalsBlock = proposalsSection ? `\n${proposalsSection}\n` : "";
|
|
157
430
|
return `Spec refined from #${args.issueNumber} by the slowcook refinement agent.
|
|
158
431
|
|
|
159
432
|
Review the YAML, edit anything that needs tightening, then mark this PR ready-for-review and merge to freeze the spec.
|
|
160
|
-
${supersedesSection}
|
|
433
|
+
${supersedesSection}${proposalsBlock}
|
|
161
434
|
---
|
|
162
435
|
*Generated by \`slowcook refine\`.*`;
|
|
163
436
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/refine/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;CAUhC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4PAsCiN,CAAC;AAE7P,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAiB,EAAE,cAAsB,EAAE,EAAE,CAAC;;;;;;EAMtF,cAAc;;;;;;EAMd,SAAS
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/refine/prompts.ts"],"names":[],"mappings":"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"}
|