@work-graph/cli 0.2.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 (194) hide show
  1. package/README.md +31 -0
  2. package/bin/work-graph.mjs +238 -0
  3. package/package.json +38 -0
  4. package/vendor/packages/design-tokens/generated/gripe-dark-default.css +67 -0
  5. package/vendor/packages/design-tokens/generated/marketplace-default.css +67 -0
  6. package/vendor/packages/design-tokens/generated/workgraph-dark.css +67 -0
  7. package/vendor/packages/workgraph-mcp/README.md +28 -0
  8. package/vendor/packages/workgraph-mcp/bin/workgraph-mcp.mjs +21 -0
  9. package/vendor/packages/workgraph-mcp/package.json +37 -0
  10. package/vendor/packages/workgraph-mcp/src/handlers.mjs +761 -0
  11. package/vendor/packages/workgraph-mcp/src/index.mjs +638 -0
  12. package/vendor/packages/workgraph-mcp/src/prompts.mjs +162 -0
  13. package/vendor/public/assets/workgraph-logo.svg +11 -0
  14. package/vendor/public/fonts/GraphikLCG/GraphikLCG-Medium.woff2 +0 -0
  15. package/vendor/public/fonts/GraphikLCG/GraphikLCG-Regular.woff2 +0 -0
  16. package/vendor/public/fonts/GraphikLCG/GraphikLCG-Semibold.woff2 +0 -0
  17. package/vendor/public/fonts/GraphikLCG/stylesheet.css +25 -0
  18. package/vendor/public/graph-canvas-lit-flow.css +154 -0
  19. package/vendor/public/graph-canvas-lit-flow.css.map +7 -0
  20. package/vendor/public/graph-canvas-lit-flow.js +8530 -0
  21. package/vendor/public/graph-canvas-lit-flow.js.map +7 -0
  22. package/vendor/src/agentBehaviorRulesAudit.mjs +168 -0
  23. package/vendor/src/agentBehaviorRulesBundle.mjs +144 -0
  24. package/vendor/src/agentRunApi.mjs +136 -0
  25. package/vendor/src/agentToolLoopGuard.mjs +88 -0
  26. package/vendor/src/agentWorkerClaudeProvider.mjs +288 -0
  27. package/vendor/src/agentWorkerCursorSdkProvider.mjs +156 -0
  28. package/vendor/src/agentWorkerLiveLoop.mjs +455 -0
  29. package/vendor/src/agentWorkerLocalCliProvider.mjs +217 -0
  30. package/vendor/src/agentWorkerLocalRunner.mjs +246 -0
  31. package/vendor/src/agentWorkerOpenAiProvider.mjs +459 -0
  32. package/vendor/src/analyticsPanelProjection.mjs +212 -0
  33. package/vendor/src/analyticsRecordStore.mjs +165 -0
  34. package/vendor/src/analyticsRecordWorkItems.mjs +104 -0
  35. package/vendor/src/architectureL1Canon.mjs +419 -0
  36. package/vendor/src/architectureLayout.mjs +229 -0
  37. package/vendor/src/architectureSnapshot.mjs +490 -0
  38. package/vendor/src/architectureViewsProjection.mjs +116 -0
  39. package/vendor/src/atomInspector.mjs +253 -0
  40. package/vendor/src/atomInspectorApi.mjs +130 -0
  41. package/vendor/src/auditGapMatrixRefresh.mjs +121 -0
  42. package/vendor/src/backlogSchemaLint.mjs +176 -0
  43. package/vendor/src/blockedOnebaseGoPreflightEval.mjs +100 -0
  44. package/vendor/src/bracketIrTraceSignal.mjs +93 -0
  45. package/vendor/src/bvcAtomParser.mjs +210 -0
  46. package/vendor/src/bvcDialectRegistry.mjs +86 -0
  47. package/vendor/src/bvcFileFormat.mjs +218 -0
  48. package/vendor/src/bvcFormatCli.mjs +55 -0
  49. package/vendor/src/bvcLintCli.mjs +48 -0
  50. package/vendor/src/bvcNewWritePolicy.mjs +70 -0
  51. package/vendor/src/charterPreflightPromoteGate.mjs +194 -0
  52. package/vendor/src/claimNoEligibleEval.mjs +205 -0
  53. package/vendor/src/closingAnalysisSuggest.mjs +59 -0
  54. package/vendor/src/codeGapAnalyzer.mjs +308 -0
  55. package/vendor/src/codeGapBacklogFeeder.mjs +82 -0
  56. package/vendor/src/codeGapDraftIntakeApi.mjs +307 -0
  57. package/vendor/src/codeGapOperatorProjection.mjs +60 -0
  58. package/vendor/src/codeSyntaxHighlight.mjs +123 -0
  59. package/vendor/src/codegenEvidence.mjs +187 -0
  60. package/vendor/src/compilerRoundTripCli.mjs +164 -0
  61. package/vendor/src/dagreGraphLayout.mjs +78 -0
  62. package/vendor/src/draftIntakePromotionRules.mjs +205 -0
  63. package/vendor/src/epicWorkScope.mjs +85 -0
  64. package/vendor/src/evalLiveLlmEnv.mjs +63 -0
  65. package/vendor/src/evidenceReadModel.mjs +167 -0
  66. package/vendor/src/gfsOverlayProjectPassport.mjs +235 -0
  67. package/vendor/src/globalStepPathToBvcReferences.mjs +196 -0
  68. package/vendor/src/goldenPath.mjs +69 -0
  69. package/vendor/src/graphCanvasLayout.mjs +464 -0
  70. package/vendor/src/graphCanvasLitFlow/client/graphCanvasMinimap.ts +261 -0
  71. package/vendor/src/graphCanvasLitFlow/client/graphCanvasSvgEdges.ts +259 -0
  72. package/vendor/src/graphCanvasLitFlow/client/graphCanvasTheme.css +152 -0
  73. package/vendor/src/graphCanvasLitFlow/client/graphCardNode.ts +328 -0
  74. package/vendor/src/graphCanvasLitFlow/client/mountGraphCanvasLitFlow.ts +322 -0
  75. package/vendor/src/graphCanvasLitFlow/graphCanvasEdgeLabels.mjs +58 -0
  76. package/vendor/src/graphCanvasLitFlow/graphCanvasEdgeRouter.mjs +142 -0
  77. package/vendor/src/graphCanvasLitFlow/graphCanvasLayoutProfile.mjs +32 -0
  78. package/vendor/src/graphCanvasLitFlow/graphCanvasNodeMetrics.mjs +45 -0
  79. package/vendor/src/graphCanvasLitFlow/graphCanvasProjection.mjs +115 -0
  80. package/vendor/src/graphCanvasLitFlow/graphCanvasProjectionToFlow.mjs +133 -0
  81. package/vendor/src/graphCanvasLitFlow/graphCanvasTraversal.mjs +77 -0
  82. package/vendor/src/graphCanvasLitFlow/layoutIntentRoadmapWorkStack.mjs +73 -0
  83. package/vendor/src/graphCanvasLitFlow/resolveGraphCanvasOverlaps.mjs +77 -0
  84. package/vendor/src/graphRagContextSlice.mjs +461 -0
  85. package/vendor/src/gvmVerifyWorkerGate.mjs +95 -0
  86. package/vendor/src/homeSnapshotApi.mjs +131 -0
  87. package/vendor/src/homeSnapshotProjection.mjs +275 -0
  88. package/vendor/src/inboxEventStream.mjs +140 -0
  89. package/vendor/src/intentComposerApi.mjs +245 -0
  90. package/vendor/src/intentGraphGbcSliceBoundary.mjs +258 -0
  91. package/vendor/src/intentGraphProjection.mjs +208 -0
  92. package/vendor/src/intentHierarchy.mjs +241 -0
  93. package/vendor/src/intentNodeLint.mjs +107 -0
  94. package/vendor/src/intentNodeRuntime.mjs +185 -0
  95. package/vendor/src/intentRoadmapCanvas.mjs +393 -0
  96. package/vendor/src/intentRoadmapEpicProjection.mjs +122 -0
  97. package/vendor/src/intentRoadmapMermaid.mjs +165 -0
  98. package/vendor/src/intentRoadmapProjection.mjs +85 -0
  99. package/vendor/src/intentTreeLint.mjs +114 -0
  100. package/vendor/src/intentTreeMigration.mjs +150 -0
  101. package/vendor/src/intentTreeWorkItems.mjs +227 -0
  102. package/vendor/src/kanbanBoardProjection.mjs +58 -0
  103. package/vendor/src/languageAdapterRegistry.mjs +180 -0
  104. package/vendor/src/languageAdapters/goAdapter.mjs +62 -0
  105. package/vendor/src/languageAdapters/jsTsAdapter.mjs +60 -0
  106. package/vendor/src/languageAdapters/jsonYamlAdapter.mjs +103 -0
  107. package/vendor/src/languageAdapters/onebaseOsAdapter.mjs +55 -0
  108. package/vendor/src/languageAdapters/plaintextAdapter.mjs +36 -0
  109. package/vendor/src/languageAdapters/shared.mjs +68 -0
  110. package/vendor/src/languageAdapters/stepAdapter.mjs +81 -0
  111. package/vendor/src/lintPlanWorkAlignment.mjs +136 -0
  112. package/vendor/src/loopHintRepeatToolEval.mjs +153 -0
  113. package/vendor/src/lowcodeScaffoldCli.mjs +386 -0
  114. package/vendor/src/markdownDocumentRender.mjs +208 -0
  115. package/vendor/src/memoryPanelProjection.mjs +116 -0
  116. package/vendor/src/memoryRecordWriter.mjs +243 -0
  117. package/vendor/src/memoryWorkerSlice.mjs +238 -0
  118. package/vendor/src/migrateStepToBvc.mjs +133 -0
  119. package/vendor/src/missionControlServerHandlers.mjs +195 -0
  120. package/vendor/src/missionControlUiClient.mjs +278 -0
  121. package/vendor/src/onebaseCliCapabilityProbe.mjs +107 -0
  122. package/vendor/src/onebaseCliRunner.mjs +145 -0
  123. package/vendor/src/onebaseGrossProfitStaticVerify.mjs +98 -0
  124. package/vendor/src/onebaseParityEvidenceSync.mjs +88 -0
  125. package/vendor/src/onebasePvrgGraphNodes.mjs +257 -0
  126. package/vendor/src/onebaseRestEvidenceAdapter.mjs +216 -0
  127. package/vendor/src/onebaseVectorDslCodegenReadiness.mjs +137 -0
  128. package/vendor/src/onebaseWorkItemTemplate.mjs +154 -0
  129. package/vendor/src/onebaseWorkerTools.mjs +586 -0
  130. package/vendor/src/operatorShellProjection.mjs +102 -0
  131. package/vendor/src/pipelineProseRender.mjs +180 -0
  132. package/vendor/src/pipelineStageLint.mjs +118 -0
  133. package/vendor/src/promptRulesEditorApi.mjs +174 -0
  134. package/vendor/src/promptRulesProjection.mjs +134 -0
  135. package/vendor/src/pvrg/bladeAdapter.mjs +40 -0
  136. package/vendor/src/pvrgTaskScope.mjs +152 -0
  137. package/vendor/src/releaseGateMatrix.mjs +188 -0
  138. package/vendor/src/schematicView.mjs +305 -0
  139. package/vendor/src/seedAnalyticsRecord.mjs +217 -0
  140. package/vendor/src/semanticSearchBm25.mjs +103 -0
  141. package/vendor/src/semanticSearchExcerpts.mjs +68 -0
  142. package/vendor/src/semanticSearchTfidfVector.mjs +86 -0
  143. package/vendor/src/semanticSearchWorkflow.mjs +366 -0
  144. package/vendor/src/stepAtomFormatter.mjs +413 -0
  145. package/vendor/src/stepGraphSlice.mjs +318 -0
  146. package/vendor/src/ui/atoms/badge.mjs +40 -0
  147. package/vendor/src/ui/atoms/badgeClient.mjs +32 -0
  148. package/vendor/src/ui/atoms/button.mjs +114 -0
  149. package/vendor/src/ui/atoms/buttonClient.mjs +49 -0
  150. package/vendor/src/ui/atoms/icon.mjs +23 -0
  151. package/vendor/src/ui/atoms/input.mjs +38 -0
  152. package/vendor/src/ui/atoms/modal.mjs +44 -0
  153. package/vendor/src/ui/atoms/select.mjs +98 -0
  154. package/vendor/src/ui/backlogShellButtons.mjs +238 -0
  155. package/vendor/src/ui/htmlEscape.mjs +11 -0
  156. package/vendor/src/ui/molecules/rating.mjs +48 -0
  157. package/vendor/src/ui/molecules/tabs.mjs +70 -0
  158. package/vendor/src/ui/organisms/modal.mjs +1 -0
  159. package/vendor/src/ui/pages/uiKitPage.mjs +147 -0
  160. package/vendor/src/ui/workItemStatusTone.mjs +36 -0
  161. package/vendor/src/unifiedLinkageProjection.mjs +264 -0
  162. package/vendor/src/verificationLoop.mjs +206 -0
  163. package/vendor/src/workGraphBacklogPersist.mjs +234 -0
  164. package/vendor/src/workGraphBacklogUiServer.mjs +9192 -0
  165. package/vendor/src/workGraphBoundedTargetFileRead.mjs +178 -0
  166. package/vendor/src/workGraphCycleSlice.mjs +184 -0
  167. package/vendor/src/workGraphDaemonTick.mjs +307 -0
  168. package/vendor/src/workGraphDaemonWatch.mjs +157 -0
  169. package/vendor/src/workGraphEngineRoot.mjs +136 -0
  170. package/vendor/src/workGraphInstallLayout.mjs +65 -0
  171. package/vendor/src/workGraphLlmUsefulnessEval.mjs +611 -0
  172. package/vendor/src/workGraphPhasePromoteReadyQueue.mjs +159 -0
  173. package/vendor/src/workGraphProjectHost.mjs +149 -0
  174. package/vendor/src/workGraphProjectInit.mjs +392 -0
  175. package/vendor/src/workGraphPromoteReadyApi.mjs +115 -0
  176. package/vendor/src/workGraphRecoveryPolicy.mjs +124 -0
  177. package/vendor/src/workGraphRunnerQueueProjection.mjs +187 -0
  178. package/vendor/src/workGraphRuntime.mjs +1008 -0
  179. package/vendor/src/workGraphToolSurfaceAudit.mjs +372 -0
  180. package/vendor/src/workGraphToolTransportRuntime.mjs +195 -0
  181. package/vendor/src/workGraphWorkerProvider.mjs +600 -0
  182. package/vendor/src/workItemBvcQuality.mjs +262 -0
  183. package/vendor/src/workItemCreateAnalysis.mjs +157 -0
  184. package/vendor/src/workItemDecisionPipeline.mjs +278 -0
  185. package/vendor/src/workItemEpicCascade.mjs +176 -0
  186. package/vendor/src/workItemExecutionGate.mjs +78 -0
  187. package/vendor/src/workItemHierarchy.mjs +226 -0
  188. package/vendor/src/workItemProseLint.mjs +133 -0
  189. package/vendor/src/workItemTextRusify.mjs +794 -0
  190. package/vendor/src/workItemTraceEnvelope.mjs +158 -0
  191. package/vendor/src/workItemUiReferences.mjs +272 -0
  192. package/vendor/src/workflowEpicGrouping.mjs +67 -0
  193. package/vendor/src/workflowTreeProjection.mjs +53 -0
  194. package/vendor/src/workspaceRegistry.mjs +150 -0
@@ -0,0 +1,216 @@
1
+ import { buildEvidenceRecordFromLegacyLine } from './evidenceReadModel.mjs';
2
+
3
+ export const ONEBASE_REST_EVIDENCE_SOURCE_CHECK = 'onebase.cli.check';
4
+ export const ONEBASE_REST_EVIDENCE_SOURCE_DESCRIBE = 'onebase.cli.describe';
5
+
6
+ function normalizeCliResult(cliResult) {
7
+ if (!cliResult || typeof cliResult !== 'object') {
8
+ return {
9
+ ok: false,
10
+ exitCode: 1,
11
+ command: 'onebase',
12
+ stdout: '',
13
+ stderr: '',
14
+ failureClass: 'cli_error',
15
+ message: 'invalid cli result',
16
+ };
17
+ }
18
+
19
+ return cliResult;
20
+ }
21
+
22
+ export function parseOnebaseDescribePayload(stdout) {
23
+ const text = String(stdout ?? '').trim();
24
+ if (text === '') {
25
+ return { ok: false, error: 'empty describe stdout', payload: null };
26
+ }
27
+
28
+ try {
29
+ const payload = JSON.parse(text);
30
+ return { ok: true, error: null, payload };
31
+ } catch (error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ return { ok: false, error: message, payload: null };
34
+ }
35
+ }
36
+
37
+ export function summarizeOnebaseDescribePayload(payload) {
38
+ if (!payload || typeof payload !== 'object') {
39
+ return {
40
+ documents: 0,
41
+ catalogs: 0,
42
+ registers: 0,
43
+ reports: 0,
44
+ widgets: 0,
45
+ totalArtifacts: 0,
46
+ };
47
+ }
48
+
49
+ const counts = {
50
+ documents: Array.isArray(payload.documents) ? payload.documents.length : 0,
51
+ catalogs: Array.isArray(payload.catalogs) ? payload.catalogs.length : 0,
52
+ registers: Array.isArray(payload.registers) ? payload.registers.length : 0,
53
+ reports: Array.isArray(payload.reports) ? payload.reports.length : 0,
54
+ widgets: Array.isArray(payload.widgets) ? payload.widgets.length : 0,
55
+ };
56
+
57
+ return {
58
+ ...counts,
59
+ totalArtifacts: Object.values(counts).reduce((sum, value) => sum + value, 0),
60
+ };
61
+ }
62
+
63
+ export function buildEvidenceRecordsFromOnebaseCheck(taskId, cliResult, options = {}) {
64
+ const result = normalizeCliResult(cliResult);
65
+ const sequence = Number.isInteger(options.sequence) ? options.sequence : 1;
66
+
67
+ return [{
68
+ schema: 'evidence-record.v1',
69
+ id: `${taskId}:onebase-check:${sequence}`,
70
+ time: options.time ?? null,
71
+ source: ONEBASE_REST_EVIDENCE_SOURCE_CHECK,
72
+ taskId,
73
+ type: 'command',
74
+ summary: result.ok
75
+ ? `onebase check passed (${result.command ?? 'onebase check'})`
76
+ : `onebase check failed: ${result.message ?? result.stderr ?? result.stdout ?? 'unknown error'}`,
77
+ status: result.ok ? 'succeeded' : 'failed',
78
+ details: {
79
+ exitCode: result.exitCode ?? null,
80
+ failureClass: result.failureClass ?? null,
81
+ command: result.command ?? null,
82
+ },
83
+ artifacts: [{
84
+ kind: 'cli',
85
+ command: result.command ?? 'onebase check',
86
+ stdoutSnippet: String(result.stdout ?? '').slice(0, 500),
87
+ stderrSnippet: String(result.stderr ?? '').slice(0, 500),
88
+ }],
89
+ }];
90
+ }
91
+
92
+ export function buildEvidenceRecordsFromOnebaseDescribe(taskId, cliResult, options = {}) {
93
+ const result = normalizeCliResult(cliResult);
94
+ const parsed = parseOnebaseDescribePayload(result.stdout);
95
+ const sequence = Number.isInteger(options.sequence) ? options.sequence : 1;
96
+ const summaryCounts = summarizeOnebaseDescribePayload(parsed.payload);
97
+
98
+ const records = [{
99
+ schema: 'evidence-record.v1',
100
+ id: `${taskId}:onebase-describe:${sequence}`,
101
+ time: options.time ?? null,
102
+ source: ONEBASE_REST_EVIDENCE_SOURCE_DESCRIBE,
103
+ taskId,
104
+ type: 'command',
105
+ summary: parsed.ok
106
+ ? `onebase describe: ${summaryCounts.totalArtifacts} artifacts (documents=${summaryCounts.documents}, catalogs=${summaryCounts.catalogs})`
107
+ : `onebase describe failed: ${parsed.error ?? result.message ?? 'invalid JSON'}`,
108
+ status: result.ok && parsed.ok ? 'succeeded' : 'failed',
109
+ details: {
110
+ exitCode: result.exitCode ?? null,
111
+ failureClass: result.failureClass ?? null,
112
+ command: result.command ?? null,
113
+ counts: summaryCounts,
114
+ parseError: parsed.ok ? null : parsed.error,
115
+ },
116
+ artifacts: [{
117
+ kind: 'cli',
118
+ command: result.command ?? 'onebase describe --json',
119
+ stdoutSnippet: String(result.stdout ?? '').slice(0, 500),
120
+ }],
121
+ }];
122
+
123
+ if (parsed.ok && Array.isArray(parsed.payload?.documents)) {
124
+ for (const [index, document] of parsed.payload.documents.entries()) {
125
+ if (!document?.name) {
126
+ continue;
127
+ }
128
+
129
+ records.push({
130
+ schema: 'evidence-record.v1',
131
+ id: `${taskId}:onebase-describe:document:${index + 1}`,
132
+ time: options.time ?? null,
133
+ source: ONEBASE_REST_EVIDENCE_SOURCE_DESCRIBE,
134
+ taskId,
135
+ type: 'change',
136
+ summary: `document ${document.name}${document.posting ? ' (posting)' : ''}`,
137
+ status: 'succeeded',
138
+ details: {
139
+ onebaseKind: 'document',
140
+ name: document.name,
141
+ posting: document.posting ?? false,
142
+ },
143
+ artifacts: [{
144
+ kind: 'onebase-metadata',
145
+ name: document.name,
146
+ restPath: `/documents/${encodeURIComponent(document.name)}`,
147
+ }],
148
+ });
149
+ }
150
+ }
151
+
152
+ return records;
153
+ }
154
+
155
+ export function buildEvidenceRecordsFromOnebaseCli(subcommand, cliResult, taskId, options = {}) {
156
+ const normalized = String(subcommand ?? '').trim().toLowerCase();
157
+ if (normalized === 'check') {
158
+ return buildEvidenceRecordsFromOnebaseCheck(taskId, cliResult, options);
159
+ }
160
+
161
+ if (normalized === 'describe') {
162
+ return buildEvidenceRecordsFromOnebaseDescribe(taskId, cliResult, options);
163
+ }
164
+
165
+ return [];
166
+ }
167
+
168
+ export function buildOnebaseRestEvidenceAdapterResult(subcommand, cliResult, taskId, options = {}) {
169
+ const records = buildEvidenceRecordsFromOnebaseCli(subcommand, cliResult, taskId, options);
170
+ const ok = records.length > 0 && records.every((record) => record.status !== 'failed');
171
+
172
+ return {
173
+ schema: 'onebase.rest-evidence.adapter.v1',
174
+ subcommand,
175
+ taskId,
176
+ ok,
177
+ recordCount: records.length,
178
+ records,
179
+ workerEvidence: records.map((record) => ({
180
+ kind: 'onebase_rest_evidence',
181
+ source: record.source,
182
+ result: record.status === 'succeeded' ? 'succeeded' : 'failed',
183
+ summary: record.summary,
184
+ evidenceRecordId: record.id,
185
+ })),
186
+ legacyLines: records.map((record) => record.summary),
187
+ };
188
+ }
189
+
190
+ export function mergeOnebaseRestEvidenceIntoWorkerOutput(output, adapterResult) {
191
+ if (!output || !adapterResult || adapterResult.recordCount === 0) {
192
+ return output;
193
+ }
194
+
195
+ const evidence = [
196
+ ...(Array.isArray(output.evidence) ? output.evidence : []),
197
+ ...adapterResult.workerEvidence,
198
+ ];
199
+
200
+ return {
201
+ ...output,
202
+ evidence,
203
+ };
204
+ }
205
+
206
+ export function buildLegacyEvidenceLinesFromRecords(records) {
207
+ return (records ?? []).map((record) => record.summary).filter(Boolean);
208
+ }
209
+
210
+ export function coerceOnebaseRestEvidenceRecord(record, taskId, index) {
211
+ if (record?.schema === 'evidence-record.v1') {
212
+ return record;
213
+ }
214
+
215
+ return buildEvidenceRecordFromLegacyLine(taskId, String(record ?? ''), index);
216
+ }
@@ -0,0 +1,137 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+
4
+ import { readWorkItemsFromIntentTree } from './intentTreeWorkItems.mjs';
5
+ import { RELEASE_GATE_ROWS } from './releaseGateMatrix.mjs';
6
+ import { buildOneBaseMcpParityMatrix } from './onebaseWorkItemTemplate.mjs';
7
+
8
+ export const ONEBASE_VECTOR_DSL_CODEGEN_READINESS_SCHEMA = 'onebase.vector-dsl.codegen-readiness.v1';
9
+ export const ONEBASE_CODEGEN_PILOT_WORK_ID = 'onebase-vector-dsl-codegen-pilot';
10
+
11
+ const DONE_STATUSES = new Set(['done', 'verified']);
12
+ const APPROVED_PILOT_STATUSES = new Set(['ready', 'claimed', 'doing', 'in_progress', 'verify', 'done', 'verified']);
13
+
14
+ async function pathExists(path) {
15
+ try {
16
+ await access(path);
17
+ return true;
18
+ } catch {
19
+ return false;
20
+ }
21
+ }
22
+
23
+ function itemById(items) {
24
+ return new Map(items.map((item) => [item.id, item]));
25
+ }
26
+
27
+ function hasGoldenPathEvidence(items) {
28
+ const goldenPathIds = [
29
+ 'onebase-implement-gross-profit-warehouse-dimension',
30
+ 'onebase-posting-rule-golden-path',
31
+ 'onebase-posting-scenario-design',
32
+ ];
33
+ return goldenPathIds.some((id) => {
34
+ const item = items.find((entry) => entry.id === id);
35
+ return item && DONE_STATUSES.has(item.status);
36
+ });
37
+ }
38
+
39
+ /**
40
+ * @param {{ cwd?: string, items?: import('./workGraphRuntime.mjs').WorkItem[], releaseGateRows?: typeof RELEASE_GATE_ROWS, deferStepPath?: string }} [options]
41
+ */
42
+ export async function evaluateOnebaseVectorDslCodegenReadiness(options = {}) {
43
+ const cwd = resolve(options.cwd ?? process.cwd());
44
+ const items = options.items ?? await readWorkItemsFromIntentTree({ cwd });
45
+ const byId = itemById(items);
46
+ const releaseGateRows = options.releaseGateRows ?? RELEASE_GATE_ROWS;
47
+ const deferStepPath = resolve(cwd, options.deferStepPath ?? 'domains/onebase/defer-vector-dsl-codegen.bvc');
48
+
49
+ const phase7 = byId.get('phase-7-onebase-vertical');
50
+ const templatePath = resolve(cwd, 'domains/onebase/workitem-template.bvc');
51
+ const mcpParityPath = resolve(cwd, 'protocols/onebase-mcp-parity-v1.bvc');
52
+ const pilotItem = byId.get(ONEBASE_CODEGEN_PILOT_WORK_ID);
53
+
54
+ const phase7Closed = Boolean(phase7 && DONE_STATUSES.has(phase7.status));
55
+ const templateExists = await pathExists(templatePath);
56
+ const mcpParityExists = await pathExists(mcpParityPath);
57
+ const parityMatrix = buildOneBaseMcpParityMatrix();
58
+ const goldenPathRepeatable = hasGoldenPathEvidence(items);
59
+ const optionalOnebaseGate = releaseGateRows.some((row) => row.command === 'npm run test:optional:onebase');
60
+ const compilerRoundtripGate = releaseGateRows.some((row) => row.id === 'compiler-roundtrip-fixture');
61
+ const pilotApproved = Boolean(
62
+ pilotItem
63
+ && APPROVED_PILOT_STATUSES.has(pilotItem.status)
64
+ && String(pilotItem.labels?.['migration.strategy'] ?? '').trim() !== 'defer',
65
+ );
66
+
67
+ const triggers = [
68
+ {
69
+ id: 'phase-7-closed-with-bridge-artifacts',
70
+ label: 'phase-7-onebase-vertical closed with template + MCP parity + ≥1 repeatable golden path',
71
+ met: phase7Closed && templateExists && mcpParityExists && goldenPathRepeatable,
72
+ evidence: [
73
+ phase7 ? `phase-7 status=${phase7.status}` : 'phase-7 missing',
74
+ templateExists ? templatePath : 'missing workitem template',
75
+ mcpParityExists ? mcpParityPath : 'missing MCP parity protocol',
76
+ goldenPathRepeatable ? 'golden-path work item done' : 'no done golden-path work item',
77
+ ],
78
+ },
79
+ {
80
+ id: 'optional-onebase-ci-tier',
81
+ label: 'npm run test:optional:onebase registered in optional CI tier',
82
+ met: optionalOnebaseGate,
83
+ evidence: optionalOnebaseGate
84
+ ? 'releaseGateMatrix optional-env onebase-go-optional'
85
+ : 'release gate row missing',
86
+ },
87
+ {
88
+ id: 'compiler-roundtrip-wired',
89
+ label: 'Compiler round-trip evidence contract wired for compiler-mode steps',
90
+ met: compilerRoundtripGate,
91
+ evidence: compilerRoundtripGate
92
+ ? 'releaseGateMatrix compiler-roundtrip-fixture'
93
+ : 'compiler roundtrip gate missing',
94
+ },
95
+ {
96
+ id: 'codegen-pilot-approved',
97
+ label: `Explicit WorkItem ${ONEBASE_CODEGEN_PILOT_WORK_ID} approved (not auto-promotion)`,
98
+ met: pilotApproved,
99
+ evidence: pilotApproved
100
+ ? `${ONEBASE_CODEGEN_PILOT_WORK_ID} status=${pilotItem.status}`
101
+ : `create/promote ${ONEBASE_CODEGEN_PILOT_WORK_ID} when reopening codegen`,
102
+ },
103
+ ];
104
+
105
+ const deferStepText = await readFile(deferStepPath, 'utf8');
106
+ const recommendation = triggers.every((trigger) => trigger.met) ? 'reopen-codegen-pilot' : 'keep-deferred';
107
+
108
+ return {
109
+ schema: ONEBASE_VECTOR_DSL_CODEGEN_READINESS_SCHEMA,
110
+ recommendation,
111
+ readyToReopenCodegen: recommendation === 'reopen-codegen-pilot',
112
+ deferStepPath,
113
+ parityCapabilityCount: parityMatrix?.rows?.length ?? 0,
114
+ triggerCount: triggers.length,
115
+ metCount: triggers.filter((trigger) => trigger.met).length,
116
+ triggers,
117
+ checklist: triggers.map((trigger) => ({
118
+ criterion: trigger.label,
119
+ met: trigger.met,
120
+ evidence: trigger.evidence,
121
+ })),
122
+ deferStepReferencesReadiness: deferStepText.includes('evaluateOnebaseVectorDslCodegenReadiness')
123
+ || deferStepText.includes('onebaseVectorDslCodegenReadiness'),
124
+ };
125
+ }
126
+
127
+ export function formatOnebaseVectorDslCodegenReadinessReport(report) {
128
+ const lines = [
129
+ `onebase vector-dsl codegen readiness: ${report.recommendation} (${report.metCount}/${report.triggerCount} triggers met)`,
130
+ ];
131
+
132
+ for (const trigger of report.triggers) {
133
+ lines.push(`${trigger.met ? 'ok' : 'pending'}: ${trigger.label}`);
134
+ }
135
+
136
+ return lines.join('\n');
137
+ }
@@ -0,0 +1,154 @@
1
+ const compareText = (left, right) => String(left).localeCompare(String(right), 'en', { sensitivity: 'variant' });
2
+
3
+ export const ONEBASE_WORKITEM_TEMPLATE_V1 = {
4
+ schema: 'onebase.workitem.template.v1',
5
+ department: 'product-architecture',
6
+ domainId: 'onebase',
7
+ verificationCwd: '../onebase',
8
+ preflightCommand: 'go version',
9
+ primaryCommand: 'go test ./...',
10
+ workGraphVerifyCommand: 'npm run test:optional:onebase',
11
+ staticGateCommand: 'verifyOnebaseGrossProfitWarehouseArtifacts',
12
+ };
13
+
14
+ export function buildOneBaseWorkItemDraft(input) {
15
+ if (input === undefined || input === null || typeof input !== 'object') {
16
+ throw new TypeError('input must be an object');
17
+ }
18
+
19
+ const workId = String(input.workId ?? '').trim();
20
+ if (workId === '') {
21
+ throw new Error('workId is required');
22
+ }
23
+
24
+ const document = String(input.document ?? input.onebaseDocument ?? '').trim();
25
+ const rule = String(input.rule ?? input.onebaseRule ?? '').trim();
26
+ const title = String(input.title ?? `OneBase: ${rule || document || workId}`).trim();
27
+ const targetFiles = [...(input.targetFiles ?? [])].map(String).filter(Boolean).sort(compareText);
28
+ const rollbackNotes = String(input.rollbackNotes ?? '').trim();
29
+ const restEvidenceRefs = [...(input.restEvidenceRefs ?? [])].map(String).filter(Boolean).sort(compareText);
30
+
31
+ const basis = input.basis ?? `OneBase change for ${document || rule || workId}.`;
32
+ const vector = input.vector ?? 'Update bounded YAML/.os/report artifacts per domains/onebase/artifact-mapping.bvc.';
33
+ const goal = input.goal ?? 'Repeatable domain change with deterministic verification evidence.';
34
+
35
+ const checks = [
36
+ 'metadata scan или artifact-mapping выполнен до правок',
37
+ 'target YAML/.os/report/widget files перечислены в work.target_files',
38
+ 'go version preflight + go test ./... или blocked environment evidence записаны',
39
+ 'rollback notes и preserved invariants задокументированы',
40
+ ];
41
+
42
+ if (restEvidenceRefs.length > 0) {
43
+ checks.push('REST evidence refs записаны или помечены blocked');
44
+ }
45
+
46
+ return {
47
+ schema: 'onebase.workitem.draft.v1',
48
+ template: ONEBASE_WORKITEM_TEMPLATE_V1.schema,
49
+ atomName: `#OneBase_${workId.replace(/-/gu, '_')}<[`,
50
+ sections: {
51
+ basis,
52
+ vector,
53
+ goal,
54
+ checks,
55
+ evidenceHints: [
56
+ ONEBASE_WORKITEM_TEMPLATE_V1.workGraphVerifyCommand,
57
+ `${ONEBASE_WORKITEM_TEMPLATE_V1.preflightCommand} + ${ONEBASE_WORKITEM_TEMPLATE_V1.primaryCommand}`,
58
+ ONEBASE_WORKITEM_TEMPLATE_V1.staticGateCommand,
59
+ ],
60
+ rollbackNotes,
61
+ },
62
+ labels: {
63
+ 'atom.profile': 'work_item',
64
+ 'work.id': workId,
65
+ 'work.title': title,
66
+ 'work.status': input.status ?? 'backlog',
67
+ 'work.department': ONEBASE_WORKITEM_TEMPLATE_V1.department,
68
+ 'work.owner_role': input.ownerRole ?? 'domain_architect',
69
+ 'work.target_files': targetFiles.join(', '),
70
+ 'domain.id': ONEBASE_WORKITEM_TEMPLATE_V1.domainId,
71
+ 'onebase.document': document,
72
+ 'onebase.rule': rule,
73
+ 'verification.primary_command': ONEBASE_WORKITEM_TEMPLATE_V1.primaryCommand,
74
+ 'verification.preflight_command': ONEBASE_WORKITEM_TEMPLATE_V1.preflightCommand,
75
+ 'verification.cwd': ONEBASE_WORKITEM_TEMPLATE_V1.verificationCwd,
76
+ ...(restEvidenceRefs.length > 0 ? { 'onebase.rest_evidence_refs': restEvidenceRefs.join(', ') } : {}),
77
+ ...(rollbackNotes ? { 'onebase.rollback_notes': rollbackNotes.slice(0, 200) } : {}),
78
+ 'trace.status': 'pending',
79
+ 'migration.strategy': input.migrationStrategy ?? 'port',
80
+ },
81
+ dependsOn: [...(input.dependsOn ?? ['onebase-posting-rule-golden-path'])].sort(compareText),
82
+ };
83
+ }
84
+
85
+ export function buildOneBaseMcpParityMatrix() {
86
+ return {
87
+ schema: 'onebase.access.parity.v1',
88
+ rows: [
89
+ {
90
+ capability: 'metadata_scan',
91
+ builtInTool: 'onebaseListMetadata',
92
+ mcpTool: 'list_metadata',
93
+ workGraphCli: 'verifyOnebaseGrossProfitWarehouseArtifacts',
94
+ ciGate: false,
95
+ notes: 'list_metadata prefers onebase describe --json with scan fallback',
96
+ },
97
+ {
98
+ capability: 'describe_config',
99
+ builtInTool: null,
100
+ mcpTool: 'describe_config',
101
+ workGraphCli: 'onebase describe --json',
102
+ ciGate: false,
103
+ },
104
+ {
105
+ capability: 'check_config',
106
+ builtInTool: null,
107
+ mcpTool: 'check_config',
108
+ workGraphCli: 'onebase check',
109
+ ciGate: false,
110
+ notes: 'optional operator/DoD gate when OneBase CLI supports check',
111
+ },
112
+ {
113
+ capability: 'ai_guide',
114
+ builtInTool: null,
115
+ mcpTool: 'ai_guide',
116
+ workGraphCli: 'onebase ai-guide',
117
+ ciGate: false,
118
+ },
119
+ {
120
+ capability: 'read_config_file',
121
+ builtInTool: 'workspace read + scan',
122
+ mcpTool: 'read_config_file',
123
+ workGraphCli: 'static artifact verify',
124
+ ciGate: false,
125
+ },
126
+ {
127
+ capability: 'rest_read',
128
+ builtInTool: 'onebaseRestCall',
129
+ mcpTool: 'rest_get',
130
+ workGraphCli: 'optional manual',
131
+ ciGate: false,
132
+ },
133
+ {
134
+ capability: 'dev_health',
135
+ builtInTool: 'onebaseDevStatus',
136
+ mcpTool: 'env ONEBASE_* in MCP server',
137
+ workGraphCli: 'go version preflight',
138
+ ciGate: true,
139
+ },
140
+ {
141
+ capability: 'deterministic_verify',
142
+ builtInTool: null,
143
+ mcpTool: null,
144
+ workGraphCli: 'npm run test:optional:onebase',
145
+ ciGate: true,
146
+ },
147
+ ],
148
+ rules: [
149
+ 'CI/done gate uses work graph CLI only',
150
+ 'MCP and built-in tools are discovery/agent paths',
151
+ 'REST evidence is optional and may be blocked',
152
+ ],
153
+ };
154
+ }