@kaddo/cli 3.37.1 → 3.39.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/README.md +2 -0
- package/dist/index.js +229 -41
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -534,6 +534,8 @@ create --from roadmap → owners → guard → explain`.
|
|
|
534
534
|
| v3.36 | State-aware bootstrap: `kaddo bootstrap` creates the full knowledge baseline for any `project.state` (new/pre-ai/legacy) with state-specific templates — no more new-only warning; idempotent, never overwrites, ensures `tech/decisions/` and `delivery/work-items/` |
|
|
535
535
|
| v3.37 | Placeholder-aware readiness: knowledge files are classified missing/placeholder/weak/useful; a bootstrap file isn't treated as ready knowledge. Layers downgrade to Placeholder/Weak, a new Knowledge Refinement phase recommends the right agent, and `create --from roadmap` is never suggested with 0 candidates |
|
|
536
536
|
| v3.37.1 | Unified next-step: one shared resolver (`core/next-step.ts`) powers `context`, `understand` and `explain` (Phase + Readiness) so they never diverge; agent JSON exposes `nextStepRecommendation`. Fixes duplicate `capabilities` line in explain |
|
|
537
|
+
| v3.38 | Open-question source locations: `kaddo questions` shows each question's `Source` (path:line), `Status`, `Severity`, `Note` + a copy/paste resolution example and localized how-to-resolve guide; JSON/report/MCP carry `sourcePath`, `line`, `raw`, `note` |
|
|
538
|
+
| v3.39 | Existing capability discovery: state-aware `capabilities.md` (pre-ai/legacy = evidence-backed Capability Inventory + Gaps + Roadmap Candidate Signals; legacy adds criticality/change-risk/modernization); capability-agent discovers with evidence, roadmap-agent treats capabilities as primary source |
|
|
537
539
|
|
|
538
540
|
**Optional modules (installed with `kaddo add`):**
|
|
539
541
|
|
package/dist/index.js
CHANGED
|
@@ -2207,6 +2207,32 @@ kaddo context
|
|
|
2207
2207
|
Especially useful for pre-AI projects, legacy projects, existing codebases with little
|
|
2208
2208
|
documentation, and projects where capabilities are not explicitly documented.
|
|
2209
2209
|
|
|
2210
|
+
## State-aware modes (VS-074)
|
|
2211
|
+
|
|
2212
|
+
Adapt to \`project.state\` (from \`.kaddo/config.yml\`):
|
|
2213
|
+
|
|
2214
|
+
- **new \u2192 Planned Capability Definition.** Define the capabilities the product *should* have. Use
|
|
2215
|
+
\`[planned]\` items; evidence is not required yet.
|
|
2216
|
+
- **pre-ai \u2192 Existing Capability Discovery.** Document the capabilities the system *already has*, as a
|
|
2217
|
+
structured inventory with **evidence**, status and gaps \u2014 a photograph of what exists today, not a
|
|
2218
|
+
wishlist.
|
|
2219
|
+
- **legacy \u2192 Legacy Capability Discovery.** Same inventory plus **criticality**, **change risk**,
|
|
2220
|
+
**operational dependency** and **modernization notes** per capability.
|
|
2221
|
+
|
|
2222
|
+
## Capability status values
|
|
2223
|
+
|
|
2224
|
+
Classify every discovered capability with exactly one status:
|
|
2225
|
+
|
|
2226
|
+
- \`implemented\` \u2014 clearly present; **must have evidence**.
|
|
2227
|
+
- \`partial\` \u2014 exists but incomplete.
|
|
2228
|
+
- \`inferred\` \u2014 likely present from indirect signals; not yet confirmed.
|
|
2229
|
+
- \`risky\` \u2014 exists but carries technical/operational risk.
|
|
2230
|
+
- \`deprecated\` \u2014 present but obsolete / being replaced.
|
|
2231
|
+
- \`unknown\` \u2014 not enough evidence to classify.
|
|
2232
|
+
|
|
2233
|
+
Never mark a capability \`implemented\` without evidence. When evidence is indirect, use \`inferred\`.
|
|
2234
|
+
When there is no evidence at all, use \`unknown\` and write \`Evidence: - pending validation\`.
|
|
2235
|
+
|
|
2210
2236
|
## Input Required
|
|
2211
2237
|
|
|
2212
2238
|
Provide \`.kaddo/context-pack.md\` as the primary input.
|
|
@@ -2230,14 +2256,20 @@ Analyze the context pack and identify:
|
|
|
2230
2256
|
7. Suggested ownership.
|
|
2231
2257
|
8. Candidate code globs if evident.
|
|
2232
2258
|
|
|
2259
|
+
For **pre-ai** and **legacy**, produce the richer inventory (see Output Format): a
|
|
2260
|
+
\`## Capability Inventory\` with status + evidence per capability, a \`## Capability Gaps\` section, and
|
|
2261
|
+
\`## Roadmap Candidate Signals\` (signals only \u2014 never a formal roadmap). For **legacy**, add
|
|
2262
|
+
\`Criticality\`, \`Change risk\`, \`Operational dependency\` and \`Modernization notes\` per capability.
|
|
2263
|
+
|
|
2233
2264
|
## Constraints
|
|
2234
2265
|
|
|
2235
2266
|
- Do not invent business context.
|
|
2236
|
-
-
|
|
2267
|
+
- Do not invent evidence; never mark \`implemented\` without a concrete path/route/table/function.
|
|
2268
|
+
- Mark assumptions clearly; use \`inferred\`/\`unknown\` when evidence is missing.
|
|
2237
2269
|
- Prefer "candidate capability" when evidence is incomplete.
|
|
2238
2270
|
- Do not produce implementation tasks.
|
|
2239
|
-
- Do not generate a roadmap yet.
|
|
2240
|
-
- Do not create ADRs.
|
|
2271
|
+
- Do not generate a roadmap yet \u2014 only \`[gap]\` and \`[candidate]\` signals.
|
|
2272
|
+
- Do not create ADRs or Work Items.
|
|
2241
2273
|
- Do not write code.
|
|
2242
2274
|
|
|
2243
2275
|
## Output Format
|
|
@@ -2280,6 +2312,47 @@ Generated from Kaddo Context Pack.
|
|
|
2280
2312
|
## Suggested Next Step
|
|
2281
2313
|
\`\`\`
|
|
2282
2314
|
|
|
2315
|
+
### Output Format \u2014 pre-ai / legacy (Existing Capability Discovery)
|
|
2316
|
+
|
|
2317
|
+
\`\`\`markdown
|
|
2318
|
+
# Existing Capabilities
|
|
2319
|
+
|
|
2320
|
+
## Capability Inventory
|
|
2321
|
+
|
|
2322
|
+
### <Capability name>
|
|
2323
|
+
|
|
2324
|
+
- Status: implemented | partial | inferred | risky | deprecated | unknown
|
|
2325
|
+
- Capability type: business | product | technical | integration | operational
|
|
2326
|
+
- User-facing: yes | no | internal
|
|
2327
|
+
- Evidence:
|
|
2328
|
+
- \`<path/to/file>\`
|
|
2329
|
+
- \`<route>\` / \`<table>\` / \`<function>\`
|
|
2330
|
+
- Related flows / data / integrations:
|
|
2331
|
+
- Current behavior:
|
|
2332
|
+
- Known constraints:
|
|
2333
|
+
- Risks or uncertainty:
|
|
2334
|
+
- Open questions:
|
|
2335
|
+
- [open] ...
|
|
2336
|
+
<!-- legacy only: -->
|
|
2337
|
+
- Criticality: low | medium | high
|
|
2338
|
+
- Change risk: low | medium | high
|
|
2339
|
+
- Operational dependency:
|
|
2340
|
+
- Modernization notes:
|
|
2341
|
+
|
|
2342
|
+
## Capability Gaps
|
|
2343
|
+
|
|
2344
|
+
- [gap] <Gap description>
|
|
2345
|
+
- Related capability: <name>
|
|
2346
|
+
- Impact: low | medium | high
|
|
2347
|
+
- Possible roadmap candidate: yes | no
|
|
2348
|
+
|
|
2349
|
+
## Roadmap Candidate Signals
|
|
2350
|
+
|
|
2351
|
+
- [candidate] <Potential roadmap candidate>
|
|
2352
|
+
- Based on: partial capability | gap | risk | open question | business goal
|
|
2353
|
+
- Related capability: <name>
|
|
2354
|
+
\`\`\`
|
|
2355
|
+
|
|
2283
2356
|
## Where to Save the Result
|
|
2284
2357
|
|
|
2285
2358
|
Save the output as \`knowledge/product/capabilities.md\`.
|
|
@@ -2396,12 +2469,24 @@ Use this agent after capabilities and architecture are understood (or at least a
|
|
|
2396
2469
|
|
|
2397
2470
|
## Input Required
|
|
2398
2471
|
|
|
2399
|
-
Provide \`.kaddo/context-pack.md\` as the primary input
|
|
2472
|
+
Provide \`.kaddo/context-pack.md\` as the primary input, and treat
|
|
2473
|
+
\`knowledge/product/capabilities.md\` as the **primary source for roadmap candidates** (VS-074).
|
|
2474
|
+
|
|
2475
|
+
Derive roadmap candidates from the capability inventory, prioritizing:
|
|
2476
|
+
|
|
2477
|
+
- \`partial\` capabilities (finish what exists)
|
|
2478
|
+
- \`## Capability Gaps\` (\`[gap]\` items, especially Impact: high)
|
|
2479
|
+
- \`## Roadmap Candidate Signals\` (\`[candidate]\` items)
|
|
2480
|
+
- \`risky\` capabilities (especially in legacy \u2014 stabilize before extending)
|
|
2481
|
+
- resolved/assumed/deferred open questions and business goals
|
|
2482
|
+
- technical risks and decision candidates
|
|
2483
|
+
|
|
2484
|
+
**Do not** build a roadmap from general ideas when \`capabilities.md\` is still a placeholder or weak:
|
|
2485
|
+
if capabilities are not yet discovered, recommend running the \`capability-agent\` first.
|
|
2400
2486
|
|
|
2401
2487
|
Optionally provide (use whatever is available; mark anything missing as an assumption or
|
|
2402
2488
|
open question):
|
|
2403
2489
|
|
|
2404
|
-
- \`knowledge/product/capabilities.md\`
|
|
2405
2490
|
- \`knowledge/tech/current-state.md\`
|
|
2406
2491
|
- \`knowledge/legacy/risks.md\`
|
|
2407
2492
|
- \`knowledge/legacy/unknowns.md\`
|
|
@@ -2809,6 +2894,10 @@ A refined Work Item intended to be saved under the lifecycle workspace:
|
|
|
2809
2894
|
**Open questions:**
|
|
2810
2895
|
|
|
2811
2896
|
**Suggested ownership (code globs):**
|
|
2897
|
+
|
|
2898
|
+
**Related capability:** <!-- recommended (VS-074): the capability from
|
|
2899
|
+
knowledge/product/capabilities.md this Work Item advances, so work traces back to a real capability.
|
|
2900
|
+
Add \`related_capability: <name>\` to the front matter when known. -->
|
|
2812
2901
|
\`\`\`
|
|
2813
2902
|
|
|
2814
2903
|
## Where to Save the Result
|
|
@@ -6992,6 +7081,9 @@ function isPlaceholderLine(line) {
|
|
|
6992
7081
|
if (/^[-*]\s+(\[[^\]]+\]\s*)?_.+_$/.test(t)) return true;
|
|
6993
7082
|
if (/^[-*]\s+\[[^\]]+\]\s*$/.test(t)) return true;
|
|
6994
7083
|
if (/^_(?:Describe|List|Document|What|Which|Who|Use|To be defined|No production code)\b/i.test(t)) return true;
|
|
7084
|
+
if (/<[^>]+>/.test(t)) return true;
|
|
7085
|
+
if (/^[-*]\s+[^:]+:\s*$/.test(t)) return true;
|
|
7086
|
+
if (/^[-*]\s+[^:]+:\s*\S.*\s\|\s/.test(t)) return true;
|
|
6995
7087
|
return false;
|
|
6996
7088
|
}
|
|
6997
7089
|
function isStructuralLine(line, inFrontMatter) {
|
|
@@ -7205,10 +7297,10 @@ function extractFromMarkdown(md) {
|
|
|
7205
7297
|
}
|
|
7206
7298
|
const m = line.match(/^\s*(?:[-*]|\d+\.)\s+(.+?)\s*$/);
|
|
7207
7299
|
if (m) {
|
|
7208
|
-
const
|
|
7209
|
-
if (!
|
|
7210
|
-
const { text: text3, resolution_status } = parseResolution(
|
|
7211
|
-
if (text3) out.push({ text: text3, resolution_status });
|
|
7300
|
+
const bullet = m[1].trim();
|
|
7301
|
+
if (!bullet || /^_.*_$/.test(bullet)) continue;
|
|
7302
|
+
const { text: text3, resolution_status } = parseResolution(bullet);
|
|
7303
|
+
if (text3) out.push({ text: text3, resolution_status, line: i + 1, raw: line.trim() });
|
|
7212
7304
|
}
|
|
7213
7305
|
}
|
|
7214
7306
|
return out;
|
|
@@ -7248,12 +7340,15 @@ function buildOpenQuestionsReport(dir, now = /* @__PURE__ */ new Date()) {
|
|
|
7248
7340
|
questions.push({
|
|
7249
7341
|
id: `OQ-${String(seq).padStart(3, "0")}`,
|
|
7250
7342
|
source,
|
|
7343
|
+
sourcePath: source,
|
|
7344
|
+
line: eq.line,
|
|
7345
|
+
raw: eq.raw,
|
|
7251
7346
|
section: "Open Questions",
|
|
7252
7347
|
question: eq.text,
|
|
7253
7348
|
classification,
|
|
7254
7349
|
resolution_status: eq.resolution_status,
|
|
7255
7350
|
reason,
|
|
7256
|
-
...eq.resolution_note ? { resolution_note: eq.resolution_note } : {},
|
|
7351
|
+
...eq.resolution_note ? { resolution_note: eq.resolution_note, note: eq.resolution_note } : {},
|
|
7257
7352
|
...classification === "blocking" && eq.resolution_status === "open" ? { suggested_assumption: suggestedAssumption(eq.text) } : {}
|
|
7258
7353
|
});
|
|
7259
7354
|
}
|
|
@@ -7323,17 +7418,23 @@ function renderOpenQuestionsMarkdown(r) {
|
|
|
7323
7418
|
L.push("## Blocking Open Questions", "");
|
|
7324
7419
|
if (blockingOpen.length === 0) L.push("_None \u2014 nothing blocks readiness._", "");
|
|
7325
7420
|
for (const q of blockingOpen) {
|
|
7326
|
-
L.push(`### ${q.
|
|
7327
|
-
L.push(`-
|
|
7328
|
-
L.push(`-
|
|
7421
|
+
L.push(`### ${q.question}`, "");
|
|
7422
|
+
L.push(`- Status: ${q.resolution_status}`);
|
|
7423
|
+
L.push(`- Severity: ${q.classification}`);
|
|
7424
|
+
L.push(`- Source: \`${q.sourcePath}:${q.line}\``);
|
|
7329
7425
|
L.push(`- Reason: ${q.reason}`);
|
|
7330
|
-
|
|
7426
|
+
L.push("");
|
|
7427
|
+
L.push("Suggested action:", "");
|
|
7428
|
+
L.push("```md");
|
|
7429
|
+
L.push(`- [assumed] ${q.question}`);
|
|
7430
|
+
L.push(` - note: ${q.suggested_assumption ?? "<editable assumption for the MVP>"}`);
|
|
7431
|
+
L.push("```");
|
|
7331
7432
|
L.push("");
|
|
7332
7433
|
}
|
|
7333
7434
|
const renderStatusList = (title, items) => {
|
|
7334
7435
|
L.push(`## ${title}`, "");
|
|
7335
7436
|
if (items.length === 0) L.push("_None._");
|
|
7336
|
-
for (const q of items) L.push(`- ${q.question}
|
|
7437
|
+
for (const q of items) L.push(`- ${q.question} \u2014 \`${q.sourcePath}:${q.line}\`${q.note ? ` \u2014 _${q.note}_` : ""}`);
|
|
7337
7438
|
L.push("");
|
|
7338
7439
|
};
|
|
7339
7440
|
renderStatusList("Resolved", r.resolved_questions);
|
|
@@ -7808,10 +7909,11 @@ function resolveNextStep(dir, now = /* @__PURE__ */ new Date()) {
|
|
|
7808
7909
|
if (!exists(join(dir, ".kaddo", "understand.md"))) {
|
|
7809
7910
|
return { id: "understand", phase: "Discovery", label: "Run `kaddo understand` to summarize the project context.", command: "kaddo understand", reason: "No understand handoff has been generated yet." };
|
|
7810
7911
|
}
|
|
7811
|
-
const
|
|
7912
|
+
const discovery = state === "pre-ai" || state === "legacy";
|
|
7913
|
+
const refine = (id, agent, target, quality, verb = "complete") => ({
|
|
7812
7914
|
id,
|
|
7813
7915
|
phase: "Knowledge Refinement",
|
|
7814
|
-
label: `Use ${agent} to
|
|
7916
|
+
label: `Use ${agent} to ${verb} \`${target}\`.`,
|
|
7815
7917
|
agent,
|
|
7816
7918
|
target,
|
|
7817
7919
|
reason: `${target} is ${quality === "missing" ? "missing" : "still a bootstrap placeholder or too thin"}.`,
|
|
@@ -7823,8 +7925,10 @@ function resolveNextStep(dir, now = /* @__PURE__ */ new Date()) {
|
|
|
7823
7925
|
});
|
|
7824
7926
|
if (qBusiness !== "useful") return refine("refine-business", "business-agent", B, qBusiness);
|
|
7825
7927
|
if (qProduct !== "useful" || qCap !== "useful") {
|
|
7826
|
-
|
|
7827
|
-
|
|
7928
|
+
if (qCap !== "useful") {
|
|
7929
|
+
return refine("refine-product", "capability-agent", CAP, qCap, discovery ? "discover and document existing system capabilities in" : "complete");
|
|
7930
|
+
}
|
|
7931
|
+
return refine("refine-product", "capability-agent", P, qProduct);
|
|
7828
7932
|
}
|
|
7829
7933
|
if (qCurrentState !== "useful") return refine("refine-current-state", "architecture-agent", CS, qCurrentState);
|
|
7830
7934
|
if (qCodebase !== "useful") {
|
|
@@ -7833,7 +7937,7 @@ function resolveNextStep(dir, now = /* @__PURE__ */ new Date()) {
|
|
|
7833
7937
|
}
|
|
7834
7938
|
const oq = buildOpenQuestionsReport(dir, now);
|
|
7835
7939
|
if (oq.summary.blocking_open > 0) {
|
|
7836
|
-
return { id: "questions", phase: "Knowledge Refinement", label: "
|
|
7940
|
+
return { id: "questions", phase: "Knowledge Refinement", label: "Run `kaddo questions` to see source locations and resolution guidance, then resolve, assume or defer the blocking open questions.", command: "kaddo questions", reason: `${oq.summary.blocking_open} blocking open question(s) remain.` };
|
|
7837
7941
|
}
|
|
7838
7942
|
const roadmap = roadmapSignal(dir);
|
|
7839
7943
|
if (roadmap !== "has-candidates") {
|
|
@@ -12148,39 +12252,77 @@ _Document the product capabilities that should exist._
|
|
|
12148
12252
|
`,
|
|
12149
12253
|
"pre-ai": `# Existing Capabilities
|
|
12150
12254
|
|
|
12151
|
-
|
|
12255
|
+
> Discover the capabilities the system already has (evidence-backed). Use the capability-agent to fill this in \u2014 run \`kaddo add agents\`, then feed it the context pack.
|
|
12152
12256
|
|
|
12153
|
-
|
|
12257
|
+
## Capability Inventory
|
|
12154
12258
|
|
|
12155
|
-
|
|
12259
|
+
### <Capability name>
|
|
12156
12260
|
|
|
12157
|
-
-
|
|
12261
|
+
- Status: implemented | partial | inferred | risky | deprecated | unknown
|
|
12262
|
+
- Capability type: business | product | technical | integration | operational
|
|
12263
|
+
- User-facing: yes | no | internal
|
|
12264
|
+
- Evidence:
|
|
12265
|
+
- _\`path/to/file\`, route, table or function \u2014 or \`pending validation\`._
|
|
12266
|
+
- Related flows / data / integrations:
|
|
12267
|
+
- _..._
|
|
12268
|
+
- Current behavior:
|
|
12269
|
+
- _..._
|
|
12270
|
+
- Known constraints:
|
|
12271
|
+
- _..._
|
|
12272
|
+
- Risks or uncertainty:
|
|
12273
|
+
- _..._
|
|
12274
|
+
- Open questions:
|
|
12275
|
+
- [open] _..._
|
|
12158
12276
|
|
|
12159
|
-
##
|
|
12277
|
+
## Capability Gaps
|
|
12160
12278
|
|
|
12161
|
-
- [
|
|
12279
|
+
- [gap] _Gap description._
|
|
12280
|
+
- Related capability: _<name>_
|
|
12281
|
+
- Impact: low | medium | high
|
|
12282
|
+
- Possible roadmap candidate: yes | no
|
|
12162
12283
|
|
|
12163
|
-
##
|
|
12284
|
+
## Roadmap Candidate Signals
|
|
12164
12285
|
|
|
12165
|
-
- [
|
|
12286
|
+
- [candidate] _Potential roadmap candidate._
|
|
12287
|
+
- Based on: partial capability | gap | risk | open question | business goal
|
|
12288
|
+
- Related capability: _<name>_
|
|
12166
12289
|
`,
|
|
12167
12290
|
legacy: `# Legacy Capabilities
|
|
12168
12291
|
|
|
12169
|
-
|
|
12292
|
+
> Discover existing capabilities plus their criticality, change risk and modernization signals. Use the capability-agent to fill this in.
|
|
12170
12293
|
|
|
12171
|
-
|
|
12294
|
+
## Capability Inventory
|
|
12172
12295
|
|
|
12173
|
-
|
|
12296
|
+
### <Capability name>
|
|
12174
12297
|
|
|
12175
|
-
-
|
|
12298
|
+
- Status: implemented | partial | inferred | risky | deprecated | unknown
|
|
12299
|
+
- Capability type: business | product | technical | integration | operational
|
|
12300
|
+
- User-facing: yes | no | internal
|
|
12301
|
+
- Criticality: low | medium | high
|
|
12302
|
+
- Change risk: low | medium | high
|
|
12303
|
+
- Operational dependency:
|
|
12304
|
+
- _..._
|
|
12305
|
+
- Evidence:
|
|
12306
|
+
- _\`path/to/file\`, route, table or function \u2014 or \`pending validation\`._
|
|
12307
|
+
- Current behavior:
|
|
12308
|
+
- _..._
|
|
12309
|
+
- Modernization notes:
|
|
12310
|
+
- _..._
|
|
12311
|
+
- Open questions:
|
|
12312
|
+
- [open] _..._
|
|
12176
12313
|
|
|
12177
|
-
##
|
|
12314
|
+
## Capability Gaps
|
|
12178
12315
|
|
|
12179
|
-
- [
|
|
12316
|
+
- [gap] _Gap description._
|
|
12317
|
+
- Related capability: _<name>_
|
|
12318
|
+
- Impact: low | medium | high
|
|
12319
|
+
- Possible roadmap candidate: yes | no
|
|
12180
12320
|
|
|
12181
|
-
##
|
|
12321
|
+
## Roadmap Candidate Signals
|
|
12182
12322
|
|
|
12183
|
-
- [
|
|
12323
|
+
- [candidate] _Potential modernization or roadmap candidate._
|
|
12324
|
+
- Based on: partial capability | gap | risk | open question | business goal
|
|
12325
|
+
- Related capability: _<name>_
|
|
12184
12326
|
`
|
|
12185
12327
|
},
|
|
12186
12328
|
codebase: {
|
|
@@ -13443,7 +13585,8 @@ function runDrift(opts = {}) {
|
|
|
13443
13585
|
// src/commands/questions.ts
|
|
13444
13586
|
function runQuestions(opts = {}) {
|
|
13445
13587
|
const dir = cwd();
|
|
13446
|
-
requireConfig(dir);
|
|
13588
|
+
const config = requireConfig(dir);
|
|
13589
|
+
const es = projectLanguage(config) === "es";
|
|
13447
13590
|
const report = buildOpenQuestionsReport(dir);
|
|
13448
13591
|
if (opts.output) {
|
|
13449
13592
|
intro2("kaddo questions");
|
|
@@ -13462,22 +13605,67 @@ function runQuestions(opts = {}) {
|
|
|
13462
13605
|
console.log(`Open questions detected: ${s.open_questions}`);
|
|
13463
13606
|
console.log(`By resolution \u2014 open: ${s.resolution.open}, resolved: ${s.resolution.resolved}, assumed: ${s.resolution.assumed}, deferred: ${s.resolution.deferred}`);
|
|
13464
13607
|
console.log(`Roadmap readiness: ${s.roadmap_readiness === "needs_decisions" ? "needs decisions" : s.roadmap_readiness} (blocking open: ${s.blocking_open}, important open: ${s.important_open})`);
|
|
13465
|
-
const list2 = (title, qs) => {
|
|
13608
|
+
const list2 = (title, qs, opts2 = {}) => {
|
|
13466
13609
|
if (qs.length === 0) return;
|
|
13467
13610
|
console.log("");
|
|
13468
13611
|
console.log(`${title}:`);
|
|
13469
|
-
|
|
13470
|
-
|
|
13612
|
+
console.log("");
|
|
13613
|
+
qs.slice(0, 12).forEach((q, i) => {
|
|
13614
|
+
console.log(`${i + 1}. ${q.question}`);
|
|
13615
|
+
console.log(` Source: ${q.sourcePath}:${q.line}`);
|
|
13616
|
+
console.log(` Status: ${q.resolution_status}`);
|
|
13617
|
+
console.log(` Severity: ${q.classification}`);
|
|
13618
|
+
if (q.note) console.log(` Note: ${q.note}`);
|
|
13619
|
+
if (opts2.example && q.resolution_status === "open") {
|
|
13620
|
+
console.log(" Suggested action:");
|
|
13621
|
+
console.log(` ${es ? "Cambia [open] por [resolved], [assumed] o [deferred]." : "Change [open] to [resolved], [assumed] or [deferred]."}`);
|
|
13622
|
+
console.log(" Example:");
|
|
13623
|
+
console.log(` - [assumed] ${q.question}`);
|
|
13624
|
+
console.log(` - note: ${es ? "<supuesto editable para el MVP>" : "<editable assumption for the MVP>"}`);
|
|
13625
|
+
}
|
|
13626
|
+
console.log("");
|
|
13627
|
+
});
|
|
13628
|
+
if (qs.length > 12) console.log(` \u2026and ${qs.length - 12} more`);
|
|
13471
13629
|
};
|
|
13472
|
-
list2("Blocking (open)", report.blocking_questions.filter((q) => q.resolution_status === "open"));
|
|
13630
|
+
list2("Blocking (open)", report.blocking_questions.filter((q) => q.resolution_status === "open"), { example: true });
|
|
13631
|
+
list2("Important (open)", report.important_questions.filter((q) => q.resolution_status === "open"));
|
|
13473
13632
|
list2("Resolved", report.resolved_questions);
|
|
13474
13633
|
list2("Assumed", report.assumed_questions);
|
|
13475
13634
|
list2("Deferred", report.deferred_status_questions);
|
|
13635
|
+
printResolutionGuide(es);
|
|
13476
13636
|
console.log("");
|
|
13477
13637
|
console.log("Suggested next:");
|
|
13478
13638
|
console.log(report.recommended_next_step);
|
|
13479
13639
|
printCommandFooter("questions");
|
|
13480
13640
|
}
|
|
13641
|
+
function printResolutionGuide(es) {
|
|
13642
|
+
console.log("");
|
|
13643
|
+
if (es) {
|
|
13644
|
+
console.log("C\xF3mo resolver");
|
|
13645
|
+
console.log("");
|
|
13646
|
+
console.log("Edita el archivo indicado en Source y cambia el marcador:");
|
|
13647
|
+
console.log(" [open] \u2192 sigue abierta");
|
|
13648
|
+
console.log(" [resolved] \u2192 respuesta confirmada");
|
|
13649
|
+
console.log(" [assumed] \u2192 supuesto seguro por ahora");
|
|
13650
|
+
console.log(" [deferred] \u2192 decisi\xF3n aplazada");
|
|
13651
|
+
console.log("");
|
|
13652
|
+
console.log("Agrega una nota debajo de la pregunta cuando sea posible:");
|
|
13653
|
+
console.log(" - [assumed] \xBFPregunta?");
|
|
13654
|
+
console.log(" - note: Se asume X para el MVP porque Y.");
|
|
13655
|
+
} else {
|
|
13656
|
+
console.log("How to resolve");
|
|
13657
|
+
console.log("");
|
|
13658
|
+
console.log("Edit the file shown in Source and change the marker:");
|
|
13659
|
+
console.log(" [open] \u2192 still unresolved");
|
|
13660
|
+
console.log(" [resolved] \u2192 confirmed answer");
|
|
13661
|
+
console.log(" [assumed] \u2192 safe assumption for now");
|
|
13662
|
+
console.log(" [deferred] \u2192 intentionally postponed");
|
|
13663
|
+
console.log("");
|
|
13664
|
+
console.log("Add a note below the question when possible:");
|
|
13665
|
+
console.log(" - [assumed] Question?");
|
|
13666
|
+
console.log(" - note: Assume X for the MVP because Y.");
|
|
13667
|
+
}
|
|
13668
|
+
}
|
|
13481
13669
|
|
|
13482
13670
|
// src/commands/adapters.ts
|
|
13483
13671
|
var ADAPTER_LIST = ADAPTERS.map((a) => a.id).join(", ");
|