@davidorex/pi-context 0.26.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/CHANGELOG.md +23 -0
- package/README.md +195 -0
- package/dist/block-api.d.ts +328 -0
- package/dist/block-api.d.ts.map +1 -0
- package/dist/block-api.js +1167 -0
- package/dist/block-api.js.map +1 -0
- package/dist/block-validation.d.ts +33 -0
- package/dist/block-validation.d.ts.map +1 -0
- package/dist/block-validation.js +213 -0
- package/dist/block-validation.js.map +1 -0
- package/dist/context-dir.d.ts +93 -0
- package/dist/context-dir.d.ts.map +1 -0
- package/dist/context-dir.js +224 -0
- package/dist/context-dir.js.map +1 -0
- package/dist/context-sdk.d.ts +428 -0
- package/dist/context-sdk.d.ts.map +1 -0
- package/dist/context-sdk.js +1327 -0
- package/dist/context-sdk.js.map +1 -0
- package/dist/context.d.ts +497 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1060 -0
- package/dist/context.js.map +1 -0
- package/dist/dispatch-context.d.ts +112 -0
- package/dist/dispatch-context.d.ts.map +1 -0
- package/dist/dispatch-context.js +119 -0
- package/dist/dispatch-context.js.map +1 -0
- package/dist/execution-context.d.ts +138 -0
- package/dist/execution-context.d.ts.map +1 -0
- package/dist/execution-context.js +151 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1655 -0
- package/dist/index.js.map +1 -0
- package/dist/lens-validator.d.ts +50 -0
- package/dist/lens-validator.d.ts.map +1 -0
- package/dist/lens-validator.js +46 -0
- package/dist/lens-validator.js.map +1 -0
- package/dist/lens-view.d.ts +75 -0
- package/dist/lens-view.d.ts.map +1 -0
- package/dist/lens-view.js +253 -0
- package/dist/lens-view.js.map +1 -0
- package/dist/rename-canonical-id.d.ts +64 -0
- package/dist/rename-canonical-id.d.ts.map +1 -0
- package/dist/rename-canonical-id.js +378 -0
- package/dist/rename-canonical-id.js.map +1 -0
- package/dist/roadmap-plan.d.ts +186 -0
- package/dist/roadmap-plan.d.ts.map +1 -0
- package/dist/roadmap-plan.js +534 -0
- package/dist/roadmap-plan.js.map +1 -0
- package/dist/samples-catalog.d.ts +48 -0
- package/dist/samples-catalog.d.ts.map +1 -0
- package/dist/samples-catalog.js +128 -0
- package/dist/samples-catalog.js.map +1 -0
- package/dist/schema-migrations.d.ts +82 -0
- package/dist/schema-migrations.d.ts.map +1 -0
- package/dist/schema-migrations.js +106 -0
- package/dist/schema-migrations.js.map +1 -0
- package/dist/schema-validator.d.ts +76 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +219 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/schema-write.d.ts +122 -0
- package/dist/schema-write.d.ts.map +1 -0
- package/dist/schema-write.js +210 -0
- package/dist/schema-write.js.map +1 -0
- package/dist/status-vocab.d.ts +60 -0
- package/dist/status-vocab.d.ts.map +1 -0
- package/dist/status-vocab.js +109 -0
- package/dist/status-vocab.js.map +1 -0
- package/dist/test-helpers.d.ts +12 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +28 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/topo.d.ts +19 -0
- package/dist/topo.d.ts.map +1 -0
- package/dist/topo.js +99 -0
- package/dist/topo.js.map +1 -0
- package/dist/update-check.d.ts +6 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +82 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +115 -0
- package/samples/blocks/context-contracts.json +3 -0
- package/samples/blocks/conventions.json +3 -0
- package/samples/blocks/decisions.json +3 -0
- package/samples/blocks/features.json +3 -0
- package/samples/blocks/framework-gaps.json +3 -0
- package/samples/blocks/issues.json +3 -0
- package/samples/blocks/layer-plans.json +3 -0
- package/samples/blocks/phase.json +3 -0
- package/samples/blocks/rationale.json +3 -0
- package/samples/blocks/requirements.json +3 -0
- package/samples/blocks/research.json +3 -0
- package/samples/blocks/spec-reviews.json +3 -0
- package/samples/blocks/story.json +3 -0
- package/samples/blocks/tasks.json +3 -0
- package/samples/blocks/verification.json +3 -0
- package/samples/conception.json +467 -0
- package/samples/schemas/context-contracts.schema.json +89 -0
- package/samples/schemas/conventions.schema.json +34 -0
- package/samples/schemas/decisions.schema.json +87 -0
- package/samples/schemas/features.schema.json +53 -0
- package/samples/schemas/framework-gaps.schema.json +64 -0
- package/samples/schemas/issues.schema.json +39 -0
- package/samples/schemas/layer-plans.schema.json +92 -0
- package/samples/schemas/phase.schema.json +118 -0
- package/samples/schemas/rationale.schema.json +24 -0
- package/samples/schemas/requirements.schema.json +34 -0
- package/samples/schemas/research.schema.json +134 -0
- package/samples/schemas/spec-reviews.schema.json +62 -0
- package/samples/schemas/story.schema.json +73 -0
- package/samples/schemas/tasks.schema.json +34 -0
- package/samples/schemas/verification.schema.json +37 -0
- package/schemas/bootstrap.schema.json +24 -0
- package/schemas/config.schema.json +193 -0
- package/schemas/layer.schema.json +9 -0
- package/schemas/priority.schema.json +9 -0
- package/schemas/relations.schema.json +31 -0
- package/schemas/severity.schema.json +9 -0
- package/schemas/source.schema.json +9 -0
- package/schemas/status.schema.json +9 -0
- package/schemas/verification-method.schema.json +9 -0
- package/skill-narrative.md +130 -0
- package/skills/pi-context/SKILL.md +684 -0
- package/skills/pi-context/references/bundled-resources.md +47 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roadmap + plan substrate primitives — pure functions over typed blocks.
|
|
3
|
+
*
|
|
4
|
+
* Module landing pattern follows lens-view.ts: pure functions take cwd +
|
|
5
|
+
* identifiers, return structured results or { error } records. Subcommand
|
|
6
|
+
* handlers and tool execute() shells in index.ts are thin wrappers that
|
|
7
|
+
* route results to ctx.ui.notify, pi.sendMessage, or AgentToolResult.
|
|
8
|
+
*
|
|
9
|
+
* Status vocabulary normalization: STATUS_VOCABULARY_DEFAULTS maps each
|
|
10
|
+
* schema's native status enum (issues uses open|resolved|deferred;
|
|
11
|
+
* decisions uses open|enacted|superseded; tasks uses
|
|
12
|
+
* todo|in_progress|completed; etc.) to a normalized StatusBucket that
|
|
13
|
+
* cross-block aggregation can compare against. Per the pi-context
|
|
14
|
+
* divergence from main, the active vocabulary is resolved via
|
|
15
|
+
* `resolveStatusVocabulary(cwd)` which merges
|
|
16
|
+
* `config.status_buckets` over the defaults — users override per-project
|
|
17
|
+
* by editing config.json (FGAP-013 closed).
|
|
18
|
+
*
|
|
19
|
+
* Diagnostic display strings: validateRoadmaps() emits issues whose
|
|
20
|
+
* `code` field is an opaque slug; the human-readable message is
|
|
21
|
+
* resolved via `diagMessage(cwd, code, fallback)` which checks
|
|
22
|
+
* `config.display_strings[code]` and falls back to embedded English.
|
|
23
|
+
* This is the pi-context divergence: main hardcodes English; pi-context
|
|
24
|
+
* routes the message through config so per-project / per-locale
|
|
25
|
+
* overrides are config-driven.
|
|
26
|
+
*
|
|
27
|
+
* Topological sort + cycle detection (topoSort) is shared utility used by
|
|
28
|
+
* loadRoadmap (over phase_depends_on edges) and loadPlan (over
|
|
29
|
+
* plan_item_depends_on edges) per DEC-0012's edges-only authoring contract.
|
|
30
|
+
*/
|
|
31
|
+
import { readBlock } from "./block-api.js";
|
|
32
|
+
import { loadContext } from "./context.js";
|
|
33
|
+
import { availableBlocks } from "./context-sdk.js";
|
|
34
|
+
import { registerLensValidator } from "./lens-validator.js";
|
|
35
|
+
import { loadLensView } from "./lens-view.js";
|
|
36
|
+
import { resolveStatusVocabulary, STATUS_VOCABULARY_DEFAULTS } from "./status-vocab.js";
|
|
37
|
+
import { topoSort } from "./topo.js";
|
|
38
|
+
export { resolveStatusVocabulary, STATUS_VOCABULARY_DEFAULTS };
|
|
39
|
+
/**
|
|
40
|
+
* Bucket each item's status field against the vocabulary; return counts
|
|
41
|
+
* + the rolled-up bucket (most-blocking bucket present, or unknown when
|
|
42
|
+
* items array is empty / no items have a status field).
|
|
43
|
+
*
|
|
44
|
+
* Rollup precedence (most-blocking wins for the bucket field):
|
|
45
|
+
* blocked > in_progress > todo > complete > unknown
|
|
46
|
+
* — meaning a phase with any blocked item rolls up as blocked even if
|
|
47
|
+
* other items are complete; a phase with all-complete items rolls up
|
|
48
|
+
* complete. This matches typical product-management roadmap-status
|
|
49
|
+
* conventions (a phase isn't "in progress" if everything's done; it's
|
|
50
|
+
* "complete"; a phase with anything blocked needs attention).
|
|
51
|
+
*
|
|
52
|
+
* Vocabulary defaults to STATUS_VOCABULARY_DEFAULTS when omitted —
|
|
53
|
+
* loaders that have already resolved per-project overrides via
|
|
54
|
+
* resolveStatusVocabulary should pass the resolved map in to keep
|
|
55
|
+
* config.status_buckets-driven mappings consistent across a single load.
|
|
56
|
+
*/
|
|
57
|
+
export function rollupPhaseStatus(items, vocabulary) {
|
|
58
|
+
const vocab = vocabulary ?? STATUS_VOCABULARY_DEFAULTS;
|
|
59
|
+
const counts = {
|
|
60
|
+
complete: 0,
|
|
61
|
+
in_progress: 0,
|
|
62
|
+
blocked: 0,
|
|
63
|
+
todo: 0,
|
|
64
|
+
unknown: 0,
|
|
65
|
+
};
|
|
66
|
+
for (const item of items) {
|
|
67
|
+
const status = typeof item.status === "string" ? item.status.toLowerCase() : null;
|
|
68
|
+
const bucket = status !== null ? (vocab[status] ?? "unknown") : "unknown";
|
|
69
|
+
counts[bucket]++;
|
|
70
|
+
}
|
|
71
|
+
const total = items.length;
|
|
72
|
+
let bucket;
|
|
73
|
+
if (total === 0)
|
|
74
|
+
bucket = "unknown";
|
|
75
|
+
else if (counts.blocked > 0)
|
|
76
|
+
bucket = "blocked";
|
|
77
|
+
else if (counts.in_progress > 0)
|
|
78
|
+
bucket = "in_progress";
|
|
79
|
+
else if (counts.todo > 0)
|
|
80
|
+
bucket = "todo";
|
|
81
|
+
else if (counts.complete > 0)
|
|
82
|
+
bucket = "complete";
|
|
83
|
+
else
|
|
84
|
+
bucket = "unknown";
|
|
85
|
+
return { bucket, counts, total };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolve a diagnostic message for `code` — config.display_strings wins,
|
|
89
|
+
* embedded English fallback otherwise. The pi-context divergence from
|
|
90
|
+
* main: validation diagnostics flow through config so per-project /
|
|
91
|
+
* per-locale wording overrides are first-class config (no code edits).
|
|
92
|
+
*/
|
|
93
|
+
function diagMessage(cwd, code, fallback) {
|
|
94
|
+
const ctx = loadContext(cwd);
|
|
95
|
+
return ctx.config?.display_strings?.[code] ?? fallback;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Generic topological sort with cycle detection. Implementation:
|
|
99
|
+
* Kahn's algorithm — repeatedly remove nodes with no incoming edges,
|
|
100
|
+
* append to order, decrement in-degree of their dependents. Any nodes
|
|
101
|
+
* remaining after the in-degree pass form one or more cycles; the
|
|
102
|
+
* cycle-finding pass uses DFS with recursion-stack tracking to extract
|
|
103
|
+
* each distinct cycle path.
|
|
104
|
+
*
|
|
105
|
+
* Returns:
|
|
106
|
+
* order — node ids in dependency-respecting order. Independent nodes
|
|
107
|
+
* appear in input order (Kahn's algorithm preserves insertion order
|
|
108
|
+
* within a stratum).
|
|
109
|
+
* cycles — array of cycle paths, each as a string[] starting and
|
|
110
|
+
* ending with the same id. Empty when graph is acyclic.
|
|
111
|
+
*
|
|
112
|
+
* Caller chooses whether cycles are fatal: validateRoadmaps surfaces
|
|
113
|
+
* roadmap_phase_cycle; loadRoadmap returns the cycles[] alongside a
|
|
114
|
+
* partial order so renderRoadmap can show what it could and what
|
|
115
|
+
* couldn't be ordered.
|
|
116
|
+
*/
|
|
117
|
+
// topoSort is extracted to ./topo.ts (pure generic util) so context-sdk can
|
|
118
|
+
// consume it without a roadmap-plan <-> context-sdk import cycle. Re-exported
|
|
119
|
+
// here to preserve the existing import surface (barrel + roadmap-plan.test).
|
|
120
|
+
export { topoSort };
|
|
121
|
+
const ROADMAP_STATUS_ENUM = new Set(["draft", "active", "paused", "complete", "archived"]);
|
|
122
|
+
/**
|
|
123
|
+
* Defensive read of roadmap.json. Returns the parsed array (may be empty)
|
|
124
|
+
* or null when the block is absent / unreadable. Validator and listRoadmaps
|
|
125
|
+
* treat absence as a non-defect (opt-in block).
|
|
126
|
+
*/
|
|
127
|
+
function readRoadmaps(cwd) {
|
|
128
|
+
try {
|
|
129
|
+
const data = readBlock(cwd, "roadmap");
|
|
130
|
+
return Array.isArray(data.roadmaps) ? data.roadmaps : [];
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Determine whether a milestone is satisfied: when both evidence_block and
|
|
138
|
+
* evidence_query are present, read the block defensively and return true
|
|
139
|
+
* iff at least one item has every evidence_query key matching by ===.
|
|
140
|
+
* Missing block / read error / no query → false (validator surfaces a
|
|
141
|
+
* separate diagnostic where appropriate).
|
|
142
|
+
*/
|
|
143
|
+
function evaluateMilestone(cwd, m) {
|
|
144
|
+
if (!m.evidence_block || !m.evidence_query)
|
|
145
|
+
return false;
|
|
146
|
+
let items;
|
|
147
|
+
try {
|
|
148
|
+
const data = readBlock(cwd, m.evidence_block);
|
|
149
|
+
const arrayKey = Object.keys(data).find((k) => Array.isArray(data[k]));
|
|
150
|
+
if (!arrayKey)
|
|
151
|
+
return false;
|
|
152
|
+
items = data[arrayKey];
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const query = m.evidence_query;
|
|
158
|
+
for (const item of items) {
|
|
159
|
+
let match = true;
|
|
160
|
+
for (const [k, v] of Object.entries(query)) {
|
|
161
|
+
if (item[k] !== v) {
|
|
162
|
+
match = false;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (match)
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Load a single roadmap by id. Returns the materialized RoadmapView or a
|
|
173
|
+
* structured { error } when config / block / id is missing.
|
|
174
|
+
*
|
|
175
|
+
* Algorithm:
|
|
176
|
+
* 1. Load context; bail when no .project/config.json.
|
|
177
|
+
* 2. Defensively read roadmap.json; bail when absent.
|
|
178
|
+
* 3. Lookup the roadmap by id; bail when unknown.
|
|
179
|
+
* 4. Build PhaseView[] in authored input order (loadLensView per phase,
|
|
180
|
+
* rollupPhaseStatus over the resulting items, milestone resolution
|
|
181
|
+
* where declared).
|
|
182
|
+
* 5. Compute the in-roadmap edge subset (phase_depends_on edges whose
|
|
183
|
+
* both endpoints are in the roadmap) and topo-sort to derive
|
|
184
|
+
* phaseOrder + cycles.
|
|
185
|
+
*
|
|
186
|
+
* The returned `edges` field is the authoritative scoped subset that the
|
|
187
|
+
* renderer consumes for per-phase adjacency lines.
|
|
188
|
+
*/
|
|
189
|
+
export function loadRoadmap(cwd, roadmapId) {
|
|
190
|
+
const ctx = loadContext(cwd);
|
|
191
|
+
if (!ctx.config) {
|
|
192
|
+
return { error: "No .project/config.json — run /context init first, then declare lenses + install assets." };
|
|
193
|
+
}
|
|
194
|
+
const roadmaps = readRoadmaps(cwd);
|
|
195
|
+
if (roadmaps === null) {
|
|
196
|
+
return { error: "no roadmap.json — install via .project/config.json's installed_blocks then author roadmap.json" };
|
|
197
|
+
}
|
|
198
|
+
const roadmap = roadmaps.find((r) => r.id === roadmapId);
|
|
199
|
+
if (!roadmap) {
|
|
200
|
+
const known = roadmaps.map((r) => r.id).join(", ") || "(none)";
|
|
201
|
+
return { error: `Roadmap '${roadmapId}' not found. Known: ${known}` };
|
|
202
|
+
}
|
|
203
|
+
const vocabulary = resolveStatusVocabulary(cwd);
|
|
204
|
+
const phases = roadmap.phases.map((phase) => {
|
|
205
|
+
const lensView = loadLensView(cwd, phase.lens);
|
|
206
|
+
const items = "error" in lensView ? [] : lensView.items;
|
|
207
|
+
const status = rollupPhaseStatus(items, vocabulary);
|
|
208
|
+
const milestone = phase.milestone ? roadmap.milestones?.find((m) => m.id === phase.milestone) : undefined;
|
|
209
|
+
const milestoneSatisfied = milestone ? evaluateMilestone(cwd, milestone) : undefined;
|
|
210
|
+
return { phase, lensView, status, milestone, milestoneSatisfied };
|
|
211
|
+
});
|
|
212
|
+
const inRoadmap = new Set(roadmap.phases.map((p) => p.id));
|
|
213
|
+
const edges = ctx.relations.filter((e) => e.relation_type === "phase_depends_on" && inRoadmap.has(e.parent) && inRoadmap.has(e.child));
|
|
214
|
+
const { order, cycles } = topoSort(roadmap.phases, (p) => p.id, (p) => edges.filter((e) => e.child === p.id).map((e) => e.parent));
|
|
215
|
+
return { roadmap, phases, phaseOrder: order, cycles, edges };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Discovery — returns one summary entry per roadmap. Empty array when
|
|
219
|
+
* roadmap.json is absent (listing is discovery; absence is the truthful
|
|
220
|
+
* answer, not an error).
|
|
221
|
+
*/
|
|
222
|
+
export function listRoadmaps(cwd) {
|
|
223
|
+
const roadmaps = readRoadmaps(cwd);
|
|
224
|
+
if (!roadmaps)
|
|
225
|
+
return [];
|
|
226
|
+
return roadmaps.map((r) => ({
|
|
227
|
+
id: r.id,
|
|
228
|
+
title: r.title,
|
|
229
|
+
...(r.status ? { status: r.status } : {}),
|
|
230
|
+
phaseCount: r.phases.length,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Validate every roadmap × phase × milestone. Codes are opaque slugs;
|
|
235
|
+
* display strings resolve via diagMessage (config.display_strings →
|
|
236
|
+
* embedded English fallback). The pi-context lens-validator dispatch
|
|
237
|
+
* (registered at module bottom) maps these to ContextValidationIssue-
|
|
238
|
+
* compatible records and merges them into validateContext's output.
|
|
239
|
+
*
|
|
240
|
+
* Roadmap.json absent → { status: "clean", issues: [] } (opt-in block;
|
|
241
|
+
* absence is not a defect).
|
|
242
|
+
*/
|
|
243
|
+
export function validateRoadmaps(cwd) {
|
|
244
|
+
const issues = [];
|
|
245
|
+
const ctx = loadContext(cwd);
|
|
246
|
+
if (!ctx.config)
|
|
247
|
+
return { status: "clean", issues: [] };
|
|
248
|
+
const roadmaps = readRoadmaps(cwd);
|
|
249
|
+
if (!roadmaps || roadmaps.length === 0)
|
|
250
|
+
return { status: "clean", issues: [] };
|
|
251
|
+
const lensIds = new Set((ctx.config.lenses ?? []).map((l) => l.id));
|
|
252
|
+
const blockNames = new Set(availableBlocks(cwd).map((b) => b.name));
|
|
253
|
+
const vocabulary = resolveStatusVocabulary(cwd);
|
|
254
|
+
const errorCodes = new Set([
|
|
255
|
+
"roadmap_lens_missing",
|
|
256
|
+
"roadmap_phase_dep_missing",
|
|
257
|
+
"roadmap_phase_cycle",
|
|
258
|
+
"roadmap_composition_cycle",
|
|
259
|
+
]);
|
|
260
|
+
for (const roadmap of roadmaps) {
|
|
261
|
+
// roadmap.status — must be in known enum (warning when not).
|
|
262
|
+
if (roadmap.status !== undefined && !ROADMAP_STATUS_ENUM.has(roadmap.status)) {
|
|
263
|
+
issues.push({
|
|
264
|
+
code: "roadmap_status_unknown_value",
|
|
265
|
+
message: diagMessage(cwd, "roadmap_status_unknown_value", `Roadmap '${roadmap.id}' has unknown status '${roadmap.status}'. Known: ${Array.from(ROADMAP_STATUS_ENUM).join(", ")}`),
|
|
266
|
+
roadmap_id: roadmap.id,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
const inRoadmap = new Set(roadmap.phases.map((p) => p.id));
|
|
270
|
+
const milestoneIds = new Set((roadmap.milestones ?? []).map((m) => m.id));
|
|
271
|
+
// Per-phase checks: lens existence + composition cycle + status rollup
|
|
272
|
+
// for unknown-status warning + milestone validation (independent of
|
|
273
|
+
// lens resolution — milestone diagnostics surface even when the lens
|
|
274
|
+
// itself fails to load).
|
|
275
|
+
for (const phase of roadmap.phases) {
|
|
276
|
+
let lensResolved = false;
|
|
277
|
+
if (!lensIds.has(phase.lens)) {
|
|
278
|
+
issues.push({
|
|
279
|
+
code: "roadmap_lens_missing",
|
|
280
|
+
message: diagMessage(cwd, "roadmap_lens_missing", `Phase '${phase.id}' in roadmap '${roadmap.id}' references unknown lens '${phase.lens}'.`),
|
|
281
|
+
roadmap_id: roadmap.id,
|
|
282
|
+
phase_id: phase.id,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const lensView = loadLensView(cwd, phase.lens);
|
|
287
|
+
if ("error" in lensView) {
|
|
288
|
+
if (lensView.error.includes("composition_cycle_detected")) {
|
|
289
|
+
issues.push({
|
|
290
|
+
code: "roadmap_composition_cycle",
|
|
291
|
+
message: diagMessage(cwd, "roadmap_composition_cycle", `Phase '${phase.id}' in roadmap '${roadmap.id}' resolves to composition lens with cycle: ${lensView.error}`),
|
|
292
|
+
roadmap_id: roadmap.id,
|
|
293
|
+
phase_id: phase.id,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
lensResolved = true;
|
|
299
|
+
const status = rollupPhaseStatus(lensView.items, vocabulary);
|
|
300
|
+
if (status.bucket === "unknown" && status.total > 0) {
|
|
301
|
+
issues.push({
|
|
302
|
+
code: "roadmap_status_unknown_value",
|
|
303
|
+
message: diagMessage(cwd, "roadmap_status_unknown_value", `Phase '${phase.id}' in roadmap '${roadmap.id}' rolls up to bucket 'unknown' across ${status.total} item(s) — items lack a recognised status enum value.`),
|
|
304
|
+
roadmap_id: roadmap.id,
|
|
305
|
+
phase_id: phase.id,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Milestone evidence_block + evidence_query checks — independent
|
|
311
|
+
// of lens resolution outcome.
|
|
312
|
+
if (phase.milestone) {
|
|
313
|
+
const milestone = roadmap.milestones?.find((m) => m.id === phase.milestone);
|
|
314
|
+
if (milestone) {
|
|
315
|
+
if (milestone.evidence_block && !blockNames.has(milestone.evidence_block)) {
|
|
316
|
+
issues.push({
|
|
317
|
+
code: "roadmap_milestone_evidence_block_missing",
|
|
318
|
+
message: diagMessage(cwd, "roadmap_milestone_evidence_block_missing", `Milestone '${milestone.id}' in roadmap '${roadmap.id}' references evidence_block '${milestone.evidence_block}' which is not loaded.`),
|
|
319
|
+
roadmap_id: roadmap.id,
|
|
320
|
+
phase_id: phase.id,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
if (milestone.evidence_query !== undefined) {
|
|
324
|
+
const q = milestone.evidence_query;
|
|
325
|
+
const ok = q !== null &&
|
|
326
|
+
typeof q === "object" &&
|
|
327
|
+
!Array.isArray(q) &&
|
|
328
|
+
Object.values(q).every((v) => v === null || ["string", "number", "boolean"].includes(typeof v));
|
|
329
|
+
if (!ok) {
|
|
330
|
+
issues.push({
|
|
331
|
+
code: "roadmap_milestone_query_invalid",
|
|
332
|
+
message: diagMessage(cwd, "roadmap_milestone_query_invalid", `Milestone '${milestone.id}' in roadmap '${roadmap.id}' has invalid evidence_query — expected plain object with primitive values only.`),
|
|
333
|
+
roadmap_id: roadmap.id,
|
|
334
|
+
phase_id: phase.id,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
void lensResolved;
|
|
341
|
+
}
|
|
342
|
+
// Dangling phase_depends_on edges — both endpoints must be in this roadmap
|
|
343
|
+
// when at least one endpoint is. (A phase_depends_on edge whose neither
|
|
344
|
+
// endpoint matches any roadmap phase is silently skipped — it may belong
|
|
345
|
+
// to a different roadmap.)
|
|
346
|
+
for (const e of ctx.relations) {
|
|
347
|
+
if (e.relation_type !== "phase_depends_on")
|
|
348
|
+
continue;
|
|
349
|
+
const parentIn = inRoadmap.has(e.parent);
|
|
350
|
+
const childIn = inRoadmap.has(e.child);
|
|
351
|
+
if (parentIn !== childIn) {
|
|
352
|
+
const dangling = parentIn ? e.child : e.parent;
|
|
353
|
+
issues.push({
|
|
354
|
+
code: "roadmap_phase_dep_missing",
|
|
355
|
+
message: diagMessage(cwd, "roadmap_phase_dep_missing", `phase_depends_on edge {parent:${e.parent}, child:${e.child}} in roadmap '${roadmap.id}' references phase '${dangling}' that is not declared in this roadmap.`),
|
|
356
|
+
roadmap_id: roadmap.id,
|
|
357
|
+
phase_id: dangling,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Phase cycles — re-run topoSort over the in-roadmap edge subset.
|
|
362
|
+
const scopedEdges = ctx.relations.filter((e) => e.relation_type === "phase_depends_on" && inRoadmap.has(e.parent) && inRoadmap.has(e.child));
|
|
363
|
+
const { cycles } = topoSort(roadmap.phases, (p) => p.id, (p) => scopedEdges.filter((e) => e.child === p.id).map((e) => e.parent));
|
|
364
|
+
for (const cycle of cycles) {
|
|
365
|
+
issues.push({
|
|
366
|
+
code: "roadmap_phase_cycle",
|
|
367
|
+
message: diagMessage(cwd, "roadmap_phase_cycle", `Phase cycle in roadmap '${roadmap.id}': ${cycle.join(" → ")}`),
|
|
368
|
+
roadmap_id: roadmap.id,
|
|
369
|
+
cycle,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
// milestoneIds is referenced for symmetry with future expansion; mark
|
|
373
|
+
// usage to satisfy noUnusedLocals without inserting noise downstream.
|
|
374
|
+
void milestoneIds;
|
|
375
|
+
}
|
|
376
|
+
let status = "clean";
|
|
377
|
+
for (const i of issues) {
|
|
378
|
+
if (errorCodes.has(i.code)) {
|
|
379
|
+
status = "invalid";
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
status = "warnings";
|
|
383
|
+
}
|
|
384
|
+
return { status, issues };
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Render a loaded RoadmapView as pure-textual markdown — NO mermaid, NO
|
|
388
|
+
* diagrams, NO graph syntax. Per-phase **Depends on:** adjacency lines
|
|
389
|
+
* are sourced strictly from view.edges (sorted alphabetically; "—" when
|
|
390
|
+
* the phase has no incoming phase_depends_on edges). Cycle-participating
|
|
391
|
+
* phases are surfaced under a separate "**Unordered (cycle-participating):**"
|
|
392
|
+
* heading and a "**Cycles detected:**" line. The renderer never infers
|
|
393
|
+
* adjacency from phaseOrder consecutive pairs (that pattern fabricates
|
|
394
|
+
* sibling edges in branching DAGs).
|
|
395
|
+
*
|
|
396
|
+
* naming consulted only for lens-target display labels; phase / roadmap
|
|
397
|
+
* ids render as-is.
|
|
398
|
+
*/
|
|
399
|
+
export function renderRoadmap(view, naming) {
|
|
400
|
+
const lines = [];
|
|
401
|
+
const r = view.roadmap;
|
|
402
|
+
lines.push(`# Roadmap: ${r.title} (${r.id})`);
|
|
403
|
+
lines.push("");
|
|
404
|
+
lines.push(`**Status:** ${r.status ?? "(unspecified)"}`);
|
|
405
|
+
lines.push(`**Phases:** ${r.phases.length} | **Ordered:** ${view.phaseOrder.length} | **Cycles:** ${view.cycles.length}`);
|
|
406
|
+
lines.push("");
|
|
407
|
+
if (r.description) {
|
|
408
|
+
lines.push(r.description);
|
|
409
|
+
lines.push("");
|
|
410
|
+
}
|
|
411
|
+
lines.push("## Phase order");
|
|
412
|
+
lines.push("");
|
|
413
|
+
const phaseById = new Map(r.phases.map((p) => [p.id, p]));
|
|
414
|
+
if (view.phaseOrder.length === 0) {
|
|
415
|
+
lines.push("(no acyclic ordering possible — see cycles below)");
|
|
416
|
+
lines.push("");
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
view.phaseOrder.forEach((id, idx) => {
|
|
420
|
+
const p = phaseById.get(id);
|
|
421
|
+
lines.push(`${idx + 1}. ${id} — ${p?.name ?? "(unknown)"}`);
|
|
422
|
+
});
|
|
423
|
+
lines.push("");
|
|
424
|
+
}
|
|
425
|
+
const orderedSet = new Set(view.phaseOrder);
|
|
426
|
+
const cycleOnly = r.phases.filter((p) => !orderedSet.has(p.id));
|
|
427
|
+
if (cycleOnly.length > 0) {
|
|
428
|
+
lines.push("**Unordered (cycle-participating):**");
|
|
429
|
+
for (const p of cycleOnly) {
|
|
430
|
+
lines.push(`- ${p.id} — ${p.name}`);
|
|
431
|
+
}
|
|
432
|
+
lines.push("");
|
|
433
|
+
}
|
|
434
|
+
if (view.cycles.length > 0) {
|
|
435
|
+
const rendered = view.cycles.map((c) => c.join(" → ")).join("; ");
|
|
436
|
+
lines.push(`**Cycles detected:** ${rendered}`);
|
|
437
|
+
lines.push("");
|
|
438
|
+
}
|
|
439
|
+
lines.push("## Phases");
|
|
440
|
+
lines.push("");
|
|
441
|
+
// Render in phaseOrder first, then any cycle-only phases (deduped, input order).
|
|
442
|
+
const phaseViewById = new Map(view.phases.map((pv) => [pv.phase.id, pv]));
|
|
443
|
+
const renderOrder = [];
|
|
444
|
+
for (const id of view.phaseOrder)
|
|
445
|
+
renderOrder.push(id);
|
|
446
|
+
for (const p of cycleOnly)
|
|
447
|
+
renderOrder.push(p.id);
|
|
448
|
+
for (const id of renderOrder) {
|
|
449
|
+
const pv = phaseViewById.get(id);
|
|
450
|
+
if (!pv)
|
|
451
|
+
continue;
|
|
452
|
+
const p = pv.phase;
|
|
453
|
+
lines.push(`### ${p.name} (${p.id}) [${pv.status.bucket}]`);
|
|
454
|
+
lines.push("");
|
|
455
|
+
const lensTargetLabel = (() => {
|
|
456
|
+
if (!("error" in pv.lensView)) {
|
|
457
|
+
const lens = pv.lensView.lens;
|
|
458
|
+
if (lens.kind === "composition") {
|
|
459
|
+
return `${(lens.targets ?? []).map((t) => naming?.[t] ?? t).join(", ")} (composition)`;
|
|
460
|
+
}
|
|
461
|
+
if (lens.target)
|
|
462
|
+
return naming?.[lens.target] ?? lens.target;
|
|
463
|
+
}
|
|
464
|
+
return p.lens;
|
|
465
|
+
})();
|
|
466
|
+
lines.push(`**Lens:** ${p.lens}${lensTargetLabel !== p.lens ? ` (${lensTargetLabel})` : ""}`);
|
|
467
|
+
const incoming = view.edges
|
|
468
|
+
.filter((e) => e.child === p.id)
|
|
469
|
+
.map((e) => e.parent)
|
|
470
|
+
.sort();
|
|
471
|
+
lines.push(`**Depends on:** ${incoming.length > 0 ? incoming.join(", ") : "—"}`);
|
|
472
|
+
const c = pv.status.counts;
|
|
473
|
+
lines.push(`**Counts:** complete=${c.complete} in_progress=${c.in_progress} blocked=${c.blocked} todo=${c.todo} unknown=${c.unknown} (total=${pv.status.total})`);
|
|
474
|
+
lines.push("");
|
|
475
|
+
if ("error" in pv.lensView) {
|
|
476
|
+
lines.push(`**Lens error:** ${pv.lensView.error}`);
|
|
477
|
+
lines.push("");
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
const items = pv.lensView.items;
|
|
481
|
+
if (items.length > 0) {
|
|
482
|
+
lines.push(`| Item | Status | Title |`);
|
|
483
|
+
lines.push(`|----------|----------|----------|`);
|
|
484
|
+
for (const item of items) {
|
|
485
|
+
const status = typeof item.status === "string" ? item.status : "";
|
|
486
|
+
const titleStr = typeof item.title === "string" ? item.title : "";
|
|
487
|
+
lines.push(`| ${item.id} | ${status} | ${titleStr} |`);
|
|
488
|
+
}
|
|
489
|
+
lines.push("");
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (pv.milestone) {
|
|
493
|
+
const verdict = pv.milestoneSatisfied ? "satisfied" : "not yet satisfied";
|
|
494
|
+
lines.push(`**Milestone:** ${pv.milestone.id} — ${pv.milestone.name} — ${verdict}`);
|
|
495
|
+
lines.push("");
|
|
496
|
+
}
|
|
497
|
+
if (p.exit_criteria && p.exit_criteria.length > 0) {
|
|
498
|
+
lines.push("**Exit criteria:**");
|
|
499
|
+
for (const crit of p.exit_criteria)
|
|
500
|
+
lines.push(`- ${crit}`);
|
|
501
|
+
lines.push("");
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return lines.join("\n").replace(/\n+$/, "\n");
|
|
505
|
+
}
|
|
506
|
+
// ── Lens-validator dispatch registration (Divergence 3) ─────────────────────
|
|
507
|
+
//
|
|
508
|
+
// Module-init side-effect: validateContext in context-sdk.ts iterates all
|
|
509
|
+
// registered lens-validators and merges their issues into the project-
|
|
510
|
+
// validation result. roadmap-plan registers itself here so import of this
|
|
511
|
+
// module from index.ts wires the dispatch automatically — no hardcoded
|
|
512
|
+
// import in context-sdk.ts.
|
|
513
|
+
registerLensValidator({
|
|
514
|
+
name: "roadmap",
|
|
515
|
+
validate: (cwd) => {
|
|
516
|
+
const result = validateRoadmaps(cwd);
|
|
517
|
+
const errorCodes = new Set([
|
|
518
|
+
"roadmap_lens_missing",
|
|
519
|
+
"roadmap_phase_dep_missing",
|
|
520
|
+
"roadmap_phase_cycle",
|
|
521
|
+
"roadmap_composition_cycle",
|
|
522
|
+
]);
|
|
523
|
+
const issues = result.issues.map((ri) => ({
|
|
524
|
+
code: ri.code,
|
|
525
|
+
severity: errorCodes.has(ri.code) ? "error" : "warning",
|
|
526
|
+
message: ri.message,
|
|
527
|
+
block: ri.roadmap_id ? `roadmap.${ri.roadmap_id}` : "roadmap",
|
|
528
|
+
...(ri.phase_id ? { field: `phase.${ri.phase_id}` } : {}),
|
|
529
|
+
}));
|
|
530
|
+
const status = issues.length === 0 ? "clean" : issues.some((i) => i.severity === "error") ? "invalid" : "warnings";
|
|
531
|
+
return { status, issues };
|
|
532
|
+
},
|
|
533
|
+
});
|
|
534
|
+
//# sourceMappingURL=roadmap-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-plan.js","sourceRoot":"","sources":["../src/roadmap-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { InvariantDecl, LensSpec, RelationTypeDecl } from "./context.js";
|
|
2
|
+
import { type SchemaProperty } from "./context-sdk.js";
|
|
3
|
+
/** Item-shape projection for a sample block kind. */
|
|
4
|
+
export interface SampleKindShape {
|
|
5
|
+
arrayKeys: string[];
|
|
6
|
+
itemProperties: Record<string, SchemaProperty[]>;
|
|
7
|
+
}
|
|
8
|
+
/** The relation_types a kind participates in, split by endpoint role. */
|
|
9
|
+
export interface SampleKindRelations {
|
|
10
|
+
as_source: RelationTypeDecl[];
|
|
11
|
+
as_target: RelationTypeDecl[];
|
|
12
|
+
}
|
|
13
|
+
/** One packaged block kind, with its associated metadata. */
|
|
14
|
+
export interface SampleKind {
|
|
15
|
+
canonical_id: string;
|
|
16
|
+
display_name: string;
|
|
17
|
+
prefix: string;
|
|
18
|
+
array_key: string;
|
|
19
|
+
data_path: string;
|
|
20
|
+
schema_path: string;
|
|
21
|
+
title: string | null;
|
|
22
|
+
description: string | null;
|
|
23
|
+
shape: SampleKindShape | null;
|
|
24
|
+
relation_types: SampleKindRelations;
|
|
25
|
+
invariants: InvariantDecl[];
|
|
26
|
+
lenses: LensSpec[];
|
|
27
|
+
warnings: string[];
|
|
28
|
+
}
|
|
29
|
+
/** The packaged samples catalog (DEC-0037 view). */
|
|
30
|
+
export interface SamplesCatalog {
|
|
31
|
+
schema_version: string;
|
|
32
|
+
kinds: SampleKind[];
|
|
33
|
+
relationTypes: RelationTypeDecl[];
|
|
34
|
+
lenses: LensSpec[];
|
|
35
|
+
invariants: InvariantDecl[];
|
|
36
|
+
layers: unknown[];
|
|
37
|
+
status_buckets: Record<string, unknown>;
|
|
38
|
+
warnings: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the packaged samples catalog. With `opts.kind` set, the catalog's
|
|
42
|
+
* `kinds[]` is filtered to the single matching block kind (empty + a warning
|
|
43
|
+
* when no kind matches). The top-level registries are always returned in full.
|
|
44
|
+
*/
|
|
45
|
+
export declare function samplesCatalog(opts?: {
|
|
46
|
+
kind?: string;
|
|
47
|
+
}): SamplesCatalog;
|
|
48
|
+
//# sourceMappingURL=samples-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"samples-catalog.d.ts","sourceRoot":"","sources":["../src/samples-catalog.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,kBAAkB,CAAC;AAM3E,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;CACjD;AAED,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAwBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CA8CvE"}
|