rcf-lite 0.0.1 → 0.8.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 +344 -0
- package/LICENSE +202 -0
- package/README.md +92 -4
- package/bin/rcf-verify.js +122 -0
- package/bin/rcf.js +174 -0
- package/bin/view-supervisor-child.mjs +14 -0
- package/fixtures/canary-manifest.json +103 -0
- package/guidance/README.md +25 -0
- package/guidance/build-cycle-playbook.md +492 -0
- package/guidance/build-cycle.md +40 -0
- package/guidance/document-model.md +45 -0
- package/guidance/elicitation-playbook.md +442 -0
- package/guidance/harness-template.md +246 -0
- package/guidance/managed/README.md +63 -0
- package/guidance/managed/agent-instructions-block.hash +1 -0
- package/guidance/managed/agent-instructions-block.md +220 -0
- package/guidance/managed/legacy-fragment-hashes.json +22 -0
- package/guidance/manifest.json +21 -0
- package/guidance/overview.md +48 -0
- package/guidance/persona-programme.md +44 -0
- package/package.json +71 -8
- package/rcf/adrs/adr-001.json +25 -0
- package/rcf/adrs/adr-002.json +25 -0
- package/rcf/adrs/adr-003.json +25 -0
- package/rcf/adrs/adr-004.json +20 -0
- package/rcf/adrs/adr-005.json +20 -0
- package/rcf/adrs/adr-006.json +25 -0
- package/rcf/adrs/adr-007.json +25 -0
- package/rcf/adrs/adr-008.json +25 -0
- package/rcf/adrs/adr-009.json +25 -0
- package/rcf/build-sequence.json +11 -0
- package/rcf/code-nodes/cn-001.json +14 -0
- package/rcf/code-nodes/cn-002.json +14 -0
- package/rcf/code-nodes/cn-003.json +15 -0
- package/rcf/code-nodes/cn-004.json +17 -0
- package/rcf/code-nodes/cn-005.json +19 -0
- package/rcf/code-nodes/cn-006.json +17 -0
- package/rcf/code-nodes/cn-007.json +16 -0
- package/rcf/code-nodes/cn-008.json +19 -0
- package/rcf/code-nodes/cn-009.json +16 -0
- package/rcf/code-nodes/cn-010.json +18 -0
- package/rcf/code-nodes/cn-011.json +18 -0
- package/rcf/code-nodes/cn-012.json +18 -0
- package/rcf/code-nodes/cn-013.json +19 -0
- package/rcf/code-nodes/cn-014.json +16 -0
- package/rcf/code-nodes/cn-015.json +16 -0
- package/rcf/code-nodes/cn-016.json +16 -0
- package/rcf/code-nodes/cn-017.json +16 -0
- package/rcf/code-nodes/cn-018.json +15 -0
- package/rcf/code-nodes/cn-019.json +16 -0
- package/rcf/code-nodes/cn-020.json +16 -0
- package/rcf/code-nodes/cn-021.json +16 -0
- package/rcf/code-nodes/cn-022.json +16 -0
- package/rcf/code-nodes/cn-023.json +16 -0
- package/rcf/code-nodes/cn-024.json +16 -0
- package/rcf/code-nodes/cn-025.json +16 -0
- package/rcf/code-nodes/cn-026.json +16 -0
- package/rcf/code-nodes/cn-027.json +16 -0
- package/rcf/code-nodes/cn-028.json +16 -0
- package/rcf/code-nodes/cn-029.json +19 -0
- package/rcf/code-nodes/cn-030.json +14 -0
- package/rcf/code-nodes/cn-031.json +14 -0
- package/rcf/code-nodes/cn-032.json +14 -0
- package/rcf/code-nodes/cn-033.json +14 -0
- package/rcf/code-nodes/cn-034.json +14 -0
- package/rcf/code-nodes/cn-035.json +14 -0
- package/rcf/code-nodes/cn-036.json +14 -0
- package/rcf/code-nodes/cn-037.json +14 -0
- package/rcf/code-nodes/cn-038.json +14 -0
- package/rcf/code-nodes/cn-039.json +14 -0
- package/rcf/code-nodes/cn-040.json +14 -0
- package/rcf/code-nodes/cn-041.json +14 -0
- package/rcf/code-nodes/cn-042.json +14 -0
- package/rcf/code-nodes/cn-043.json +14 -0
- package/rcf/code-nodes/cn-044.json +14 -0
- package/rcf/code-nodes/cn-045.json +14 -0
- package/rcf/code-nodes/cn-046.json +14 -0
- package/rcf/code-nodes/cn-047.json +14 -0
- package/rcf/code-nodes/cn-048.json +14 -0
- package/rcf/code-nodes/cn-049.json +14 -0
- package/rcf/code-nodes/cn-050.json +14 -0
- package/rcf/code-nodes/cn-051.json +14 -0
- package/rcf/code-nodes/cn-052.json +14 -0
- package/rcf/code-nodes/cn-053.json +14 -0
- package/rcf/code-nodes/cn-054.json +14 -0
- package/rcf/code-nodes/cn-055.json +14 -0
- package/rcf/code-nodes/cn-056.json +14 -0
- package/rcf/code-nodes/cn-057.json +14 -0
- package/rcf/fbs/fbs-001.json +49 -0
- package/rcf/fbs/fbs-002.json +42 -0
- package/rcf/fbs/fbs-003.json +37 -0
- package/rcf/fbs/fbs-004.json +39 -0
- package/rcf/fbs/fbs-005.json +38 -0
- package/rcf/fbs/fbs-006.json +48 -0
- package/rcf/fbs/fbs-007.json +39 -0
- package/rcf/fbs/fbs-008.json +40 -0
- package/rcf/fbs/fbs-009.json +36 -0
- package/rcf/fbs/fbs-010.json +41 -0
- package/rcf/fbs/fbs-011.json +36 -0
- package/rcf/fbs/fbs-012.json +46 -0
- package/rcf/fbs/fbs-013.json +42 -0
- package/rcf/fbs/fbs-014.json +49 -0
- package/rcf/fbs/fbs-015.json +32 -0
- package/rcf/manifest.json +17 -0
- package/rcf/prd.json +47 -0
- package/rcf/requirements/req-001.json +19 -0
- package/rcf/requirements/req-002.json +19 -0
- package/rcf/requirements/req-003.json +19 -0
- package/rcf/requirements/req-004.json +19 -0
- package/rcf/requirements/req-005.json +19 -0
- package/rcf/requirements/req-006.json +19 -0
- package/rcf/requirements/req-007.json +19 -0
- package/rcf/requirements/req-008.json +19 -0
- package/rcf/requirements/req-009.json +19 -0
- package/rcf/tacs/tac-001.json +45 -0
- package/rcf/tacs/tac-002.json +109 -0
- package/rcf/tacs/tac-003.json +40 -0
- package/rcf/tacs/tac-004.json +51 -0
- package/rcf/tacs/tac-005.json +52 -0
- package/rcf/tacs/tac-006.json +104 -0
- package/rcf/tacs/tac-007.json +38 -0
- package/rcf/tacs/tac-008.json +51 -0
- package/rcf/tad.json +51 -0
- package/rcf/test-suites/PENDING.md +23 -0
- package/rcf/test-suites/ts-001.json +38 -0
- package/rcf/test-suites/ts-002.json +38 -0
- package/rcf/test-suites/ts-003.json +43 -0
- package/rcf/test-suites/ts-004.json +44 -0
- package/rcf/test-suites/ts-005.json +30 -0
- package/rcf/test-suites/ts-006.json +36 -0
- package/rcf/test-suites/ts-007.json +43 -0
- package/rcf/test-suites/ts-008.json +37 -0
- package/rcf/test-suites/ts-009.json +38 -0
- package/rcf/test-suites/ts-010.json +38 -0
- package/rcf/test-suites/ts-011.json +44 -0
- package/rcf/test-suites/ts-012.json +36 -0
- package/rcf/test-suites/ts-013.json +38 -0
- package/rcf/test-suites/ts-014.json +38 -0
- package/rcf/test-suites/ts-015.json +38 -0
- package/rcf/test-suites/ts-016.json +37 -0
- package/rcf/test-suites/ts-017.json +38 -0
- package/rcf/test-suites/ts-018.json +38 -0
- package/rcf/test-suites/ts-019.json +37 -0
- package/rcf/test-suites/ts-020.json +46 -0
- package/rcf/test-suites/ts-021.json +46 -0
- package/rcf/test-suites/ts-022.json +46 -0
- package/rcf/test-suites/ts-023.json +46 -0
- package/rcf/test-suites/ts-024.json +46 -0
- package/rcf/test-suites/ts-025.json +52 -0
- package/rcf/user-stories/us-101.json +40 -0
- package/rcf/user-stories/us-102.json +40 -0
- package/rcf/user-stories/us-201.json +40 -0
- package/rcf/user-stories/us-202.json +40 -0
- package/rcf/user-stories/us-203.json +32 -0
- package/rcf/user-stories/us-301.json +40 -0
- package/rcf/user-stories/us-302.json +40 -0
- package/rcf/user-stories/us-303.json +40 -0
- package/rcf/user-stories/us-304.json +40 -0
- package/rcf/user-stories/us-401.json +40 -0
- package/rcf/user-stories/us-402.json +40 -0
- package/rcf/user-stories/us-403.json +40 -0
- package/rcf/user-stories/us-501.json +40 -0
- package/rcf/user-stories/us-502.json +40 -0
- package/rcf/user-stories/us-503.json +40 -0
- package/rcf/user-stories/us-601.json +40 -0
- package/rcf/user-stories/us-602.json +40 -0
- package/rcf/user-stories/us-701.json +40 -0
- package/rcf/user-stories/us-702.json +40 -0
- package/rcf/user-stories/us-801.json +49 -0
- package/rcf/user-stories/us-802.json +49 -0
- package/rcf/user-stories/us-803.json +49 -0
- package/rcf/user-stories/us-804.json +49 -0
- package/rcf/user-stories/us-805.json +49 -0
- package/rcf/user-stories/us-901.json +40 -0
- package/src/.gitkeep +0 -0
- package/src/admissibility/enforce.js +142 -0
- package/src/admissibility/index.js +8 -0
- package/src/admissibility/markers.js +104 -0
- package/src/admissibility/scope-lint.js +163 -0
- package/src/browser-verify/auth-smoke.js +109 -0
- package/src/browser-verify/index.js +29 -0
- package/src/browser-verify/invariants.js +336 -0
- package/src/browser-verify/manifest-writer.js +189 -0
- package/src/browser-verify/runner.js +171 -0
- package/src/build/bundle.js +198 -0
- package/src/build/formatters/json.js +18 -0
- package/src/build/formatters/markdown.js +406 -0
- package/src/build/index.js +14 -0
- package/src/build/mark.js +177 -0
- package/src/build/queue.js +285 -0
- package/src/cli/browser-verify.js +231 -0
- package/src/cli/build.js +584 -0
- package/src/cli/coverage.js +219 -0
- package/src/cli/create.js +358 -0
- package/src/cli/delete.js +127 -0
- package/src/cli/design.js +353 -0
- package/src/cli/doctor.js +548 -0
- package/src/cli/fbs.js +171 -0
- package/src/cli/finalise.js +377 -0
- package/src/cli/guidance.js +206 -0
- package/src/cli/help.js +156 -0
- package/src/cli/impact.js +119 -0
- package/src/cli/init.js +282 -0
- package/src/cli/intake.js +153 -0
- package/src/cli/link.js +128 -0
- package/src/cli/mcp.js +160 -0
- package/src/cli/preflight.js +220 -0
- package/src/cli/read.js +168 -0
- package/src/cli/req-baseline.js +269 -0
- package/src/cli/req-classify.js +135 -0
- package/src/cli/review.js +295 -0
- package/src/cli/test-suite.js +221 -0
- package/src/cli/trace.js +172 -0
- package/src/cli/ui-baseline.js +292 -0
- package/src/cli/ui-classify.js +108 -0
- package/src/cli/update.js +197 -0
- package/src/cli/validate.js +168 -0
- package/src/cli/view.js +452 -0
- package/src/core/baseline-catalog/data/auth.json +42 -0
- package/src/core/baseline-catalog/data/http-api.json +42 -0
- package/src/core/baseline-catalog/data/notifications.json +33 -0
- package/src/core/baseline-catalog/data/persistence.json +33 -0
- package/src/core/baseline-catalog/data/web-ui.json +60 -0
- package/src/core/baseline-catalog/index.js +121 -0
- package/src/core/errors/index.js +167 -0
- package/src/core/fixtures/register-canary/canary-prompt-01.json +18 -0
- package/src/core/fixtures/register-canary/canary-prompt-02.json +21 -0
- package/src/core/fixtures/register-canary/canary-prompt-03.json +17 -0
- package/src/core/isolation/index.js +60 -0
- package/src/core/mcp/framing.js +103 -0
- package/src/core/mcp/index.js +8 -0
- package/src/core/mcp/server.js +228 -0
- package/src/core/patterns/register-canary.js +209 -0
- package/src/core/patterns/req-shapes.js +158 -0
- package/src/core/patterns/services.js +358 -0
- package/src/core/patterns/ui-shapes.js +166 -0
- package/src/core/store/cn-resolve.js +134 -0
- package/src/core/store/derive-deps.js +93 -0
- package/src/core/store/ids.js +78 -0
- package/src/core/store/index.js +20 -0
- package/src/core/store/init.js +255 -0
- package/src/core/store/loader.js +214 -0
- package/src/core/store/tp-resolve.js +176 -0
- package/src/core/store/validator.js +191 -0
- package/src/core/store/walker.js +944 -0
- package/src/core/store/writer.js +1879 -0
- package/src/design/index.js +11 -0
- package/src/design/writer.js +271 -0
- package/src/finalise/detect.js +151 -0
- package/src/finalise/index.js +31 -0
- package/src/finalise/ingest.js +160 -0
- package/src/finalise/install.js +119 -0
- package/src/finalise/ship-without-verified.js +131 -0
- package/src/finalise/spawn.js +84 -0
- package/src/intake/fidelity.js +105 -0
- package/src/intake/index.js +6 -0
- package/src/intake/manifest-writer.js +100 -0
- package/src/intake/orchestrator.js +138 -0
- package/src/intake/validate.js +80 -0
- package/src/mcp/map-errors.js +131 -0
- package/src/mcp/prompts.js +49 -0
- package/src/mcp/resources.js +244 -0
- package/src/mcp/tools.js +1212 -0
- package/src/preflight/design-shapes.js +185 -0
- package/src/preflight/index.js +90 -0
- package/src/preflight/manifest-writer.js +264 -0
- package/src/preflight/scanner.js +206 -0
- package/src/preflight/secrets.js +134 -0
- package/src/preflight/session.js +246 -0
- package/src/query/attestation.js +285 -0
- package/src/query/coverage.js +308 -0
- package/src/query/formatters/json.js +21 -0
- package/src/query/formatters/mermaid.js +209 -0
- package/src/query/formatters/table.js +203 -0
- package/src/query/impact.js +173 -0
- package/src/query/index.js +13 -0
- package/src/query/refuse-on-admissibility.js +73 -0
- package/src/query/trace.js +345 -0
- package/src/register-canary/fixture-loader.js +87 -0
- package/src/register-canary/index.js +10 -0
- package/src/register-canary/record-writer.js +132 -0
- package/src/register-canary/runner.js +156 -0
- package/src/req-baseline/gate.js +86 -0
- package/src/req-baseline/index.js +27 -0
- package/src/req-baseline/open-candidates.js +143 -0
- package/src/req-baseline/opt-out.js +195 -0
- package/src/req-baseline/sweep.js +230 -0
- package/src/req-detection/classifier.js +181 -0
- package/src/req-detection/index.js +9 -0
- package/src/req-detection/persist.js +55 -0
- package/src/review/index.js +325 -0
- package/src/review/mutation.js +117 -0
- package/src/review/ui-baseline-drift.js +138 -0
- package/src/ruleset/index.js +140 -0
- package/src/ruleset/ruleset.json +146 -0
- package/src/server/index.js +178 -0
- package/src/server/routes.js +110 -0
- package/src/server/sse.js +118 -0
- package/src/setup/agent-setup.js +362 -0
- package/src/setup/identity-seed.js +104 -0
- package/src/setup/knowledge-seed.js +123 -0
- package/src/setup/managed-block.js +193 -0
- package/src/setup/managed-gitignore.js +166 -0
- package/src/setup/managed-markers.js +49 -0
- package/src/ui-baseline/defaults.js +119 -0
- package/src/ui-baseline/index.js +25 -0
- package/src/ui-baseline/manifest-writer.js +282 -0
- package/src/ui-baseline/session.js +178 -0
- package/src/ui-detection/classifier.js +192 -0
- package/src/verify/chain/index.js +221 -0
- package/src/verify/cli/cleanup.js +61 -0
- package/src/verify/cli/help.js +56 -0
- package/src/verify/cli/mcp.js +98 -0
- package/src/verify/cli/provision.js +71 -0
- package/src/verify/cli/report.js +71 -0
- package/src/verify/cli/run.js +155 -0
- package/src/verify/engine/brief.js +87 -0
- package/src/verify/engine/index.js +177 -0
- package/src/verify/engine/launcher.js +307 -0
- package/src/verify/mcp/tools.js +107 -0
- package/src/verify/profile/index.js +146 -0
- package/src/verify/provision/index.js +256 -0
- package/src/verify/report/index.js +139 -0
- package/src/verify/report/renderer.js +118 -0
- package/src/verify/verdict/index.js +313 -0
- package/src/view/doc-renderers/adr.js +44 -0
- package/src/view/doc-renderers/build-sequence.js +40 -0
- package/src/view/doc-renderers/fbs.js +128 -0
- package/src/view/doc-renderers/helpers.js +159 -0
- package/src/view/doc-renderers/index.js +12 -0
- package/src/view/doc-renderers/prd.js +45 -0
- package/src/view/doc-renderers/req.js +43 -0
- package/src/view/doc-renderers/tac.js +38 -0
- package/src/view/doc-renderers/tad.js +74 -0
- package/src/view/doc-renderers/test-suite.js +45 -0
- package/src/view/doc-renderers/user-story.js +63 -0
- package/src/view/html-page.js +462 -0
- package/src/view/index.js +63 -0
- package/src/view/live-client.js +338 -0
- package/src/view/mermaid-diagram.js +178 -0
- package/src/view/style.css +735 -0
- package/src/view/tree-model.js +152 -0
- package/src/view/vendored/mermaid.min.js +2607 -0
- package/src/view-supervisor/index.js +26 -0
- package/src/view-supervisor/logs.js +32 -0
- package/src/view-supervisor/manifest-writer.js +178 -0
- package/src/view-supervisor/persist-until.js +85 -0
- package/src/view-supervisor/supervisor.js +276 -0
- package/src/watch/index.js +152 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Normalise a walked tree into the structure the renderers consume. Post-3.7
|
|
2
|
+
// the load-bearing relationship maps (`parentByChild`, `childrenByParent`,
|
|
3
|
+
// `fbsByAcId`, `dependentsByFbsId`, `tsByAcId`, `tcsByAcId`, `usByTacId`) are
|
|
4
|
+
// computed by the walker itself; the tree-model layers view-specific
|
|
5
|
+
// convenience maps on top (storiesByReqId as REQ-doc list, usByAcId as
|
|
6
|
+
// AC->US pointer, acIdsByUsId as US->AC[] list, errorsById as error index).
|
|
7
|
+
//
|
|
8
|
+
// The tree-model is also where broken references are recorded as a Set of
|
|
9
|
+
// ids the renderer marks with the "broken" class in the diagram and the
|
|
10
|
+
// "broken" banner in the page.
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {object} BuiltTreeModel
|
|
14
|
+
* @property {object|null} manifest
|
|
15
|
+
* @property {object|null} prd
|
|
16
|
+
* @property {object|null} tad
|
|
17
|
+
* @property {object|null} bs
|
|
18
|
+
* @property {object[]} requirements
|
|
19
|
+
* @property {object[]} userStories
|
|
20
|
+
* @property {object[]} tacs
|
|
21
|
+
* @property {object[]} adrs
|
|
22
|
+
* @property {object[]} fbsItems
|
|
23
|
+
* @property {object[]} testSuites
|
|
24
|
+
* @property {Map<string, object>} byId
|
|
25
|
+
* @property {Map<string, string>} rawById
|
|
26
|
+
* @property {Set<string>} brokenIds
|
|
27
|
+
* @property {Map<string, string>} parentByChild
|
|
28
|
+
* @property {Map<string, string[]>} childrenByParent
|
|
29
|
+
* @property {Map<string, string[]>} dependentsByFbsId
|
|
30
|
+
* @property {Map<string, string[]>} tsByAcId
|
|
31
|
+
* @property {Map<string, Array<{ tsId: string, tcId: string }>>} tcsByAcId
|
|
32
|
+
* @property {Map<string, string[]>} usByTacId
|
|
33
|
+
* @property {Map<string, object[]>} storiesByReqId
|
|
34
|
+
* @property {Map<string, object[]>} fbsByAcId
|
|
35
|
+
* @property {Map<string, string[]>} acIdsByUsId
|
|
36
|
+
* @property {Map<string, object>} usByAcId
|
|
37
|
+
* @property {Map<string, import('#core/errors').RcfError[]>} errorsById
|
|
38
|
+
* @property {import('#core/errors').RcfError[]} errors
|
|
39
|
+
* @property {object[]} codeNodes - Phase 10 (X2 CodeNode bridge)
|
|
40
|
+
* @property {Map<string, string[]>} cnByAcId - Phase 10: AC -> implementing CN ids
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
const emptyMap = () => new Map();
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build the render-ready tree model from a walker result plus the error
|
|
47
|
+
* list.
|
|
48
|
+
*
|
|
49
|
+
* @param {object} args
|
|
50
|
+
* @param {object} args.tree - the walker's returned tree
|
|
51
|
+
* @param {import('#core/errors').RcfError[]} args.errors - the walker's error list
|
|
52
|
+
* @returns {BuiltTreeModel}
|
|
53
|
+
*/
|
|
54
|
+
export function buildTreeModel({ tree, errors }) {
|
|
55
|
+
// storiesByReqId: keyed on REQ id, values are US doc arrays (renderers want
|
|
56
|
+
// the whole US doc, not just the id, to render titles + drilldowns).
|
|
57
|
+
const storiesByReqId = new Map();
|
|
58
|
+
for (const us of tree.userStories) {
|
|
59
|
+
if (!us?.reqId) continue;
|
|
60
|
+
const list = storiesByReqId.get(us.reqId) ?? [];
|
|
61
|
+
list.push(us);
|
|
62
|
+
storiesByReqId.set(us.reqId, list);
|
|
63
|
+
}
|
|
64
|
+
for (const [reqId, list] of storiesByReqId.entries()) {
|
|
65
|
+
storiesByReqId.set(reqId, list.sort((a, b) => (a.usId ?? '').localeCompare(b.usId ?? '')));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const acIdsByUsId = new Map();
|
|
69
|
+
const usByAcId = new Map();
|
|
70
|
+
for (const us of tree.userStories) {
|
|
71
|
+
const acIds = [];
|
|
72
|
+
for (const ac of us.acceptanceCriteria ?? []) {
|
|
73
|
+
acIds.push(ac.id);
|
|
74
|
+
usByAcId.set(ac.id, us);
|
|
75
|
+
}
|
|
76
|
+
acIdsByUsId.set(us.usId, acIds);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// fbsByAcId: renderers want the whole FBS doc so they can print id + title.
|
|
80
|
+
// The walker's `fbsByAcId` is id-list only; the view layer's is object-list.
|
|
81
|
+
const fbsByAcId = new Map();
|
|
82
|
+
for (const f of tree.fbsItems) {
|
|
83
|
+
for (const acId of f.acIds ?? []) {
|
|
84
|
+
const list = fbsByAcId.get(acId) ?? [];
|
|
85
|
+
list.push(f);
|
|
86
|
+
fbsByAcId.set(acId, list);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const [acId, list] of fbsByAcId.entries()) {
|
|
90
|
+
fbsByAcId.set(acId, list.sort((a, b) => (a.fbsId ?? '').localeCompare(b.fbsId ?? '')));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const errorsById = new Map();
|
|
94
|
+
for (const err of errors) {
|
|
95
|
+
if (!err.documentId) continue;
|
|
96
|
+
const list = errorsById.get(err.documentId) ?? [];
|
|
97
|
+
list.push(err);
|
|
98
|
+
errorsById.set(err.documentId, list);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
manifest: tree.manifest,
|
|
103
|
+
prd: tree.prd,
|
|
104
|
+
tad: tree.tad,
|
|
105
|
+
bs: tree.bs,
|
|
106
|
+
requirements: tree.requirements,
|
|
107
|
+
userStories: tree.userStories,
|
|
108
|
+
tacs: tree.tacs,
|
|
109
|
+
adrs: tree.adrs,
|
|
110
|
+
fbsItems: tree.fbsItems,
|
|
111
|
+
testSuites: tree.testSuites,
|
|
112
|
+
byId: tree.byId,
|
|
113
|
+
rawById: tree.rawById,
|
|
114
|
+
brokenIds: tree.brokenIds,
|
|
115
|
+
parentByChild: tree.parentByChild ?? emptyMap(),
|
|
116
|
+
childrenByParent: tree.childrenByParent ?? emptyMap(),
|
|
117
|
+
dependentsByFbsId: tree.dependentsByFbsId ?? emptyMap(),
|
|
118
|
+
tsByAcId: tree.tsByAcId ?? emptyMap(),
|
|
119
|
+
tcsByAcId: tree.tcsByAcId ?? emptyMap(),
|
|
120
|
+
usByTacId: tree.usByTacId ?? emptyMap(),
|
|
121
|
+
storiesByReqId,
|
|
122
|
+
fbsByAcId,
|
|
123
|
+
acIdsByUsId,
|
|
124
|
+
usByAcId,
|
|
125
|
+
errorsById,
|
|
126
|
+
errors,
|
|
127
|
+
// Phase 10 (X2 CodeNode bridge): forwarded as-is; empty when no
|
|
128
|
+
// code-nodes/ dir exists, so every spec-only view stays byte-identical.
|
|
129
|
+
codeNodes: tree.codeNodes ?? [],
|
|
130
|
+
cnByAcId: tree.cnByAcId ?? emptyMap(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Return the list of every document id present in the tree (excluding the
|
|
136
|
+
* manifest), in a stable order suitable for diagram emission.
|
|
137
|
+
*
|
|
138
|
+
* @param {BuiltTreeModel} model
|
|
139
|
+
* @returns {string[]}
|
|
140
|
+
*/
|
|
141
|
+
export function listAllDocumentIds(model) {
|
|
142
|
+
const ids = [];
|
|
143
|
+
if (model.prd?.prdId) ids.push(model.prd.prdId);
|
|
144
|
+
for (const r of model.requirements) if (r.reqId) ids.push(r.reqId);
|
|
145
|
+
for (const u of model.userStories) if (u.usId) ids.push(u.usId);
|
|
146
|
+
if (model.tad?.tadId) ids.push(model.tad.tadId);
|
|
147
|
+
for (const t of model.tacs) if (t.tacId) ids.push(t.tacId);
|
|
148
|
+
for (const a of model.adrs) if (a.adrId) ids.push(a.adrId);
|
|
149
|
+
if (model.bs?.bsId) ids.push(model.bs.bsId);
|
|
150
|
+
for (const f of model.fbsItems) if (f.fbsId) ids.push(f.fbsId);
|
|
151
|
+
return ids;
|
|
152
|
+
}
|