@khoavu882/doflow 2.0.0-beta.3 → 2.0.0-beta.5
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/bin/doflow.js +2 -2
- package/core/.antigravity-plugin/plugin.json +0 -1
- package/core/.claude-plugin/plugin.json +1 -1
- package/core/.codex-plugin/plugin.json +1 -1
- package/core/.plugin/plugin.json +1 -1
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +7 -17
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +7 -17
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +7 -18
- package/core/harnesses/claude/hooks/session-start.sh +5 -3
- package/core/harnesses/claude/hooks/stop-check.sh +5 -3
- package/core/harnesses/claude/hooks/subagent-audit.sh +5 -5
- package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -3
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +7 -15
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +7 -15
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +7 -16
- package/core/harnesses/codex/hooks/session-start.sh +5 -3
- package/core/harnesses/codex/hooks/stop-check.sh +6 -5
- package/core/harnesses/codex/hooks/subagent-audit.sh +17 -6
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +5 -4
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +7 -18
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +7 -18
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +7 -19
- package/core/harnesses/gemini/hooks/session-start.sh +5 -3
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +20 -5
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +20 -5
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +20 -5
- package/core/harnesses/kiro/hooks/session-start.sh +11 -5
- package/core/harnesses/kiro/hooks/stop-check.sh +21 -30
- package/core/harnesses/pi/extensions/doflow-guard.js +159 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +27 -11
- package/core/harnesses/shared/hooks/adapters/antigravity.js +14 -57
- package/core/harnesses/shared/hooks/bridge/bridge.sh +184 -0
- package/core/harnesses/shared/hooks/bridge/envelope.jq +60 -0
- package/core/harnesses/shared/hooks/bridge/respond.sh +62 -0
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +4 -2
- package/core/harnesses/shared/hooks/policies/contract.sh +75 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +39 -4
- package/core/harnesses/shared/hooks/policies/lib.sh +4 -2
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +46 -34
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +75 -25
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +67 -73
- package/core/harnesses/shared/hooks/policies/session-context.sh +37 -7
- package/core/harnesses/shared/hooks/policies/stop-check.sh +42 -15
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +35 -5
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +40 -7
- package/core/harnesses/shared/hooks/stream-hook-runner.js +69 -181
- package/core/registry/assets.json +19 -0
- package/core/registry/contracts.json +2 -2
- package/core/registry/harnesses.json +196 -10
- package/core/registry/lifecycle.json +2626 -7
- package/core/registry/storage.json +110 -83
- package/core/registry/verification.json +1 -1
- package/core/shared/scripts/doflow/bash/render-puml.sh +2 -2
- package/core/shared/scripts/doflow/bin/doflow-run +10 -6
- package/core/shared/skills/do-design/SKILL.md +6 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +11 -10
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +2 -0
- package/core/shared/skills/do-execute-plan/references/scaffold.md +2 -2
- package/core/shared/skills/do-implement/SKILL.md +3 -2
- package/core/shared/skills/do-plan/SKILL.md +7 -8
- package/package.json +4 -2
- package/src/adapters/antigravity/{index.ts → index.js} +141 -105
- package/src/adapters/claude/{index.ts → index.js} +63 -49
- package/src/adapters/claude/{mcp.ts → mcp.js} +16 -16
- package/src/adapters/codex/{agents.ts → agents.js} +24 -24
- package/src/adapters/codex/{config.ts → config.js} +49 -49
- package/src/adapters/codex/{hooks.ts → hooks.js} +62 -27
- package/src/adapters/codex/{index.ts → index.js} +148 -105
- package/src/adapters/codex/{mcp.ts → mcp.js} +38 -38
- package/src/adapters/codex/{native-projection.ts → native-projection.js} +5 -5
- package/src/adapters/copilot/{index.ts → index.js} +42 -42
- package/src/adapters/{copy-tree.ts → copy-tree.js} +74 -74
- package/src/adapters/gemini/{hooks.ts → hooks.js} +78 -37
- package/src/adapters/gemini/{index.ts → index.js} +96 -57
- package/src/adapters/{hook-commands.ts → hook-commands.js} +8 -8
- package/src/adapters/{index.ts → index.js} +13 -13
- package/src/adapters/kiro/{index.ts → index.js} +49 -35
- package/src/adapters/{mcp-entries.ts → mcp-entries.js} +55 -55
- package/src/adapters/opencode/{index.ts → index.js} +52 -52
- package/src/adapters/pi/hooks.js +119 -0
- package/src/adapters/pi/{index.ts → index.js} +64 -39
- package/src/adapters/pi/{json-members.ts → json-members.js} +23 -23
- package/src/adapters/pi/{mcp.ts → mcp.js} +70 -70
- package/src/adapters/{resolve-source.ts → resolve-source.js} +1 -1
- package/src/cli/commands/{install.ts → install.js} +25 -25
- package/src/cli/commands/{list-backups.ts → list-backups.js} +4 -4
- package/src/cli/commands/{reconcile.ts → reconcile.js} +19 -19
- package/src/cli/commands/{remove.ts → remove.js} +10 -10
- package/src/cli/commands/{rollback.ts → rollback.js} +17 -17
- package/src/cli/commands/{self-update.ts → self-update.js} +3 -3
- package/src/cli/commands/{status.ts → status.js} +24 -24
- package/src/cli/commands/{tools.ts → tools.js} +16 -16
- package/src/cli/commands/{update.ts → update.js} +20 -20
- package/src/cli/{index.ts → index.js} +43 -31
- package/src/cli/{runtime-commands.ts → runtime-commands.js} +97 -58
- package/src/cli/{shared.ts → shared.js} +40 -40
- package/src/helper/{bash-helper.ts → bash-helper.js} +7 -7
- package/src/helper/{git.ts → git.js} +2 -2
- package/src/helper/{guardrails.ts → guardrails.js} +10 -10
- package/src/helper/{harness-paths.ts → harness-paths.js} +24 -24
- package/src/helper/{marker-merge.ts → marker-merge.js} +4 -4
- package/src/helper/{prompt.ts → prompt.js} +5 -5
- package/src/helper/{repo-root.ts → repo-root.js} +2 -2
- package/src/helper/{settings-merge.ts → settings-merge.js} +27 -27
- package/src/helper/{settings-scope.ts → settings-scope.js} +3 -3
- package/src/helper/{toml.ts → toml.js} +48 -48
- package/src/install/{backup-set.ts → backup-set.js} +16 -16
- package/src/install/{backup.ts → backup.js} +65 -65
- package/src/install/{context.ts → context.js} +15 -15
- package/src/install/{manifest.ts → manifest.js} +27 -27
- package/src/install/{mcp.ts → mcp.js} +30 -30
- package/src/install/{paths.ts → paths.js} +15 -15
- package/src/install/{targets.ts → targets.js} +10 -10
- package/src/install/{tool-lifecycle.ts → tool-lifecycle.js} +20 -20
- package/src/lifecycle/{bash-availability.ts → bash-availability.js} +1 -1
- package/src/lifecycle/coverage.js +57 -0
- package/src/lifecycle/hook-step.js +61 -0
- package/src/lifecycle/{index.ts → index.js} +160 -146
- package/src/lifecycle/{mcp-index.ts → mcp-index.js} +1 -1
- package/src/lifecycle/{policies.ts → policies.js} +11 -11
- package/src/lifecycle/{view.ts → view.js} +28 -28
- package/src/registry/{index.ts → index.js} +195 -66
- package/src/release/build-package.js +91 -0
- package/src/release/changelog-section.js +70 -0
- package/src/release/{sync-plugin-versions.ts → sync-plugin-versions.js} +4 -4
- package/src/runtime/advice/{cli.ts → cli.js} +31 -31
- package/src/runtime/advice/{client.ts → client.js} +44 -44
- package/src/runtime/advice/{config.ts → config.js} +16 -16
- package/src/runtime/advice/{doctor.ts → doctor.js} +32 -32
- package/src/runtime/advice/{endpoint-guard.ts → endpoint-guard.js} +20 -20
- package/src/runtime/advice/{kinds.ts → kinds.js} +16 -16
- package/src/runtime/advice/providers/{ollama-systemone.ts → ollama-systemone.js} +21 -21
- package/src/runtime/advice/{record.ts → record.js} +19 -19
- package/src/runtime/advice/{registry.ts → registry.js} +16 -16
- package/src/runtime/advice/{strength.ts → strength.js} +7 -7
- package/src/runtime/{brief-tools.ts → brief-tools.js} +50 -50
- package/src/runtime/{c4-project.ts → c4-project.js} +27 -27
- package/src/runtime/candidate.js +505 -0
- package/src/runtime/{capability-router.ts → capability-router.js} +39 -39
- package/src/runtime/{checkouts.ts → checkouts.js} +21 -21
- package/src/runtime/{claims.ts → claims.js} +44 -35
- package/src/runtime/{cli-result.ts → cli-result.js} +15 -8
- package/src/runtime/{cli.ts → cli.js} +59 -292
- package/src/runtime/{command-detect.ts → command-detect.js} +47 -47
- package/src/runtime/context/budget.js +203 -0
- package/src/runtime/context/compose.js +1367 -0
- package/src/runtime/context/delivery-store.js +102 -0
- package/src/runtime/context/mandatory.js +594 -0
- package/src/runtime/context/pointer.js +142 -0
- package/src/runtime/context-pack.js +1277 -0
- package/src/runtime/{decision-register.ts → decision-register.js} +67 -67
- package/src/runtime/evidence-fields.js +39 -0
- package/src/runtime/{evidence-ledger.ts → evidence-ledger.js} +32 -25
- package/src/runtime/failure/{capture.ts → capture.js} +29 -29
- package/src/runtime/failure/{classifier.ts → classifier.js} +4 -4
- package/src/runtime/failure/{cli.ts → cli.js} +30 -30
- package/src/runtime/failure/{home.ts → home.js} +6 -6
- package/src/runtime/failure/{store.ts → store.js} +32 -32
- package/src/runtime/{feature-resolve.ts → feature-resolve.js} +6 -6
- package/src/runtime/{freshness.ts → freshness.js} +59 -22
- package/src/runtime/{health.ts → health.js} +72 -72
- package/src/runtime/{history-compactor.ts → history-compactor.js} +25 -25
- package/src/runtime/{implementation-gate.ts → implementation-gate.js} +30 -30
- package/src/runtime/inventory/{coverage.ts → coverage.js} +10 -10
- package/src/runtime/inventory/{identity.ts → identity.js} +2 -2
- package/src/runtime/inventory/{index.ts → index.js} +36 -36
- package/src/runtime/inventory/{precedence.ts → precedence.js} +2 -2
- package/src/runtime/inventory/{read-scopes.ts → read-scopes.js} +9 -9
- package/src/runtime/inventory/{siblings.ts → siblings.js} +15 -15
- package/src/runtime/knowledge/{chunker.ts → chunker.js} +12 -12
- package/src/runtime/knowledge/{hybrid.ts → hybrid.js} +17 -17
- package/src/runtime/knowledge/{index-store.ts → index-store.js} +23 -23
- package/src/runtime/knowledge/{retrieval.ts → retrieval.js} +27 -27
- package/src/runtime/{leak-scan.ts → leak-scan.js} +12 -12
- package/src/runtime/lifecycle/{cli.ts → cli.js} +32 -32
- package/src/runtime/lifecycle/{event-store.ts → event-store.js} +48 -48
- package/src/runtime/lifecycle/{fold.ts → fold.js} +41 -41
- package/src/runtime/lifecycle/{followup.ts → followup.js} +54 -54
- package/src/runtime/lifecycle/{goal.ts → goal.js} +50 -50
- package/src/runtime/lifecycle/{intent-writer.ts → intent-writer.js} +5 -5
- package/src/runtime/lifecycle/{overview.ts → overview.js} +47 -47
- package/src/runtime/lifecycle/{release.ts → release.js} +29 -29
- package/src/runtime/lifecycle/{report-store.ts → report-store.js} +25 -25
- package/src/runtime/lifecycle/{retention.ts → retention.js} +37 -37
- package/src/runtime/lifecycle/{root.ts → root.js} +9 -9
- package/src/runtime/lifecycle/{status.ts → status.js} +64 -64
- package/src/runtime/lifecycle/{store-upkeep.ts → store-upkeep.js} +46 -46
- package/src/runtime/{locator-resolve.ts → locator-resolve.js} +7 -7
- package/src/runtime/{mask.ts → mask.js} +22 -22
- package/src/runtime/{mcp-consultations.ts → mcp-consultations.js} +54 -54
- package/src/runtime/{mcp-reach.ts → mcp-reach.js} +24 -24
- package/src/runtime/{model-router.ts → model-router.js} +20 -20
- package/src/runtime/{outcome.ts → outcome.js} +27 -27
- package/src/runtime/{reach.ts → reach.js} +21 -21
- package/src/runtime/{readiness-record.ts → readiness-record.js} +12 -12
- package/src/runtime/{readiness.ts → readiness.js} +113 -43
- package/src/runtime/{recovery.ts → recovery.js} +15 -15
- package/src/runtime/{research-request.ts → research-request.js} +34 -34
- package/src/runtime/{retrieval-plan.ts → retrieval-plan.js} +453 -104
- package/src/runtime/retrieval-record.js +223 -0
- package/src/runtime/scaffold/{artifacts.ts → artifacts.js} +22 -19
- package/src/runtime/scaffold/{fingerprint.ts → fingerprint.js} +3 -3
- package/src/runtime/scaffold/{generate.ts → generate.js} +109 -109
- package/src/runtime/scaffold/{languages.ts → languages.js} +34 -34
- package/src/runtime/source-version.js +289 -0
- package/src/runtime/storage/{cli.ts → cli.js} +9 -9
- package/src/runtime/storage/{engine.ts → engine.js} +37 -37
- package/src/runtime/storage/{registry.ts → registry.js} +19 -19
- package/src/runtime/storage/{roots.ts → roots.js} +8 -8
- package/src/runtime/storage/{rules.ts → rules.js} +26 -26
- package/src/runtime/storage/{upkeep.ts → upkeep.js} +35 -35
- package/src/runtime/storage/{work-status.ts → work-status.js} +39 -39
- package/src/runtime/{task-attempts.ts → task-attempts.js} +62 -62
- package/src/runtime/{task-classifier.ts → task-classifier.js} +34 -34
- package/src/runtime/{task-scope.ts → task-scope.js} +40 -15
- package/src/runtime/{task-state.ts → task-state.js} +86 -21
- package/src/runtime/trace/{indicators.ts → indicators.js} +22 -22
- package/src/runtime/trace/{ledger.ts → ledger.js} +42 -42
- package/src/runtime/trace/{render.ts → render.js} +7 -7
- package/src/runtime/trace/{views.ts → views.js} +40 -40
- package/src/runtime/verification/{contract-runner.ts → contract-runner.js} +23 -23
- package/src/runtime/verification/{engine.ts → engine.js} +143 -143
- package/src/runtime/verification/{registry.ts → registry.js} +6 -6
- package/src/runtime/verification/{scope-bound.ts → scope-bound.js} +50 -50
- package/src/runtime/verification/{test-selection.ts → test-selection.js} +28 -28
- package/src/runtime/{workflow-engine.ts → workflow-engine.js} +50 -50
- package/src/runtime/{workflow-orchestrator.ts → workflow-orchestrator.js} +91 -91
- package/src/runtime/{worktree.ts → worktree.js} +31 -31
- package/src/state/{index.ts → index.js} +26 -26
- package/src/state/{lockfile.ts → lockfile.js} +20 -20
- package/src/state/{run-lock.ts → run-lock.js} +44 -44
- package/core/.antigravity-plugin/hooks.json +0 -39
- package/core/harnesses/shared/hooks/adapters/arg-fields.js +0 -19
- package/core/harnesses/shared/hooks/adapters/gemini.js +0 -114
- package/core/harnesses/shared/hooks/hooks.json +0 -47
- package/src/runtime/context-pack.ts +0 -492
|
@@ -83,11 +83,11 @@ class Refused extends Error {}
|
|
|
83
83
|
* Returns the arguments AND how many characters the call occupied, so the caller can resume scanning
|
|
84
84
|
* after the closing paren rather than assuming the macro owned the rest of its line.
|
|
85
85
|
*/
|
|
86
|
-
function splitArgs(text
|
|
87
|
-
const args
|
|
86
|
+
function splitArgs(text ) {
|
|
87
|
+
const args = [];
|
|
88
88
|
let buf = '';
|
|
89
89
|
let depth = 0;
|
|
90
|
-
let quote
|
|
90
|
+
let quote = null;
|
|
91
91
|
let consumed = text.length;
|
|
92
92
|
let closed = false;
|
|
93
93
|
for (let i = 0; i < text.length; i += 1) {
|
|
@@ -127,9 +127,9 @@ function splitArgs(text: string): { args: string[]; consumed: number; closed: bo
|
|
|
127
127
|
* line-level transform running ahead of quote state has silently rewritten a label, so the transform
|
|
128
128
|
* moved in here rather than being fixed again where it stood.
|
|
129
129
|
*/
|
|
130
|
-
function stripComments(raw
|
|
130
|
+
function stripComments(raw , state , lineno ) {
|
|
131
131
|
let out = '';
|
|
132
|
-
let quote
|
|
132
|
+
let quote = null;
|
|
133
133
|
let i = 0;
|
|
134
134
|
let continues = false;
|
|
135
135
|
while (i < raw.length) {
|
|
@@ -161,7 +161,7 @@ function stripComments(raw: string, state: { inBlock: boolean; openedAt: number
|
|
|
161
161
|
|
|
162
162
|
/** Mermaid delimits a node label with double quotes; an unescaped one inside ends it early and the
|
|
163
163
|
* rest of the fence stops parsing. `"` is the entity Mermaid documents for this. */
|
|
164
|
-
function escapeLabel(text
|
|
164
|
+
function escapeLabel(text ) {
|
|
165
165
|
return String(text).replace(/"/g, '"');
|
|
166
166
|
}
|
|
167
167
|
|
|
@@ -185,11 +185,11 @@ function escapeLabel(text: any): string {
|
|
|
185
185
|
const ALIAS = /^[A-Za-z0-9_]+([.-][A-Za-z0-9_]+)*$/;
|
|
186
186
|
|
|
187
187
|
/** Every refusal carries the file and line, so the one place that formats it owns both. */
|
|
188
|
-
function refuse(ctx
|
|
188
|
+
function refuse(ctx , lineno , message ) {
|
|
189
189
|
throw new Refused(`${ctx.sourcePath}:${lineno}: ${message}`);
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
-
function requireAlias(ctx
|
|
192
|
+
function requireAlias(ctx , alias , lineno , role ) {
|
|
193
193
|
if (!ALIAS.test(alias)) {
|
|
194
194
|
refuse(ctx, lineno, `${role} '${alias}' is not a usable node id. Mermaid fails the whole diagram `
|
|
195
195
|
+ 'on one it cannot lex, and silently reads one carrying `--` or `-.-` as a LINK instead, '
|
|
@@ -197,7 +197,7 @@ function requireAlias(ctx: any, alias: string, lineno: number, role: string): vo
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
function acceptElement(ctx
|
|
200
|
+
function acceptElement(ctx , name , args , lineno ) {
|
|
201
201
|
if (args.length < 2) refuse(ctx, lineno, `${name} needs an alias and a label`);
|
|
202
202
|
requireAlias(ctx, args[0], lineno, 'alias');
|
|
203
203
|
if (ctx.nodes.has(args[0])) {
|
|
@@ -211,7 +211,7 @@ function acceptElement(ctx: any, name: string, args: string[], lineno: number):
|
|
|
211
211
|
// A boundary opened inside another is that one's CHILD, not a second root. Pushing every boundary
|
|
212
212
|
// onto one flat list rendered the outer one as an empty subgraph and hoisted the inner one to the
|
|
213
213
|
// top level -- dropping a containment the source states and Mermaid supports.
|
|
214
|
-
function acceptBoundary(ctx
|
|
214
|
+
function acceptBoundary(ctx , name , args , lineno ) {
|
|
215
215
|
if (args.length < 2) refuse(ctx, lineno, `${name} needs an alias and a label`);
|
|
216
216
|
requireAlias(ctx, args[0], lineno, 'boundary alias');
|
|
217
217
|
const b = { alias: args[0], label: args[1], members: [], children: [] };
|
|
@@ -219,14 +219,14 @@ function acceptBoundary(ctx: any, name: string, args: string[], lineno: number):
|
|
|
219
219
|
ctx.stack.push(b);
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
function acceptRelation(ctx
|
|
222
|
+
function acceptRelation(ctx , name , args , lineno ) {
|
|
223
223
|
if (args.length < 2) refuse(ctx, lineno, `${name} needs a source and a target`);
|
|
224
224
|
requireAlias(ctx, args[0], lineno, 'relation source');
|
|
225
225
|
requireAlias(ctx, args[1], lineno, 'relation target');
|
|
226
226
|
ctx.edges.push({ from: args[0], to: args[1], label: args[2] || '', bi: name.startsWith('BiRel') });
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
function accept(ctx
|
|
229
|
+
function accept(ctx , name , args , lineno ) {
|
|
230
230
|
if (SKIPPED.has(name)) return;
|
|
231
231
|
if (ELEMENTS.has(name)) acceptElement(ctx, name, args, lineno);
|
|
232
232
|
else if (BOUNDARIES.has(name)) acceptBoundary(ctx, name, args, lineno);
|
|
@@ -234,7 +234,7 @@ function accept(ctx: any, name: string, args: string[], lineno: number): void {
|
|
|
234
234
|
else {
|
|
235
235
|
refuse(ctx, lineno, `unrecognized macro '${name}'. The projector refuses rather than skipping `
|
|
236
236
|
+ 'it, because a skipped macro would silently shrink the diagram. Add it to the recognized '
|
|
237
|
-
+ 'set in src/runtime/c4-project.
|
|
237
|
+
+ 'set in src/runtime/c4-project.js if the bundled library defines it.');
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
|
|
@@ -246,10 +246,10 @@ function accept(ctx: any, name: string, args: string[], lineno: number): void {
|
|
|
246
246
|
* is what joins them. A trailing backslash inside a quoted label is therefore not a continuation,
|
|
247
247
|
* and the call it leaves unterminated refuses in the scan rather than absorbing the next line.
|
|
248
248
|
*/
|
|
249
|
-
function toLogicalLines(text
|
|
249
|
+
function toLogicalLines(text , state ) {
|
|
250
250
|
const rawLines = text.split('\n');
|
|
251
|
-
const logical
|
|
252
|
-
let pending
|
|
251
|
+
const logical = [];
|
|
252
|
+
let pending = null;
|
|
253
253
|
for (let n = 0; n < rawLines.length; n += 1) {
|
|
254
254
|
const stripped = stripComments(rawLines[n], state, n + 1);
|
|
255
255
|
if (pending === null) pending = { raw: stripped.text, lineno: n + 1 };
|
|
@@ -263,7 +263,7 @@ function toLogicalLines(text: string, state: { inBlock: boolean; openedAt: numbe
|
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
/** Read every construct one logical line carries, in order. */
|
|
266
|
-
function scanLine(ctx
|
|
266
|
+
function scanLine(ctx , line , lineno ) {
|
|
267
267
|
if (!line || /^[#@!]/.test(line)) return;
|
|
268
268
|
// A line is scanned for constructs only when it BEGINS with one. Scanning every offset of every
|
|
269
269
|
// line turned any free text containing `word (` into a macro candidate, so `title My Diagram
|
|
@@ -283,7 +283,7 @@ function scanLine(ctx: any, line: string, lineno: number): void {
|
|
|
283
283
|
// `Rel(a)` must be ignored the way prose is everywhere else.
|
|
284
284
|
const rest = line.slice(i);
|
|
285
285
|
const hit = [...rest.matchAll(/([A-Za-z_][A-Za-z0-9_]*)\s*\(/g)]
|
|
286
|
-
.find(([, n]
|
|
286
|
+
.find(([, n] ) => ELEMENTS.has(n) || BOUNDARIES.has(n) || RELATIONS.has(n));
|
|
287
287
|
const dropped = hit && !/[A-Za-z0-9]/.test(rest.slice(0, hit.index)) ? hit[1] : null;
|
|
288
288
|
if (dropped) {
|
|
289
289
|
refuse(ctx, lineno, `${dropped}(...) follows text on this line that is not a construct, `
|
|
@@ -302,7 +302,7 @@ function scanLine(ctx: any, line: string, lineno: number): void {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
-
function parse(text
|
|
305
|
+
function parse(text , sourcePath ) {
|
|
306
306
|
const ctx = { sourcePath, nodes: new Map(), edges: [], boundaries: [], stack: [] };
|
|
307
307
|
const state = { inBlock: false, openedAt: 0 };
|
|
308
308
|
for (const entry of toLogicalLines(text, state)) scanLine(ctx, entry.raw.trim(), entry.lineno);
|
|
@@ -315,9 +315,9 @@ function parse(text: string, sourcePath: string): { nodes: Map<string, string>;
|
|
|
315
315
|
return { nodes: ctx.nodes, edges: ctx.edges, boundaries: ctx.boundaries };
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
function emit({ nodes, edges, boundaries }
|
|
319
|
-
const grouped = new Set
|
|
320
|
-
const collect = (list
|
|
318
|
+
function emit({ nodes, edges, boundaries } , sourceRel , digest ) {
|
|
319
|
+
const grouped = new Set ();
|
|
320
|
+
const collect = (list ) => {
|
|
321
321
|
for (const b of list) {
|
|
322
322
|
for (const a of b.members) grouped.add(a);
|
|
323
323
|
collect(b.children);
|
|
@@ -330,7 +330,7 @@ function emit({ nodes, edges, boundaries }: { nodes: Map<string, string>; edges:
|
|
|
330
330
|
'```mermaid',
|
|
331
331
|
'flowchart TB',
|
|
332
332
|
];
|
|
333
|
-
const renderBoundary = (b
|
|
333
|
+
const renderBoundary = (b , indent ) => {
|
|
334
334
|
out.push(`${indent}subgraph ${b.alias}["${escapeLabel(b.label)}"]`);
|
|
335
335
|
for (const a of b.members) out.push(`${indent} ${a}["${escapeLabel(nodes.get(a) ?? a)}"]`);
|
|
336
336
|
for (const child of b.children) renderBoundary(child, `${indent} `);
|
|
@@ -348,7 +348,7 @@ function emit({ nodes, edges, boundaries }: { nodes: Map<string, string>; edges:
|
|
|
348
348
|
return `${out.join('\n')}\n`;
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
-
function project(text
|
|
351
|
+
function project(text , sourceRel = '<source>') {
|
|
352
352
|
const digest = crypto.createHash('sha256').update(text, 'utf8').digest('hex').slice(0, 12);
|
|
353
353
|
return { block: emit(parse(text, sourceRel), sourceRel, digest), digest };
|
|
354
354
|
}
|
|
@@ -360,11 +360,11 @@ module.exports = {
|
|
|
360
360
|
if (require.main === module) {
|
|
361
361
|
const file = process.argv[2];
|
|
362
362
|
if (!file) { process.stderr.write('usage: c4-project.ts <file.puml>\n'); process.exit(2); }
|
|
363
|
-
let text
|
|
363
|
+
let text ;
|
|
364
364
|
try { text = fs.readFileSync(file, 'utf8'); }
|
|
365
|
-
catch (err
|
|
365
|
+
catch (err ) { process.stderr.write(`c4-project: cannot read ${file}: ${err.message}\n`); process.exit(2); }
|
|
366
366
|
try { process.stdout.write(project(text, file).block); }
|
|
367
|
-
catch (err
|
|
367
|
+
catch (err ) {
|
|
368
368
|
if (err instanceof Refused) { process.stderr.write(`c4-project: ${err.message}\n`); process.exit(1); }
|
|
369
369
|
throw err;
|
|
370
370
|
}
|