@rsaglobaltech/specgate 0.27.9 → 1.0.0-rc.2

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 (144) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/packages/core/src/application/ValidateChangeUseCase.js +19 -3
  3. package/dist/packages/core/src/application/ValidateChangeUseCase.js.map +1 -1
  4. package/dist/packages/core/src/domain/ApiContract.js +157 -0
  5. package/dist/packages/core/src/domain/ApiContract.js.map +1 -0
  6. package/dist/packages/core/src/domain/Approvals.js +127 -0
  7. package/dist/packages/core/src/domain/Approvals.js.map +1 -0
  8. package/dist/packages/core/src/domain/ChangeLayers.js +285 -0
  9. package/dist/packages/core/src/domain/ChangeLayers.js.map +1 -0
  10. package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
  11. package/dist/packages/core/src/domain/HarnessGaps.js +182 -0
  12. package/dist/packages/core/src/domain/HarnessGaps.js.map +1 -0
  13. package/dist/packages/core/src/domain/HarnessReport.js +16 -1
  14. package/dist/packages/core/src/domain/HarnessReport.js.map +1 -1
  15. package/dist/packages/core/src/domain/HarnessRun.js.map +1 -1
  16. package/dist/packages/core/src/domain/Principles.js +119 -0
  17. package/dist/packages/core/src/domain/Principles.js.map +1 -0
  18. package/dist/packages/core/src/domain/RequirementGraph.js +12 -1
  19. package/dist/packages/core/src/domain/RequirementGraph.js.map +1 -1
  20. package/dist/packages/core/src/domain/Workspace.js +150 -0
  21. package/dist/packages/core/src/domain/Workspace.js.map +1 -0
  22. package/dist/packages/core/src/domain/WorkspaceStory.js +176 -0
  23. package/dist/packages/core/src/domain/WorkspaceStory.js.map +1 -0
  24. package/dist/packages/core/src/index.js +1 -0
  25. package/dist/packages/core/src/index.js.map +1 -1
  26. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +12 -0
  27. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
  28. package/dist/packages/mcp-spec-driven/src/tools.js +18 -0
  29. package/dist/packages/mcp-spec-driven/src/tools.js.map +1 -1
  30. package/dist/scripts/alm/cli.js +45 -4
  31. package/dist/scripts/alm/cli.js.map +1 -1
  32. package/dist/scripts/alm/clients.js +3 -1
  33. package/dist/scripts/alm/clients.js.map +1 -1
  34. package/dist/scripts/alm/phases.js +279 -0
  35. package/dist/scripts/alm/phases.js.map +1 -0
  36. package/dist/scripts/alm/port.js +33 -5
  37. package/dist/scripts/alm/port.js.map +1 -1
  38. package/dist/scripts/alm/providers/azure.js +72 -11
  39. package/dist/scripts/alm/providers/azure.js.map +1 -1
  40. package/dist/scripts/alm/providers/github.js +67 -7
  41. package/dist/scripts/alm/providers/github.js.map +1 -1
  42. package/dist/scripts/alm/providers/index.js +8 -2
  43. package/dist/scripts/alm/providers/index.js.map +1 -1
  44. package/dist/scripts/alm/providers/jira.js +86 -8
  45. package/dist/scripts/alm/providers/jira.js.map +1 -1
  46. package/dist/scripts/alm/providers/linear.js +167 -0
  47. package/dist/scripts/alm/providers/linear.js.map +1 -0
  48. package/dist/scripts/change/artifacts.js +15 -1
  49. package/dist/scripts/change/artifacts.js.map +1 -1
  50. package/dist/scripts/change/instructions.js +47 -5
  51. package/dist/scripts/change/instructions.js.map +1 -1
  52. package/dist/scripts/cli/commands/alm/PhaseCommand.js +153 -0
  53. package/dist/scripts/cli/commands/alm/PhaseCommand.js.map +1 -0
  54. package/dist/scripts/cli/commands/alm/PullCommand.js +33 -2
  55. package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -1
  56. package/dist/scripts/cli/commands/alm/pull-back.js +104 -0
  57. package/dist/scripts/cli/commands/alm/pull-back.js.map +1 -0
  58. package/dist/scripts/cli/commands/change/ChangeCommand.js +149 -15
  59. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  60. package/dist/scripts/cli/commands/change/TicketCommand.js +20 -7
  61. package/dist/scripts/cli/commands/change/TicketCommand.js.map +1 -1
  62. package/dist/scripts/cli/commands/harness/RunCommand.js +64 -20
  63. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  64. package/dist/scripts/cli/commands/project/AdoptCommand.js +44 -4
  65. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
  66. package/dist/scripts/cli/commands/project/InitProjectCommand.js +9 -14
  67. package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
  68. package/dist/scripts/cli/commands/project/MigrateCommand.js +166 -0
  69. package/dist/scripts/cli/commands/project/MigrateCommand.js.map +1 -0
  70. package/dist/scripts/cli/commands/project/OnboardCommand.js +23 -5
  71. package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -1
  72. package/dist/scripts/cli/commands/quality/CheckCommand.js +25 -0
  73. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
  74. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +15 -0
  75. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
  76. package/dist/scripts/cli/commands/spec/ContractCommand.js +117 -0
  77. package/dist/scripts/cli/commands/spec/ContractCommand.js.map +1 -0
  78. package/dist/scripts/cli/commands/spec/DoneCommand.js +22 -0
  79. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
  80. package/dist/scripts/cli/commands/spec/DraftCommand.js +22 -8
  81. package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
  82. package/dist/scripts/cli/commands/spec/DriftCommand.js +128 -0
  83. package/dist/scripts/cli/commands/spec/DriftCommand.js.map +1 -0
  84. package/dist/scripts/cli/commands/spec/StatusCommand.js +85 -0
  85. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  86. package/dist/scripts/cli/commands/spec/StudioCommand.js +48 -6
  87. package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
  88. package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js +612 -0
  89. package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js.map +1 -0
  90. package/dist/scripts/contract.js +10 -0
  91. package/dist/scripts/contract.js.map +1 -0
  92. package/dist/scripts/docs/nav.js +16 -1
  93. package/dist/scripts/docs/nav.js.map +1 -1
  94. package/dist/scripts/draft/drafting-guide.js +6 -0
  95. package/dist/scripts/draft/drafting-guide.js.map +1 -1
  96. package/dist/scripts/draft/ticket-guide.js +5 -0
  97. package/dist/scripts/draft/ticket-guide.js.map +1 -1
  98. package/dist/scripts/drift.js +10 -0
  99. package/dist/scripts/drift.js.map +1 -0
  100. package/dist/scripts/harness/gap-evidence.js +149 -0
  101. package/dist/scripts/harness/gap-evidence.js.map +1 -0
  102. package/dist/scripts/harness/prompt.js +54 -1
  103. package/dist/scripts/harness/prompt.js.map +1 -1
  104. package/dist/scripts/harness/report.js +104 -5
  105. package/dist/scripts/harness/report.js.map +1 -1
  106. package/dist/scripts/lib/approvals.js +243 -0
  107. package/dist/scripts/lib/approvals.js.map +1 -0
  108. package/dist/scripts/lib/change-review.js +19 -11
  109. package/dist/scripts/lib/change-review.js.map +1 -1
  110. package/dist/scripts/lib/contracts.js +211 -0
  111. package/dist/scripts/lib/contracts.js.map +1 -0
  112. package/dist/scripts/lib/drift.js +80 -0
  113. package/dist/scripts/lib/drift.js.map +1 -0
  114. package/dist/scripts/lib/live-model.js +1 -0
  115. package/dist/scripts/lib/live-model.js.map +1 -1
  116. package/dist/scripts/lib/migrate.js +264 -0
  117. package/dist/scripts/lib/migrate.js.map +1 -0
  118. package/dist/scripts/lib/role-packages.js +230 -0
  119. package/dist/scripts/lib/role-packages.js.map +1 -0
  120. package/dist/scripts/lib/steering.js +180 -0
  121. package/dist/scripts/lib/steering.js.map +1 -0
  122. package/dist/scripts/lib/studio-app-page.js +28 -5
  123. package/dist/scripts/lib/studio-app-page.js.map +1 -1
  124. package/dist/scripts/lib/studio-app.js +29 -0
  125. package/dist/scripts/lib/studio-app.js.map +1 -1
  126. package/dist/scripts/lib/studio-route.js +20 -0
  127. package/dist/scripts/lib/studio-route.js.map +1 -1
  128. package/dist/scripts/lib/surface.js +55 -0
  129. package/dist/scripts/lib/surface.js.map +1 -1
  130. package/dist/scripts/lib/workspace-draft.js +146 -0
  131. package/dist/scripts/lib/workspace-draft.js.map +1 -0
  132. package/dist/scripts/lib/workspace-live-page.js +90 -0
  133. package/dist/scripts/lib/workspace-live-page.js.map +1 -0
  134. package/dist/scripts/lib/workspace-live.js +199 -0
  135. package/dist/scripts/lib/workspace-live.js.map +1 -0
  136. package/dist/scripts/lib/workspace.js +619 -0
  137. package/dist/scripts/lib/workspace.js.map +1 -0
  138. package/dist/scripts/migrate.js +10 -0
  139. package/dist/scripts/migrate.js.map +1 -0
  140. package/dist/scripts/schema/registry.js +12 -0
  141. package/dist/scripts/schema/registry.js.map +1 -1
  142. package/dist/scripts/workspace.js +10 -0
  143. package/dist/scripts/workspace.js.map +1 -0
  144. package/package.json +1 -1
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.storyRel = exports.WORKSPACE_BRIEF = void 0;
37
+ exports.workspaceBrief = workspaceBrief;
38
+ exports.readWorkspaceStories = readWorkspaceStories;
39
+ exports.scaffoldStory = scaffoldStory;
40
+ exports.storyPrompt = storyPrompt;
41
+ exports.draftStoryWithAgent = draftStoryWithAgent;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const Workspace_1 = require("../../packages/core/src/domain/Workspace");
45
+ const WorkspaceStory_1 = require("../../packages/core/src/domain/WorkspaceStory");
46
+ const confined_agent_1 = require("../draft/confined-agent");
47
+ /**
48
+ * The client's brief in a workspace repository, and the stories it holds
49
+ * (REQ-339..340). A workspace brief names stories, as a project's names
50
+ * modules: each story is split across the repositories it touches.
51
+ */
52
+ exports.WORKSPACE_BRIEF = path.join("docs", "brief.md");
53
+ /**
54
+ * `docs/brief.md` of the workspace, made from a root `brief.md` the first
55
+ * time — the client's text kept as it is, below a front matter to fill.
56
+ */
57
+ function workspaceBrief(ws) {
58
+ const file = path.join(ws.dir, exports.WORKSPACE_BRIEF);
59
+ let created = false;
60
+ if (!fs.existsSync(file)) {
61
+ const root = path.join(ws.dir, "brief.md");
62
+ const body = fs.existsSync(root)
63
+ ? fs.readFileSync(root, "utf8").replace(/\r\n/g, "\n")
64
+ : "# Brief\n\nPaste the client's brief here as it is.\n";
65
+ fs.mkdirSync(path.dirname(file), { recursive: true });
66
+ fs.writeFileSync(file, (0, WorkspaceStory_1.workspaceBriefTemplate)(ws.config.name, ws.config.repos.map((r) => r.name)) + body, "utf8");
67
+ created = true;
68
+ }
69
+ const text = fs.readFileSync(file, "utf8");
70
+ return {
71
+ file: exports.WORKSPACE_BRIEF.split(path.sep).join("/"),
72
+ created,
73
+ stories: (0, WorkspaceStory_1.briefStories)((0, WorkspaceStory_1.briefFrontMatter)(text)),
74
+ };
75
+ }
76
+ /** The stories the workspace brief names, without writing anything. */
77
+ function readWorkspaceStories(ws) {
78
+ const file = path.join(ws.dir, exports.WORKSPACE_BRIEF);
79
+ if (!fs.existsSync(file))
80
+ return [];
81
+ return (0, WorkspaceStory_1.briefStories)((0, WorkspaceStory_1.briefFrontMatter)(fs.readFileSync(file, "utf8")));
82
+ }
83
+ /** The story folder, relative to the workspace repository. */
84
+ const storyRel = (id) => `${Workspace_1.STORIES_DIR}/${id}`;
85
+ exports.storyRel = storyRel;
86
+ /** The story's folder with its `story.yaml` (no parts yet) and a `story.md` to fill. */
87
+ function scaffoldStory(ws, story) {
88
+ const dir = path.join(ws.dir, Workspace_1.STORIES_DIR, story.id);
89
+ fs.mkdirSync(dir, { recursive: true });
90
+ const written = [];
91
+ const yaml = path.join(dir, "story.yaml");
92
+ if (!fs.existsSync(yaml)) {
93
+ fs.writeFileSync(yaml, (0, Workspace_1.renderStory)({ id: story.id, title: story.title, subchanges: [] }), "utf8");
94
+ written.push(`${(0, exports.storyRel)(story.id)}/story.yaml`);
95
+ }
96
+ const md = path.join(dir, "story.md");
97
+ if (!fs.existsSync(md)) {
98
+ fs.writeFileSync(md, (0, WorkspaceStory_1.storyTemplate)(story.title, story.repos), "utf8");
99
+ written.push(`${(0, exports.storyRel)(story.id)}/story.md`);
100
+ }
101
+ return written;
102
+ }
103
+ /** What the agent drafting a story is told: the brief, the story, and the format. */
104
+ function storyPrompt(ws, story) {
105
+ const brief = (0, WorkspaceStory_1.briefText)(fs.readFileSync(path.join(ws.dir, exports.WORKSPACE_BRIEF), "utf8"));
106
+ const file = `${(0, exports.storyRel)(story.id)}/story.md`;
107
+ return [
108
+ `# Draft the story ${story.id} of the workspace ${ws.config.name}`,
109
+ "",
110
+ `Write \`${file}\`: the business story "${story.title}", which the repositories ${story.repos
111
+ .map((r) => `\`${r}\``)
112
+ .join(", ")} will each build a part of. Write nothing else.`,
113
+ "",
114
+ "## The rules",
115
+ "",
116
+ "- **Intent:** who needs what, and why, in the client's words — quote the brief where it says it. No technology: each repository's design says how.",
117
+ "- **Acceptance criteria:** one line each, `- AC-1: …`, `- AC-2: …`, each a thing a person can see or check. Only what the brief supports; a number the brief does not give is a question, not a guess.",
118
+ "- Keep the file's headings: `## Intent`, `## Acceptance criteria`, `## Repositories`.",
119
+ "",
120
+ `## The file as it is now: ${file}`,
121
+ "",
122
+ "```markdown",
123
+ fs.readFileSync(path.join(ws.dir, file), "utf8").trimEnd(),
124
+ "```",
125
+ "",
126
+ "## The client's brief",
127
+ "",
128
+ brief.trimEnd(),
129
+ "",
130
+ ].join("\n");
131
+ }
132
+ /** An agent drafts the story, confined to its folder (REQ-340). */
133
+ function draftStoryWithAgent(ws, story, command, showOutput) {
134
+ const { command: cmd, added } = (0, confined_agent_1.withWritePermission)(command);
135
+ const prefix = `${(0, exports.storyRel)(story.id)}/`;
136
+ const run = (0, confined_agent_1.runConfinedAgent)({
137
+ projectDir: ws.dir,
138
+ changeId: story.id,
139
+ allowed: (rel) => rel.split(path.sep).join("/").startsWith(prefix),
140
+ command: cmd,
141
+ prompt: storyPrompt(ws, story),
142
+ showOutput,
143
+ });
144
+ return { ...run, permissionAdded: added };
145
+ }
146
+ //# sourceMappingURL=workspace-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-draft.js","sourceRoot":"","sources":["../../../scripts/lib/workspace-draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workspaceLivePage = workspaceLivePage;
4
+ /**
5
+ * The workspace's live page (REQ-323): one panel per repository — the
6
+ * requirement in flight, its gate step and the agent's last step — then each
7
+ * story with its parts, and the cost. Filled from `/live.json`, kept current by
8
+ * `/live/stream`; every value is set with textContent, never as HTML.
9
+ *
10
+ * The script lives inside this template literal: it uses no backticks, no
11
+ * dollar-brace, and no backslash escapes.
12
+ */
13
+ function workspaceLivePage(workspaceName) {
14
+ const title = String(workspaceName).replace(/[&<>"']/g, "");
15
+ return `<!doctype html>
16
+ <html lang="en"><head><meta charset="utf-8"/>
17
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
18
+ <title>Workspace live — ${title}</title>
19
+ <style>
20
+ :root{--bg:#f6f8fa;--panel:#fff;--line:#d1d9e0;--ink:#1f2328;--muted:#59636e;--pass:#1a7f37;--fail:#cf222e;
21
+ --run:#9a6700;--accent:#0969da;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
22
+ --sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;color-scheme:light}
23
+ @media (prefers-color-scheme: dark){:root{--bg:#0d1117;--panel:#151b23;--line:#3d444d;--ink:#f0f6fc;--muted:#9198a1;
24
+ --pass:#3fb950;--fail:#f85149;--run:#d29922;--accent:#4493f8;color-scheme:dark}}
25
+ *{box-sizing:border-box}
26
+ body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.45 var(--sans)}
27
+ header{padding:14px 20px;border-bottom:1px solid var(--line);background:var(--panel);display:flex;gap:12px;align-items:baseline}
28
+ header b{font-size:16px} header span{color:var(--muted)}
29
+ main{padding:16px 20px;display:grid;gap:20px}
30
+ h2{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:0 0 8px}
31
+ .repos{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}
32
+ .card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:12px}
33
+ .card h3{margin:0 0 6px;font-size:15px} .role{color:var(--muted);font-weight:400;font-size:12px;margin-left:6px}
34
+ .idle{color:var(--muted)} .req{font-family:var(--mono)} .step{color:var(--run)} .agent{color:var(--muted);font-family:var(--mono);font-size:12px;word-break:break-all}
35
+ .cost{margin-top:8px;color:var(--muted);font-size:12px}
36
+ table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:8px}
37
+ th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
38
+ th{font-size:12px;color:var(--muted);font-weight:600}
39
+ .state-building{color:var(--run)} .state-archived{color:var(--pass)} .state-missing{color:var(--fail)} .blocked{color:var(--fail);font-size:12px}
40
+ </style></head>
41
+ <body>
42
+ <header><b>Workspace live</b><span>${title}</span><span id="updated"></span></header>
43
+ <main>
44
+ <section><h2>Repositories</h2><div class="repos" id="repos"></div></section>
45
+ <section><h2>Stories</h2><table><thead><tr><th>Story</th><th>Parts</th><th>Cost</th></tr></thead><tbody id="stories"></tbody></table></section>
46
+ </main>
47
+ <script>
48
+ (function(){
49
+ function el(tag, cls, text){ var e = document.createElement(tag); if (cls) e.className = cls; if (text !== undefined) e.textContent = text; return e; }
50
+ function cost(c){ var m = c.money === null ? "—" : "$" + c.money.toFixed(2); return m + " · " + c.minutes + " min"; }
51
+ function since(t){ if (!t) return ""; var s = Math.max(0, Math.round(Date.now() / 1000 - t)); return s < 60 ? s + " s" : Math.floor(s / 60) + " min"; }
52
+ function render(m){
53
+ var repos = document.getElementById("repos"); repos.textContent = "";
54
+ m.repos.forEach(function(r){
55
+ var c = el("div", "card"); var h = el("h3", "", r.name); h.appendChild(el("span", "role", r.role)); c.appendChild(h);
56
+ if (!r.exists) c.appendChild(el("div", "idle", "folder missing"));
57
+ else if (!r.inFlight) c.appendChild(el("div", "idle", r.queue.length ? "queued: " + r.queue.join(", ") : "idle"));
58
+ else {
59
+ var f = r.inFlight; c.appendChild(el("div", "req", f.req + " · attempt " + f.attempt + (f.title ? " — " + f.title : "")));
60
+ if (f.running) c.appendChild(el("div", "step", f.running.stage + (f.running.runner ? " (" + f.running.runner + ")" : "") + " · " + since(f.running.since)));
61
+ else c.appendChild(el("div", "step", f.phase));
62
+ if (f.agent) c.appendChild(el("div", "agent", f.agent.kind + " " + f.agent.target));
63
+ }
64
+ c.appendChild(el("div", "cost", r.requirements.pass + " passed · " + r.requirements.fail + " failed · " + cost(r.cost)));
65
+ repos.appendChild(c);
66
+ });
67
+ var body = document.getElementById("stories"); body.textContent = "";
68
+ m.stories.forEach(function(s){
69
+ var tr = el("tr"); var name = el("td"); name.appendChild(el("div", "", s.title || s.id)); name.appendChild(el("div", "idle", s.done ? "done" : s.id)); tr.appendChild(name);
70
+ var parts = el("td");
71
+ s.subchanges.forEach(function(p){
72
+ var d = el("div"); d.appendChild(el("span", "", p.repo + " ")); d.appendChild(el("span", "state-" + p.state, p.state));
73
+ if (p.blockedBy.length) d.appendChild(el("div", "blocked", "waits on " + p.blockedBy.join(", ")));
74
+ parts.appendChild(d);
75
+ });
76
+ tr.appendChild(parts); tr.appendChild(el("td", "", cost(s.cost))); body.appendChild(tr);
77
+ });
78
+ document.getElementById("updated").textContent = "updated " + new Date().toLocaleTimeString();
79
+ }
80
+ fetch("/live.json").then(function(r){ return r.json(); }).then(function(d){ render(d.live); });
81
+ if (window.EventSource) {
82
+ var es = new EventSource("/live/stream");
83
+ es.addEventListener("live", function(ev){ try { render(JSON.parse(ev.data)); } catch (e) {} });
84
+ }
85
+ })();
86
+ </script>
87
+ </body></html>
88
+ `;
89
+ }
90
+ //# sourceMappingURL=workspace-live-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-live-page.js","sourceRoot":"","sources":["../../../scripts/lib/workspace-live-page.ts"],"names":[],"mappings":";;AASA,8CA4EC;AArFD;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAAC,aAAqB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO;;;0BAGiB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;qCAwBM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CzC,CAAC;AACF,CAAC"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.partRequirements = partRequirements;
37
+ exports.readWorkspaceLive = readWorkspaceLive;
38
+ exports.workspaceLiveSignature = workspaceLiveSignature;
39
+ const fs = __importStar(require("node:fs"));
40
+ const path = __importStar(require("node:path"));
41
+ const Workspace_1 = require("../../packages/core/src/domain/Workspace");
42
+ const live_model_1 = require("./live-model");
43
+ const in_flight_1 = require("./in-flight");
44
+ const workspace_1 = require("./workspace");
45
+ /** The requirements a sub-change's delta adds or modifies, open or archived, with their dependencies and scenarios. */
46
+ function partRequirements(memberDir, change) {
47
+ return (0, workspace_1.changeRequirements)(memberDir, change).map(({ id, depends, scenarios }) => ({
48
+ id,
49
+ depends,
50
+ scenarios,
51
+ }));
52
+ }
53
+ /** Minutes the member's ledger recorded, for the requirements `only` names (all when absent). */
54
+ function ledgerMinutes(memberDir, only) {
55
+ const runs = path.join(memberDir, ".harness", "runs");
56
+ let ms = 0;
57
+ let files = [];
58
+ try {
59
+ files = fs.readdirSync(runs).filter((f) => f.endsWith(".json"));
60
+ }
61
+ catch {
62
+ return 0;
63
+ }
64
+ for (const f of files) {
65
+ try {
66
+ const doc = JSON.parse(fs.readFileSync(path.join(runs, f), "utf8"));
67
+ for (const r of doc.results || []) {
68
+ if (only && !only.has(String(r.requirement)))
69
+ continue;
70
+ if (Number(r.durationMs) > 0)
71
+ ms += Number(r.durationMs);
72
+ }
73
+ }
74
+ catch {
75
+ /* a ledger being written */
76
+ }
77
+ }
78
+ return Math.round(ms / 60000);
79
+ }
80
+ function money(reqs) {
81
+ const costs = reqs
82
+ .map((r) => (r.usage && r.usage.cost !== null ? r.usage.cost : null))
83
+ .filter((c) => c !== null);
84
+ return costs.length ? Math.round(costs.reduce((a, b) => a + b, 0) * 100) / 100 : null;
85
+ }
86
+ function sumCost(costs) {
87
+ const paid = costs.map((c) => c.money).filter((m) => m !== null);
88
+ return {
89
+ money: paid.length ? Math.round(paid.reduce((a, b) => a + b, 0) * 100) / 100 : null,
90
+ minutes: costs.reduce((a, c) => a + c.minutes, 0),
91
+ };
92
+ }
93
+ function repoLive(ws, name, role, live) {
94
+ const dir = ws.dirs[name];
95
+ const reqs = live ? live.requirements : [];
96
+ const running = reqs.find((r) => r.state === "running") || null;
97
+ const lastStep = running
98
+ ? [...running.steps].reverse().find((e) => e.type === "step" && e.kind)
99
+ : undefined;
100
+ return {
101
+ name,
102
+ role,
103
+ exists: live !== null,
104
+ queue: live ? live.queue : [],
105
+ inFlight: running
106
+ ? {
107
+ req: running.req,
108
+ title: running.title,
109
+ attempt: running.attempt,
110
+ phase: running.phase,
111
+ elapsed: running.elapsed,
112
+ running: running.running,
113
+ agent: lastStep
114
+ ? { kind: String(lastStep.kind), target: String(lastStep.target || "") }
115
+ : null,
116
+ }
117
+ : null,
118
+ requirements: {
119
+ running: reqs.filter((r) => r.state === "running").length,
120
+ pass: reqs.filter((r) => r.state === "pass").length,
121
+ fail: reqs.filter((r) => r.state === "fail").length,
122
+ },
123
+ cost: { money: money(reqs), minutes: live ? ledgerMinutes(dir) : 0 },
124
+ };
125
+ }
126
+ /** The workspace's live model: every repository's harness, and every story's parts (REQ-320..322). */
127
+ function readWorkspaceLive(ws) {
128
+ const lives = new Map();
129
+ for (const r of ws.config.repos) {
130
+ const dir = ws.dirs[r.name];
131
+ lives.set(r.name, fs.existsSync(dir) ? (0, live_model_1.readLive)(dir) : null);
132
+ }
133
+ const statuses = new Map();
134
+ const statusOf = (repo, req) => {
135
+ if (!ws.dirs[repo] || !fs.existsSync(ws.dirs[repo]))
136
+ return "";
137
+ if (!statuses.has(repo))
138
+ statuses.set(repo, (0, workspace_1.memberStatuses)(ws.dirs[repo]));
139
+ return statuses.get(repo).get(req) || "";
140
+ };
141
+ const stories = (0, workspace_1.readStories)(ws.dir).map((s) => {
142
+ const costs = [];
143
+ const subchanges = s.subchanges.map((sc) => {
144
+ const dir = ws.dirs[sc.repo];
145
+ const exists = !!dir && fs.existsSync(dir);
146
+ const base = exists ? (0, workspace_1.subChangeState)(dir, sc.change) : "missing";
147
+ // REQ-347: an archived part's requirements still count in the story's cost.
148
+ const reqs = exists && base !== "missing" ? partRequirements(dir, sc.change) : [];
149
+ const ids = new Set(reqs.map((r) => r.id));
150
+ const live = lives.get(sc.repo);
151
+ const seen = live ? live.requirements.filter((r) => ids.has(r.req)) : [];
152
+ const blockedBy = [
153
+ ...new Set((base === "open" ? reqs : []).flatMap((r) => r.depends.filter((d) => {
154
+ const q = (0, Workspace_1.splitQualified)(d);
155
+ return !!q && !in_flight_1.DELIVERED.includes(statusOf(q.repo, q.id));
156
+ }))),
157
+ ];
158
+ if (exists)
159
+ costs.push({ money: money(seen), minutes: ledgerMinutes(dir, ids) });
160
+ return {
161
+ repo: sc.repo,
162
+ change: sc.change,
163
+ state: (base === "open" && seen.length > 0 ? "building" : base),
164
+ requirements: [...ids],
165
+ blockedBy,
166
+ };
167
+ });
168
+ return {
169
+ id: s.id,
170
+ title: s.title,
171
+ done: subchanges.length > 0 && subchanges.every((p) => p.state === "archived"),
172
+ subchanges,
173
+ cost: sumCost(costs),
174
+ };
175
+ });
176
+ return {
177
+ schemaVersion: 1,
178
+ name: ws.config.name,
179
+ dir: ws.dir,
180
+ repos: ws.config.repos.map((r) => repoLive(ws, r.name, r.role, lives.get(r.name) || null)),
181
+ stories,
182
+ };
183
+ }
184
+ /** Changes whenever a member's events or the workspace's stories change. */
185
+ function workspaceLiveSignature(ws) {
186
+ const parts = ws.config.repos.map((r) => fs.existsSync(ws.dirs[r.name]) ? (0, live_model_1.liveSignature)(ws.dirs[r.name]) : r.name);
187
+ const stories = path.join(ws.dir, Workspace_1.STORIES_DIR);
188
+ try {
189
+ for (const e of fs.readdirSync(stories)) {
190
+ const st = fs.statSync(path.join(stories, e, "story.yaml"));
191
+ parts.push(`${e}:${st.mtimeMs}`);
192
+ }
193
+ }
194
+ catch {
195
+ /* no stories yet */
196
+ }
197
+ return parts.join("|");
198
+ }
199
+ //# sourceMappingURL=workspace-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-live.js","sourceRoot":"","sources":["../../../scripts/lib/workspace-live.ts"],"names":[],"mappings":"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"}