@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,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
+ }