@bragi-gmbh/codebus 1.4.0 → 1.6.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 (130) hide show
  1. package/dist/ci-hooks/ci-hooks.js +126 -0
  2. package/dist/ci-hooks/ci-hooks.js.map +1 -0
  3. package/dist/commands/agent.js +137 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/as.js +1 -1
  6. package/dist/commands/as.js.map +1 -1
  7. package/dist/commands/ask.js +1 -1
  8. package/dist/commands/ask.js.map +1 -1
  9. package/dist/commands/ci-findings.js +129 -0
  10. package/dist/commands/ci-findings.js.map +1 -0
  11. package/dist/commands/ci-reply.js +117 -0
  12. package/dist/commands/ci-reply.js.map +1 -0
  13. package/dist/commands/ci-steer-escalate.js +65 -0
  14. package/dist/commands/ci-steer-escalate.js.map +1 -0
  15. package/dist/commands/cli-mcp-correlation.js +131 -0
  16. package/dist/commands/cli-mcp-correlation.js.map +1 -0
  17. package/dist/commands/connector-attach-detach.js +542 -0
  18. package/dist/commands/connector-attach-detach.js.map +1 -0
  19. package/dist/commands/connector.js +513 -0
  20. package/dist/commands/connector.js.map +1 -0
  21. package/dist/commands/correlation.js +194 -0
  22. package/dist/commands/correlation.js.map +1 -0
  23. package/dist/commands/decision.js +63 -0
  24. package/dist/commands/decision.js.map +1 -1
  25. package/dist/commands/digest.js +14 -3
  26. package/dist/commands/digest.js.map +1 -1
  27. package/dist/commands/do.js +127 -0
  28. package/dist/commands/do.js.map +1 -0
  29. package/dist/commands/factory-attention.js +106 -0
  30. package/dist/commands/factory-attention.js.map +1 -0
  31. package/dist/commands/factory-context-read.js +171 -0
  32. package/dist/commands/factory-context-read.js.map +1 -0
  33. package/dist/commands/factory-interventions.js +102 -0
  34. package/dist/commands/factory-interventions.js.map +1 -0
  35. package/dist/commands/factory.js +187 -0
  36. package/dist/commands/factory.js.map +1 -1
  37. package/dist/commands/graph-pull.js +130 -0
  38. package/dist/commands/graph-pull.js.map +1 -0
  39. package/dist/commands/graph.js +5 -1
  40. package/dist/commands/graph.js.map +1 -1
  41. package/dist/commands/inbox.js +7 -7
  42. package/dist/commands/inbox.js.map +1 -1
  43. package/dist/commands/ingest.js +1 -1
  44. package/dist/commands/ingest.js.map +1 -1
  45. package/dist/commands/install.js +1160 -55
  46. package/dist/commands/install.js.map +1 -1
  47. package/dist/commands/integration-ledger.js +81 -0
  48. package/dist/commands/integration-ledger.js.map +1 -0
  49. package/dist/commands/knowledge.js +178 -0
  50. package/dist/commands/knowledge.js.map +1 -0
  51. package/dist/commands/links.js +1 -1
  52. package/dist/commands/links.js.map +1 -1
  53. package/dist/commands/morning.js +50 -1
  54. package/dist/commands/morning.js.map +1 -1
  55. package/dist/commands/plan-compiler.js +260 -0
  56. package/dist/commands/plan-compiler.js.map +1 -0
  57. package/dist/commands/plan-lint.js +275 -0
  58. package/dist/commands/plan-lint.js.map +1 -0
  59. package/dist/commands/plan-score.js +203 -0
  60. package/dist/commands/plan-score.js.map +1 -0
  61. package/dist/commands/plan.js +481 -15
  62. package/dist/commands/plan.js.map +1 -1
  63. package/dist/commands/product-validity.js +168 -0
  64. package/dist/commands/product-validity.js.map +1 -0
  65. package/dist/commands/question.js +1 -1
  66. package/dist/commands/question.js.map +1 -1
  67. package/dist/commands/read-policy.js +131 -0
  68. package/dist/commands/read-policy.js.map +1 -0
  69. package/dist/commands/read.js +1 -1
  70. package/dist/commands/read.js.map +1 -1
  71. package/dist/commands/repo.js +106 -8
  72. package/dist/commands/repo.js.map +1 -1
  73. package/dist/commands/repository-protection.js +209 -0
  74. package/dist/commands/repository-protection.js.map +1 -0
  75. package/dist/commands/resolve.js +2 -2
  76. package/dist/commands/resolve.js.map +1 -1
  77. package/dist/commands/self-healing.js +26 -0
  78. package/dist/commands/self-healing.js.map +1 -0
  79. package/dist/commands/send.js +1 -1
  80. package/dist/commands/send.js.map +1 -1
  81. package/dist/commands/serial-merge.js +303 -0
  82. package/dist/commands/serial-merge.js.map +1 -0
  83. package/dist/commands/session.js +1 -1
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/task.js +92 -1
  86. package/dist/commands/task.js.map +1 -1
  87. package/dist/commands/verify.js +77 -0
  88. package/dist/commands/verify.js.map +1 -0
  89. package/dist/config/self-healing-analysis.json +158 -0
  90. package/dist/errors.js +18 -4
  91. package/dist/errors.js.map +1 -1
  92. package/dist/execution/client.js +53 -0
  93. package/dist/execution/client.js.map +1 -0
  94. package/dist/execution/local.js +24 -0
  95. package/dist/execution/local.js.map +1 -0
  96. package/dist/execution/ssh.js +38 -0
  97. package/dist/execution/ssh.js.map +1 -0
  98. package/dist/graph.js +78 -16
  99. package/dist/graph.js.map +1 -1
  100. package/dist/index.js +30 -0
  101. package/dist/index.js.map +1 -1
  102. package/dist/json-lite.js +248 -0
  103. package/dist/json-lite.js.map +1 -0
  104. package/dist/knowledge-drift.js +40 -0
  105. package/dist/knowledge-drift.js.map +1 -0
  106. package/dist/lint/parallelism.js +414 -0
  107. package/dist/lint/parallelism.js.map +1 -0
  108. package/dist/mail-latency.js +11 -1
  109. package/dist/mail-latency.js.map +1 -1
  110. package/dist/mcp-ci-findings.js +31 -0
  111. package/dist/mcp-ci-findings.js.map +1 -0
  112. package/dist/mcp-correlation.js +290 -0
  113. package/dist/mcp-correlation.js.map +1 -0
  114. package/dist/mcp-factory-context-read.js +81 -0
  115. package/dist/mcp-factory-context-read.js.map +1 -0
  116. package/dist/mcp-registry.js +128 -1
  117. package/dist/mcp-registry.js.map +1 -1
  118. package/dist/mcp.js +94 -5
  119. package/dist/mcp.js.map +1 -1
  120. package/dist/openrouter-reservation-guard.js +97 -0
  121. package/dist/openrouter-reservation-guard.js.map +1 -0
  122. package/dist/self-healing-analysis-loader.js +150 -0
  123. package/dist/self-healing-analysis-loader.js.map +1 -0
  124. package/dist/sender.js +11 -9
  125. package/dist/sender.js.map +1 -1
  126. package/dist/toml-lite.js +546 -0
  127. package/dist/toml-lite.js.map +1 -0
  128. package/dist/version-check.js +23 -7
  129. package/dist/version-check.js.map +1 -1
  130. package/package.json +5 -3
@@ -0,0 +1,77 @@
1
+ /**
2
+ * verify — `codebus verify` core (CI-A verify-service child).
3
+ *
4
+ * T1 LAN verify: push the ref to the GHRUN01 bare mirror (docs/ci/lan.md),
5
+ * run the affected lanes on a warm group-5 runner, return ci-finding v1
6
+ * findings on CodeBus. Timing SLO: end-to-end p50 <= 180s (release 0.3).
7
+ *
8
+ * Governed: this module builds plans and formats results only. It never
9
+ * ssh's to a host, never touches docker/systemd, never executes CI itself —
10
+ * the operator (Valerian, backup Gercho) applies deploy/r640/verify-service/
11
+ * in the governed window after scripts/ci/host-fence-check.sh passes.
12
+ */
13
+ import { validateFinding } from "./ci-findings.js";
14
+ export const VERIFY_SLO_MS = 180_000;
15
+ export const VERIFY_MIRROR_PORT = 56041;
16
+ export const VERIFY_OPERATOR_TRANSPORT = "ssh sysadmin@100.113.92.72";
17
+ /** Defaults: ref HEAD, LAN mirror on port 56041, affected lanes. */
18
+ export function defaultVerifyPlan() {
19
+ return {
20
+ ref: "HEAD",
21
+ mirror: `git://ghrun01-lan:${VERIFY_MIRROR_PORT}/codebus.git`,
22
+ lanes: ["affected"],
23
+ sloMs: VERIFY_SLO_MS,
24
+ };
25
+ }
26
+ /** Merge CLI options over defaults. Throws on empty ref/mirror or empty lanes. */
27
+ export function buildVerifyPlan(o = {}) {
28
+ const base = defaultVerifyPlan();
29
+ const ref = o.ref ?? base.ref;
30
+ const mirror = o.mirror ?? base.mirror;
31
+ const lanes = o.lanes ?? base.lanes;
32
+ if (!ref.trim())
33
+ throw new Error("verify requires a non-empty --ref");
34
+ if (!mirror.trim())
35
+ throw new Error("verify requires a non-empty --mirror");
36
+ if (lanes.length === 0)
37
+ throw new Error("verify requires at least one --lane");
38
+ return { ref, mirror, lanes, sloMs: VERIFY_SLO_MS };
39
+ }
40
+ /** True when elapsedMs is within the 180s SLO. */
41
+ export function withinSlo(elapsedMs) {
42
+ return Number.isFinite(elapsedMs) && elapsedMs >= 0 && elapsedMs <= VERIFY_SLO_MS;
43
+ }
44
+ /** Split findings into valid/invalid per the pinned ci-finding v1 shape. */
45
+ export function splitVerifyFindings(findings) {
46
+ const valid = findings.filter((f) => validateFinding(f).length === 0);
47
+ return { valid, invalid: findings.length - valid.length };
48
+ }
49
+ /** Assemble the result record: findings + timing + artifact base URL. */
50
+ export function buildVerifyResult(ref, elapsedMs, findings) {
51
+ const { valid, invalid } = splitVerifyFindings(findings);
52
+ return {
53
+ ref,
54
+ elapsedMs,
55
+ withinSlo: withinSlo(elapsedMs),
56
+ findings: valid,
57
+ invalid,
58
+ artifactsBase: "http://ghrun01:56042/junit/",
59
+ };
60
+ }
61
+ /** Human-readable one-line-per-finding summary. */
62
+ export function formatVerifyResult(r) {
63
+ const head = `verify ${r.ref}: ${r.findings.length} finding(s), ${r.elapsedMs}ms (slo ${r.withinSlo ? "ok" : "exceeded"})`;
64
+ const lines = r.findings.map((f) => `[${f.kind}] ${f.check} @ ${f.location} -> ${f.next_action}`);
65
+ return [head, ...lines].join("\n");
66
+ }
67
+ /** CLI entry point: `codebus verify [--ref R] [--mirror U] [--lane L...] [--json]`. */
68
+ export async function verifyCmd(o) {
69
+ const plan = buildVerifyPlan(o);
70
+ // No local execution: findings arrive from the LAN run; here we emit the plan.
71
+ if (o.json) {
72
+ console.log(JSON.stringify({ plan }, null, 2));
73
+ return;
74
+ }
75
+ console.log(`verify plan: push ${plan.ref} to ${plan.mirror}, lanes: ${plan.lanes.join(",")}, slo: ${plan.sloMs}ms`);
76
+ }
77
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ {
2
+ "schema_version": "0.5.0-proposed",
3
+ "document_id": "com.bragi.config.self-healing-analysis-v16",
4
+ "revision": 16,
5
+ "purpose": "Configuration for maximum-context three-model self-healing analysis",
6
+ "created": "2026-09-17T18:00:00Z",
7
+ "binding": {
8
+ "product_id": "REPROD-2160",
9
+ "version": "0.12.0-proposed",
10
+ "section": "OUT-self-healing-analysis",
11
+ "child_id": "com.bragi.work.bcode-phase2.self-healing-analysis"
12
+ },
13
+ "description": "Specification for analyzing self-healing candidates through three independent maximum-context models per v16 plan ADR-0007 and contract com.bragi.contract.self-healing-reference",
14
+ "context": {
15
+ "sources": [
16
+ "Sentry exceptions and error patterns",
17
+ "Sonar code quality and coverage violations",
18
+ "GitHub check failures and CI signals",
19
+ "Case incident reports and remediation records"
20
+ ],
21
+ "scope": "internal self-healing reference loop for repository health and automated repair suggestions",
22
+ "evidence_reference": "factory/dev01/plans/phase2-package/owner-statements/gercho-self-healing.md:3-19 - v0.5 repair loop specification"
23
+ },
24
+ "analysis_configuration": {
25
+ "model_set": {
26
+ "count": 3,
27
+ "independent": true,
28
+ "models": [
29
+ {
30
+ "role": "reasoning",
31
+ "provider": "openai",
32
+ "id": "gpt-sol-latest",
33
+ "effort_level": "high",
34
+ "context_model": "maximum",
35
+ "purpose": "architectural and trade-off analysis of repair strategies"
36
+ },
37
+ {
38
+ "role": "research",
39
+ "provider": "qwen",
40
+ "id": "qwen3.8-max-0902",
41
+ "effort_level": "minimal",
42
+ "context_model": "maximum",
43
+ "purpose": "evidence gathering and pattern synthesis from observed failures"
44
+ },
45
+ {
46
+ "role": "executor",
47
+ "provider": "openai",
48
+ "id": "gpt-5.6-luna",
49
+ "effort_level": "minimal",
50
+ "context_model": "maximum",
51
+ "purpose": "mechanical implementation and test validation of repairs"
52
+ }
53
+ ]
54
+ },
55
+ "context_handling": {
56
+ "strategy": "maximum",
57
+ "components": [
58
+ {
59
+ "name": "source_evidence",
60
+ "description": "Full structured context from Sentry/Sonar/GitHub/Case including historical patterns",
61
+ "token_budget": "proportional to pool capacity"
62
+ },
63
+ {
64
+ "name": "repository_context",
65
+ "description": "SCIP graph, taxonomy, existing repairs, coverage history",
66
+ "token_budget": "proportional to pool capacity"
67
+ },
68
+ {
69
+ "name": "codebus_context",
70
+ "description": "Related plans, contracts, ADRs, prior decisions and precedent",
71
+ "token_budget": "proportional to pool capacity"
72
+ },
73
+ {
74
+ "name": "factory_context",
75
+ "description": "Prior repair attempts, execution results, cost and impact",
76
+ "token_budget": "proportional to pool capacity"
77
+ }
78
+ ]
79
+ },
80
+ "analysis_stages": {
81
+ "stage_1_evidence_collection": {
82
+ "name": "Collect and normalize evidence",
83
+ "responsible": ["research"],
84
+ "description": "Gather structured evidence from all sources, normalize timestamps and identifiers, create unified representation",
85
+ "output": "normalized evidence object with full provenance"
86
+ },
87
+ "stage_2_pattern_analysis": {
88
+ "name": "Pattern and root-cause analysis",
89
+ "responsible": ["research", "reasoning"],
90
+ "description": "Identify patterns across failures, synthesize root causes, classify by category and severity",
91
+ "output": "classified analysis with confidence levels and alternative explanations"
92
+ },
93
+ "stage_3_repair_strategy": {
94
+ "name": "Generate repair strategies",
95
+ "responsible": ["reasoning"],
96
+ "description": "Propose three or more independent repair strategies with trade-offs, architectural implications and risk assessment",
97
+ "output": "ranked repair options with reasoning chains"
98
+ },
99
+ "stage_4_implementation": {
100
+ "name": "Implement and validate proposed repair",
101
+ "responsible": ["executor"],
102
+ "description": "Select top-ranked strategy, generate code changes, create tests, validate against original evidence",
103
+ "output": "pull request diff with validation results"
104
+ }
105
+ }
106
+ },
107
+ "output_format": {
108
+ "analysis_record": {
109
+ "candidate_id": "stable identifier from source system",
110
+ "source_type": "sentry",
111
+ "evidence_summary": "human-readable evidence digest",
112
+ "analysis_by_model": {
113
+ "reasoning": {
114
+ "architecture": "architectural analysis and trade-offs",
115
+ "precedent": "references to prior decisions and ADRs",
116
+ "risks": "identified risks and mitigations"
117
+ },
118
+ "research": {
119
+ "patterns": "synthesized patterns and root causes",
120
+ "categories": "classification and severity",
121
+ "confidence": "confidence level (high/medium/low)"
122
+ },
123
+ "executor": {
124
+ "proposed_repair": "specific code changes or configuration",
125
+ "test_coverage": "validation approach",
126
+ "effort_estimate": "implementation effort in minutes"
127
+ }
128
+ },
129
+ "consensus_recommendation": "agreement level across three models",
130
+ "escalation_required": false
131
+ }
132
+ },
133
+ "governance": {
134
+ "maximum_context_justification": "Self-healing repairs require complete repository context, historical patterns and architectural constraints. Maximum context reduces hallucination and improves repair quality and precedent awareness.",
135
+ "three_model_justification": "Architectural decisions (reasoning) + evidence synthesis (research) + implementation validation (executor) provides balanced analysis per ADR-0007 and ADR-0008 multi-agent DAG pattern",
136
+ "adrs": ["ADR-0007 (plan standard)", "ADR-0008 (multi-agent DAG)", "ADR-0010 (connector adapters)"],
137
+ "contracts": ["com.bragi.contract.self-healing-reference@0.5.0-proposed"],
138
+ "evidence": "factory/dev01/plans/phase2-package/owner-statements/gercho-self-healing.md:3-19, factory/dev01/plans/phase2-package/owner-statements/owner-decisions-2026-09-17.md"
139
+ },
140
+ "receipt_expectations": {
141
+ "positive_fixture": "three_independent_models_maximum_context",
142
+ "criteria": [
143
+ "All three models (reasoning, research, executor) are configured",
144
+ "Context model is 'maximum' for all three",
145
+ "Each model has distinct role and purpose",
146
+ "Analysis stages assign responsibility to appropriate models",
147
+ "Output format includes analysis_by_model with all three roles"
148
+ ],
149
+ "negative_fixture": "single_model_or_missing_evidence",
150
+ "refusal": [
151
+ "Only one model configured",
152
+ "Maximum context not specified for all models",
153
+ "Missing evidence components (source_evidence, repository_context, codebus_context, factory_context)",
154
+ "Analysis stages missing responsible model assignments",
155
+ "Output format incomplete or missing model-level analysis"
156
+ ]
157
+ }
158
+ }
package/dist/errors.js CHANGED
@@ -1,10 +1,24 @@
1
1
  export class CodebusError extends Error {
2
- exitCode;
3
- constructor(message, exitCode = 1) {
4
- super(message);
5
- this.exitCode = exitCode;
2
+ code;
3
+ details;
4
+ constructor(message, exitCodeOrOptions) {
5
+ super(typeof message === "string" ? message : message.message);
6
6
  this.name = "CodebusError";
7
+ if (typeof message === "object" && message) {
8
+ this.code = message.code;
9
+ this.details = message.details;
10
+ }
11
+ if (typeof exitCodeOrOptions === "number") {
12
+ this.exitCode = exitCodeOrOptions;
13
+ }
14
+ else if (exitCodeOrOptions) {
15
+ this.code = exitCodeOrOptions.code;
16
+ this.details = exitCodeOrOptions.details;
17
+ if (exitCodeOrOptions.exitCode !== undefined)
18
+ this.exitCode = exitCodeOrOptions.exitCode;
19
+ }
7
20
  }
21
+ exitCode = 1;
8
22
  }
9
23
  /**
10
24
  * Round-13 review finding 8 (CONFIRMED, MAJOR): `repo connect --build`'s
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACD;IAApC,YAAY,OAAe,EAAS,WAAW,CAAC;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,aAAQ,GAAR,QAAQ,CAAI;QAE9C,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAChB;IAAsB;IAA1D,YAAY,OAAe,EAAS,KAAa,EAAS,KAA6B;QACrF,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,UAAK,GAAL,KAAK,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAwB;QAErF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAC7B;IAAnB,YAAmB,IAAY;QAC7B,KAAK,CACH,6CAA6C,IAAI,wCAAwC;YACzF,6GAA6G,CAC9G,CAAC;QAJe,SAAI,GAAJ,IAAI,CAAQ;QAK7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,MAAc;QACxB,KAAK,CACH,6BAA6B,MAAM,gEAAgE;YACnG,kGAAkG;YAClG,sGAAsG;YACtG,uEAAuE,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC9B,IAAI,CAAU;IACd,OAAO,CAAW;IACzB,YAAY,OAAuE,EAAE,iBAAoF;QACvK,KAAK,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC;QACD,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;QACpC,CAAC;aAAM,IAAI,iBAAiB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC;YACzC,IAAI,iBAAiB,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,QAAQ,GAAG,CAAC,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAChB;IAAsB;IAA1D,YAAY,OAAe,EAAS,KAAa,EAAS,KAA6B;QACrF,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,UAAK,GAAL,KAAK,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAwB;QAErF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAC7B;IAAnB,YAAmB,IAAY;QAC7B,KAAK,CACH,6CAA6C,IAAI,wCAAwC;YACzF,6GAA6G,CAC9G,CAAC;QAJe,SAAI,GAAJ,IAAI,CAAQ;QAK7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,MAAc;QACxB,KAAK,CACH,6BAA6B,MAAM,gEAAgE;YACnG,kGAAkG;YAClG,sGAAsG;YACtG,uEAAuE,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ import { CodebusError } from "../errors.js";
2
+ function parseJson(value, context) {
3
+ try {
4
+ return JSON.parse(value);
5
+ }
6
+ catch {
7
+ throw new CodebusError(`${context} returned invalid JSON`, 2);
8
+ }
9
+ }
10
+ function parseOutput(stdout, kind) {
11
+ const trimmed = stdout.trim();
12
+ if (!trimmed)
13
+ throw new CodebusError("factory returned no JSON output", 2);
14
+ if (kind === "jsonl") {
15
+ return trimmed.split("\n").map((line, index) => {
16
+ const value = parseJson(line, `factory event line ${index + 1}`);
17
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
18
+ throw new CodebusError(`factory event line ${index + 1} is not a JSON object`, 2);
19
+ }
20
+ return value;
21
+ });
22
+ }
23
+ const value = parseJson(trimmed, "factory");
24
+ if (kind === "array" && !Array.isArray(value)) {
25
+ throw new CodebusError("factory returned JSON that is not an array", 2);
26
+ }
27
+ if (kind === "object" && (!value || typeof value !== "object" || Array.isArray(value))) {
28
+ throw new CodebusError("factory returned JSON that is not an object", 2);
29
+ }
30
+ return value;
31
+ }
32
+ /** Thin, strict adapter over the deployed factory v0 JSON and exit contract. */
33
+ export class ExecutionClient {
34
+ transport;
35
+ constructor(transport) {
36
+ this.transport = transport;
37
+ }
38
+ async execute(argv, kind = "object") {
39
+ const result = await this.transport.execute(argv);
40
+ if (!Number.isInteger(result.exitCode) || result.exitCode < 0 || result.exitCode > 5) {
41
+ throw new CodebusError(`factory returned unsupported exit code ${result.exitCode}`, 2);
42
+ }
43
+ if (result.exitCode !== 0 && !result.stdout.trim()) {
44
+ throw new CodebusError(result.stderr.trim() || `factory exited with code ${result.exitCode}`, result.exitCode);
45
+ }
46
+ return {
47
+ ...result,
48
+ exitCode: result.exitCode,
49
+ value: parseOutput(result.stdout, kind),
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/execution/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { execFile } from "node:child_process";
2
+ import { CodebusError } from "../errors.js";
3
+ export class LocalExecutionTransport {
4
+ executable;
5
+ constructor(executable = "factory") {
6
+ this.executable = executable;
7
+ }
8
+ execute(argv) {
9
+ return new Promise((resolve, reject) => {
10
+ execFile(this.executable, [...argv], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }, (error, stdout, stderr) => {
11
+ if (error && error.code === "ENOENT") {
12
+ reject(new CodebusError(`factory executable not found: ${this.executable}`, 2));
13
+ return;
14
+ }
15
+ resolve({
16
+ stdout,
17
+ stderr,
18
+ exitCode: error && typeof error.code === "number" ? error.code : 0,
19
+ });
20
+ });
21
+ });
22
+ }
23
+ }
24
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/execution/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,aAAa,SAAS;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,OAAO,CAAC,IAAuB;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBAChH,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,YAAY,CAAC,iCAAiC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBAChF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC;oBACN,MAAM;oBACN,MAAM;oBACN,QAAQ,EAAE,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACnE,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import { execFile } from "node:child_process";
2
+ import { CodebusError } from "../errors.js";
3
+ function exec(executable, argv) {
4
+ return new Promise((resolve, reject) => {
5
+ execFile(executable, [...argv], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }, (error, stdout, stderr) => {
6
+ if (error && error.code === "ENOENT") {
7
+ reject(new CodebusError(`SSH executable not found: ${executable}`, 2));
8
+ return;
9
+ }
10
+ resolve({ stdout, stderr, exitCode: error && typeof error.code === "number" ? error.code : 0 });
11
+ });
12
+ });
13
+ }
14
+ /** OpenSSH transport. The host may be reached by any SSH route; Tailscale is not consulted. */
15
+ export class SshExecutionTransport {
16
+ host;
17
+ expectedCodebusVersion;
18
+ executable;
19
+ constructor(host, expectedCodebusVersion, executable = "ssh") {
20
+ this.host = host;
21
+ this.expectedCodebusVersion = expectedCodebusVersion;
22
+ this.executable = executable;
23
+ if (!host)
24
+ throw new CodebusError("SSH host must not be empty", 2);
25
+ }
26
+ async execute(argv) {
27
+ const base = ["-o", "BatchMode=yes", this.host];
28
+ const version = await exec(this.executable, [...base, "codebus", "--version"]);
29
+ if (version.exitCode !== 0) {
30
+ throw new CodebusError(version.stderr.trim() || `unable to check codebus version on ${this.host}`, 2);
31
+ }
32
+ if (version.stdout.trim() !== this.expectedCodebusVersion) {
33
+ throw new CodebusError(`remote codebus version mismatch: expected ${this.expectedCodebusVersion}, got ${version.stdout.trim() || "no version"}`, 2);
34
+ }
35
+ return exec(this.executable, [...base, "factory", ...argv]);
36
+ }
37
+ }
38
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/execution/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,SAAS,IAAI,CAAC,UAAkB,EAAE,IAAuB;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC3G,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,YAAY,CAAC,6BAA6B,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IAHnB,YACmB,IAAY,EACZ,sBAA8B,EAC9B,aAAa,KAAK;QAFlB,SAAI,GAAJ,IAAI,CAAQ;QACZ,2BAAsB,GAAtB,sBAAsB,CAAQ;QAC9B,eAAU,GAAV,UAAU,CAAQ;QAEnC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAuB;QACnC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,sCAAsC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC1D,MAAM,IAAI,YAAY,CACpB,6CAA6C,IAAI,CAAC,sBAAsB,SAAS,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,EAAE,EACxH,CAAC,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF"}
package/dist/graph.js CHANGED
@@ -8,6 +8,36 @@ function getLastGoodSnapshotPath() {
8
8
  const codebusCacheDir = join(homedir(), ".codebus");
9
9
  return join(codebusCacheDir, "last-good-graph.json");
10
10
  }
11
+ /**
12
+ * Get the path to the cached snapshot directory (~/.codebus/graph/).
13
+ */
14
+ function getGraphCacheDir() {
15
+ return join(homedir(), ".codebus", "graph");
16
+ }
17
+ /**
18
+ * Read the `current` pointer file from the cache dir.
19
+ * Returns the built_at_commit string, or null if the file doesn't exist.
20
+ */
21
+ export function getCachedCommit() {
22
+ const currentPath = join(getGraphCacheDir(), "current");
23
+ try {
24
+ return readFileSync(currentPath, "utf-8").trim();
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Resolve the cached snapshot path from the `current` pointer.
32
+ * Returns the full path to ~/.codebus/graph/<commit>/graph.json, or null
33
+ * if the pointer file or the snapshot is missing.
34
+ */
35
+ function getCachedSnapshotPath() {
36
+ const current = getCachedCommit();
37
+ if (!current)
38
+ return null;
39
+ return join(getGraphCacheDir(), current, "graph.json");
40
+ }
11
41
  /**
12
42
  * Save a snapshot as the last-good backup.
13
43
  * Creates ~/.codebus/ if needed.
@@ -53,8 +83,12 @@ export function loadLastGoodSnapshot() {
53
83
  * explicit --repo should route to remote instead. Side effect preserved:
54
84
  * a successfully-parsed snapshot is still saved as last-good, exactly as
55
85
  * before.
56
- * Returns null if no graphify-out/graph.json is found on the walk-up, or if
57
- * the one found is unreadable/invalid — never falls back to last-good itself.
86
+ *
87
+ * After the walk-up fails, falls back to the local artifact cache
88
+ * (~/.codebus/graph/current/graph.json) populated by `codebus graph pull`
89
+ * (issue #257: the snapshot is no longer tracked in git). Returns null if
90
+ * neither a tracked/local graphify-out nor a cached snapshot exists —
91
+ * never falls back to last-good itself.
58
92
  */
59
93
  export function loadLocalSnapshot(repoRoot) {
60
94
  let searchPath = repoRoot || process.cwd();
@@ -82,17 +116,33 @@ export function loadLocalSnapshot(repoRoot) {
82
116
  }
83
117
  searchPath = parent;
84
118
  }
119
+ // Walk-up exhausted: fall back to the `codebus graph pull` cache.
120
+ const cachedPath = getCachedSnapshotPath();
121
+ if (cachedPath && existsSync(cachedPath)) {
122
+ try {
123
+ const content = readFileSync(cachedPath, "utf-8");
124
+ const snapshot = JSON.parse(content);
125
+ saveLastGoodSnapshot(snapshot);
126
+ return snapshot;
127
+ }
128
+ catch {
129
+ // Cached snapshot unreadable or invalid.
130
+ return null;
131
+ }
132
+ }
85
133
  return null;
86
134
  }
87
135
  /**
88
136
  * Load the graphify-out/graph.json snapshot.
89
- * Walks up the directory tree looking for graphify-out/ (handles being in cli/ subdirectory).
90
- * Falls back to last-good snapshot (~/.codebus/last-good-graph.json) if the current snapshot
91
- * cannot be loaded (e.g., failed build).
92
- * Returns null if neither exists.
137
+ * Precedence: tracked/local graphify-out/ (walk-up) ~/.codebus/graph cache
138
+ * (populated by `codebus graph pull`, issue #257) → last-good backup
139
+ * (~/.codebus/last-good-graph.json) if the current snapshot cannot be loaded
140
+ * (e.g., failed build).
141
+ * Returns null if none exist.
93
142
  *
94
- * A6: reimplemented as loadLocalSnapshot() ?? loadLastGoodSnapshot() — bit-identical
95
- * to the previous inline implementation for every existing caller (ask.ts's own
143
+ * A6: reimplemented as loadLocalSnapshot() ?? loadLastGoodSnapshot() — where
144
+ * loadLocalSnapshot now includes the cache fallback tier. Bit-identical to
145
+ * the previous inline implementation for every existing caller (ask.ts's own
96
146
  * direct use was replaced by resolveGraphSource, but graph-bootstrap.ts, commands/
97
147
  * graph.ts, commands/ingest.ts, commands/pack.ts, and mcp.ts's back-compat path all
98
148
  * still call this exact function with this exact behavior).
@@ -300,29 +350,41 @@ export function formatEdgeCitation(edge) {
300
350
  }
301
351
  /**
302
352
  * Check staleness: compare snapshot commit to repo HEAD.
303
- * Returns { isStale, isDirty, snapshotCommit, headCommit }
353
+ * Uses git merge-base --is-ancestor + rev-list count to determine how many
354
+ * commits the snapshot is behind (or ahead of) HEAD. When stale, suggests
355
+ * `codebus graph pull` since the snapshot on main is refreshed every merge
356
+ * by the graphify-on-merge workflow (issue #257).
304
357
  */
305
358
  export async function checkStaleness(snapshot, repoRoot, tolerance = "dirty-only") {
306
359
  const { execSync } = await import("node:child_process");
307
360
  const cwd = repoRoot || process.cwd();
308
361
  try {
309
- const snapshotCommit = getGraphBuiltCommit(snapshot).slice(0, 7);
310
- const headCommit = execSync("git rev-parse HEAD", { cwd, encoding: "utf-8" }).trim().slice(0, 7);
362
+ const snapshotCommit = getGraphBuiltCommit(snapshot);
363
+ const snapshotShort = snapshotCommit.slice(0, 7);
364
+ const headCommit = execSync("git rev-parse HEAD", { cwd, encoding: "utf-8" }).trim();
365
+ const headShort = headCommit.slice(0, 7);
311
366
  const isDirty = execSync("git status --porcelain", { cwd, encoding: "utf-8" }).trim() !== "";
312
367
  if (snapshotCommit === headCommit) {
313
368
  // Fresh
314
369
  if (isDirty && tolerance === "dirty-only") {
315
- return { isStale: false, isDirty: true, note: `(working tree dirty; snapshot fresh at ${snapshotCommit})` };
370
+ return { isStale: false, isDirty: true, note: `(working tree dirty; snapshot fresh at ${snapshotShort})` };
316
371
  }
317
372
  return { isStale: false, isDirty };
318
373
  }
319
374
  else {
320
- // Stale
375
+ // Stale — compute how many commits behind/ahead
376
+ let commitCount = 0;
377
+ try {
378
+ commitCount = parseInt(execSync(`git rev-list --count ${snapshotCommit}..HEAD`, { cwd, encoding: "utf-8" }).trim(), 10);
379
+ }
380
+ catch {
381
+ commitCount = 0;
382
+ }
383
+ const pullSuggestion = `Run 'codebus graph pull' to refresh`;
321
384
  if (tolerance === "dirty-only" && isDirty) {
322
- // Tolerate only if working tree is dirty (local dev)
323
- return { isStale: true, isDirty, note: `(snapshot at ${snapshotCommit}, HEAD is ${headCommit}; rebuild on merge)` };
385
+ return { isStale: true, isDirty, note: `(snapshot at ${snapshotShort}, HEAD is ${headShort}; ${commitCount} commits behind; ${pullSuggestion})` };
324
386
  }
325
- return { isStale: true, isDirty, note: `(snapshot at ${snapshotCommit}, HEAD is ${headCommit})` };
387
+ return { isStale: true, isDirty, note: `(snapshot at ${snapshotShort}, HEAD is ${headShort}; ${commitCount} commits behind; ${pullSuggestion})` };
326
388
  }
327
389
  }
328
390
  catch {
package/dist/graph.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}