@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
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @work-graph/cli
2
+
3
+ User-first установка Work Graph в любой проект.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ npx @work-graph/cli init .
9
+ npm install
10
+ npm run workgraph:ui
11
+ ```
12
+
13
+ → http://127.0.0.1:4177/
14
+
15
+ ## Commands
16
+
17
+ | Command | Description |
18
+ |---------|-------------|
19
+ | `init [path]` | Канон `intent/`, devDependencies, MCP, Cursor rule |
20
+ | `ui [path]` | Backlog UI для проекта |
21
+ | `doctor [path]` | Проверка установки |
22
+ | `register [path]` | Опционально: multiproject registry (power-user) |
23
+
24
+ ## Dev (contributors)
25
+
26
+ ```bash
27
+ git clone …/work-graph && cd work-graph && npm install
28
+ WORKGRAPH_ENGINE_ROOT=. npx work-graph ui /path/to/project
29
+ ```
30
+
31
+ См. [CONTRIBUTING.md](../../CONTRIBUTING.md) в репозитории Work Graph.
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env node
2
+ import { accessSync, constants } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath, pathToFileURL } from 'node:url';
5
+
6
+ const cliModuleUrl = import.meta.url;
7
+ const cliDir = dirname(fileURLToPath(cliModuleUrl));
8
+ const packageRoot = resolve(cliDir, '..');
9
+
10
+ function pathExists(path) {
11
+ try {
12
+ accessSync(path, constants.R_OK);
13
+ return true;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+
19
+ function resolveRuntimeModule(relativePath) {
20
+ const vendorPath = join(packageRoot, 'vendor', relativePath);
21
+ if (pathExists(vendorPath)) {
22
+ return pathToFileURL(vendorPath).href;
23
+ }
24
+ const monorepoPath = join(packageRoot, '../..', relativePath);
25
+ if (pathExists(monorepoPath)) {
26
+ return pathToFileURL(monorepoPath).href;
27
+ }
28
+ throw new Error(`Work Graph runtime module not found: ${relativePath}`);
29
+ }
30
+
31
+ const projectInitUrl = resolveRuntimeModule('src/workGraphProjectInit.mjs');
32
+ const workspaceRegistryUrl = resolveRuntimeModule('src/workspaceRegistry.mjs');
33
+ const backlogUiUrl = resolveRuntimeModule('src/workGraphBacklogUiServer.mjs');
34
+ const engineRootUrl = resolveRuntimeModule('src/workGraphEngineRoot.mjs');
35
+
36
+ const {
37
+ defaultEngineRootFromCliModule,
38
+ initWorkGraphProject,
39
+ runWorkGraphDoctor,
40
+ startProjectUiFromCwd,
41
+ } = await import(projectInitUrl);
42
+ const { registerWorkspace, setActiveWorkspace } = await import(workspaceRegistryUrl);
43
+ const { startBacklogUiServer } = await import(backlogUiUrl);
44
+ const { resolveEngineRoot } = await import(engineRootUrl);
45
+
46
+ const devEngineRoot = defaultEngineRootFromCliModule(cliModuleUrl);
47
+
48
+ function usage() {
49
+ console.log(`Work Graph CLI
50
+
51
+ Usage:
52
+ work-graph init [path] установить WG в проект (канон + npm deps + MCP + rule)
53
+ work-graph ui [path] backlog UI для текущего или указанного проекта
54
+ work-graph doctor [path] проверить установку WG в проекте
55
+ work-graph register [path] (опционально) добавить проект в общий хост ~/.work-graph/
56
+
57
+ Options:
58
+ --engine <path> dev-only: путь к clone WG (WORKGRAPH_ENGINE_ROOT)
59
+ --id <projectId> id проекта
60
+ --label <name> отображаемое имя
61
+ --port <number> порт UI (по умолчанию 4177)
62
+ --no-mcp не трогать .cursor/mcp.json
63
+ --no-package не трогать package.json
64
+ --no-rule не создавать .cursor/rules/work-graph-project.mdc
65
+ --register-host после init зарегистрировать проект в multiproject-хосте
66
+ --legacy-engine-config записать engineRoot в config (dev-first, deprecated)
67
+ `);
68
+ }
69
+
70
+ function parseArgs(argv) {
71
+ const args = [...argv];
72
+ const flags = {
73
+ mergeMcp: true,
74
+ mergePackageJson: true,
75
+ writeCursorRule: true,
76
+ registerHost: false,
77
+ legacyEngineConfig: false,
78
+ };
79
+ const positionals = [];
80
+
81
+ while (args.length > 0) {
82
+ const token = args.shift();
83
+ if (token === '--id') {
84
+ flags.id = args.shift();
85
+ continue;
86
+ }
87
+ if (token === '--label') {
88
+ flags.label = args.shift();
89
+ continue;
90
+ }
91
+ if (token === '--port') {
92
+ flags.port = Number(args.shift());
93
+ continue;
94
+ }
95
+ if (token === '--engine') {
96
+ flags.engine = args.shift();
97
+ continue;
98
+ }
99
+ if (token === '--no-mcp') {
100
+ flags.mergeMcp = false;
101
+ continue;
102
+ }
103
+ if (token === '--no-package') {
104
+ flags.mergePackageJson = false;
105
+ continue;
106
+ }
107
+ if (token === '--no-rule') {
108
+ flags.writeCursorRule = false;
109
+ continue;
110
+ }
111
+ if (token === '--register-host') {
112
+ flags.registerHost = true;
113
+ continue;
114
+ }
115
+ if (token === '--legacy-engine-config') {
116
+ flags.legacyEngineConfig = true;
117
+ continue;
118
+ }
119
+ if (token?.startsWith('--')) {
120
+ throw new Error(`unknown flag: ${token}`);
121
+ }
122
+ positionals.push(token);
123
+ }
124
+
125
+ return { flags, positionals };
126
+ }
127
+
128
+ async function cmdInit(targetPath, flags) {
129
+ const root = resolve(targetPath ?? process.cwd());
130
+ const useLegacyEngine = Boolean(flags.engine || flags.legacyEngineConfig);
131
+ const result = await initWorkGraphProject({
132
+ projectRoot: root,
133
+ engineRoot: useLegacyEngine ? resolve(flags.engine ?? devEngineRoot) : undefined,
134
+ npmFirst: !useLegacyEngine,
135
+ cliModuleUrl,
136
+ id: flags.id,
137
+ label: flags.label,
138
+ uiPort: flags.port,
139
+ mergeMcp: flags.mergeMcp,
140
+ mergePackageJson: flags.mergePackageJson,
141
+ writeCursorRule: flags.writeCursorRule,
142
+ });
143
+
144
+ if (flags.registerHost) {
145
+ const registry = await registerWorkspace({
146
+ id: result.projectId,
147
+ root: result.projectRoot,
148
+ label: result.label,
149
+ });
150
+ await setActiveWorkspace(result.projectId);
151
+ result.hostRegistry = {
152
+ activeProjectId: registry.activeProjectId,
153
+ workspaceCount: registry.workspaces.length,
154
+ };
155
+ }
156
+
157
+ console.log(JSON.stringify(result, null, 2));
158
+ }
159
+
160
+ async function cmdRegister(targetPath, flags) {
161
+ const root = resolve(targetPath ?? process.cwd());
162
+ const registry = await registerWorkspace({
163
+ id: flags.id,
164
+ root,
165
+ label: flags.label,
166
+ });
167
+ const entry = registry.workspaces.find((item) => resolve(item.root) === root);
168
+ console.log(JSON.stringify({
169
+ ok: true,
170
+ schema: 'workgraph.cli.register.v1',
171
+ workspace: entry,
172
+ activeProjectId: registry.activeProjectId,
173
+ note: 'Опционально: для power-user с одним UI на N проектов. Основной путь — work-graph init в каждом репо.',
174
+ }, null, 2));
175
+ }
176
+
177
+ async function cmdDoctor(targetPath) {
178
+ const cwd = resolve(targetPath ?? process.cwd());
179
+ const report = await runWorkGraphDoctor({ cwd, cliModuleUrl });
180
+ console.log(JSON.stringify(report, null, 2));
181
+ if (!report.ok) {
182
+ process.exitCode = 1;
183
+ }
184
+ }
185
+
186
+ async function cmdUi(targetPath, flags) {
187
+ const cwd = resolve(targetPath ?? process.cwd());
188
+
189
+ try {
190
+ const { host, port } = await startProjectUiFromCwd({ cwd, port: flags.port, cliModuleUrl });
191
+ console.log(`Work Graph UI: http://${host}:${port}/`);
192
+ return;
193
+ } catch {
194
+ // fallback: запуск из репозитория движка (разработка WG)
195
+ }
196
+
197
+ const engineRoot = resolveEngineRoot({ cliModuleUrl }) ?? devEngineRoot;
198
+ const { host, port } = await startBacklogUiServer({
199
+ hostRoot: engineRoot,
200
+ cwd: engineRoot,
201
+ port: flags.port,
202
+ });
203
+ console.log(`Work Graph UI (engine): http://${host}:${port}/`);
204
+ }
205
+
206
+ async function main() {
207
+ const [command, ...rest] = process.argv.slice(2);
208
+ if (!command || command === '--help' || command === '-h') {
209
+ usage();
210
+ return;
211
+ }
212
+
213
+ const { flags, positionals } = parseArgs(rest);
214
+
215
+ if (command === 'init') {
216
+ await cmdInit(positionals[0], flags);
217
+ return;
218
+ }
219
+ if (command === 'register') {
220
+ await cmdRegister(positionals[0], flags);
221
+ return;
222
+ }
223
+ if (command === 'doctor') {
224
+ await cmdDoctor(positionals[0]);
225
+ return;
226
+ }
227
+ if (command === 'ui') {
228
+ await cmdUi(positionals[0], flags);
229
+ return;
230
+ }
231
+
232
+ throw new Error(`unknown command: ${command}`);
233
+ }
234
+
235
+ main().catch((error) => {
236
+ console.error(error instanceof Error ? error.message : String(error));
237
+ process.exit(1);
238
+ });
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@work-graph/cli",
3
+ "version": "0.2.0",
4
+ "description": "Work Graph CLI — init project, doctor, start UI",
5
+ "type": "module",
6
+ "bin": {
7
+ "work-graph": "bin/work-graph.mjs"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "vendor",
12
+ "README.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "license": "Apache-2.0",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/work-graph/work-graph.git",
24
+ "directory": "packages/work-graph-cli"
25
+ },
26
+ "keywords": [
27
+ "work-graph",
28
+ "backlog",
29
+ "bvc",
30
+ "cli"
31
+ ],
32
+ "dependencies": {
33
+ "mermaid": "^11.15.0"
34
+ },
35
+ "scripts": {
36
+ "prepack": "node ../../scripts/sync-work-graph-cli-vendor.mjs"
37
+ }
38
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Generated by @iohasc/design-tokens — do not edit by hand.
3
+ * theme: gripe-dark-default
4
+ */
5
+ :root {
6
+ --brand-font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
7
+ --brand-radius-sm: 0.25rem;
8
+ --brand-radius-md: 0.5rem;
9
+ --brand-radius-lg: 0.75rem;
10
+ --brand-primary-rgb: 245 158 11;
11
+ --brand-primary-foreground-rgb: 17 17 17;
12
+ --brand-bg-rgb: 30 30 30;
13
+ --brand-surface-rgb: 37 37 38;
14
+ --brand-border-rgb: 60 60 60;
15
+ --brand-muted-rgb: 157 157 157;
16
+ --brand-scrollbar-track: #1e1e1e;
17
+ --brand-scrollbar-thumb: rgba(255, 255, 255, 0.22);
18
+ --brand-scrollbar-thumb-hover: rgba(255, 255, 255, 0.34);
19
+
20
+ /* Typography (Marketplace scale) */
21
+ --text-heading-letter-spacing: 0.01em;
22
+ --text-xs: 0.6875rem;
23
+ --text-xs-line-height: 1rem;
24
+ --text-sm: 0.8125rem;
25
+ --text-sm-line-height: 1.25rem;
26
+ --text-base: 0.9375rem;
27
+ --text-base-line-height: 1.5rem;
28
+ --text-lg: 1.0625rem;
29
+ --text-lg-line-height: 1.625rem;
30
+ --text-xl: 1.1875rem;
31
+ --text-xl-line-height: 1.75rem;
32
+ --text-2xl: 1.4375rem;
33
+ --text-2xl-line-height: 1.875rem;
34
+ --font-weight-strong: 600;
35
+ --font-size-sm: var(--text-sm);
36
+ --font-size-base: var(--text-base);
37
+
38
+ /* Runtime UI semantic tokens */
39
+ --ui-accent-rgb: 245 158 11;
40
+ --ui-accent-hover-rgb: 217 119 6;
41
+ --ui-accent-active-rgb: 180 83 9;
42
+ --ui-accent-foreground-rgb: 17 17 17;
43
+ --ui-link-rgb: 245 158 11;
44
+ --ui-link-hover-rgb: 251 191 36;
45
+ --ui-link-active-rgb: 217 119 6;
46
+ --ui-text-rgb: 212 212 212;
47
+ --ui-muted-rgb: 157 157 157;
48
+ --ui-surface-rgb: 37 37 38;
49
+ --ui-surface-muted-rgb: 45 45 48;
50
+ --ui-surface-hover-rgb: 45 45 48;
51
+ --ui-control-bg-rgb: 45 45 48;
52
+ --ui-control-bg-hover-rgb: 60 60 60;
53
+ --ui-control-checked-rgb: 245 158 11;
54
+ --ui-control-checked-foreground-rgb: 17 17 17;
55
+ --ui-focus-ring-rgb: 245 158 11;
56
+ --ui-danger-rgb: 241 76 76;
57
+ --ui-cta-rgb: 245 158 11;
58
+ --ui-cta-hover-rgb: 217 119 6;
59
+ --ui-cta-active-rgb: 180 83 9;
60
+ --ui-cta-foreground-rgb: 17 17 17;
61
+ --ui-rating-active-rgb: 245 158 11;
62
+ --ui-radius-card: 0.5rem;
63
+ --ui-radius-modal: 0.5rem;
64
+ --ui-radius-control-lg: 0.5rem;
65
+ --ui-radius-control: 0.375rem;
66
+ --ui-radius-control-sm: 0.25rem;
67
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Generated by @iohasc/design-tokens — do not edit by hand.
3
+ * theme: marketplace-default
4
+ */
5
+ :root {
6
+ --brand-font-sans: 'Graphik LCG', ui-sans-serif, system-ui, sans-serif;
7
+ --brand-radius-sm: 0.25rem;
8
+ --brand-radius-md: 0.5rem;
9
+ --brand-radius-lg: 0.75rem;
10
+ --brand-primary-rgb: 245 158 11;
11
+ --brand-primary-foreground-rgb: 15 23 42;
12
+ --brand-bg-rgb: 2 6 23;
13
+ --brand-surface-rgb: 15 23 42;
14
+ --brand-border-rgb: 30 41 59;
15
+ --brand-muted-rgb: 148 163 184;
16
+ --brand-scrollbar-track: #f1f5f9;
17
+ --brand-scrollbar-thumb: #cbd5e1;
18
+ --brand-scrollbar-thumb-hover: #94a3b8;
19
+
20
+ /* Typography (Marketplace scale) */
21
+ --text-heading-letter-spacing: 0.01em;
22
+ --text-xs: 0.6875rem;
23
+ --text-xs-line-height: 1rem;
24
+ --text-sm: 0.8125rem;
25
+ --text-sm-line-height: 1.25rem;
26
+ --text-base: 0.9375rem;
27
+ --text-base-line-height: 1.5rem;
28
+ --text-lg: 1.0625rem;
29
+ --text-lg-line-height: 1.625rem;
30
+ --text-xl: 1.1875rem;
31
+ --text-xl-line-height: 1.75rem;
32
+ --text-2xl: 1.4375rem;
33
+ --text-2xl-line-height: 1.875rem;
34
+ --font-weight-strong: 600;
35
+ --font-size-sm: var(--text-sm);
36
+ --font-size-base: var(--text-base);
37
+
38
+ /* Runtime UI semantic tokens */
39
+ --ui-accent-rgb: 12 115 254;
40
+ --ui-accent-hover-rgb: 9 101 224;
41
+ --ui-accent-active-rgb: 8 88 199;
42
+ --ui-accent-foreground-rgb: 255 255 255;
43
+ --ui-link-rgb: 12 115 254;
44
+ --ui-link-hover-rgb: 220 38 38;
45
+ --ui-link-active-rgb: 185 28 28;
46
+ --ui-text-rgb: 15 23 42;
47
+ --ui-muted-rgb: 100 116 139;
48
+ --ui-surface-rgb: 255 255 255;
49
+ --ui-surface-muted-rgb: 245 245 245;
50
+ --ui-surface-hover-rgb: 243 243 243;
51
+ --ui-control-bg-rgb: 242 242 242;
52
+ --ui-control-bg-hover-rgb: 226 232 240;
53
+ --ui-control-checked-rgb: 0 0 0;
54
+ --ui-control-checked-foreground-rgb: 255 255 255;
55
+ --ui-focus-ring-rgb: 12 115 254;
56
+ --ui-danger-rgb: 220 38 38;
57
+ --ui-cta-rgb: 0 0 0;
58
+ --ui-cta-hover-rgb: 38 38 38;
59
+ --ui-cta-active-rgb: 23 23 23;
60
+ --ui-cta-foreground-rgb: 255 255 255;
61
+ --ui-rating-active-rgb: 12 115 254;
62
+ --ui-radius-card: 1.5rem;
63
+ --ui-radius-modal: 1.5rem;
64
+ --ui-radius-control-lg: 1rem;
65
+ --ui-radius-control: 0.75rem;
66
+ --ui-radius-control-sm: 0.5rem;
67
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Generated by @iohasc/design-tokens — do not edit by hand.
3
+ * theme: workgraph-dark
4
+ */
5
+ :root {
6
+ --brand-font-sans: 'Graphik LCG', ui-sans-serif, system-ui, sans-serif;
7
+ --brand-radius-sm: 0.25rem;
8
+ --brand-radius-md: 0.5rem;
9
+ --brand-radius-lg: 0.75rem;
10
+ --brand-primary-rgb: 0 102 255;
11
+ --brand-primary-foreground-rgb: 255 255 255;
12
+ --brand-bg-rgb: 30 30 30;
13
+ --brand-surface-rgb: 37 37 38;
14
+ --brand-border-rgb: 60 60 60;
15
+ --brand-muted-rgb: 157 157 157;
16
+ --brand-scrollbar-track: #1e1e1e;
17
+ --brand-scrollbar-thumb: rgba(255, 255, 255, 0.22);
18
+ --brand-scrollbar-thumb-hover: rgba(255, 255, 255, 0.34);
19
+
20
+ /* Typography (Marketplace scale) */
21
+ --text-heading-letter-spacing: 0.01em;
22
+ --text-xs: 0.6875rem;
23
+ --text-xs-line-height: 1rem;
24
+ --text-sm: 0.8125rem;
25
+ --text-sm-line-height: 1.25rem;
26
+ --text-base: 0.9375rem;
27
+ --text-base-line-height: 1.5rem;
28
+ --text-lg: 1.0625rem;
29
+ --text-lg-line-height: 1.625rem;
30
+ --text-xl: 1.1875rem;
31
+ --text-xl-line-height: 1.75rem;
32
+ --text-2xl: 1.4375rem;
33
+ --text-2xl-line-height: 1.875rem;
34
+ --font-weight-strong: 600;
35
+ --font-size-sm: var(--text-sm);
36
+ --font-size-base: var(--text-base);
37
+
38
+ /* Runtime UI semantic tokens */
39
+ --ui-accent-rgb: 0 102 255;
40
+ --ui-accent-hover-rgb: 0 90 230;
41
+ --ui-accent-active-rgb: 0 78 204;
42
+ --ui-accent-foreground-rgb: 255 255 255;
43
+ --ui-link-rgb: 0 102 255;
44
+ --ui-link-hover-rgb: 96 165 250;
45
+ --ui-link-active-rgb: 59 130 246;
46
+ --ui-text-rgb: 212 212 212;
47
+ --ui-muted-rgb: 157 157 157;
48
+ --ui-surface-rgb: 37 37 38;
49
+ --ui-surface-muted-rgb: 45 45 48;
50
+ --ui-surface-hover-rgb: 45 45 48;
51
+ --ui-control-bg-rgb: 45 45 48;
52
+ --ui-control-bg-hover-rgb: 60 60 60;
53
+ --ui-control-checked-rgb: 0 102 255;
54
+ --ui-control-checked-foreground-rgb: 255 255 255;
55
+ --ui-focus-ring-rgb: 0 102 255;
56
+ --ui-danger-rgb: 241 76 76;
57
+ --ui-cta-rgb: 0 102 255;
58
+ --ui-cta-hover-rgb: 0 90 230;
59
+ --ui-cta-active-rgb: 0 78 204;
60
+ --ui-cta-foreground-rgb: 255 255 255;
61
+ --ui-rating-active-rgb: 240 173 78;
62
+ --ui-radius-card: 0.5rem;
63
+ --ui-radius-modal: 0.5rem;
64
+ --ui-radius-control-lg: 0.5rem;
65
+ --ui-radius-control: 0.375rem;
66
+ --ui-radius-control-sm: 0.25rem;
67
+ }
@@ -0,0 +1,28 @@
1
+ # @work-graph/mcp
2
+
3
+ MCP server for Work Graph — list/create/update work items in `intent/**/*.work.bvc`.
4
+
5
+ ## Cursor
6
+
7
+ After `npx @work-graph/cli init .`, `.cursor/mcp.json` includes:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "workgraph": {
13
+ "command": "npx",
14
+ "args": ["-y", "@work-graph/mcp"],
15
+ "env": {
16
+ "WORKGRAPH_ROOT": "${workspaceFolder}",
17
+ "WG_PROJECT_ROOT": "${workspaceFolder}"
18
+ }
19
+ }
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## Standalone
25
+
26
+ ```bash
27
+ WORKGRAPH_ROOT=/path/to/project npx @work-graph/mcp
28
+ ```
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+
6
+ const require = createRequire(import.meta.url);
7
+
8
+ function resolveMcpEntry() {
9
+ try {
10
+ const cliPkg = require.resolve('@work-graph/cli/package.json');
11
+ const cliRoot = dirname(cliPkg);
12
+ const vendorEntry = join(cliRoot, 'vendor/packages/workgraph-mcp/src/index.mjs');
13
+ return pathToFileURL(vendorEntry).href;
14
+ } catch {
15
+ // monorepo dev
16
+ const localEntry = new URL('../src/index.mjs', import.meta.url).href;
17
+ return localEntry;
18
+ }
19
+ }
20
+
21
+ await import(resolveMcpEntry());
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@work-graph/mcp",
3
+ "version": "0.2.0",
4
+ "description": "MCP server for Work Graph WorkItems",
5
+ "type": "module",
6
+ "bin": {
7
+ "workgraph-mcp": "bin/workgraph-mcp.mjs"
8
+ },
9
+ "main": "src/index.mjs",
10
+ "files": [
11
+ "bin",
12
+ "src",
13
+ "README.md"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "dependencies": {
19
+ "@work-graph/cli": "^0.2.0",
20
+ "@modelcontextprotocol/sdk": "^1.29.0",
21
+ "zod": "^3.25.76"
22
+ },
23
+ "license": "Apache-2.0",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/work-graph/work-graph.git",
27
+ "directory": "packages/workgraph-mcp"
28
+ },
29
+ "keywords": [
30
+ "work-graph",
31
+ "mcp",
32
+ "cursor"
33
+ ],
34
+ "scripts": {
35
+ "start": "node bin/workgraph-mcp.mjs"
36
+ }
37
+ }