@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.
Files changed (126) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +195 -0
  3. package/dist/block-api.d.ts +328 -0
  4. package/dist/block-api.d.ts.map +1 -0
  5. package/dist/block-api.js +1167 -0
  6. package/dist/block-api.js.map +1 -0
  7. package/dist/block-validation.d.ts +33 -0
  8. package/dist/block-validation.d.ts.map +1 -0
  9. package/dist/block-validation.js +213 -0
  10. package/dist/block-validation.js.map +1 -0
  11. package/dist/context-dir.d.ts +93 -0
  12. package/dist/context-dir.d.ts.map +1 -0
  13. package/dist/context-dir.js +224 -0
  14. package/dist/context-dir.js.map +1 -0
  15. package/dist/context-sdk.d.ts +428 -0
  16. package/dist/context-sdk.d.ts.map +1 -0
  17. package/dist/context-sdk.js +1327 -0
  18. package/dist/context-sdk.js.map +1 -0
  19. package/dist/context.d.ts +497 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/context.js +1060 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/dispatch-context.d.ts +112 -0
  24. package/dist/dispatch-context.d.ts.map +1 -0
  25. package/dist/dispatch-context.js +119 -0
  26. package/dist/dispatch-context.js.map +1 -0
  27. package/dist/execution-context.d.ts +138 -0
  28. package/dist/execution-context.d.ts.map +1 -0
  29. package/dist/execution-context.js +151 -0
  30. package/dist/execution-context.js.map +1 -0
  31. package/dist/index.d.ts +34 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +1655 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lens-validator.d.ts +50 -0
  36. package/dist/lens-validator.d.ts.map +1 -0
  37. package/dist/lens-validator.js +46 -0
  38. package/dist/lens-validator.js.map +1 -0
  39. package/dist/lens-view.d.ts +75 -0
  40. package/dist/lens-view.d.ts.map +1 -0
  41. package/dist/lens-view.js +253 -0
  42. package/dist/lens-view.js.map +1 -0
  43. package/dist/rename-canonical-id.d.ts +64 -0
  44. package/dist/rename-canonical-id.d.ts.map +1 -0
  45. package/dist/rename-canonical-id.js +378 -0
  46. package/dist/rename-canonical-id.js.map +1 -0
  47. package/dist/roadmap-plan.d.ts +186 -0
  48. package/dist/roadmap-plan.d.ts.map +1 -0
  49. package/dist/roadmap-plan.js +534 -0
  50. package/dist/roadmap-plan.js.map +1 -0
  51. package/dist/samples-catalog.d.ts +48 -0
  52. package/dist/samples-catalog.d.ts.map +1 -0
  53. package/dist/samples-catalog.js +128 -0
  54. package/dist/samples-catalog.js.map +1 -0
  55. package/dist/schema-migrations.d.ts +82 -0
  56. package/dist/schema-migrations.d.ts.map +1 -0
  57. package/dist/schema-migrations.js +106 -0
  58. package/dist/schema-migrations.js.map +1 -0
  59. package/dist/schema-validator.d.ts +76 -0
  60. package/dist/schema-validator.d.ts.map +1 -0
  61. package/dist/schema-validator.js +219 -0
  62. package/dist/schema-validator.js.map +1 -0
  63. package/dist/schema-write.d.ts +122 -0
  64. package/dist/schema-write.d.ts.map +1 -0
  65. package/dist/schema-write.js +210 -0
  66. package/dist/schema-write.js.map +1 -0
  67. package/dist/status-vocab.d.ts +60 -0
  68. package/dist/status-vocab.d.ts.map +1 -0
  69. package/dist/status-vocab.js +109 -0
  70. package/dist/status-vocab.js.map +1 -0
  71. package/dist/test-helpers.d.ts +12 -0
  72. package/dist/test-helpers.d.ts.map +1 -0
  73. package/dist/test-helpers.js +28 -0
  74. package/dist/test-helpers.js.map +1 -0
  75. package/dist/topo.d.ts +19 -0
  76. package/dist/topo.d.ts.map +1 -0
  77. package/dist/topo.js +99 -0
  78. package/dist/topo.js.map +1 -0
  79. package/dist/update-check.d.ts +6 -0
  80. package/dist/update-check.d.ts.map +1 -0
  81. package/dist/update-check.js +82 -0
  82. package/dist/update-check.js.map +1 -0
  83. package/package.json +115 -0
  84. package/samples/blocks/context-contracts.json +3 -0
  85. package/samples/blocks/conventions.json +3 -0
  86. package/samples/blocks/decisions.json +3 -0
  87. package/samples/blocks/features.json +3 -0
  88. package/samples/blocks/framework-gaps.json +3 -0
  89. package/samples/blocks/issues.json +3 -0
  90. package/samples/blocks/layer-plans.json +3 -0
  91. package/samples/blocks/phase.json +3 -0
  92. package/samples/blocks/rationale.json +3 -0
  93. package/samples/blocks/requirements.json +3 -0
  94. package/samples/blocks/research.json +3 -0
  95. package/samples/blocks/spec-reviews.json +3 -0
  96. package/samples/blocks/story.json +3 -0
  97. package/samples/blocks/tasks.json +3 -0
  98. package/samples/blocks/verification.json +3 -0
  99. package/samples/conception.json +467 -0
  100. package/samples/schemas/context-contracts.schema.json +89 -0
  101. package/samples/schemas/conventions.schema.json +34 -0
  102. package/samples/schemas/decisions.schema.json +87 -0
  103. package/samples/schemas/features.schema.json +53 -0
  104. package/samples/schemas/framework-gaps.schema.json +64 -0
  105. package/samples/schemas/issues.schema.json +39 -0
  106. package/samples/schemas/layer-plans.schema.json +92 -0
  107. package/samples/schemas/phase.schema.json +118 -0
  108. package/samples/schemas/rationale.schema.json +24 -0
  109. package/samples/schemas/requirements.schema.json +34 -0
  110. package/samples/schemas/research.schema.json +134 -0
  111. package/samples/schemas/spec-reviews.schema.json +62 -0
  112. package/samples/schemas/story.schema.json +73 -0
  113. package/samples/schemas/tasks.schema.json +34 -0
  114. package/samples/schemas/verification.schema.json +37 -0
  115. package/schemas/bootstrap.schema.json +24 -0
  116. package/schemas/config.schema.json +193 -0
  117. package/schemas/layer.schema.json +9 -0
  118. package/schemas/priority.schema.json +9 -0
  119. package/schemas/relations.schema.json +31 -0
  120. package/schemas/severity.schema.json +9 -0
  121. package/schemas/source.schema.json +9 -0
  122. package/schemas/status.schema.json +9 -0
  123. package/schemas/verification-method.schema.json +9 -0
  124. package/skill-narrative.md +130 -0
  125. package/skills/pi-context/SKILL.md +684 -0
  126. 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"}