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