@prd-improve/cli 1.1.1 → 1.6.0
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/changelog.d.ts +13 -7
- package/dist/changelog.js +12 -15
- package/dist/changelog.js.map +1 -1
- package/dist/cli.js +55 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/_prdSource.d.ts +35 -0
- package/dist/commands/_prdSource.js +110 -0
- package/dist/commands/_prdSource.js.map +1 -0
- package/dist/commands/closeout.d.ts +9 -0
- package/dist/commands/closeout.js +293 -0
- package/dist/commands/closeout.js.map +1 -0
- package/dist/commands/context.js +11 -117
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/export.d.ts +8 -0
- package/dist/commands/export.js +179 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/freeze.d.ts +23 -0
- package/dist/commands/freeze.js +125 -32
- package/dist/commands/freeze.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +7 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate-yaml.js +94 -46
- package/dist/commands/migrate-yaml.js.map +1 -1
- package/dist/commands/reopen.d.ts +4 -0
- package/dist/commands/reopen.js +76 -0
- package/dist/commands/reopen.js.map +1 -0
- package/dist/commands/resolve.d.ts +8 -0
- package/dist/commands/resolve.js +127 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.js +16 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +4 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/i18n/en.js +71 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/help.en.d.ts +30 -0
- package/dist/i18n/help.en.js +32 -2
- package/dist/i18n/help.en.js.map +1 -1
- package/dist/i18n/help.zh.d.ts +30 -0
- package/dist/i18n/help.zh.js +32 -2
- package/dist/i18n/help.zh.js.map +1 -1
- package/dist/i18n/helpGroups.js +1 -1
- package/dist/i18n/helpGroups.js.map +1 -1
- package/dist/i18n/peekLang.d.ts +1 -0
- package/dist/i18n/peekLang.js +19 -0
- package/dist/i18n/peekLang.js.map +1 -1
- package/dist/i18n/zh.d.ts +161 -1
- package/dist/i18n/zh.js +71 -6
- package/dist/i18n/zh.js.map +1 -1
- package/dist/renderer/context-md.d.ts +13 -2
- package/dist/renderer/context-md.js +12 -12
- package/dist/renderer/context-md.js.map +1 -1
- package/dist/renderer/spec-md.d.ts +19 -0
- package/dist/renderer/spec-md.js +206 -0
- package/dist/renderer/spec-md.js.map +1 -0
- package/dist/schema/modules.d.ts +37 -5
- package/dist/schema/modules.js +14 -1
- package/dist/schema/modules.js.map +1 -1
- package/dist/schema/prd.d.ts +93 -17
- package/dist/schema/prd.js +51 -7
- package/dist/schema/prd.js.map +1 -1
- package/dist/skill/prd-improve-forge/SKILL.md +150 -10
- package/dist/skill/prd-improve-forge/checklists/batch-import.md +2 -1
- package/dist/skill/prd-improve-forge/checklists/dimensions/integration-seam.md +131 -0
- package/dist/skill/prd-improve-forge/checklists/dimensions/state-machine-counter.md +130 -0
- package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +10 -5
- package/dist/skill/prd-improve-forge/templates/prd.yaml +25 -9
- package/dist/validators/blocking.js +15 -12
- package/dist/validators/blocking.js.map +1 -1
- package/dist/validators/references.js +9 -0
- package/dist/validators/references.js.map +1 -1
- package/dist/validators/runner.js +2 -2
- package/dist/validators/runner.js.map +1 -1
- package/dist/workspace.d.ts +12 -1
- package/dist/workspace.js +12 -1
- package/dist/workspace.js.map +1 -1
- package/dist/yamlPatch.d.ts +16 -0
- package/dist/yamlPatch.js +50 -0
- package/dist/yamlPatch.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,21 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `prd migrate-yaml [<slug>]` — schema
|
|
2
|
+
* `prd migrate-yaml [<slug>]` — schema yaml upgrader, three-version dispatch:
|
|
3
|
+
*
|
|
4
|
+
* - v0.3 (current): nothing to do → "skipped"
|
|
5
|
+
* - v0.2: pure version bump → v0.3, fully OFFLINE. No team/project
|
|
6
|
+
* mutation (meta.team/project already exist since v0.2),
|
|
7
|
+
* no backend, no server probe.
|
|
8
|
+
* - v0.1 (legacy): full pipeline — resolve team/project, server-validate,
|
|
9
|
+
* write meta.team/project, jump STRAIGHT to v0.3 in a
|
|
10
|
+
* single pass (no intermediate v0.2 write).
|
|
11
|
+
* - anything else: "failed" (unsupported schema version)
|
|
3
12
|
*
|
|
4
13
|
* Spec §5.2 / Task 8. Independent from `prd refresh` (refresh = "sync upstream
|
|
5
|
-
* PRD heading slice into yaml index"; this command = pure schema
|
|
14
|
+
* PRD heading slice into yaml index"; this command = pure schema migration).
|
|
6
15
|
*
|
|
7
16
|
* Two modes:
|
|
8
17
|
* - single slug: migrate one feature
|
|
9
18
|
* - no slug: batch-iterate every feature in .prd/features/*\/working/prd.yaml
|
|
10
19
|
* and report rolled-up counts at the end
|
|
11
20
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
21
|
+
* Backend resolution is LAZY: rc/backend deps are only resolved the first
|
|
22
|
+
* time a v0.1 file is encountered (memoized, failure included). A pure
|
|
23
|
+
* v0.2/v0.3 workspace therefore migrates with no rc file and no network.
|
|
24
|
+
*
|
|
25
|
+
* Hard invariant for the v0.1 path (reviewer I6 patch): SERVER-VALIDATE
|
|
26
|
+
* before writing yaml. If the user types a non-existent team / project slug
|
|
27
|
+
* we MUST refuse to persist it — otherwise the yaml gets version-bumped but
|
|
28
|
+
* every push 410s forever, "bricked" until a hand-edit. We probe via the
|
|
29
|
+
* scoped feature-list endpoint (`GET /api/teams/:t/projects/:p/features`)
|
|
30
|
+
* which is already mounted; a 200 proves team+project exist AND user has
|
|
31
|
+
* membership, a 404 means at least one of the three is missing
|
|
32
|
+
* (anti-enumeration uniform per spec §3.4).
|
|
19
33
|
*
|
|
20
34
|
* yaml mutation: eemeli/yaml's `Document.setIn(...)` lets us insert
|
|
21
35
|
* `meta.team` into an existing meta map. Other comments / key order / values
|
|
@@ -30,6 +44,7 @@ import { createInterface } from "node:readline";
|
|
|
30
44
|
import { apiFetch, projectUrl } from "../api/client.js";
|
|
31
45
|
import { loadRcWithWarn, requireBackend } from "../sync/cliRcHelpers.js";
|
|
32
46
|
import { getMessages, readLocale } from "../i18n/index.js";
|
|
47
|
+
import { SCHEMA_VERSION_CURRENT, SCHEMA_VERSION_V02, SCHEMA_VERSION_LEGACY, } from "../schema/prd.js";
|
|
33
48
|
import * as c from "../formatter/colors.js";
|
|
34
49
|
/**
|
|
35
50
|
* Resolve target (team, project) for a single feature given precedence:
|
|
@@ -107,10 +122,13 @@ async function verifyTeamProjectOnServer(backend, team, project, fetchFn) {
|
|
|
107
122
|
/**
|
|
108
123
|
* Migrate one feature's working/prd.yaml in place.
|
|
109
124
|
*
|
|
125
|
+
* Version dispatch (see file header): v0.3 skip / v0.2 offline bump /
|
|
126
|
+
* v0.1 full pipeline (lazy deps via `getV01Deps`) / otherwise failed.
|
|
127
|
+
*
|
|
110
128
|
* Returns `FeatureOutcome` so the batch driver can roll up a summary line.
|
|
111
129
|
* Writes user-facing IO directly (per-feature `·` / `✓` / `✗` lines).
|
|
112
130
|
*/
|
|
113
|
-
async function migrateOneFeature(slug, yamlPath,
|
|
131
|
+
async function migrateOneFeature(slug, yamlPath, opts, getV01Deps, m, prompt) {
|
|
114
132
|
const raw = readFileSync(yamlPath, "utf8");
|
|
115
133
|
let doc;
|
|
116
134
|
try {
|
|
@@ -123,18 +141,38 @@ async function migrateOneFeature(slug, yamlPath, backend, resolved, m, fetchFn)
|
|
|
123
141
|
return "failed";
|
|
124
142
|
}
|
|
125
143
|
const schemaVersion = doc.get("schema_version");
|
|
126
|
-
|
|
127
|
-
|
|
144
|
+
// Already current — nothing to do.
|
|
145
|
+
if (schemaVersion === SCHEMA_VERSION_CURRENT) {
|
|
146
|
+
process.stdout.write(m.migrate_yaml_already_current({ slug }) + "\n");
|
|
128
147
|
return "skipped";
|
|
129
148
|
}
|
|
130
|
-
|
|
149
|
+
// v0.2 → v0.3 is a pure version-number bump: meta.team/project already
|
|
150
|
+
// exist since v0.2, so no resolution and no server probe — fully offline.
|
|
151
|
+
if (schemaVersion === SCHEMA_VERSION_V02) {
|
|
152
|
+
doc.set("schema_version", SCHEMA_VERSION_CURRENT);
|
|
153
|
+
writeFileSync(yamlPath, String(doc), "utf8");
|
|
154
|
+
process.stdout.write(c.pass("✓ ") + m.migrate_yaml_bumped({ slug }) + "\n");
|
|
155
|
+
return "upgraded";
|
|
156
|
+
}
|
|
157
|
+
if (schemaVersion !== SCHEMA_VERSION_LEGACY) {
|
|
131
158
|
process.stderr.write(c.fail("✗ ") +
|
|
132
159
|
m.migrate_yaml_unknown_schema({ slug, got: String(schemaVersion) }) +
|
|
133
160
|
"\n");
|
|
134
161
|
return "failed";
|
|
135
162
|
}
|
|
163
|
+
// v0.1 — full pipeline. Lazily resolve backend + rc defaults (first v0.1
|
|
164
|
+
// file triggers the resolve; memoized across a batch).
|
|
165
|
+
const deps = getV01Deps();
|
|
166
|
+
if (!deps)
|
|
167
|
+
return "failed";
|
|
168
|
+
// Resolve per-feature (could differ per slug if user types a different
|
|
169
|
+
// team/project at the prompt) — batch mode re-prompts per v0.1 feature,
|
|
170
|
+
// which is the path the spec requires.
|
|
171
|
+
const resolved = await resolveTeamProject(opts, deps.rcDefaults, m, prompt);
|
|
172
|
+
if (!resolved)
|
|
173
|
+
return "failed";
|
|
136
174
|
// Server validation — refuse to write yaml if (team, project) is bogus.
|
|
137
|
-
const verify = await verifyTeamProjectOnServer(backend, resolved.team, resolved.project, fetchFn);
|
|
175
|
+
const verify = await verifyTeamProjectOnServer(deps.backend, resolved.team, resolved.project, opts.fetchFn);
|
|
138
176
|
if (!verify.ok) {
|
|
139
177
|
if (verify.reason === "network") {
|
|
140
178
|
process.stderr.write(c.fail("✗ ") +
|
|
@@ -157,9 +195,10 @@ async function migrateOneFeature(slug, yamlPath, backend, resolved, m, fetchFn)
|
|
|
157
195
|
// comments, key order on existing keys, and indentation. The newly added
|
|
158
196
|
// meta.team key lands at the end of the meta map (acceptable — meta is a
|
|
159
197
|
// small map, exact insertion position isn't load-bearing for schema).
|
|
198
|
+
// v0.1 jumps straight to the current version in one pass.
|
|
160
199
|
doc.setIn(["meta", "team"], resolved.team);
|
|
161
200
|
doc.setIn(["meta", "project"], resolved.project);
|
|
162
|
-
doc.set("schema_version",
|
|
201
|
+
doc.set("schema_version", SCHEMA_VERSION_CURRENT);
|
|
163
202
|
const newYaml = String(doc);
|
|
164
203
|
writeFileSync(yamlPath, newYaml, "utf8");
|
|
165
204
|
process.stdout.write(c.pass("✓ ") +
|
|
@@ -220,24 +259,38 @@ export async function runMigrateYamlCommand(opts, cwd) {
|
|
|
220
259
|
process.stderr.write(c.fail("✗ ") + m.migrate_yaml_workspace_not_init + "\n");
|
|
221
260
|
return 1;
|
|
222
261
|
}
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
262
|
+
// Lazy v0.1-deps resolver — backend + rc defaults are only needed for the
|
|
263
|
+
// v0.1 full pipeline (server probe). Deferring keeps pure v0.2 workspaces
|
|
264
|
+
// fully offline. Memoized (failure included) so a batch with many v0.1
|
|
265
|
+
// features resolves once and doesn't re-print the same backend error.
|
|
266
|
+
let v01DepsMemo;
|
|
267
|
+
const getV01Deps = () => {
|
|
268
|
+
if (v01DepsMemo !== undefined)
|
|
269
|
+
return v01DepsMemo;
|
|
270
|
+
const loaded = loadRcWithWarn(opts.rcPath);
|
|
271
|
+
if (loaded.hadError) {
|
|
272
|
+
v01DepsMemo = null;
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
const backend = requireBackend(loaded.rc, { backend: opts.backend });
|
|
276
|
+
if (!backend) {
|
|
277
|
+
v01DepsMemo = null;
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
// Resolve .prdrc defaults from the backend the user is actually using.
|
|
281
|
+
// (`requireBackend` already returned its name as `backend.name`; we look
|
|
282
|
+
// it up in the rc to pull default_team / default_project.)
|
|
283
|
+
const rcEntry = loaded.rc && backend.name !== "(env)"
|
|
284
|
+
? loaded.rc.backends[backend.name]
|
|
285
|
+
: undefined;
|
|
286
|
+
v01DepsMemo = {
|
|
287
|
+
backend,
|
|
288
|
+
rcDefaults: {
|
|
289
|
+
team: rcEntry?.default_team,
|
|
290
|
+
project: rcEntry?.default_project,
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
return v01DepsMemo;
|
|
241
294
|
};
|
|
242
295
|
const prompt = opts.promptFn ?? defaultPrompt;
|
|
243
296
|
// Batch mode: no slug → iterate all features.
|
|
@@ -252,15 +305,7 @@ export async function runMigrateYamlCommand(opts, cwd) {
|
|
|
252
305
|
let failed = 0;
|
|
253
306
|
for (const slug of slugs) {
|
|
254
307
|
const yamlPath = join(cwd, ".prd", "features", slug, "working", "prd.yaml");
|
|
255
|
-
|
|
256
|
-
// team/project at the prompt). Cache once when flags + defaults force
|
|
257
|
-
// the same answer; otherwise re-prompt is the path the spec requires.
|
|
258
|
-
const resolved = await resolveTeamProject(opts, rcDefaults, m, prompt);
|
|
259
|
-
if (!resolved) {
|
|
260
|
-
failed++;
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
|
-
const outcome = await migrateOneFeature(slug, yamlPath, backend, resolved, m, opts.fetchFn);
|
|
308
|
+
const outcome = await migrateOneFeature(slug, yamlPath, opts, getV01Deps, m, prompt);
|
|
264
309
|
if (outcome === "upgraded")
|
|
265
310
|
upgraded++;
|
|
266
311
|
else if (outcome === "skipped")
|
|
@@ -269,6 +314,9 @@ export async function runMigrateYamlCommand(opts, cwd) {
|
|
|
269
314
|
failed++;
|
|
270
315
|
}
|
|
271
316
|
process.stdout.write(m.migrate_yaml_batch_summary({ upgraded, skipped, failed }) + "\n");
|
|
317
|
+
if (upgraded > 0) {
|
|
318
|
+
process.stdout.write(m.migrate_yaml_reformat_note + "\n");
|
|
319
|
+
}
|
|
272
320
|
return failed > 0 ? 1 : 0;
|
|
273
321
|
}
|
|
274
322
|
// Single-slug mode.
|
|
@@ -279,10 +327,10 @@ export async function runMigrateYamlCommand(opts, cwd) {
|
|
|
279
327
|
"\n");
|
|
280
328
|
return 1;
|
|
281
329
|
}
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
284
|
-
|
|
285
|
-
|
|
330
|
+
const outcome = await migrateOneFeature(opts.slug, yamlPath, opts, getV01Deps, m, prompt);
|
|
331
|
+
if (outcome === "upgraded") {
|
|
332
|
+
process.stdout.write(m.migrate_yaml_reformat_note + "\n");
|
|
333
|
+
}
|
|
286
334
|
return outcome === "failed" ? 1 : 0;
|
|
287
335
|
}
|
|
288
336
|
//# sourceMappingURL=migrate-yaml.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-yaml.js","sourceRoot":"","sources":["../../src/commands/migrate-yaml.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"migrate-yaml.js","sourceRoot":"","sources":["../../src/commands/migrate-yaml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `prd reopen <slug>` — shipped feature 重开迭代(v1.23 spec §1)。
|
|
3
|
+
* working 复位 draft + 删除交付痕迹字段;manifest 交付史保留(frozen 不可变事实)。
|
|
4
|
+
* 旧 open_questions 的 resolution/resolved_at 保留(历史事实)——下次 closeout 门禁 3 只约束新增题。
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { parseDocument } from "yaml";
|
|
9
|
+
import { getMessages, readLocale } from "../i18n/index.js";
|
|
10
|
+
import * as c from "../formatter/colors.js";
|
|
11
|
+
import { readManifest } from "../workspace.js";
|
|
12
|
+
import { patchYamlText } from "../yamlPatch.js";
|
|
13
|
+
export function runReopenCommand(opts, cwd) {
|
|
14
|
+
const m = getMessages(readLocale());
|
|
15
|
+
const manifestRead = readManifest(join(cwd, ".prd/manifest.json"));
|
|
16
|
+
if (!manifestRead.ok) {
|
|
17
|
+
process.stderr.write(c.fail("✗ ") + m.freeze_workspace_not_init + "\n");
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
const workingPath = join(cwd, ".prd/features", opts.feature, "working/prd.yaml");
|
|
21
|
+
if (!existsSync(workingPath)) {
|
|
22
|
+
process.stderr.write(c.fail("✗ ") + m.freeze_working_not_found({ slug: opts.feature }) + "\n");
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
let yamlText;
|
|
26
|
+
try {
|
|
27
|
+
yamlText = readFileSync(workingPath, "utf8");
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
process.stderr.write(c.fail("✗ ") +
|
|
31
|
+
m.closeout_fs_error({ operation: "read working/prd.yaml", message: e.message }) +
|
|
32
|
+
"\n");
|
|
33
|
+
return 2;
|
|
34
|
+
}
|
|
35
|
+
let doc;
|
|
36
|
+
try {
|
|
37
|
+
doc = parseDocument(yamlText);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
process.stderr.write(c.fail("✗ ") + m.reopen_yaml_parse_error + "\n");
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
if (doc.errors.length > 0) {
|
|
44
|
+
process.stderr.write(c.fail("✗ ") + m.reopen_yaml_parse_error + "\n");
|
|
45
|
+
return 1;
|
|
46
|
+
}
|
|
47
|
+
const status = doc.getIn(["meta", "lifecycle", "status"]);
|
|
48
|
+
if (status !== "shipped") {
|
|
49
|
+
process.stderr.write(c.fail("✗ ") + m.reopen_not_shipped({ status: String(status ?? "(missing)") }) + "\n");
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
53
|
+
const patched = patchYamlText(yamlText, [
|
|
54
|
+
{ path: ["meta", "lifecycle", "status"], value: "draft" },
|
|
55
|
+
{ path: ["meta", "lifecycle", "updated_at"], value: today },
|
|
56
|
+
{ path: ["meta", "lifecycle", "shipped_at"], value: "", op: "delete" },
|
|
57
|
+
{ path: ["meta", "lifecycle", "landed_commit"], value: "", op: "delete" },
|
|
58
|
+
]);
|
|
59
|
+
if (!patched.ok) {
|
|
60
|
+
process.stderr.write(c.fail("✗ ") + m.reopen_patch_fail({ message: patched.error }) + "\n");
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
writeFileSync(workingPath, patched.text, "utf8");
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
process.stderr.write(c.fail("✗ ") +
|
|
68
|
+
m.closeout_fs_error({ operation: "write working/prd.yaml", message: e.message }) +
|
|
69
|
+
"\n");
|
|
70
|
+
return 2;
|
|
71
|
+
}
|
|
72
|
+
process.stdout.write(c.pass("✓ ") + m.reopen_success({ slug: opts.feature }) + "\n");
|
|
73
|
+
process.stdout.write(m.reopen_next_version_hint + "\n");
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=reopen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reopen.js","sourceRoot":"","sources":["../../src/commands/reopen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `prd resolve <slug> <qid>` — open_questions 决议回填(v1.22 spec §1)。
|
|
3
|
+
* dogfood 实证决议回填是全流程唯一手编 yaml 环节(注释密集不能库往返);
|
|
4
|
+
* 本命令经 yamlPatch(style:block)下沉,closeout 全程零手编。
|
|
5
|
+
* 字段语义与 closeout classifyQuestion 口径对齐:resolution 非空 ⇒ resolved(忽略 deferred_to 占位)。
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { parseDocument } from "yaml";
|
|
10
|
+
import { getMessages, readLocale } from "../i18n/index.js";
|
|
11
|
+
import * as c from "../formatter/colors.js";
|
|
12
|
+
import { readManifest } from "../workspace.js";
|
|
13
|
+
import { patchYamlText } from "../yamlPatch.js";
|
|
14
|
+
import { SCHEMA_VERSION_CURRENT } from "../schema/prd.js";
|
|
15
|
+
export function runResolveCommand(opts, cwd) {
|
|
16
|
+
const m = getMessages(readLocale());
|
|
17
|
+
const has = (s) => typeof s === "string" && s.trim() !== "";
|
|
18
|
+
// 互斥二选一
|
|
19
|
+
const hasText = typeof opts.text === "string";
|
|
20
|
+
const hasDefer = typeof opts.defer === "string";
|
|
21
|
+
if (hasText === hasDefer) {
|
|
22
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_flags_exclusive + "\n");
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
const value = (hasText ? opts.text : opts.defer).trim();
|
|
26
|
+
if (value === "") {
|
|
27
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_value_empty + "\n");
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
// workspace + working 存在(与 closeout 门禁同套消息)
|
|
31
|
+
const manifestRead = readManifest(join(cwd, ".prd/manifest.json"));
|
|
32
|
+
if (!manifestRead.ok) {
|
|
33
|
+
process.stderr.write(c.fail("✗ ") + m.freeze_workspace_not_init + "\n");
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
const workingPath = join(cwd, ".prd/features", opts.feature, "working/prd.yaml");
|
|
37
|
+
if (!existsSync(workingPath)) {
|
|
38
|
+
process.stderr.write(c.fail("✗ ") + m.freeze_working_not_found({ slug: opts.feature }) + "\n");
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
let yamlText;
|
|
42
|
+
try {
|
|
43
|
+
yamlText = readFileSync(workingPath, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
process.stderr.write(c.fail("✗ ") +
|
|
47
|
+
m.closeout_fs_error({ operation: "read working/prd.yaml", message: e.message }) +
|
|
48
|
+
"\n");
|
|
49
|
+
return 2;
|
|
50
|
+
}
|
|
51
|
+
let doc;
|
|
52
|
+
try {
|
|
53
|
+
doc = parseDocument(yamlText);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_yaml_parse_error + "\n");
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
if (doc.errors.length > 0) {
|
|
60
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_yaml_parse_error + "\n");
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
// schema v0.3-only(resolution/resolved_at 是 v0.3 字段)
|
|
64
|
+
const schemaVersion = doc.get("schema_version");
|
|
65
|
+
if (schemaVersion !== SCHEMA_VERSION_CURRENT) {
|
|
66
|
+
process.stderr.write(c.fail("✗ ") +
|
|
67
|
+
m.resolve_schema_version_required({ got: String(schemaVersion ?? "(missing)") }) +
|
|
68
|
+
"\n");
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
// 按 id 定位
|
|
72
|
+
const js = doc.toJS();
|
|
73
|
+
const questions = Array.isArray(js.open_questions) ? js.open_questions : [];
|
|
74
|
+
const idx = questions.findIndex((q) => q.id === opts.qid);
|
|
75
|
+
if (idx < 0) {
|
|
76
|
+
process.stderr.write(c.fail("✗ ") +
|
|
77
|
+
m.resolve_qid_not_found({
|
|
78
|
+
qid: opts.qid,
|
|
79
|
+
ids: questions.map((q) => String(q.id ?? "?")).join(", ") || "(none)",
|
|
80
|
+
}) +
|
|
81
|
+
"\n");
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
84
|
+
// 防重跑:resolved_at 非空 = 已处理;裸 --defer 不得销毁已有 resolution 草稿(spec §1.2)
|
|
85
|
+
const target = questions[idx];
|
|
86
|
+
const guarded = has(target.resolved_at) || (hasDefer && has(target.resolution));
|
|
87
|
+
if (guarded && opts.force !== true) {
|
|
88
|
+
const current = has(target.resolution)
|
|
89
|
+
? target.resolution.split("\n")[0].slice(0, 80)
|
|
90
|
+
: `deferred_to: ${target.deferred_to ?? ""}`;
|
|
91
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_already_resolved({ qid: opts.qid, current }) + "\n");
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
95
|
+
const edits = hasText
|
|
96
|
+
? [
|
|
97
|
+
{ path: ["open_questions", idx, "resolution"], value, style: "block" },
|
|
98
|
+
{ path: ["open_questions", idx, "resolved_at"], value: today },
|
|
99
|
+
]
|
|
100
|
+
: [
|
|
101
|
+
// --force --defer 覆盖已 --text 的 Q 必须清 resolution,否则 classifyQuestion 仍判 resolved
|
|
102
|
+
{ path: ["open_questions", idx, "resolution"], value: "" },
|
|
103
|
+
{ path: ["open_questions", idx, "deferred_to"], value },
|
|
104
|
+
{ path: ["open_questions", idx, "resolved_at"], value: today },
|
|
105
|
+
];
|
|
106
|
+
const patched = patchYamlText(yamlText, edits);
|
|
107
|
+
if (!patched.ok) {
|
|
108
|
+
process.stderr.write(c.fail("✗ ") + m.resolve_patch_fail({ message: patched.error }) + "\n");
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
writeFileSync(workingPath, patched.text, "utf8");
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
process.stderr.write(c.fail("✗ ") +
|
|
116
|
+
m.closeout_fs_error({ operation: "write working/prd.yaml", message: e.message }) +
|
|
117
|
+
"\n");
|
|
118
|
+
return 2;
|
|
119
|
+
}
|
|
120
|
+
process.stdout.write(c.pass("✓ ") +
|
|
121
|
+
(hasText
|
|
122
|
+
? m.resolve_success_text({ slug: opts.feature, qid: opts.qid, first_line: value.split("\n")[0].slice(0, 80) })
|
|
123
|
+
: m.resolve_success_defer({ slug: opts.feature, qid: opts.qid, target: value })) +
|
|
124
|
+
"\n");
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
/** 定位 bundled skill:published(dist/commands→dist/skill)优先,缺则回退 dev 源(src/commands→packages/skill)。 */
|
|
2
2
|
export declare function resolveBundledSkillDir(): string | null;
|
|
3
|
+
/** 读 skill 目录 SKILL.md 的版本行(`**当前版本:** SKILL.md vX.Y …`);读不到/解析不出返回 null。 */
|
|
4
|
+
export declare function readSkillVersion(skillDir: string): string | null;
|
|
5
|
+
/** 默认已装 skill 目录(与 install 默认目标一致)。导出供 closeout 自检。 */
|
|
6
|
+
export declare function installedSkillDir(parent?: string): string;
|
|
3
7
|
export interface SkillInstallOptions {
|
|
4
8
|
dir?: string;
|
|
5
9
|
}
|
package/dist/commands/skill.js
CHANGED
|
@@ -19,6 +19,21 @@ export function resolveBundledSkillDir() {
|
|
|
19
19
|
];
|
|
20
20
|
return candidates.find((p) => existsSync(join(p, "SKILL.md"))) ?? null;
|
|
21
21
|
}
|
|
22
|
+
/** 读 skill 目录 SKILL.md 的版本行(`**当前版本:** SKILL.md vX.Y …`);读不到/解析不出返回 null。 */
|
|
23
|
+
export function readSkillVersion(skillDir) {
|
|
24
|
+
try {
|
|
25
|
+
const content = readFileSync(join(skillDir, "SKILL.md"), "utf8");
|
|
26
|
+
const match = /\*\*当前版本[::]\*\*\s*SKILL\.md\s+(v\d+\.\d+)/.exec(content);
|
|
27
|
+
return match ? match[1] : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** 默认已装 skill 目录(与 install 默认目标一致)。导出供 closeout 自检。 */
|
|
34
|
+
export function installedSkillDir(parent) {
|
|
35
|
+
return join(parent ?? join(homedir(), ".claude", "skills"), SKILL_NAME);
|
|
36
|
+
}
|
|
22
37
|
export function runSkillInstallCommand(opts = {}) {
|
|
23
38
|
const m = getMessages(readLocale());
|
|
24
39
|
const srcDir = resolveBundledSkillDir();
|
|
@@ -27,7 +42,7 @@ export function runSkillInstallCommand(opts = {}) {
|
|
|
27
42
|
return 1;
|
|
28
43
|
}
|
|
29
44
|
const parent = opts.dir ?? join(homedir(), ".claude", "skills");
|
|
30
|
-
const target =
|
|
45
|
+
const target = installedSkillDir(opts.dir);
|
|
31
46
|
mkdirSync(parent, { recursive: true });
|
|
32
47
|
cpSync(srcDir, target, { recursive: true }); // 默认覆盖(幂等=升级)
|
|
33
48
|
process.stdout.write(c.pass("✓ ") + m.skill_installed({ path: target }) + "\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,CAAC,MAAM,wBAAwB,CAAC;AAE5C,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC,sGAAsG;AACtG,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAQ,+BAA+B;IAC5F,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAyB,wCAAwC;QACnG,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAmB,yCAAyC;KACrG,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzE,CAAC;AAID,MAAM,UAAU,sBAAsB,CAAC,OAA4B,EAAE;IACnE,MAAM,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -122,8 +122,10 @@ export function runValidateCommand(opts, cwd) {
|
|
|
122
122
|
: input.kind === "single_feature"
|
|
123
123
|
? `.prd/features/${input.slug}/working/prd.yaml`
|
|
124
124
|
: input.path;
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
if (!(opts.quiet === true && exitCode === 0)) {
|
|
126
|
+
const out = formatHuman(result, locale, { pattern });
|
|
127
|
+
process.stdout.write(out + "\n");
|
|
128
|
+
}
|
|
127
129
|
return exitCode;
|
|
128
130
|
}
|
|
129
131
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AAMnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|