@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.
- package/README.md +31 -0
- package/bin/work-graph.mjs +238 -0
- package/package.json +38 -0
- package/vendor/packages/design-tokens/generated/gripe-dark-default.css +67 -0
- package/vendor/packages/design-tokens/generated/marketplace-default.css +67 -0
- package/vendor/packages/design-tokens/generated/workgraph-dark.css +67 -0
- package/vendor/packages/workgraph-mcp/README.md +28 -0
- package/vendor/packages/workgraph-mcp/bin/workgraph-mcp.mjs +21 -0
- package/vendor/packages/workgraph-mcp/package.json +37 -0
- package/vendor/packages/workgraph-mcp/src/handlers.mjs +761 -0
- package/vendor/packages/workgraph-mcp/src/index.mjs +638 -0
- package/vendor/packages/workgraph-mcp/src/prompts.mjs +162 -0
- package/vendor/public/assets/workgraph-logo.svg +11 -0
- package/vendor/public/fonts/GraphikLCG/GraphikLCG-Medium.woff2 +0 -0
- package/vendor/public/fonts/GraphikLCG/GraphikLCG-Regular.woff2 +0 -0
- package/vendor/public/fonts/GraphikLCG/GraphikLCG-Semibold.woff2 +0 -0
- package/vendor/public/fonts/GraphikLCG/stylesheet.css +25 -0
- package/vendor/public/graph-canvas-lit-flow.css +154 -0
- package/vendor/public/graph-canvas-lit-flow.css.map +7 -0
- package/vendor/public/graph-canvas-lit-flow.js +8530 -0
- package/vendor/public/graph-canvas-lit-flow.js.map +7 -0
- package/vendor/src/agentBehaviorRulesAudit.mjs +168 -0
- package/vendor/src/agentBehaviorRulesBundle.mjs +144 -0
- package/vendor/src/agentRunApi.mjs +136 -0
- package/vendor/src/agentToolLoopGuard.mjs +88 -0
- package/vendor/src/agentWorkerClaudeProvider.mjs +288 -0
- package/vendor/src/agentWorkerCursorSdkProvider.mjs +156 -0
- package/vendor/src/agentWorkerLiveLoop.mjs +455 -0
- package/vendor/src/agentWorkerLocalCliProvider.mjs +217 -0
- package/vendor/src/agentWorkerLocalRunner.mjs +246 -0
- package/vendor/src/agentWorkerOpenAiProvider.mjs +459 -0
- package/vendor/src/analyticsPanelProjection.mjs +212 -0
- package/vendor/src/analyticsRecordStore.mjs +165 -0
- package/vendor/src/analyticsRecordWorkItems.mjs +104 -0
- package/vendor/src/architectureL1Canon.mjs +419 -0
- package/vendor/src/architectureLayout.mjs +229 -0
- package/vendor/src/architectureSnapshot.mjs +490 -0
- package/vendor/src/architectureViewsProjection.mjs +116 -0
- package/vendor/src/atomInspector.mjs +253 -0
- package/vendor/src/atomInspectorApi.mjs +130 -0
- package/vendor/src/auditGapMatrixRefresh.mjs +121 -0
- package/vendor/src/backlogSchemaLint.mjs +176 -0
- package/vendor/src/blockedOnebaseGoPreflightEval.mjs +100 -0
- package/vendor/src/bracketIrTraceSignal.mjs +93 -0
- package/vendor/src/bvcAtomParser.mjs +210 -0
- package/vendor/src/bvcDialectRegistry.mjs +86 -0
- package/vendor/src/bvcFileFormat.mjs +218 -0
- package/vendor/src/bvcFormatCli.mjs +55 -0
- package/vendor/src/bvcLintCli.mjs +48 -0
- package/vendor/src/bvcNewWritePolicy.mjs +70 -0
- package/vendor/src/charterPreflightPromoteGate.mjs +194 -0
- package/vendor/src/claimNoEligibleEval.mjs +205 -0
- package/vendor/src/closingAnalysisSuggest.mjs +59 -0
- package/vendor/src/codeGapAnalyzer.mjs +308 -0
- package/vendor/src/codeGapBacklogFeeder.mjs +82 -0
- package/vendor/src/codeGapDraftIntakeApi.mjs +307 -0
- package/vendor/src/codeGapOperatorProjection.mjs +60 -0
- package/vendor/src/codeSyntaxHighlight.mjs +123 -0
- package/vendor/src/codegenEvidence.mjs +187 -0
- package/vendor/src/compilerRoundTripCli.mjs +164 -0
- package/vendor/src/dagreGraphLayout.mjs +78 -0
- package/vendor/src/draftIntakePromotionRules.mjs +205 -0
- package/vendor/src/epicWorkScope.mjs +85 -0
- package/vendor/src/evalLiveLlmEnv.mjs +63 -0
- package/vendor/src/evidenceReadModel.mjs +167 -0
- package/vendor/src/gfsOverlayProjectPassport.mjs +235 -0
- package/vendor/src/globalStepPathToBvcReferences.mjs +196 -0
- package/vendor/src/goldenPath.mjs +69 -0
- package/vendor/src/graphCanvasLayout.mjs +464 -0
- package/vendor/src/graphCanvasLitFlow/client/graphCanvasMinimap.ts +261 -0
- package/vendor/src/graphCanvasLitFlow/client/graphCanvasSvgEdges.ts +259 -0
- package/vendor/src/graphCanvasLitFlow/client/graphCanvasTheme.css +152 -0
- package/vendor/src/graphCanvasLitFlow/client/graphCardNode.ts +328 -0
- package/vendor/src/graphCanvasLitFlow/client/mountGraphCanvasLitFlow.ts +322 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasEdgeLabels.mjs +58 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasEdgeRouter.mjs +142 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasLayoutProfile.mjs +32 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasNodeMetrics.mjs +45 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasProjection.mjs +115 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasProjectionToFlow.mjs +133 -0
- package/vendor/src/graphCanvasLitFlow/graphCanvasTraversal.mjs +77 -0
- package/vendor/src/graphCanvasLitFlow/layoutIntentRoadmapWorkStack.mjs +73 -0
- package/vendor/src/graphCanvasLitFlow/resolveGraphCanvasOverlaps.mjs +77 -0
- package/vendor/src/graphRagContextSlice.mjs +461 -0
- package/vendor/src/gvmVerifyWorkerGate.mjs +95 -0
- package/vendor/src/homeSnapshotApi.mjs +131 -0
- package/vendor/src/homeSnapshotProjection.mjs +275 -0
- package/vendor/src/inboxEventStream.mjs +140 -0
- package/vendor/src/intentComposerApi.mjs +245 -0
- package/vendor/src/intentGraphGbcSliceBoundary.mjs +258 -0
- package/vendor/src/intentGraphProjection.mjs +208 -0
- package/vendor/src/intentHierarchy.mjs +241 -0
- package/vendor/src/intentNodeLint.mjs +107 -0
- package/vendor/src/intentNodeRuntime.mjs +185 -0
- package/vendor/src/intentRoadmapCanvas.mjs +393 -0
- package/vendor/src/intentRoadmapEpicProjection.mjs +122 -0
- package/vendor/src/intentRoadmapMermaid.mjs +165 -0
- package/vendor/src/intentRoadmapProjection.mjs +85 -0
- package/vendor/src/intentTreeLint.mjs +114 -0
- package/vendor/src/intentTreeMigration.mjs +150 -0
- package/vendor/src/intentTreeWorkItems.mjs +227 -0
- package/vendor/src/kanbanBoardProjection.mjs +58 -0
- package/vendor/src/languageAdapterRegistry.mjs +180 -0
- package/vendor/src/languageAdapters/goAdapter.mjs +62 -0
- package/vendor/src/languageAdapters/jsTsAdapter.mjs +60 -0
- package/vendor/src/languageAdapters/jsonYamlAdapter.mjs +103 -0
- package/vendor/src/languageAdapters/onebaseOsAdapter.mjs +55 -0
- package/vendor/src/languageAdapters/plaintextAdapter.mjs +36 -0
- package/vendor/src/languageAdapters/shared.mjs +68 -0
- package/vendor/src/languageAdapters/stepAdapter.mjs +81 -0
- package/vendor/src/lintPlanWorkAlignment.mjs +136 -0
- package/vendor/src/loopHintRepeatToolEval.mjs +153 -0
- package/vendor/src/lowcodeScaffoldCli.mjs +386 -0
- package/vendor/src/markdownDocumentRender.mjs +208 -0
- package/vendor/src/memoryPanelProjection.mjs +116 -0
- package/vendor/src/memoryRecordWriter.mjs +243 -0
- package/vendor/src/memoryWorkerSlice.mjs +238 -0
- package/vendor/src/migrateStepToBvc.mjs +133 -0
- package/vendor/src/missionControlServerHandlers.mjs +195 -0
- package/vendor/src/missionControlUiClient.mjs +278 -0
- package/vendor/src/onebaseCliCapabilityProbe.mjs +107 -0
- package/vendor/src/onebaseCliRunner.mjs +145 -0
- package/vendor/src/onebaseGrossProfitStaticVerify.mjs +98 -0
- package/vendor/src/onebaseParityEvidenceSync.mjs +88 -0
- package/vendor/src/onebasePvrgGraphNodes.mjs +257 -0
- package/vendor/src/onebaseRestEvidenceAdapter.mjs +216 -0
- package/vendor/src/onebaseVectorDslCodegenReadiness.mjs +137 -0
- package/vendor/src/onebaseWorkItemTemplate.mjs +154 -0
- package/vendor/src/onebaseWorkerTools.mjs +586 -0
- package/vendor/src/operatorShellProjection.mjs +102 -0
- package/vendor/src/pipelineProseRender.mjs +180 -0
- package/vendor/src/pipelineStageLint.mjs +118 -0
- package/vendor/src/promptRulesEditorApi.mjs +174 -0
- package/vendor/src/promptRulesProjection.mjs +134 -0
- package/vendor/src/pvrg/bladeAdapter.mjs +40 -0
- package/vendor/src/pvrgTaskScope.mjs +152 -0
- package/vendor/src/releaseGateMatrix.mjs +188 -0
- package/vendor/src/schematicView.mjs +305 -0
- package/vendor/src/seedAnalyticsRecord.mjs +217 -0
- package/vendor/src/semanticSearchBm25.mjs +103 -0
- package/vendor/src/semanticSearchExcerpts.mjs +68 -0
- package/vendor/src/semanticSearchTfidfVector.mjs +86 -0
- package/vendor/src/semanticSearchWorkflow.mjs +366 -0
- package/vendor/src/stepAtomFormatter.mjs +413 -0
- package/vendor/src/stepGraphSlice.mjs +318 -0
- package/vendor/src/ui/atoms/badge.mjs +40 -0
- package/vendor/src/ui/atoms/badgeClient.mjs +32 -0
- package/vendor/src/ui/atoms/button.mjs +114 -0
- package/vendor/src/ui/atoms/buttonClient.mjs +49 -0
- package/vendor/src/ui/atoms/icon.mjs +23 -0
- package/vendor/src/ui/atoms/input.mjs +38 -0
- package/vendor/src/ui/atoms/modal.mjs +44 -0
- package/vendor/src/ui/atoms/select.mjs +98 -0
- package/vendor/src/ui/backlogShellButtons.mjs +238 -0
- package/vendor/src/ui/htmlEscape.mjs +11 -0
- package/vendor/src/ui/molecules/rating.mjs +48 -0
- package/vendor/src/ui/molecules/tabs.mjs +70 -0
- package/vendor/src/ui/organisms/modal.mjs +1 -0
- package/vendor/src/ui/pages/uiKitPage.mjs +147 -0
- package/vendor/src/ui/workItemStatusTone.mjs +36 -0
- package/vendor/src/unifiedLinkageProjection.mjs +264 -0
- package/vendor/src/verificationLoop.mjs +206 -0
- package/vendor/src/workGraphBacklogPersist.mjs +234 -0
- package/vendor/src/workGraphBacklogUiServer.mjs +9192 -0
- package/vendor/src/workGraphBoundedTargetFileRead.mjs +178 -0
- package/vendor/src/workGraphCycleSlice.mjs +184 -0
- package/vendor/src/workGraphDaemonTick.mjs +307 -0
- package/vendor/src/workGraphDaemonWatch.mjs +157 -0
- package/vendor/src/workGraphEngineRoot.mjs +136 -0
- package/vendor/src/workGraphInstallLayout.mjs +65 -0
- package/vendor/src/workGraphLlmUsefulnessEval.mjs +611 -0
- package/vendor/src/workGraphPhasePromoteReadyQueue.mjs +159 -0
- package/vendor/src/workGraphProjectHost.mjs +149 -0
- package/vendor/src/workGraphProjectInit.mjs +392 -0
- package/vendor/src/workGraphPromoteReadyApi.mjs +115 -0
- package/vendor/src/workGraphRecoveryPolicy.mjs +124 -0
- package/vendor/src/workGraphRunnerQueueProjection.mjs +187 -0
- package/vendor/src/workGraphRuntime.mjs +1008 -0
- package/vendor/src/workGraphToolSurfaceAudit.mjs +372 -0
- package/vendor/src/workGraphToolTransportRuntime.mjs +195 -0
- package/vendor/src/workGraphWorkerProvider.mjs +600 -0
- package/vendor/src/workItemBvcQuality.mjs +262 -0
- package/vendor/src/workItemCreateAnalysis.mjs +157 -0
- package/vendor/src/workItemDecisionPipeline.mjs +278 -0
- package/vendor/src/workItemEpicCascade.mjs +176 -0
- package/vendor/src/workItemExecutionGate.mjs +78 -0
- package/vendor/src/workItemHierarchy.mjs +226 -0
- package/vendor/src/workItemProseLint.mjs +133 -0
- package/vendor/src/workItemTextRusify.mjs +794 -0
- package/vendor/src/workItemTraceEnvelope.mjs +158 -0
- package/vendor/src/workItemUiReferences.mjs +272 -0
- package/vendor/src/workflowEpicGrouping.mjs +67 -0
- package/vendor/src/workflowTreeProjection.mjs +53 -0
- package/vendor/src/workspaceRegistry.mjs +150 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { pathToFileURL } from 'node:url';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
appendDaemonAuditJournal,
|
|
5
|
+
runWorkGraphDaemonTickFromBacklogFile,
|
|
6
|
+
} from './workGraphDaemonTick.mjs';
|
|
7
|
+
|
|
8
|
+
export const DAEMON_WATCH_OUTPUT_SCHEMA = 'workgraph.daemon.watch.output.v1';
|
|
9
|
+
|
|
10
|
+
function sleep(ms) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
setTimeout(resolve, ms);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function runWorkGraphDaemonWatch(options = {}) {
|
|
17
|
+
const maxTicks = Number.isInteger(options.maxTicks) && options.maxTicks > 0 ? options.maxTicks : 2;
|
|
18
|
+
const intervalMs = Number.isInteger(options.intervalMs) && options.intervalMs >= 0 ? options.intervalMs : 50;
|
|
19
|
+
const maxDurationMs = Number.isInteger(options.maxDurationMs) && options.maxDurationMs > 0 ? options.maxDurationMs : 5000;
|
|
20
|
+
const writeJournal = options.writeJournal !== false;
|
|
21
|
+
const dryRun = options.dryRun !== false;
|
|
22
|
+
const startedAt = Date.now();
|
|
23
|
+
const results = [];
|
|
24
|
+
|
|
25
|
+
for (let index = 0; index < maxTicks; index += 1) {
|
|
26
|
+
if (Date.now() - startedAt >= maxDurationMs) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const tickId = options.tickIdPrefix
|
|
31
|
+
? `${options.tickIdPrefix}-${index + 1}`
|
|
32
|
+
: `watch-tick-${index + 1}`;
|
|
33
|
+
|
|
34
|
+
const result = await runWorkGraphDaemonTickFromBacklogFile({
|
|
35
|
+
...options,
|
|
36
|
+
tickId,
|
|
37
|
+
runId: options.runId ?? `watch-run-${index + 1}`,
|
|
38
|
+
schedulerPolicy: {
|
|
39
|
+
dryRun,
|
|
40
|
+
paused: false,
|
|
41
|
+
...(options.schedulerPolicy ?? {}),
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
if (writeJournal && result.auditRecord) {
|
|
46
|
+
await appendDaemonAuditJournal(result.auditRecord, options);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
results.push({
|
|
50
|
+
tickId: result.tickId,
|
|
51
|
+
ok: result.ok,
|
|
52
|
+
skippedReason: result.skippedReason ?? null,
|
|
53
|
+
selectedTaskId: result.selectedTaskId ?? null,
|
|
54
|
+
event: result.auditRecord?.event ?? null,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (index < maxTicks - 1 && intervalMs > 0) {
|
|
58
|
+
await sleep(intervalMs);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
schema: DAEMON_WATCH_OUTPUT_SCHEMA,
|
|
64
|
+
maxTicks,
|
|
65
|
+
intervalMs,
|
|
66
|
+
maxDurationMs,
|
|
67
|
+
elapsedMs: Date.now() - startedAt,
|
|
68
|
+
tickCount: results.length,
|
|
69
|
+
dryRun,
|
|
70
|
+
writeJournal,
|
|
71
|
+
results,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function parseCliArgs(argv) {
|
|
76
|
+
const options = {
|
|
77
|
+
maxTicks: 2,
|
|
78
|
+
intervalMs: 1000,
|
|
79
|
+
maxDurationMs: 600_000,
|
|
80
|
+
dryRun: false,
|
|
81
|
+
writeJournal: true,
|
|
82
|
+
backlogPath: undefined,
|
|
83
|
+
auditPath: undefined,
|
|
84
|
+
paused: false,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
for (let index = 2; index < argv.length; index += 1) {
|
|
88
|
+
const arg = argv[index];
|
|
89
|
+
|
|
90
|
+
if (arg === '--dry-run') {
|
|
91
|
+
options.dryRun = true;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (arg === '--paused') {
|
|
96
|
+
options.paused = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (arg === '--no-journal') {
|
|
101
|
+
options.writeJournal = false;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (arg === '--max-ticks') {
|
|
106
|
+
options.maxTicks = Number.parseInt(argv[index + 1], 10);
|
|
107
|
+
index += 1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (arg === '--interval-ms') {
|
|
112
|
+
options.intervalMs = Number.parseInt(argv[index + 1], 10);
|
|
113
|
+
index += 1;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (arg === '--max-duration-ms') {
|
|
118
|
+
options.maxDurationMs = Number.parseInt(argv[index + 1], 10);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (arg === '--backlog') {
|
|
123
|
+
options.backlogPath = argv[index + 1];
|
|
124
|
+
index += 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (arg === '--audit') {
|
|
129
|
+
options.auditPath = argv[index + 1];
|
|
130
|
+
index += 1;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return options;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
138
|
+
const cli = parseCliArgs(process.argv);
|
|
139
|
+
const output = await runWorkGraphDaemonWatch({
|
|
140
|
+
backlogPath: cli.backlogPath,
|
|
141
|
+
auditPath: cli.auditPath,
|
|
142
|
+
maxTicks: cli.maxTicks,
|
|
143
|
+
intervalMs: cli.intervalMs,
|
|
144
|
+
maxDurationMs: cli.maxDurationMs,
|
|
145
|
+
dryRun: cli.dryRun,
|
|
146
|
+
writeJournal: cli.writeJournal,
|
|
147
|
+
schedulerPolicy: { paused: cli.paused },
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
console.log(JSON.stringify({
|
|
151
|
+
schema: output.schema,
|
|
152
|
+
tickCount: output.tickCount,
|
|
153
|
+
dryRun: output.dryRun,
|
|
154
|
+
elapsedMs: output.elapsedMs,
|
|
155
|
+
results: output.results,
|
|
156
|
+
}, null, 2));
|
|
157
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
|
+
|
|
6
|
+
const DEPRECATED_ENGINE_ROOT =
|
|
7
|
+
'[work-graph] config.engineRoot устарел — используйте npm install @work-graph/cli или WORKGRAPH_ENGINE_ROOT для разработки WG';
|
|
8
|
+
|
|
9
|
+
export function defaultEngineRootFromCliModule(cliModuleUrl) {
|
|
10
|
+
return resolve(dirname(fileURLToPath(cliModuleUrl)), '../../..');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function pathExists(path) {
|
|
14
|
+
try {
|
|
15
|
+
accessSync(path, constants.R_OK);
|
|
16
|
+
return true;
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function firstExistingPath(candidates) {
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
if (pathExists(candidate)) {
|
|
25
|
+
return candidate;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function isNpmCliPackageRoot(installRoot) {
|
|
32
|
+
return pathExists(join(installRoot, 'vendor/src/workGraphBacklogUiServer.mjs'));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function resolveEngineRoot(options = {}) {
|
|
36
|
+
const { projectRoot, config, cliModuleUrl } = options;
|
|
37
|
+
|
|
38
|
+
if (process.env.WORKGRAPH_ENGINE_ROOT) {
|
|
39
|
+
return resolve(process.env.WORKGRAPH_ENGINE_ROOT);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (config?.engineRoot) {
|
|
43
|
+
console.warn(DEPRECATED_ENGINE_ROOT);
|
|
44
|
+
return resolve(config.engineRoot);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (projectRoot) {
|
|
48
|
+
const fromProject = resolveEngineRootFromNodeModules(projectRoot);
|
|
49
|
+
if (fromProject) {
|
|
50
|
+
return fromProject;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (cliModuleUrl) {
|
|
55
|
+
const fromCli = defaultEngineRootFromCliModule(cliModuleUrl);
|
|
56
|
+
if (pathExists(join(fromCli, 'src/workGraphBacklogUiServer.mjs'))) {
|
|
57
|
+
return fromCli;
|
|
58
|
+
}
|
|
59
|
+
const cliPkgRoot = dirname(fileURLToPath(cliModuleUrl));
|
|
60
|
+
const npmRoot = resolve(cliPkgRoot, '..');
|
|
61
|
+
if (isNpmCliPackageRoot(npmRoot)) {
|
|
62
|
+
return npmRoot;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
throw new Error(
|
|
67
|
+
'Не удалось найти Work Graph engine. Выполните: npm install -D @work-graph/cli @work-graph/mcp '
|
|
68
|
+
+ 'или задайте WORKGRAPH_ENGINE_ROOT для разработки WG.',
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function resolveEngineRootFromNodeModules(projectRoot) {
|
|
73
|
+
const pkgJsonPath = join(resolve(projectRoot), 'package.json');
|
|
74
|
+
if (!pathExists(pkgJsonPath)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const require = createRequire(pkgJsonPath);
|
|
79
|
+
const cliPkgJson = require.resolve('@work-graph/cli/package.json');
|
|
80
|
+
return dirname(cliPkgJson);
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function resolveBacklogUiServerModule(installRoot) {
|
|
87
|
+
const root = resolve(installRoot);
|
|
88
|
+
const hit = firstExistingPath([
|
|
89
|
+
join(root, 'vendor/src/workGraphBacklogUiServer.mjs'),
|
|
90
|
+
join(root, 'src/workGraphBacklogUiServer.mjs'),
|
|
91
|
+
]);
|
|
92
|
+
if (!hit) {
|
|
93
|
+
throw new Error(`workGraphBacklogUiServer.mjs не найден в ${root}`);
|
|
94
|
+
}
|
|
95
|
+
return hit;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function resolveMcpEntryModule(installRoot) {
|
|
99
|
+
const root = resolve(installRoot);
|
|
100
|
+
const hit = firstExistingPath([
|
|
101
|
+
join(root, 'vendor/packages/workgraph-mcp/src/index.mjs'),
|
|
102
|
+
join(root, 'packages/workgraph-mcp/src/index.mjs'),
|
|
103
|
+
]);
|
|
104
|
+
if (!hit) {
|
|
105
|
+
throw new Error(`workgraph-mcp entry не найден в ${root}`);
|
|
106
|
+
}
|
|
107
|
+
return hit;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export async function importBacklogUiServer(installRoot) {
|
|
111
|
+
const modulePath = resolveBacklogUiServerModule(installRoot);
|
|
112
|
+
return import(pathToFileURL(modulePath).href);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export async function importMcpServer(installRoot) {
|
|
116
|
+
const modulePath = resolveMcpEntryModule(installRoot);
|
|
117
|
+
return import(pathToFileURL(modulePath).href);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function buildDoctorReport({ projectRoot, config, engineRoot }) {
|
|
121
|
+
const root = resolve(projectRoot);
|
|
122
|
+
const checks = [];
|
|
123
|
+
const add = (name, ok, detail) => checks.push({ name, ok, detail });
|
|
124
|
+
|
|
125
|
+
add('config', Boolean(config), config ? '.work-graph/config.json' : 'нет config — выполните work-graph init');
|
|
126
|
+
add('intent-index', pathExists(join(root, 'intent/index.bvc')), 'intent/index.bvc');
|
|
127
|
+
add('engine-root', Boolean(engineRoot), engineRoot ?? 'не резолвится');
|
|
128
|
+
if (engineRoot) {
|
|
129
|
+
add('ui-module', pathExists(resolveBacklogUiServerModule(engineRoot)), 'workGraphBacklogUiServer.mjs');
|
|
130
|
+
add('mcp-module', pathExists(resolveMcpEntryModule(engineRoot)), 'workgraph-mcp entry');
|
|
131
|
+
}
|
|
132
|
+
add('npm-cli', Boolean(resolveEngineRootFromNodeModules(root)), '@work-graph/cli в node_modules');
|
|
133
|
+
|
|
134
|
+
const ok = checks.every((item) => item.ok);
|
|
135
|
+
return { ok, schema: 'workgraph.doctor.v1', projectRoot: root, engineRoot, checks };
|
|
136
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
|
|
5
|
+
function pathExists(path) {
|
|
6
|
+
try {
|
|
7
|
+
accessSync(path, constants.R_OK);
|
|
8
|
+
return true;
|
|
9
|
+
} catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function firstExisting(candidates) {
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
if (pathExists(candidate)) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return candidates[0];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function resolveInstallLayout({ moduleUrl, installRootOverride } = {}) {
|
|
24
|
+
const moduleDir = dirname(fileURLToPath(moduleUrl));
|
|
25
|
+
let installRoot;
|
|
26
|
+
|
|
27
|
+
if (installRootOverride) {
|
|
28
|
+
installRoot = resolve(installRootOverride);
|
|
29
|
+
} else if (moduleDir.replace(/\\/gu, '/').includes('/vendor/src')) {
|
|
30
|
+
installRoot = resolve(moduleDir, '../..');
|
|
31
|
+
} else {
|
|
32
|
+
installRoot = resolve(moduleDir, '..');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const publicRoot = firstExisting([
|
|
36
|
+
join(installRoot, 'vendor/public'),
|
|
37
|
+
join(installRoot, 'public'),
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
const designTokensRoot = firstExisting([
|
|
41
|
+
join(installRoot, 'vendor/packages/design-tokens/generated'),
|
|
42
|
+
join(installRoot, 'packages/design-tokens/generated'),
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
const mermaidPath = firstExisting([
|
|
46
|
+
join(installRoot, 'node_modules/mermaid/dist/mermaid.min.js'),
|
|
47
|
+
join(installRoot, '..', 'node_modules/mermaid/dist/mermaid.min.js'),
|
|
48
|
+
join(installRoot, '..', '..', 'node_modules/mermaid/dist/mermaid.min.js'),
|
|
49
|
+
join(installRoot, '..', '..', '..', 'node_modules/mermaid/dist/mermaid.min.js'),
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
installRoot,
|
|
54
|
+
MERMAID_VENDOR_PATH: mermaidPath,
|
|
55
|
+
GRAPH_CANVAS_LIT_FLOW_JS_PATH: join(publicRoot, 'graph-canvas-lit-flow.js'),
|
|
56
|
+
GRAPH_CANVAS_LIT_FLOW_CSS_PATH: join(publicRoot, 'graph-canvas-lit-flow.css'),
|
|
57
|
+
WORKGRAPH_LOGO_SVG_PATH: join(publicRoot, 'assets/workgraph-logo.svg'),
|
|
58
|
+
PUBLIC_ROOT: publicRoot,
|
|
59
|
+
DESIGN_TOKENS_GRIPE_CSS_PATH: join(designTokensRoot, 'gripe-dark-default.css'),
|
|
60
|
+
DESIGN_TOKENS_WG_CSS_PATH: join(designTokensRoot, 'workgraph-dark.css'),
|
|
61
|
+
SRC_ROOT: moduleDir.replace(/\\/gu, '/').includes('/vendor/src')
|
|
62
|
+
? join(installRoot, 'vendor/src')
|
|
63
|
+
: moduleDir,
|
|
64
|
+
};
|
|
65
|
+
}
|