@jeger-ai/opengantry 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +24 -7
  2. package/dist/cli/commands/audit-rigor.d.ts +8 -0
  3. package/dist/cli/commands/audit-rigor.d.ts.map +1 -0
  4. package/dist/cli/commands/audit-rigor.js +24 -0
  5. package/dist/cli/commands/audit-rigor.js.map +1 -0
  6. package/dist/cli/commands/context-feed.d.ts +6 -0
  7. package/dist/cli/commands/context-feed.d.ts.map +1 -0
  8. package/dist/cli/commands/context-feed.js +48 -0
  9. package/dist/cli/commands/context-feed.js.map +1 -0
  10. package/dist/cli/commands/mission.js +1 -1
  11. package/dist/cli/commands/mission.js.map +1 -1
  12. package/dist/cli/commands/onboarding.d.ts.map +1 -1
  13. package/dist/cli/commands/onboarding.js +9 -4
  14. package/dist/cli/commands/onboarding.js.map +1 -1
  15. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  16. package/dist/cli/commands/upgrade.js +2 -1
  17. package/dist/cli/commands/upgrade.js.map +1 -1
  18. package/dist/cli/lib/architecture-pointer.d.ts +1 -1
  19. package/dist/cli/lib/architecture-pointer.d.ts.map +1 -1
  20. package/dist/cli/lib/audit-rigor.d.ts +18 -0
  21. package/dist/cli/lib/audit-rigor.d.ts.map +1 -0
  22. package/dist/cli/lib/audit-rigor.js +189 -0
  23. package/dist/cli/lib/audit-rigor.js.map +1 -0
  24. package/dist/cli/lib/constants.d.ts +4 -0
  25. package/dist/cli/lib/constants.d.ts.map +1 -1
  26. package/dist/cli/lib/constants.js +4 -0
  27. package/dist/cli/lib/constants.js.map +1 -1
  28. package/dist/cli/lib/context-feed-remediation.d.ts +12 -0
  29. package/dist/cli/lib/context-feed-remediation.d.ts.map +1 -0
  30. package/dist/cli/lib/context-feed-remediation.js +88 -0
  31. package/dist/cli/lib/context-feed-remediation.js.map +1 -0
  32. package/dist/cli/lib/context-feed-store.d.ts +33 -0
  33. package/dist/cli/lib/context-feed-store.d.ts.map +1 -0
  34. package/dist/cli/lib/context-feed-store.js +110 -0
  35. package/dist/cli/lib/context-feed-store.js.map +1 -0
  36. package/dist/cli/lib/doctor-core.d.ts +5 -0
  37. package/dist/cli/lib/doctor-core.d.ts.map +1 -0
  38. package/dist/cli/lib/doctor-core.js +163 -0
  39. package/dist/cli/lib/doctor-core.js.map +1 -0
  40. package/dist/cli/lib/doctor-integration.d.ts +13 -0
  41. package/dist/cli/lib/doctor-integration.d.ts.map +1 -0
  42. package/dist/cli/lib/doctor-integration.js +120 -0
  43. package/dist/cli/lib/doctor-integration.js.map +1 -0
  44. package/dist/cli/lib/doctor-substrate.d.ts +3 -0
  45. package/dist/cli/lib/doctor-substrate.d.ts.map +1 -0
  46. package/dist/cli/lib/doctor-substrate.js +35 -0
  47. package/dist/cli/lib/doctor-substrate.js.map +1 -0
  48. package/dist/cli/lib/doctor-types.d.ts +24 -0
  49. package/dist/cli/lib/doctor-types.d.ts.map +1 -0
  50. package/dist/cli/lib/doctor-types.js +7 -0
  51. package/dist/cli/lib/doctor-types.js.map +1 -0
  52. package/dist/cli/lib/doctor.d.ts +4 -30
  53. package/dist/cli/lib/doctor.d.ts.map +1 -1
  54. package/dist/cli/lib/doctor.js +4 -281
  55. package/dist/cli/lib/doctor.js.map +1 -1
  56. package/dist/cli/lib/integration-compat.d.ts +7 -0
  57. package/dist/cli/lib/integration-compat.d.ts.map +1 -1
  58. package/dist/cli/lib/integration-compat.js +14 -0
  59. package/dist/cli/lib/integration-compat.js.map +1 -1
  60. package/dist/cli/lib/kpi-engine.d.ts +0 -2
  61. package/dist/cli/lib/kpi-engine.d.ts.map +1 -1
  62. package/dist/cli/lib/kpi-engine.js +11 -13
  63. package/dist/cli/lib/kpi-engine.js.map +1 -1
  64. package/dist/cli/lib/mcp-tools-register.js +1 -1
  65. package/dist/cli/lib/mcp-tools-register.js.map +1 -1
  66. package/dist/cli/lib/mcp-upgrade.d.ts +2 -2
  67. package/dist/cli/lib/mcp-upgrade.d.ts.map +1 -1
  68. package/dist/cli/lib/mcp-upgrade.js +5 -1
  69. package/dist/cli/lib/mcp-upgrade.js.map +1 -1
  70. package/dist/cli/lib/missions/formatter.d.ts.map +1 -1
  71. package/dist/cli/lib/missions/formatter.js +1 -0
  72. package/dist/cli/lib/missions/formatter.js.map +1 -1
  73. package/dist/cli/lib/missions/parser.d.ts.map +1 -1
  74. package/dist/cli/lib/missions/parser.js +1 -0
  75. package/dist/cli/lib/missions/parser.js.map +1 -1
  76. package/dist/cli/lib/start-orchestration.d.ts +1 -11
  77. package/dist/cli/lib/start-orchestration.d.ts.map +1 -1
  78. package/dist/cli/lib/start-orchestration.js +1 -85
  79. package/dist/cli/lib/start-orchestration.js.map +1 -1
  80. package/dist/cli/lib/start-snapshot.d.ts +12 -0
  81. package/dist/cli/lib/start-snapshot.d.ts.map +1 -0
  82. package/dist/cli/lib/start-snapshot.js +81 -0
  83. package/dist/cli/lib/start-snapshot.js.map +1 -0
  84. package/dist/cli/lib/trace.d.ts.map +1 -1
  85. package/dist/cli/lib/trace.js +1 -6
  86. package/dist/cli/lib/trace.js.map +1 -1
  87. package/dist/cli/lib/types.d.ts +3 -0
  88. package/dist/cli/lib/types.d.ts.map +1 -1
  89. package/dist/cli/lib/upgrade-plan-payload.d.ts +31 -0
  90. package/dist/cli/lib/upgrade-plan-payload.d.ts.map +1 -0
  91. package/dist/cli/lib/upgrade-plan-payload.js +109 -0
  92. package/dist/cli/lib/upgrade-plan-payload.js.map +1 -0
  93. package/dist/cli/lib/verify-engine.d.ts.map +1 -1
  94. package/dist/cli/lib/verify-engine.js +39 -13
  95. package/dist/cli/lib/verify-engine.js.map +1 -1
  96. package/dist/cli/lib/verify-failure-format.d.ts +29 -0
  97. package/dist/cli/lib/verify-failure-format.d.ts.map +1 -0
  98. package/dist/cli/lib/verify-failure-format.js +68 -0
  99. package/dist/cli/lib/verify-failure-format.js.map +1 -0
  100. package/dist/cli/lib/verify-hints.d.ts +32 -0
  101. package/dist/cli/lib/verify-hints.d.ts.map +1 -0
  102. package/dist/cli/lib/verify-hints.js +161 -0
  103. package/dist/cli/lib/verify-hints.js.map +1 -0
  104. package/dist/cli/lib/verify-payload.d.ts +0 -1
  105. package/dist/cli/lib/verify-payload.d.ts.map +1 -1
  106. package/dist/cli/lib/verify-payload.js +6 -19
  107. package/dist/cli/lib/verify-payload.js.map +1 -1
  108. package/dist/cli/lib/verify-present.d.ts +6 -23
  109. package/dist/cli/lib/verify-present.d.ts.map +1 -1
  110. package/dist/cli/lib/verify-present.js +3 -215
  111. package/dist/cli/lib/verify-present.js.map +1 -1
  112. package/dist/cli/lib/verify-presentation.d.ts +2 -1
  113. package/dist/cli/lib/verify-presentation.d.ts.map +1 -1
  114. package/dist/cli/lib/verify-presentation.js +2 -1
  115. package/dist/cli/lib/verify-presentation.js.map +1 -1
  116. package/dist/cli/lib/verify-presenters.d.ts +19 -0
  117. package/dist/cli/lib/verify-presenters.d.ts.map +1 -0
  118. package/dist/cli/lib/verify-presenters.js +173 -0
  119. package/dist/cli/lib/verify-presenters.js.map +1 -0
  120. package/dist/cli/lib/verify-remediation.d.ts +4 -56
  121. package/dist/cli/lib/verify-remediation.d.ts.map +1 -1
  122. package/dist/cli/lib/verify-remediation.js +2 -226
  123. package/dist/cli/lib/verify-remediation.js.map +1 -1
  124. package/dist/cli/lib/verify-run.d.ts +12 -0
  125. package/dist/cli/lib/verify-run.d.ts.map +1 -0
  126. package/dist/cli/lib/verify-run.js +70 -0
  127. package/dist/cli/lib/verify-run.js.map +1 -0
  128. package/dist/cli/lib/verify-sinks.d.ts +4 -0
  129. package/dist/cli/lib/verify-sinks.d.ts.map +1 -0
  130. package/dist/cli/lib/verify-sinks.js +12 -0
  131. package/dist/cli/lib/verify-sinks.js.map +1 -0
  132. package/dist/cli/lib/version.gen.d.ts +1 -1
  133. package/dist/cli/lib/version.gen.js +1 -1
  134. package/dist/cli/lib/virtual-scratch-store.d.ts +37 -0
  135. package/dist/cli/lib/virtual-scratch-store.d.ts.map +1 -0
  136. package/dist/cli/lib/virtual-scratch-store.js +132 -0
  137. package/dist/cli/lib/virtual-scratch-store.js.map +1 -0
  138. package/dist/cli/program-core.d.ts.map +1 -1
  139. package/dist/cli/program-core.js +43 -3
  140. package/dist/cli/program-core.js.map +1 -1
  141. package/package.json +1 -1
  142. package/templates/.gitagent/teacher/MISSION.schema.yaml +6 -0
  143. package/templates/.gitignore.gxt +2 -0
  144. package/templates/integrations/asset-catalog.json +1 -0
  145. package/templates/integrations/compatibility.json +10 -1
  146. package/templates/integrations/recipes/claude-code.md +6 -4
  147. package/templates/integrations/recipes/codex-cli.md +6 -4
  148. package/templates/integrations/recipes/opencode.md +8 -2
  149. package/templates/scripts/gxt-shell-agent.sh +62 -0
  150. package/dist/cli/lib/kpi-report-stale.d.ts +0 -18
  151. package/dist/cli/lib/kpi-report-stale.d.ts.map +0 -1
  152. package/dist/cli/lib/kpi-report-stale.js +0 -91
  153. package/dist/cli/lib/kpi-report-stale.js.map +0 -1
  154. package/dist/cli/lib/trace-evidence.d.ts +0 -23
  155. package/dist/cli/lib/trace-evidence.d.ts.map +0 -1
  156. package/dist/cli/lib/trace-evidence.js +0 -118
  157. package/dist/cli/lib/trace-evidence.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import type { VerifyFailedPayload } from "./verify-payload.js";
2
+ import type { ParsedMission } from "./types.js";
3
+ import type { VerifyPhaseFailure } from "./verify-engine.js";
4
+ import { readRemediationSnapshot, type RemediationSnapshot } from "./context-feed-store.js";
5
+ import type { VerifyOptions } from "./verify-engine.js";
6
+ export declare function remediationFromFailedPayload(root: string, mission: ParsedMission | null, missionArg: string | undefined, payload: VerifyFailedPayload): RemediationSnapshot;
7
+ export declare function remediationFromPhaseFailure(root: string, mission: ParsedMission, missionArg: string, options: VerifyOptions, failure: VerifyPhaseFailure): RemediationSnapshot;
8
+ export declare function persistRemediationSnapshot(root: string, snapshot: RemediationSnapshot): void;
9
+ export declare function persistRemediationFromFailedPayload(root: string, mission: ParsedMission | null, missionArg: string | undefined, payload: VerifyFailedPayload): void;
10
+ export declare function persistRemediationFromPhaseFailure(root: string, mission: ParsedMission, missionArg: string, options: VerifyOptions, failure: VerifyPhaseFailure): void;
11
+ export { readRemediationSnapshot };
12
+ //# sourceMappingURL=context-feed-remediation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-feed-remediation.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/context-feed-remediation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EACL,uBAAuB,EAEvB,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAuBrB;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,kBAAkB,GAC1B,mBAAmB,CA4CrB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAM5F;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,IAAI,CAEN;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,CAKN;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { toPosixRel } from "./cli-io.js";
2
+ import { readRemediationSnapshot, writeRemediationSnapshot, } from "./context-feed-store.js";
3
+ import { verifyFailurePresentation } from "./verify-failure-format.js";
4
+ export function remediationFromFailedPayload(root, mission, missionArg, payload) {
5
+ return {
6
+ schema_version: 1,
7
+ written_at: new Date().toISOString(),
8
+ source: "gapman verify",
9
+ phase: payload.phase,
10
+ error_code: payload.error_code,
11
+ message: payload.message,
12
+ ...(mission ? { mission_file_path: toPosixRel(root, mission.rawPath) } : {}),
13
+ ...(mission?.msnId ? { msn_id: mission.msnId } : {}),
14
+ ...(missionArg && !mission ? { mission_file_path: missionArg } : {}),
15
+ fix_hints: payload.fix_hints,
16
+ next_actions: payload.next_actions,
17
+ ...(payload.failures ? { failures: payload.failures } : {}),
18
+ ...(payload.stdout !== undefined || payload.stderr !== undefined
19
+ ? {
20
+ gate: {
21
+ ...(payload.stdout !== undefined ? { stdout: payload.stdout } : {}),
22
+ ...(payload.stderr !== undefined ? { stderr: payload.stderr } : {}),
23
+ },
24
+ }
25
+ : {}),
26
+ };
27
+ }
28
+ export function remediationFromPhaseFailure(root, mission, missionArg, options, failure) {
29
+ const presentation = verifyFailurePresentation({
30
+ failure,
31
+ missionArg,
32
+ options,
33
+ root,
34
+ msnId: mission.msnId ?? undefined,
35
+ });
36
+ return {
37
+ schema_version: 1,
38
+ written_at: new Date().toISOString(),
39
+ source: "gapman verify",
40
+ phase: failure.phase,
41
+ error_code: presentation.error_code,
42
+ message: failure.message,
43
+ mission_file_path: toPosixRel(root, mission.rawPath),
44
+ ...(mission.msnId ? { msn_id: mission.msnId } : {}),
45
+ fix_hints: presentation.fix_hints,
46
+ next_actions: presentation.next_actions,
47
+ ...(failure.phase === "gate"
48
+ ? {
49
+ gate: {
50
+ ...(failure.gateStdout !== undefined ? { stdout: failure.gateStdout } : {}),
51
+ ...(failure.gateStderr !== undefined ? { stderr: failure.gateStderr } : {}),
52
+ ...(failure.gateExitCode !== undefined ? { exit_code: failure.gateExitCode } : {}),
53
+ },
54
+ }
55
+ : {}),
56
+ ...(failure.phase === "kpi"
57
+ ? {
58
+ failures: [failure.kpiReason ?? failure.message],
59
+ kpi: {
60
+ ...(failure.kpiMetric ? { metric: failure.kpiMetric } : {}),
61
+ ...(failure.kpiOp ? { op: failure.kpiOp } : {}),
62
+ ...(failure.kpiExpected !== undefined ? { expected: failure.kpiExpected } : {}),
63
+ ...(failure.kpiActual !== undefined ? { actual: failure.kpiActual } : {}),
64
+ ...(failure.kpiReportPath ? { report_path: failure.kpiReportPath } : {}),
65
+ },
66
+ }
67
+ : {}),
68
+ ...(failure.phase === "trace" && failure.traceReason
69
+ ? { failures: [`DoD trace: ${failure.traceReason}`] }
70
+ : {}),
71
+ };
72
+ }
73
+ export function persistRemediationSnapshot(root, snapshot) {
74
+ try {
75
+ writeRemediationSnapshot(root, snapshot);
76
+ }
77
+ catch {
78
+ // Best-effort feed — verify must not fail because remediation I/O failed.
79
+ }
80
+ }
81
+ export function persistRemediationFromFailedPayload(root, mission, missionArg, payload) {
82
+ persistRemediationSnapshot(root, remediationFromFailedPayload(root, mission, missionArg, payload));
83
+ }
84
+ export function persistRemediationFromPhaseFailure(root, mission, missionArg, options, failure) {
85
+ persistRemediationSnapshot(root, remediationFromPhaseFailure(root, mission, missionArg, options, failure));
86
+ }
87
+ export { readRemediationSnapshot };
88
+ //# sourceMappingURL=context-feed-remediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-feed-remediation.js","sourceRoot":"","sources":["../../../src/cli/lib/context-feed-remediation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const REMEDIATION_SCHEMA_VERSION: 1;
2
+ export interface RemediationSnapshot {
3
+ schema_version: typeof REMEDIATION_SCHEMA_VERSION;
4
+ written_at: string;
5
+ source: "gapman verify";
6
+ cleared?: true;
7
+ phase: string;
8
+ error_code: string;
9
+ message: string;
10
+ mission_file_path?: string;
11
+ msn_id?: string;
12
+ fix_hints: string[];
13
+ next_actions: string[];
14
+ failures?: string[];
15
+ gate?: {
16
+ stdout?: string;
17
+ stderr?: string;
18
+ exit_code?: number;
19
+ };
20
+ kpi?: {
21
+ metric?: string;
22
+ op?: string;
23
+ expected?: number;
24
+ actual?: number | boolean;
25
+ report_path?: string;
26
+ };
27
+ }
28
+ /** Atomic replace: write temp file in same directory, then rename onto target. */
29
+ export declare function writeRemediationSnapshot(repoRoot: string, snapshot: RemediationSnapshot): void;
30
+ export declare function readRemediationSnapshot(repoRoot: string): RemediationSnapshot | null;
31
+ /** Race-safe clear: tombstone via atomic swap (never unlink-only). */
32
+ export declare function clearRemediationSnapshot(repoRoot: string): void;
33
+ //# sourceMappingURL=context-feed-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-feed-store.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/context-feed-store.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,OAAO,0BAA0B,CAAC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,GAAG,CAAC,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAmCD,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAkB9F;AAmBD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAWpF;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAa/D"}
@@ -0,0 +1,110 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { REL_NEXT_REMEDIATION } from "./constants.js";
5
+ export const REMEDIATION_SCHEMA_VERSION = 1;
6
+ const TMP_PREFIX = "NEXT_REMEDIATION.json.tmp.";
7
+ function remediationDir(repoRoot) {
8
+ return path.join(repoRoot, path.dirname(REL_NEXT_REMEDIATION));
9
+ }
10
+ function remediationPath(repoRoot) {
11
+ return path.join(repoRoot, REL_NEXT_REMEDIATION);
12
+ }
13
+ function tempRemediationPath(repoRoot) {
14
+ const nonce = crypto.randomBytes(4).toString("hex");
15
+ return path.join(remediationDir(repoRoot), `${TMP_PREFIX}${process.pid}.${Date.now()}.${nonce}`);
16
+ }
17
+ function ensureRemediationDir(repoRoot) {
18
+ fs.mkdirSync(remediationDir(repoRoot), { recursive: true });
19
+ }
20
+ function bestEffortCleanupStaleTemps(repoRoot) {
21
+ const dir = remediationDir(repoRoot);
22
+ if (!fs.existsSync(dir))
23
+ return;
24
+ for (const entry of fs.readdirSync(dir)) {
25
+ if (!entry.startsWith(TMP_PREFIX))
26
+ continue;
27
+ const full = path.join(dir, entry);
28
+ try {
29
+ fs.unlinkSync(full);
30
+ }
31
+ catch {
32
+ // abandoned temp from crashed writer — ignore
33
+ }
34
+ }
35
+ }
36
+ /** Atomic replace: write temp file in same directory, then rename onto target. */
37
+ export function writeRemediationSnapshot(repoRoot, snapshot) {
38
+ ensureRemediationDir(repoRoot);
39
+ const target = remediationPath(repoRoot);
40
+ const temp = tempRemediationPath(repoRoot);
41
+ const body = `${JSON.stringify(snapshot, null, 2)}\n`;
42
+ try {
43
+ fs.writeFileSync(temp, body, { encoding: "utf8", flag: "wx" });
44
+ fs.renameSync(temp, target);
45
+ }
46
+ catch (e) {
47
+ try {
48
+ if (fs.existsSync(temp))
49
+ fs.unlinkSync(temp);
50
+ }
51
+ catch {
52
+ // ignore cleanup failure
53
+ }
54
+ throw e;
55
+ }
56
+ finally {
57
+ bestEffortCleanupStaleTemps(repoRoot);
58
+ }
59
+ }
60
+ function readFileWithRetry(absPath, attempts = 3) {
61
+ for (let i = 0; i < attempts; i += 1) {
62
+ try {
63
+ return fs.readFileSync(absPath, "utf8");
64
+ }
65
+ catch (e) {
66
+ const errno = typeof e === "object" && e !== null ? e.code : undefined;
67
+ if (errno === "ENOENT")
68
+ return null;
69
+ if (errno === "EBUSY" || errno === "EPERM") {
70
+ if (i + 1 < attempts)
71
+ continue;
72
+ return null;
73
+ }
74
+ throw e;
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+ export function readRemediationSnapshot(repoRoot) {
80
+ const raw = readFileWithRetry(remediationPath(repoRoot));
81
+ if (raw === null)
82
+ return null;
83
+ try {
84
+ const parsed = JSON.parse(raw);
85
+ if (parsed.schema_version !== REMEDIATION_SCHEMA_VERSION)
86
+ return null;
87
+ if (parsed.cleared === true)
88
+ return null;
89
+ return parsed;
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ /** Race-safe clear: tombstone via atomic swap (never unlink-only). */
96
+ export function clearRemediationSnapshot(repoRoot) {
97
+ const tombstone = {
98
+ schema_version: REMEDIATION_SCHEMA_VERSION,
99
+ written_at: new Date().toISOString(),
100
+ source: "gapman verify",
101
+ cleared: true,
102
+ phase: "cleared",
103
+ error_code: "GXT_REMEDIATION_CLEARED",
104
+ message: "Remediation feed cleared",
105
+ fix_hints: [],
106
+ next_actions: [],
107
+ };
108
+ writeRemediationSnapshot(repoRoot, tombstone);
109
+ }
110
+ //# sourceMappingURL=context-feed-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-feed-store.js","sourceRoot":"","sources":["../../../src/cli/lib/context-feed-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Manifest } from "./types.js";
2
+ import { type DoctorCheckResult, type DoctorReport } from "./doctor-types.js";
3
+ export declare function runDoctorChecks(root: string, manifest: Manifest): DoctorCheckResult;
4
+ export declare function collectDoctorReport(root: string, manifest: Manifest, templatesRoot?: string): DoctorReport;
5
+ //# sourceMappingURL=doctor-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-core.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/doctor-core.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAyG3B,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CA6BnF;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,YAAY,CAwBd"}
@@ -0,0 +1,163 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { runArchitecturePointerDoctorChecks } from "./architecture-pointer.js";
4
+ import { ENV_BYPASS_SECRET, isBypassSecretAuthorized, REL_BYPASS_SHA256 } from "./break-glass.js";
5
+ import { REL_AGENT_ERROR_FILE, REL_MANIFEST } from "./constants.js";
6
+ import { agentErrorAbsolutePath } from "./errors.js";
7
+ import { gitConfigGet } from "./git.js";
8
+ import { resolveTemplateRootFromModule } from "./integration-compat.js";
9
+ import { resolveTeacherEmails } from "./teacher-identity.js";
10
+ import { checkSkillManifestSync } from "./skill-sync.js";
11
+ import { doctorLinesHasFail, pickNextStep, } from "./doctor-types.js";
12
+ import { runIntegrationDoctorChecks } from "./doctor-integration.js";
13
+ import { runSubstrateDriftDoctorChecks } from "./doctor-substrate.js";
14
+ function readBypassAnchorState(repoRoot) {
15
+ const p = path.join(repoRoot, REL_BYPASS_SHA256);
16
+ if (!fs.existsSync(p))
17
+ return "missing";
18
+ const raw = fs.readFileSync(p, "utf8");
19
+ if (/^[a-f0-9]{64}$/im.test(raw))
20
+ return "configured";
21
+ return "placeholder";
22
+ }
23
+ function readHooksPath(repoRoot) {
24
+ return gitConfigGet(repoRoot, "core.hooksPath");
25
+ }
26
+ function appendTeacherAllowlistChecks(root, lines, nextStep) {
27
+ const teacherIdentity = resolveTeacherEmails(root);
28
+ if (teacherIdentity.emails.length > 0) {
29
+ lines.push({
30
+ level: "ok",
31
+ message: `Teacher allowlist (${teacherIdentity.source}): ${teacherIdentity.emails.join(", ")}`,
32
+ });
33
+ if (teacherIdentity.source === "env") {
34
+ lines.push({
35
+ level: "warn",
36
+ message: "Teacher identity from GAPMAN_TEACHER_EMAILS env — prefer repo-local .gitagent/foreman/TEACHER.allowlist.local when working across projects",
37
+ });
38
+ }
39
+ return { nextStep, teacherAllowlistUnset: false };
40
+ }
41
+ lines.push({ level: "warn", message: "Teacher allowlist unset — verify git-proof will fail" });
42
+ nextStep = pickNextStep(nextStep, 'gapman teacher set "$(git config user.email)"');
43
+ return { nextStep, teacherAllowlistUnset: true };
44
+ }
45
+ function appendBypassChecks(root, lines) {
46
+ const bypassState = readBypassAnchorState(root);
47
+ if (bypassState === "configured") {
48
+ lines.push({ level: "ok", message: "BYPASS.sha256 anchor present" });
49
+ const secret = process.env[ENV_BYPASS_SECRET];
50
+ if (secret?.length) {
51
+ const authorized = isBypassSecretAuthorized(root);
52
+ lines.push({
53
+ level: authorized ? "ok" : "warn",
54
+ message: authorized
55
+ ? "bypass: GXT_BYPASS_SECRET matches anchor"
56
+ : "bypass: GXT_BYPASS_SECRET does NOT match anchor",
57
+ });
58
+ }
59
+ else {
60
+ lines.push({ level: "warn", message: "bypass: GXT_BYPASS_SECRET unset (expected unless in emergency)" });
61
+ }
62
+ }
63
+ else if (bypassState === "placeholder") {
64
+ lines.push({ level: "warn", message: "BYPASS.sha256 has no hash line — break-glass not provisioned" });
65
+ }
66
+ else {
67
+ lines.push({ level: "warn", message: `${REL_BYPASS_SHA256} missing` });
68
+ }
69
+ }
70
+ function appendHooksAndExampleMissionChecks(root, lines, nextStep) {
71
+ const hooks = readHooksPath(root);
72
+ if (hooks === ".githooks") {
73
+ lines.push({ level: "ok", message: "core.hooksPath=.githooks" });
74
+ }
75
+ else if (hooks) {
76
+ lines.push({ level: "warn", message: `core.hooksPath=${hooks} (expected .githooks for GXT hooks)` });
77
+ }
78
+ else {
79
+ lines.push({ level: "warn", message: "core.hooksPath unset — run: git config core.hooksPath .githooks" });
80
+ }
81
+ const exampleMission = ".gitagent/missions/example.verify.yaml";
82
+ const teacherIdentity = resolveTeacherEmails(root);
83
+ if (fs.existsSync(path.join(root, exampleMission))) {
84
+ lines.push({ level: "ok", message: `example mission: ${exampleMission}` });
85
+ if (teacherIdentity.emails.length > 0) {
86
+ nextStep = pickNextStep(nextStep, `gapman verify --mission ${exampleMission}`);
87
+ }
88
+ }
89
+ else {
90
+ lines.push({ level: "warn", message: "no example.verify.yaml — legislate a mission first" });
91
+ nextStep = pickNextStep(nextStep, 'gapman legislate "<intent>" --msn MSN-0001 --skill-key <key>');
92
+ }
93
+ return nextStep;
94
+ }
95
+ function appendAgentErrorCheck(root, lines) {
96
+ const errPath = agentErrorAbsolutePath(root);
97
+ if (!fs.existsSync(errPath))
98
+ return;
99
+ try {
100
+ const payload = JSON.parse(fs.readFileSync(errPath, "utf8"));
101
+ const summary = typeof payload.summary === "string" ? payload.summary : "(no summary)";
102
+ lines.push({ level: "warn", message: `last agent error: ${summary}` });
103
+ lines.push({ level: "warn", message: ` file: ${REL_AGENT_ERROR_FILE}` });
104
+ }
105
+ catch {
106
+ lines.push({ level: "warn", message: `stale ${REL_AGENT_ERROR_FILE} (unreadable)` });
107
+ }
108
+ }
109
+ export function runDoctorChecks(root, manifest) {
110
+ const lines = [{ level: "ok", message: `repo: ${root}` }];
111
+ let hasFail = false;
112
+ let nextStep = null;
113
+ let teacherAllowlistUnset = false;
114
+ const skillSync = checkSkillManifestSync(root, manifest);
115
+ if (skillSync.ok) {
116
+ lines.push({ level: "ok", message: "manifest + skills/ Rule 4.4 sync" });
117
+ }
118
+ else {
119
+ for (const err of skillSync.errors)
120
+ lines.push({ level: "fail", message: err });
121
+ hasFail = true;
122
+ nextStep = pickNextStep(nextStep, "gapman check");
123
+ }
124
+ const teacherResult = appendTeacherAllowlistChecks(root, lines, nextStep);
125
+ nextStep = teacherResult.nextStep;
126
+ teacherAllowlistUnset = teacherResult.teacherAllowlistUnset;
127
+ appendBypassChecks(root, lines);
128
+ nextStep = appendHooksAndExampleMissionChecks(root, lines, nextStep);
129
+ appendAgentErrorCheck(root, lines);
130
+ if (!fs.existsSync(path.join(root, REL_MANIFEST))) {
131
+ lines.push({ level: "fail", message: `${REL_MANIFEST} missing` });
132
+ hasFail = true;
133
+ nextStep = pickNextStep(nextStep, "gapman init");
134
+ }
135
+ return { lines, hasFail, nextStep, teacherAllowlistUnset };
136
+ }
137
+ export function collectDoctorReport(root, manifest, templatesRoot) {
138
+ const result = runDoctorChecks(root, manifest);
139
+ let lines = [...result.lines, ...runArchitecturePointerDoctorChecks(root)];
140
+ let nextStep = result.nextStep;
141
+ try {
142
+ const tpl = templatesRoot ?? resolveTemplateRootFromModule();
143
+ lines = [...lines, ...runIntegrationDoctorChecks(root, tpl)];
144
+ const drift = runSubstrateDriftDoctorChecks(root, tpl);
145
+ lines = [...lines, ...drift.lines];
146
+ if (drift.nextStep) {
147
+ nextStep = pickNextStep(nextStep, drift.nextStep);
148
+ }
149
+ }
150
+ catch {
151
+ lines = [
152
+ ...lines,
153
+ { level: "warn", message: "integration compat checks skipped (templates not found)" },
154
+ ];
155
+ }
156
+ return {
157
+ lines,
158
+ hasFail: doctorLinesHasFail(lines) || result.hasFail,
159
+ nextStep,
160
+ teacherAllowlistUnset: result.teacherAllowlistUnset,
161
+ };
162
+ }
163
+ //# sourceMappingURL=doctor-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-core.js","sourceRoot":"","sources":["../../../src/cli/lib/doctor-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DoctorLine } from "./doctor-types.js";
2
+ export type IntegrationProfileState = "uninitialized" | "configured";
3
+ /** Whether any integration canonical files exist on disk (configured vs pristine repo). */
4
+ export declare function classifyIntegrationProfileState(repoRoot: string, templatesRoot: string): IntegrationProfileState;
5
+ export interface IntegrationOnboardingGateResult {
6
+ state: IntegrationProfileState;
7
+ blockers: string[];
8
+ notices: string[];
9
+ }
10
+ /** Doctor lines that should block onboarding (configured + corrupt/mismatch only). */
11
+ export declare function integrationOnboardingBlockers(repoRoot: string, templatesRoot: string): IntegrationOnboardingGateResult;
12
+ export declare function runIntegrationDoctorChecks(repoRoot: string, templatesRoot: string): DoctorLine[];
13
+ //# sourceMappingURL=doctor-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-integration.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/doctor-integration.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG,YAAY,CAAC;AAsCrE,2FAA2F;AAC3F,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,uBAAuB,CAQzB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AASD,sFAAsF;AACtF,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,+BAA+B,CAiBjC;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAsDhG"}
@@ -0,0 +1,120 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { errorMessage } from "./cli-io.js";
5
+ import { INTEGRATION_IDE_KEYS, isBootstrapHookMode, loadIntegrationCompat, } from "./integration-compat.js";
6
+ const NO_INTEGRATION_MSG = "no agent integration files detected — run gapman init";
7
+ function pathExists(repoRoot, rel) {
8
+ const normalized = rel.endsWith("/") ? rel.slice(0, -1) : rel;
9
+ return fs.existsSync(path.join(repoRoot, normalized));
10
+ }
11
+ function readCursorHooksVersion(repoRoot) {
12
+ const p = path.join(repoRoot, ".cursor/hooks.json");
13
+ if (!fs.existsSync(p))
14
+ return null;
15
+ try {
16
+ const j = JSON.parse(fs.readFileSync(p, "utf8"));
17
+ return typeof j.version === "number" ? j.version : null;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function probeCliVersion(cmd, args) {
24
+ const r = spawnSync(cmd, args, { encoding: "utf8", timeout: 5000 });
25
+ if (r.status !== 0)
26
+ return null;
27
+ const out = `${r.stdout ?? ""}${r.stderr ?? ""}`.trim();
28
+ return out.length > 0 ? out.split("\n")[0].trim() : null;
29
+ }
30
+ function detectIntegrationPresent(repoRoot, key, entry) {
31
+ if (key === "codex-cli") {
32
+ return pathExists(repoRoot, ".codex/config.toml");
33
+ }
34
+ return entry.canonical_paths.some((p) => pathExists(repoRoot, p));
35
+ }
36
+ /** Whether any integration canonical files exist on disk (configured vs pristine repo). */
37
+ export function classifyIntegrationProfileState(repoRoot, templatesRoot) {
38
+ const compat = loadIntegrationCompat(templatesRoot);
39
+ for (const key of INTEGRATION_IDE_KEYS) {
40
+ if (detectIntegrationPresent(repoRoot, key, compat.integrations[key])) {
41
+ return "configured";
42
+ }
43
+ }
44
+ return "uninitialized";
45
+ }
46
+ function isOnboardingBlockerLine(message, state) {
47
+ if (state === "uninitialized" && message.includes(NO_INTEGRATION_MSG)) {
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ /** Doctor lines that should block onboarding (configured + corrupt/mismatch only). */
53
+ export function integrationOnboardingBlockers(repoRoot, templatesRoot) {
54
+ const state = classifyIntegrationProfileState(repoRoot, templatesRoot);
55
+ const lines = runIntegrationDoctorChecks(repoRoot, templatesRoot);
56
+ if (state === "uninitialized") {
57
+ const notices = lines
58
+ .filter((l) => l.level === "warn" || l.level === "ok")
59
+ .map((l) => l.message);
60
+ return { state, blockers: [], notices };
61
+ }
62
+ const blockers = lines
63
+ .filter((l) => l.level === "warn" || l.level === "fail")
64
+ .filter((l) => isOnboardingBlockerLine(l.message, state))
65
+ .map((l) => l.message);
66
+ return { state, blockers, notices: [] };
67
+ }
68
+ export function runIntegrationDoctorChecks(repoRoot, templatesRoot) {
69
+ const lines = [];
70
+ let compat;
71
+ try {
72
+ compat = loadIntegrationCompat(templatesRoot);
73
+ }
74
+ catch (e) {
75
+ lines.push({
76
+ level: "warn",
77
+ message: `integration compat manifest unavailable: ${errorMessage(e)}`,
78
+ });
79
+ return lines;
80
+ }
81
+ const detected = [];
82
+ for (const key of INTEGRATION_IDE_KEYS) {
83
+ const entry = compat.integrations[key];
84
+ for (const dep of entry.deprecated_paths) {
85
+ if (pathExists(repoRoot, dep)) {
86
+ const canonical = entry.canonical_paths[0] ?? "(see .gitagent/ARCHITECTURE.pointer.json)";
87
+ lines.push({
88
+ level: "warn",
89
+ message: `deprecated path ${dep} — migrate to ${canonical} (${entry.display_name})`,
90
+ });
91
+ }
92
+ }
93
+ if (!detectIntegrationPresent(repoRoot, key, entry))
94
+ continue;
95
+ let label = key;
96
+ if (entry.cli_probe && entry.cli_probe.length >= 2) {
97
+ const ver = probeCliVersion(entry.cli_probe[0], entry.cli_probe.slice(1));
98
+ if (ver)
99
+ label = `${key} (${ver})`;
100
+ }
101
+ detected.push(label);
102
+ if (key === "cursor" && isBootstrapHookMode(entry) && entry.hooks_schema_version != null) {
103
+ const hv = readCursorHooksVersion(repoRoot);
104
+ if (hv != null && hv !== entry.hooks_schema_version) {
105
+ lines.push({
106
+ level: "warn",
107
+ message: `.cursor/hooks.json version ${hv} — expected ${entry.hooks_schema_version} per integration compat`,
108
+ });
109
+ }
110
+ }
111
+ }
112
+ if (detected.length > 0) {
113
+ lines.push({ level: "ok", message: `detected agent wiring: ${detected.join(", ")}` });
114
+ }
115
+ else {
116
+ lines.push({ level: "warn", message: NO_INTEGRATION_MSG });
117
+ }
118
+ return lines;
119
+ }
120
+ //# sourceMappingURL=doctor-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-integration.js","sourceRoot":"","sources":["../../../src/cli/lib/doctor-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SubstrateDriftDoctorResult } from "./doctor-types.js";
2
+ export declare function runSubstrateDriftDoctorChecks(repoRoot: string, templatesRoot: string): SubstrateDriftDoctorResult;
3
+ //# sourceMappingURL=doctor-substrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-substrate.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/doctor-substrate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAEhF,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,0BAA0B,CA+B5B"}