@skillcap/gdh 0.15.1 → 0.17.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 (75) hide show
  1. package/INSTALL-BUNDLE.json +1 -1
  2. package/README.md +37 -108
  3. package/RELEASE-SPAN-UPDATE-CONTRACTS.json +184 -0
  4. package/node_modules/@gdh/adapters/dist/index.d.ts +2 -2
  5. package/node_modules/@gdh/adapters/dist/index.d.ts.map +1 -1
  6. package/node_modules/@gdh/adapters/dist/index.js +148 -110
  7. package/node_modules/@gdh/adapters/dist/index.js.map +1 -1
  8. package/node_modules/@gdh/adapters/package.json +8 -8
  9. package/node_modules/@gdh/authoring/dist/index.d.ts +4 -3
  10. package/node_modules/@gdh/authoring/dist/index.d.ts.map +1 -1
  11. package/node_modules/@gdh/authoring/dist/index.js +80 -9
  12. package/node_modules/@gdh/authoring/dist/index.js.map +1 -1
  13. package/node_modules/@gdh/authoring/dist/lsp-client.d.ts +47 -0
  14. package/node_modules/@gdh/authoring/dist/lsp-client.d.ts.map +1 -0
  15. package/node_modules/@gdh/authoring/dist/lsp-client.js +371 -0
  16. package/node_modules/@gdh/authoring/dist/lsp-client.js.map +1 -0
  17. package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.d.ts +35 -0
  18. package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.d.ts.map +1 -0
  19. package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.js +194 -0
  20. package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.js.map +1 -0
  21. package/node_modules/@gdh/authoring/dist/lsp.d.ts +62 -1
  22. package/node_modules/@gdh/authoring/dist/lsp.d.ts.map +1 -1
  23. package/node_modules/@gdh/authoring/dist/lsp.js +1207 -109
  24. package/node_modules/@gdh/authoring/dist/lsp.js.map +1 -1
  25. package/node_modules/@gdh/authoring/dist/project.d.ts.map +1 -1
  26. package/node_modules/@gdh/authoring/dist/project.js +28 -1
  27. package/node_modules/@gdh/authoring/dist/project.js.map +1 -1
  28. package/node_modules/@gdh/authoring/dist/scene-resource.d.ts +39 -0
  29. package/node_modules/@gdh/authoring/dist/scene-resource.d.ts.map +1 -0
  30. package/node_modules/@gdh/authoring/dist/scene-resource.js +544 -0
  31. package/node_modules/@gdh/authoring/dist/scene-resource.js.map +1 -0
  32. package/node_modules/@gdh/authoring/package.json +2 -2
  33. package/node_modules/@gdh/cli/dist/index.d.ts.map +1 -1
  34. package/node_modules/@gdh/cli/dist/index.js +121 -35
  35. package/node_modules/@gdh/cli/dist/index.js.map +1 -1
  36. package/node_modules/@gdh/cli/dist/migrate.d.ts +1 -0
  37. package/node_modules/@gdh/cli/dist/migrate.d.ts.map +1 -1
  38. package/node_modules/@gdh/cli/dist/migrate.js +140 -13
  39. package/node_modules/@gdh/cli/dist/migrate.js.map +1 -1
  40. package/node_modules/@gdh/cli/package.json +10 -10
  41. package/node_modules/@gdh/core/dist/index.d.ts +109 -14
  42. package/node_modules/@gdh/core/dist/index.d.ts.map +1 -1
  43. package/node_modules/@gdh/core/dist/index.js +16 -18
  44. package/node_modules/@gdh/core/dist/index.js.map +1 -1
  45. package/node_modules/@gdh/core/package.json +1 -1
  46. package/node_modules/@gdh/docs/dist/guidance.d.ts.map +1 -1
  47. package/node_modules/@gdh/docs/dist/guidance.js +34 -2
  48. package/node_modules/@gdh/docs/dist/guidance.js.map +1 -1
  49. package/node_modules/@gdh/docs/dist/rules.d.ts.map +1 -1
  50. package/node_modules/@gdh/docs/dist/rules.js +2 -2
  51. package/node_modules/@gdh/docs/dist/rules.js.map +1 -1
  52. package/node_modules/@gdh/docs/package.json +2 -2
  53. package/node_modules/@gdh/mcp/package.json +8 -8
  54. package/node_modules/@gdh/observability/package.json +2 -2
  55. package/node_modules/@gdh/runtime/dist/bridge-surface.d.ts.map +1 -1
  56. package/node_modules/@gdh/runtime/dist/bridge-surface.js +128 -16
  57. package/node_modules/@gdh/runtime/dist/bridge-surface.js.map +1 -1
  58. package/node_modules/@gdh/runtime/dist/index.d.ts +1 -0
  59. package/node_modules/@gdh/runtime/dist/index.d.ts.map +1 -1
  60. package/node_modules/@gdh/runtime/dist/index.js +189 -0
  61. package/node_modules/@gdh/runtime/dist/index.js.map +1 -1
  62. package/node_modules/@gdh/runtime/dist/knowledge-surface.d.ts +6 -0
  63. package/node_modules/@gdh/runtime/dist/knowledge-surface.d.ts.map +1 -0
  64. package/node_modules/@gdh/runtime/dist/knowledge-surface.js +216 -0
  65. package/node_modules/@gdh/runtime/dist/knowledge-surface.js.map +1 -0
  66. package/node_modules/@gdh/runtime/package.json +2 -2
  67. package/node_modules/@gdh/scan/dist/onboard.d.ts.map +1 -1
  68. package/node_modules/@gdh/scan/dist/onboard.js +13 -0
  69. package/node_modules/@gdh/scan/dist/onboard.js.map +1 -1
  70. package/node_modules/@gdh/scan/package.json +3 -3
  71. package/node_modules/@gdh/verify/dist/policy.d.ts.map +1 -1
  72. package/node_modules/@gdh/verify/dist/policy.js +157 -29
  73. package/node_modules/@gdh/verify/dist/policy.js.map +1 -1
  74. package/node_modules/@gdh/verify/package.json +7 -7
  75. package/package.json +11 -11
@@ -4,17 +4,17 @@ import fs from "node:fs/promises";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { promisify } from "node:util";
7
- import { readProjectConfig, resolvePinnedVersion, resolvePinnedVersionOrNull, resolveProjectRoot, readWorktreeState, resolveAuthoringStatus, } from "@gdh/authoring";
8
- import { CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH, CLAUDE_CHECK_UPDATE_WORKER_RELATIVE_PATH, renderClaudeCheckUpdateHook, } from "./claude-update-hook-render.js";
9
- import { renderClaudeCheckUpdateWorker } from "./claude-update-worker-render.js";
10
- import { CLAUDE_STATUSLINE_RELATIVE_PATH, renderClaudeUpdateStatusline, } from "./claude-statusline-render.js";
11
- import { CLAUDE_SETTINGS_RELATIVE_PATH, patchClaudeSettingsForGdhSessionStart, patchClaudeSettingsForGdhStatusline, } from "./claude-settings-patch.js";
12
- import { GDH_AGENT_CONTRACT_VERSION, GDH_CURSOR_RULE_VERSION, GDH_GUIDANCE_INDEX_VERSION, GDH_GUIDANCE_UNIT_VERSION, GDH_PROJECT_CONFIG_VERSION, GDH_RECIPE_SCHEMA_VERSION, GDH_RULES_SCHEMA_VERSION, GDH_SCENARIO_SCHEMA_VERSION, assertProjectLifecycleCompatibilityInvariant, definePackageBoundary, resolveCurrentGdhInstall, resolveConfiguredGodotEditorBin, resolveGdhProductMetadata, } from "@gdh/core";
7
+ import { readProjectConfig, readWorktreeState, resolveAuthoringStatus, resolvePinnedVersion, resolvePinnedVersionOrNull, resolveProjectRoot, } from "@gdh/authoring";
8
+ import { assertProjectLifecycleCompatibilityInvariant, definePackageBoundary, GDH_AGENT_CONTRACT_VERSION, GDH_CURSOR_RULE_VERSION, GDH_GUIDANCE_INDEX_VERSION, GDH_GUIDANCE_UNIT_VERSION, GDH_PROJECT_CONFIG_VERSION, GDH_RECIPE_SCHEMA_VERSION, GDH_RULES_SCHEMA_VERSION, GDH_SCENARIO_SCHEMA_VERSION, resolveConfiguredGodotEditorBin, resolveCurrentGdhInstall, resolveGdhProductMetadata, } from "@gdh/core";
13
9
  import { createDefaultGuidanceUnits, getGuidanceStatus, resolveGuidanceQuery, resolveRecoveryHints, } from "@gdh/docs";
14
10
  import { inspectGuidanceAudit } from "@gdh/observability";
15
- import { inspectRuntimeBridgeSurface } from "@gdh/runtime";
11
+ import { inspectRuntimeBridgeSurface, inspectRuntimeKnowledgeSurface } from "@gdh/runtime";
16
12
  import { readInventoryCacheOrScan } from "@gdh/scan";
17
13
  import { evaluateDonePolicy, recommendValidationForChange } from "@gdh/verify";
14
+ import { CLAUDE_SETTINGS_RELATIVE_PATH, patchClaudeSettingsForGdhSessionStart, patchClaudeSettingsForGdhStatusline, } from "./claude-settings-patch.js";
15
+ import { CLAUDE_STATUSLINE_RELATIVE_PATH, renderClaudeUpdateStatusline, } from "./claude-statusline-render.js";
16
+ import { CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH, CLAUDE_CHECK_UPDATE_WORKER_RELATIVE_PATH, renderClaudeCheckUpdateHook, } from "./claude-update-hook-render.js";
17
+ import { renderClaudeCheckUpdateWorker } from "./claude-update-worker-render.js";
18
18
  export const adaptersPackage = definePackageBoundary({
19
19
  name: "@gdh/adapters",
20
20
  layer: "integration",
@@ -29,7 +29,11 @@ export const adaptersPackage = definePackageBoundary({
29
29
  "@gdh/verify",
30
30
  ],
31
31
  });
32
- export const SUPPORTED_AGENTS = ["codex", "claude", "cursor"];
32
+ export const SUPPORTED_AGENTS = [
33
+ "codex",
34
+ "claude",
35
+ "cursor",
36
+ ];
33
37
  export const CLAUDE_SHIM_RELATIVE_PATH = "CLAUDE.md";
34
38
  export const CLAUDE_ONBOARD_COMMAND_RELATIVE_PATH = ".claude/commands/gdh/onboard.md";
35
39
  export const PROJECT_MCP_RELATIVE_PATH = ".mcp.json";
@@ -199,9 +203,7 @@ export async function inspectProjectLifecycleCompatibility(targetPath) {
199
203
  autoApplicable: false,
200
204
  },
201
205
  });
202
- return summarizeProjectLifecycleCompatibility(resolvedTargetPath, [
203
- blockedSurface,
204
- ]);
206
+ return summarizeProjectLifecycleCompatibility(resolvedTargetPath, [blockedSurface]);
205
207
  }
206
208
  const guidanceStatus = await getGuidanceStatus(resolvedTargetPath);
207
209
  const bridgeStatus = await inspectRuntimeBridgeSurface({
@@ -227,6 +229,10 @@ export async function inspectProjectLifecycleCompatibility(targetPath) {
227
229
  export async function buildGdhStatusResult(targetPath) {
228
230
  const context = await buildAuthoringContext(targetPath);
229
231
  const projectLifecycle = await inspectProjectLifecycleCompatibility(targetPath);
232
+ const runtimeKnowledge = await inspectRuntimeKnowledgeSurface({
233
+ targetPath: context.status.targetPath,
234
+ runtimeKnowledgePath: context.projectConfig?.runtimeKnowledge.path ?? null,
235
+ });
230
236
  const recoveryHints = resolveRecoveryHints(projectLifecycle.reasons);
231
237
  const capabilities = await addOperationalCapabilityStatus(context.status.capabilities, context.status.targetPath);
232
238
  const detectedProjects = summarizeDetectedProjects(context.inventory.projects, context.status.primaryProjectPath);
@@ -236,6 +242,7 @@ export async function buildGdhStatusResult(targetPath) {
236
242
  detectedProjects,
237
243
  product: resolveGdhProductMetadata(),
238
244
  projectLifecycle,
245
+ runtimeKnowledge,
239
246
  recoveryHints,
240
247
  };
241
248
  }
@@ -716,7 +723,7 @@ export function renderClaudeMigrateCommand(pinnedVersion) {
716
723
  "",
717
724
  `1. Run \`npx -y @skillcap/gdh@${pinnedVersion} migrate\` to preview pending migrations (this is a dry-run; the JSON \`mode\` field will be \`"preview"\`).`,
718
725
  "2. Inspect `compatibility.blockingReasons` vs `compatibility.coupledReasons` — if `blockingReasons` is non-empty, STOP: `migrate --apply` cannot fix them (recommend `/gdh-update` or manual intervention per each reason's recovery hint). If only `coupledReasons` is non-empty, proceed.",
719
- "3. Explain what each migration step will change and why (use \"would\" verb forms — \"would delete\", \"would create\", \"would refresh\").",
726
+ '3. Explain what each migration step will change and why (use "would" verb forms — "would delete", "would create", "would refresh").',
720
727
  `4. Offer to run \`npx -y @skillcap/gdh@${pinnedVersion} migrate --apply\` if the user approves — after apply, the JSON \`mode\` field becomes \`"applied"\` and verbs switch to past tense ("deleted", "created", "refreshed").`,
721
728
  "5. After apply, read `terminal.state` in the stdout JSON.",
722
729
  "6. If `terminal.state` is `healthy`, confirm no further migration action is required and stop.",
@@ -761,7 +768,7 @@ export function renderCodexMigrateSkill(pinnedVersion) {
761
768
  "",
762
769
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} migrate\` to preview pending migrations (this is a dry-run; the JSON \`mode\` field will be \`"preview"\`)`,
763
770
  "- inspect `compatibility.blockingReasons` vs `compatibility.coupledReasons` — if `blockingReasons` is non-empty, STOP: `migrate --apply` cannot fix them (recommend `/gdh-update` or manual intervention per each reason's recovery hint); if only `coupledReasons` is non-empty, proceed",
764
- "- explain what each migration step will change and why (use \"would\" verb forms — \"would delete\", \"would create\", \"would refresh\")",
771
+ '- explain what each migration step will change and why (use "would" verb forms — "would delete", "would create", "would refresh")',
765
772
  `- offer to run \`npx -y @skillcap/gdh@${pinnedVersion} migrate --apply\` if the user approves — after apply, the JSON \`mode\` field becomes \`"applied"\` and verbs switch to past tense ("deleted", "created", "refreshed")`,
766
773
  "- after apply, read `terminal.state` in the stdout JSON",
767
774
  "- if `terminal.state` is `healthy`, confirm no further migration action is required and stop",
@@ -804,7 +811,7 @@ export function renderCursorMigrateSkill(pinnedVersion) {
804
811
  "",
805
812
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} migrate\` to preview pending migrations (this is a dry-run; the JSON \`mode\` field will be \`"preview"\`)`,
806
813
  "- inspect `compatibility.blockingReasons` vs `compatibility.coupledReasons` — if `blockingReasons` is non-empty, STOP: `migrate --apply` cannot fix them (recommend `/gdh-update` or manual intervention per each reason's recovery hint); if only `coupledReasons` is non-empty, proceed",
807
- "- explain what each migration step will change and why (use \"would\" verb forms — \"would delete\", \"would create\", \"would refresh\")",
814
+ '- explain what each migration step will change and why (use "would" verb forms — "would delete", "would create", "would refresh")',
808
815
  `- offer to run \`npx -y @skillcap/gdh@${pinnedVersion} migrate --apply\` if the user approves — after apply, the JSON \`mode\` field becomes \`"applied"\` and verbs switch to past tense ("deleted", "created", "refreshed")`,
809
816
  "- after apply, read `terminal.state` in the stdout JSON",
810
817
  "- if `terminal.state` is `healthy`, confirm no further migration action is required and stop",
@@ -999,15 +1006,20 @@ export function renderClaudeCheckCommand(pinnedVersion) {
999
1006
  "<process>",
1000
1007
  "Follow this order:",
1001
1008
  "",
1002
- `1. Run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\`.`,
1003
- "2. Explain each diagnostic finding with severity and provenance.",
1004
- "3. Surface any import-state caveats or editor-side warnings.",
1005
- "4. If issues found, suggest concrete remediation steps.",
1009
+ `1. Run \`npx -y @skillcap/gdh@${pinnedVersion} lsp status\` only for lifecycle visibility; do not treat lifecycle readiness as diagnostic evidence.`,
1010
+ `2. Run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\` to collect validator evidence.`,
1011
+ "3. Explain each diagnostic finding with severity, provenance, and validator family (`gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`).",
1012
+ "4. Surface any import-state caveats or editor-side warnings.",
1013
+ `5. If stale managed LSP state is suspected, use bounded GDH cleanup such as \`npx -y @skillcap/gdh@${pinnedVersion} lsp prune\` or \`npx -y @skillcap/gdh@${pinnedVersion} lsp stop\`; do not hand-manage Godot LSP processes.`,
1014
+ "6. If issues found, suggest concrete remediation steps.",
1006
1015
  "</process>",
1007
1016
  "",
1008
1017
  "<rules>",
1009
1018
  "- Do not fix issues automatically unless asked.",
1019
+ "- Do not hand-manage Godot LSP processes; use GDH lifecycle commands.",
1020
+ "- The gdh lsp lifecycle commands are status, prune, and stop.",
1010
1021
  "- Explain diagnostics in human-readable terms.",
1022
+ "- A ready `authoring.lsp` lifecycle is not proof that the authoring check collected diagnostics.",
1011
1023
  "- Report both hard failures and informational caveats.",
1012
1024
  "</rules>",
1013
1025
  "",
@@ -1039,15 +1051,20 @@ export function renderCodexCheckSkill(pinnedVersion) {
1039
1051
  "<process>",
1040
1052
  "Follow this order:",
1041
1053
  "",
1042
- `- run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\``,
1043
- "- explain each diagnostic finding with severity and provenance",
1054
+ `- run \`npx -y @skillcap/gdh@${pinnedVersion} lsp status\` only for lifecycle visibility; do not treat lifecycle readiness as diagnostic evidence`,
1055
+ `- run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\` to collect validator evidence`,
1056
+ "- explain each diagnostic finding with severity, provenance, and validator family (`gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`)",
1044
1057
  "- surface any import-state caveats or editor-side warnings",
1058
+ `- if stale managed LSP state is suspected, use bounded GDH cleanup such as \`npx -y @skillcap/gdh@${pinnedVersion} lsp prune\` or \`npx -y @skillcap/gdh@${pinnedVersion} lsp stop\`; do not hand-manage Godot LSP processes`,
1045
1059
  "- if issues found, suggest concrete remediation steps",
1046
1060
  "</process>",
1047
1061
  "",
1048
1062
  "<rules>",
1049
1063
  "- Do not fix issues automatically unless asked.",
1064
+ "- Do not hand-manage Godot LSP processes; use GDH lifecycle commands.",
1065
+ "- The gdh lsp lifecycle commands are status, prune, and stop.",
1050
1066
  "- Explain diagnostics in human-readable terms.",
1067
+ "- A ready `authoring.lsp` lifecycle is not proof that the authoring check collected diagnostics.",
1051
1068
  "- Report both hard failures and informational caveats.",
1052
1069
  "</rules>",
1053
1070
  "",
@@ -1077,15 +1094,20 @@ export function renderCursorCheckSkill(pinnedVersion) {
1077
1094
  "<process>",
1078
1095
  "Follow this order:",
1079
1096
  "",
1080
- `- run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\``,
1081
- "- explain each diagnostic finding with severity and provenance",
1097
+ `- run \`npx -y @skillcap/gdh@${pinnedVersion} lsp status\` only for lifecycle visibility; do not treat lifecycle readiness as diagnostic evidence`,
1098
+ `- run \`npx -y @skillcap/gdh@${pinnedVersion} authoring check\` to collect validator evidence`,
1099
+ "- explain each diagnostic finding with severity, provenance, and validator family (`gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`)",
1082
1100
  "- surface any import-state caveats or editor-side warnings",
1101
+ `- if stale managed LSP state is suspected, use bounded GDH cleanup such as \`npx -y @skillcap/gdh@${pinnedVersion} lsp prune\` or \`npx -y @skillcap/gdh@${pinnedVersion} lsp stop\`; do not hand-manage Godot LSP processes`,
1083
1102
  "- if issues found, suggest concrete remediation steps",
1084
1103
  "</process>",
1085
1104
  "",
1086
1105
  "<rules>",
1087
1106
  "- Do not fix issues automatically unless asked.",
1107
+ "- Do not hand-manage Godot LSP processes; use GDH lifecycle commands.",
1108
+ "- The gdh lsp lifecycle commands are status, prune, and stop.",
1088
1109
  "- Explain diagnostics in human-readable terms.",
1110
+ "- A ready `authoring.lsp` lifecycle is not proof that the authoring check collected diagnostics.",
1089
1111
  "- Report both hard failures and informational caveats.",
1090
1112
  "</rules>",
1091
1113
  "",
@@ -1228,8 +1250,9 @@ export function renderClaudeVerifyCommand(pinnedVersion) {
1228
1250
  "1. Identify changed files from git diff or user input.",
1229
1251
  `2. Run \`npx -y @skillcap/gdh@${pinnedVersion} verify recommend\` with those files to get recommended validation kinds.`,
1230
1252
  `3. Run \`npx -y @skillcap/gdh@${pinnedVersion} verify done\` with performed validations to check done eligibility.`,
1231
- "4. Summarize gaps between recommended and performed validation.",
1232
- "5. Suggest specific next verification steps.",
1253
+ "4. For authoring checks, explain validator-family expectations: `gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`, and manual validation for unsupported authoring files.",
1254
+ "5. Summarize gaps between recommended and performed validation, including unavailable/degraded authoring evidence.",
1255
+ "6. Suggest specific next verification steps.",
1233
1256
  "</process>",
1234
1257
  "",
1235
1258
  "<rules>",
@@ -1269,7 +1292,8 @@ export function renderCodexVerifySkill(pinnedVersion) {
1269
1292
  "- identify changed files from git diff or user input",
1270
1293
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} verify recommend\` with those files to get recommended validation kinds`,
1271
1294
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} verify done\` with performed validations to check done eligibility`,
1272
- "- summarize gaps between recommended and performed validation",
1295
+ "- for authoring checks, explain validator-family expectations: `gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`, and manual validation for unsupported authoring files",
1296
+ "- summarize gaps between recommended and performed validation, including unavailable/degraded authoring evidence",
1273
1297
  "- suggest specific next verification steps",
1274
1298
  "</process>",
1275
1299
  "",
@@ -1308,7 +1332,8 @@ export function renderCursorVerifySkill(pinnedVersion) {
1308
1332
  "- identify changed files from git diff or user input",
1309
1333
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} verify recommend\` with those files to get recommended validation kinds`,
1310
1334
  `- run \`npx -y @skillcap/gdh@${pinnedVersion} verify done\` with performed validations to check done eligibility`,
1311
- "- summarize gaps between recommended and performed validation",
1335
+ "- for authoring checks, explain validator-family expectations: `gdscript_lsp` for `.gd`, `godot_scene_resource` for `.tscn`/`.tres`, and manual validation for unsupported authoring files",
1336
+ "- summarize gaps between recommended and performed validation, including unavailable/degraded authoring evidence",
1312
1337
  "- suggest specific next verification steps",
1313
1338
  "</process>",
1314
1339
  "",
@@ -1329,7 +1354,9 @@ async function inspectProjectMcpSupport(targetPath, options) {
1329
1354
  const [projectFile, cursorFile, codexProjectContent, localPathHints] = await Promise.all([
1330
1355
  inspectJsonFile(path.join(options.integrationRootPath, PROJECT_MCP_RELATIVE_PATH)),
1331
1356
  inspectJsonFile(path.join(options.integrationRootPath, CURSOR_MCP_RELATIVE_PATH)),
1332
- fs.readFile(path.join(options.integrationRootPath, CODEX_PROJECT_CONFIG_RELATIVE_PATH), "utf8").catch(() => null),
1357
+ fs
1358
+ .readFile(path.join(options.integrationRootPath, CODEX_PROJECT_CONFIG_RELATIVE_PATH), "utf8")
1359
+ .catch(() => null),
1333
1360
  readLocalPathHints(options.integrationRootPath),
1334
1361
  ]);
1335
1362
  const codexConfigPath = path.join(os.homedir(), ".codex/config.toml");
@@ -1534,11 +1561,7 @@ function inspectCodexSkillSurface(targetPath, relativePath, content, expectedCon
1534
1561
  targetPath,
1535
1562
  relativePath,
1536
1563
  present: content !== null,
1537
- state: content === null
1538
- ? "missing"
1539
- : content === expectedContent
1540
- ? "ready"
1541
- : "misconfigured",
1564
+ state: content === null ? "missing" : content === expectedContent ? "ready" : "misconfigured",
1542
1565
  summary: content === null
1543
1566
  ? `Codex \`/${skillName}\` skill is missing and should install under .codex/skills/.`
1544
1567
  : content === expectedContent
@@ -1570,11 +1593,7 @@ function inspectClaudeCommandSurface(targetPath, relativePath, content, expected
1570
1593
  targetPath,
1571
1594
  relativePath,
1572
1595
  present: content !== null,
1573
- state: content === null
1574
- ? "missing"
1575
- : content === expectedContent
1576
- ? "ready"
1577
- : "misconfigured",
1596
+ state: content === null ? "missing" : content === expectedContent ? "ready" : "misconfigured",
1578
1597
  summary: content === null
1579
1598
  ? `Claude \`/${commandName}\` command is missing and should install under .claude/commands/gdh/.`
1580
1599
  : content === expectedContent
@@ -1606,11 +1625,7 @@ function inspectCursorSkillSurface(targetPath, relativePath, content, expectedCo
1606
1625
  targetPath,
1607
1626
  relativePath,
1608
1627
  present: content !== null,
1609
- state: content === null
1610
- ? "missing"
1611
- : content === expectedContent
1612
- ? "ready"
1613
- : "misconfigured",
1628
+ state: content === null ? "missing" : content === expectedContent ? "ready" : "misconfigured",
1614
1629
  summary: content === null
1615
1630
  ? `Cursor \`/${skillName}\` skill is missing and should install under .cursor/skills/.`
1616
1631
  : content === expectedContent
@@ -1623,17 +1638,31 @@ function inspectCursorSkillSurface(targetPath, relativePath, content, expectedCo
1623
1638
  async function inspectCodexAdapter(targetPath, guidance, projectMcp, pinnedVersion, options) {
1624
1639
  const codexSkillPath = path.join(targetPath, CODEX_ONBOARD_SKILL_RELATIVE_PATH);
1625
1640
  const codexSkillContent = await fs.readFile(codexSkillPath, "utf8").catch(() => null);
1626
- const codexStatusContent = await fs.readFile(path.join(targetPath, CODEX_STATUS_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1627
- const codexMigrateContent = await fs.readFile(path.join(targetPath, CODEX_MIGRATE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1641
+ const codexStatusContent = await fs
1642
+ .readFile(path.join(targetPath, CODEX_STATUS_SKILL_RELATIVE_PATH), "utf8")
1643
+ .catch(() => null);
1644
+ const codexMigrateContent = await fs
1645
+ .readFile(path.join(targetPath, CODEX_MIGRATE_SKILL_RELATIVE_PATH), "utf8")
1646
+ .catch(() => null);
1628
1647
  // Phase 13 Plan 13-03 deliverable — /gdh-update skill for Codex. Inspection
1629
1648
  // wiring is required so planSkillInstallAction can see the surface state;
1630
1649
  // otherwise the planner returns `unchanged` for a missing file and install
1631
1650
  // becomes a no-op (Plan 13-05 integration-test Rule 2 fix).
1632
- const codexUpdateContent = await fs.readFile(path.join(targetPath, CODEX_UPDATE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1633
- const codexCheckContent = await fs.readFile(path.join(targetPath, CODEX_CHECK_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1634
- const codexPrepareContent = await fs.readFile(path.join(targetPath, CODEX_PREPARE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1635
- const codexVerifyContent = await fs.readFile(path.join(targetPath, CODEX_VERIFY_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1636
- const codexScanContent = await fs.readFile(path.join(targetPath, CODEX_SCAN_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1651
+ const codexUpdateContent = await fs
1652
+ .readFile(path.join(targetPath, CODEX_UPDATE_SKILL_RELATIVE_PATH), "utf8")
1653
+ .catch(() => null);
1654
+ const codexCheckContent = await fs
1655
+ .readFile(path.join(targetPath, CODEX_CHECK_SKILL_RELATIVE_PATH), "utf8")
1656
+ .catch(() => null);
1657
+ const codexPrepareContent = await fs
1658
+ .readFile(path.join(targetPath, CODEX_PREPARE_SKILL_RELATIVE_PATH), "utf8")
1659
+ .catch(() => null);
1660
+ const codexVerifyContent = await fs
1661
+ .readFile(path.join(targetPath, CODEX_VERIFY_SKILL_RELATIVE_PATH), "utf8")
1662
+ .catch(() => null);
1663
+ const codexScanContent = await fs
1664
+ .readFile(path.join(targetPath, CODEX_SCAN_SKILL_RELATIVE_PATH), "utf8")
1665
+ .catch(() => null);
1637
1666
  const expectedCodexOnboardSkill = pinnedVersion === null ? null : renderCodexOnboardSkill(pinnedVersion);
1638
1667
  const expectedCodexStatusSkill = pinnedVersion === null ? null : renderCodexStatusSkill(pinnedVersion);
1639
1668
  const expectedCodexMigrateSkill = pinnedVersion === null ? null : renderCodexMigrateSkill(pinnedVersion);
@@ -1723,20 +1752,40 @@ async function inspectClaudeAdapter(targetPath, guidance, projectMcp, pinnedVers
1723
1752
  const onboardCommandPath = path.join(targetPath, CLAUDE_ONBOARD_COMMAND_RELATIVE_PATH);
1724
1753
  const lstat = await fs.lstat(absolutePath).catch(() => null);
1725
1754
  const onboardCommandContent = await fs.readFile(onboardCommandPath, "utf8").catch(() => null);
1726
- const claudeStatusContent = await fs.readFile(path.join(targetPath, CLAUDE_STATUS_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1727
- const claudeMigrateContent = await fs.readFile(path.join(targetPath, CLAUDE_MIGRATE_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1755
+ const claudeStatusContent = await fs
1756
+ .readFile(path.join(targetPath, CLAUDE_STATUS_COMMAND_RELATIVE_PATH), "utf8")
1757
+ .catch(() => null);
1758
+ const claudeMigrateContent = await fs
1759
+ .readFile(path.join(targetPath, CLAUDE_MIGRATE_COMMAND_RELATIVE_PATH), "utf8")
1760
+ .catch(() => null);
1728
1761
  // Phase 13 Plan 13-03 deliverable — /gdh-update slash command for Claude.
1729
1762
  // Inspection wiring is required so planSkillInstallAction can see the surface
1730
1763
  // state; otherwise the planner returns `unchanged` for a missing file and
1731
1764
  // install becomes a no-op (Plan 13-05 integration-test Rule 2 fix).
1732
- const claudeUpdateContent = await fs.readFile(path.join(targetPath, CLAUDE_UPDATE_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1733
- const claudeCheckContent = await fs.readFile(path.join(targetPath, CLAUDE_CHECK_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1734
- const claudePrepareContent = await fs.readFile(path.join(targetPath, CLAUDE_PREPARE_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1735
- const claudeVerifyContent = await fs.readFile(path.join(targetPath, CLAUDE_VERIFY_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1736
- const claudeScanContent = await fs.readFile(path.join(targetPath, CLAUDE_SCAN_COMMAND_RELATIVE_PATH), "utf8").catch(() => null);
1737
- const claudeCheckUpdateHookContent = await fs.readFile(path.join(targetPath, CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH), "utf8").catch(() => null);
1738
- const claudeCheckUpdateWorkerContent = await fs.readFile(path.join(targetPath, CLAUDE_CHECK_UPDATE_WORKER_RELATIVE_PATH), "utf8").catch(() => null);
1739
- const claudeStatuslineContent = await fs.readFile(path.join(targetPath, CLAUDE_STATUSLINE_RELATIVE_PATH), "utf8").catch(() => null);
1765
+ const claudeUpdateContent = await fs
1766
+ .readFile(path.join(targetPath, CLAUDE_UPDATE_COMMAND_RELATIVE_PATH), "utf8")
1767
+ .catch(() => null);
1768
+ const claudeCheckContent = await fs
1769
+ .readFile(path.join(targetPath, CLAUDE_CHECK_COMMAND_RELATIVE_PATH), "utf8")
1770
+ .catch(() => null);
1771
+ const claudePrepareContent = await fs
1772
+ .readFile(path.join(targetPath, CLAUDE_PREPARE_COMMAND_RELATIVE_PATH), "utf8")
1773
+ .catch(() => null);
1774
+ const claudeVerifyContent = await fs
1775
+ .readFile(path.join(targetPath, CLAUDE_VERIFY_COMMAND_RELATIVE_PATH), "utf8")
1776
+ .catch(() => null);
1777
+ const claudeScanContent = await fs
1778
+ .readFile(path.join(targetPath, CLAUDE_SCAN_COMMAND_RELATIVE_PATH), "utf8")
1779
+ .catch(() => null);
1780
+ const claudeCheckUpdateHookContent = await fs
1781
+ .readFile(path.join(targetPath, CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH), "utf8")
1782
+ .catch(() => null);
1783
+ const claudeCheckUpdateWorkerContent = await fs
1784
+ .readFile(path.join(targetPath, CLAUDE_CHECK_UPDATE_WORKER_RELATIVE_PATH), "utf8")
1785
+ .catch(() => null);
1786
+ const claudeStatuslineContent = await fs
1787
+ .readFile(path.join(targetPath, CLAUDE_STATUSLINE_RELATIVE_PATH), "utf8")
1788
+ .catch(() => null);
1740
1789
  let detectedTarget = null;
1741
1790
  if (lstat?.isSymbolicLink()) {
1742
1791
  detectedTarget = await fs.readlink(absolutePath).catch(() => null);
@@ -1827,17 +1876,31 @@ async function inspectCursorAdapter(targetPath, guidance, projectMcp, pinnedVers
1827
1876
  const onboardSkillPath = path.join(targetPath, CURSOR_ONBOARD_SKILL_RELATIVE_PATH);
1828
1877
  const content = await fs.readFile(absolutePath, "utf8").catch(() => null);
1829
1878
  const onboardSkillContent = await fs.readFile(onboardSkillPath, "utf8").catch(() => null);
1830
- const cursorStatusContent = await fs.readFile(path.join(targetPath, CURSOR_STATUS_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1831
- const cursorMigrateContent = await fs.readFile(path.join(targetPath, CURSOR_MIGRATE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1879
+ const cursorStatusContent = await fs
1880
+ .readFile(path.join(targetPath, CURSOR_STATUS_SKILL_RELATIVE_PATH), "utf8")
1881
+ .catch(() => null);
1882
+ const cursorMigrateContent = await fs
1883
+ .readFile(path.join(targetPath, CURSOR_MIGRATE_SKILL_RELATIVE_PATH), "utf8")
1884
+ .catch(() => null);
1832
1885
  // Phase 13 Plan 13-03 deliverable — /gdh-update skill for Cursor. Inspection
1833
1886
  // wiring required so planSkillInstallAction sees the surface state; otherwise
1834
1887
  // the planner returns `unchanged` for a missing file and install becomes a
1835
1888
  // no-op (Plan 13-05 integration-test Rule 2 fix).
1836
- const cursorUpdateContent = await fs.readFile(path.join(targetPath, CURSOR_UPDATE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1837
- const cursorCheckContent = await fs.readFile(path.join(targetPath, CURSOR_CHECK_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1838
- const cursorPrepareContent = await fs.readFile(path.join(targetPath, CURSOR_PREPARE_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1839
- const cursorVerifyContent = await fs.readFile(path.join(targetPath, CURSOR_VERIFY_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1840
- const cursorScanContent = await fs.readFile(path.join(targetPath, CURSOR_SCAN_SKILL_RELATIVE_PATH), "utf8").catch(() => null);
1889
+ const cursorUpdateContent = await fs
1890
+ .readFile(path.join(targetPath, CURSOR_UPDATE_SKILL_RELATIVE_PATH), "utf8")
1891
+ .catch(() => null);
1892
+ const cursorCheckContent = await fs
1893
+ .readFile(path.join(targetPath, CURSOR_CHECK_SKILL_RELATIVE_PATH), "utf8")
1894
+ .catch(() => null);
1895
+ const cursorPrepareContent = await fs
1896
+ .readFile(path.join(targetPath, CURSOR_PREPARE_SKILL_RELATIVE_PATH), "utf8")
1897
+ .catch(() => null);
1898
+ const cursorVerifyContent = await fs
1899
+ .readFile(path.join(targetPath, CURSOR_VERIFY_SKILL_RELATIVE_PATH), "utf8")
1900
+ .catch(() => null);
1901
+ const cursorScanContent = await fs
1902
+ .readFile(path.join(targetPath, CURSOR_SCAN_SKILL_RELATIVE_PATH), "utf8")
1903
+ .catch(() => null);
1841
1904
  const expectedContent = renderCursorRule();
1842
1905
  const version = readCursorRuleVersion(content);
1843
1906
  const expectedCursorOnboardSkill = pinnedVersion === null ? null : renderCursorOnboardSkill(pinnedVersion);
@@ -1855,11 +1918,7 @@ async function inspectCursorAdapter(targetPath, guidance, projectMcp, pinnedVers
1855
1918
  targetPath,
1856
1919
  relativePath: CURSOR_RULE_RELATIVE_PATH,
1857
1920
  present: content !== null,
1858
- state: content === null
1859
- ? "missing"
1860
- : content === expectedContent
1861
- ? "ready"
1862
- : "misconfigured",
1921
+ state: content === null ? "missing" : content === expectedContent ? "ready" : "misconfigured",
1863
1922
  summary: content === null
1864
1923
  ? "Cursor reinforcement is missing and should point back to AGENTS.md."
1865
1924
  : content === expectedContent
@@ -2145,12 +2204,7 @@ function planCodexUserInstallActions(targetPath, projectMcp, integrationRootPath
2145
2204
  }
2146
2205
  const resolvedTargetPath = path.resolve(targetPath);
2147
2206
  const resolvedIntegrationRootPath = path.resolve(integrationRootPath);
2148
- const codexCommandArgs = [
2149
- "-y",
2150
- `@skillcap/gdh@${pinnedVersion}`,
2151
- "mcp",
2152
- "serve",
2153
- ];
2207
+ const codexCommandArgs = ["-y", `@skillcap/gdh@${pinnedVersion}`, "mcp", "serve"];
2154
2208
  if (resolvedTargetPath !== resolvedIntegrationRootPath) {
2155
2209
  codexCommandArgs.push("--target", resolvedTargetPath);
2156
2210
  }
@@ -2259,11 +2313,7 @@ function planClaudeInstallActions(targetPath, adapter, pinnedVersion) {
2259
2313
  targetPath,
2260
2314
  relativePath: CLAUDE_SETTINGS_RELATIVE_PATH,
2261
2315
  state: settingsIsUnchanged ? "unchanged" : "planned",
2262
- mode: settingsIsUnchanged
2263
- ? "unchanged"
2264
- : settingsExistedOnDisk
2265
- ? "replace"
2266
- : "create",
2316
+ mode: settingsIsUnchanged ? "unchanged" : settingsExistedOnDisk ? "replace" : "create",
2267
2317
  summary: settingsIsUnchanged
2268
2318
  ? "GDH SessionStart hook + statusline already registered in .claude/settings.json."
2269
2319
  : settingsExistedOnDisk
@@ -2423,8 +2473,7 @@ function isMatchingManagedMcpServerEntry(entry, expectedEntry) {
2423
2473
  if (entry === null) {
2424
2474
  return false;
2425
2475
  }
2426
- return (JSON.stringify(normalizeJson(entry)) ===
2427
- JSON.stringify(normalizeJson(expectedEntry)));
2476
+ return JSON.stringify(normalizeJson(entry)) === JSON.stringify(normalizeJson(expectedEntry));
2428
2477
  }
2429
2478
  function renderManagedMcpConfig(absolutePath, managedEntry) {
2430
2479
  const existing = readExistingMcpConfig(absolutePath);
@@ -2502,10 +2551,7 @@ function extractManagedCodexSection(content) {
2502
2551
  break;
2503
2552
  }
2504
2553
  }
2505
- return lines
2506
- .slice(start, end)
2507
- .join("\n")
2508
- .replace(/\s+$/, "");
2554
+ return lines.slice(start, end).join("\n").replace(/\s+$/, "");
2509
2555
  }
2510
2556
  function normalizeJson(value) {
2511
2557
  if (Array.isArray(value)) {
@@ -2648,12 +2694,7 @@ async function listCodexMcpServers() {
2648
2694
  function isMatchingCodexRegistration(registration, input) {
2649
2695
  const resolvedTargetPath = path.resolve(input.targetPath);
2650
2696
  const resolvedIntegrationRootPath = path.resolve(input.integrationRootPath);
2651
- const expectedArgs = [
2652
- "-y",
2653
- `@skillcap/gdh@${input.pinnedVersion}`,
2654
- "mcp",
2655
- "serve",
2656
- ];
2697
+ const expectedArgs = ["-y", `@skillcap/gdh@${input.pinnedVersion}`, "mcp", "serve"];
2657
2698
  if (resolvedTargetPath !== resolvedIntegrationRootPath) {
2658
2699
  expectedArgs.push("--target", resolvedTargetPath);
2659
2700
  }
@@ -2663,9 +2704,7 @@ function isMatchingCodexRegistration(registration, input) {
2663
2704
  }
2664
2705
  async function inspectProjectConfigLifecycleSurface(targetPath) {
2665
2706
  const relativePath = ".gdh/project.yaml";
2666
- const content = await fs
2667
- .readFile(path.join(targetPath, relativePath), "utf8")
2668
- .catch(() => null);
2707
+ const content = await fs.readFile(path.join(targetPath, relativePath), "utf8").catch(() => null);
2669
2708
  const detectedVersion = readYamlVersionHeader(content);
2670
2709
  const probes = [
2671
2710
  createVersionProbe({
@@ -2768,9 +2807,7 @@ async function inspectVerificationScenarioLifecycleSurface(targetPath) {
2768
2807
  }
2769
2808
  async function inspectRulesLifecycleSurface(targetPath) {
2770
2809
  const relativePath = ".gdh/rules.yaml";
2771
- const content = await fs
2772
- .readFile(path.join(targetPath, relativePath), "utf8")
2773
- .catch(() => null);
2810
+ const content = await fs.readFile(path.join(targetPath, relativePath), "utf8").catch(() => null);
2774
2811
  const detectedVersion = readYamlVersionHeader(content);
2775
2812
  const probes = [
2776
2813
  createVersionProbe({
@@ -2869,9 +2906,7 @@ function inspectAgentContractLifecycleSurface(targetPath, guidanceStatus) {
2869
2906
  }
2870
2907
  async function inspectGuidanceIndexLifecycleSurface(targetPath) {
2871
2908
  const relativePath = "docs/agent/README.md";
2872
- const content = await fs
2873
- .readFile(path.join(targetPath, relativePath), "utf8")
2874
- .catch(() => null);
2909
+ const content = await fs.readFile(path.join(targetPath, relativePath), "utf8").catch(() => null);
2875
2910
  const detectedVersion = readTaggedVersion(content, /<!-- GDH GUIDANCE INDEX VERSION: (\d+) -->/);
2876
2911
  const probes = [
2877
2912
  createVersionProbe({
@@ -3079,9 +3114,7 @@ function inspectCursorRuleLifecycleSurface(targetPath, adapterStatus) {
3079
3114
  management: "managed",
3080
3115
  state: surface?.present ? "migration_available" : "migration_needed",
3081
3116
  summary: "Cursor rule file needs to be created or refreshed through the adapter install flow.",
3082
- reasons: surface?.present
3083
- ? ["cursor_rule_misconfigured"]
3084
- : ["cursor_rule_missing"],
3117
+ reasons: surface?.present ? ["cursor_rule_misconfigured"] : ["cursor_rule_missing"],
3085
3118
  probes,
3086
3119
  action: {
3087
3120
  kind: "run_repair",
@@ -3528,8 +3561,7 @@ function readTaggedVersion(content, pattern) {
3528
3561
  function findAdapterSurface(adapterStatus, agent, kind) {
3529
3562
  return (adapterStatus.adapters
3530
3563
  .find((entry) => entry.agent === agent)
3531
- ?.surfaces.find((surface) => surface.kind === kind && surface.scope === "repo") ??
3532
- null);
3564
+ ?.surfaces.find((surface) => surface.kind === kind && surface.scope === "repo") ?? null);
3533
3565
  }
3534
3566
  async function pathExists(targetPath) {
3535
3567
  try {
@@ -3575,6 +3607,9 @@ async function addOperationalCapabilityStatus(capabilities, targetPath) {
3575
3607
  operationalAvailability: "available",
3576
3608
  operationalReason: null,
3577
3609
  operationalSummary: "Machine-local Godot editor path is configured, so managed authoring.lsp can launch or reuse an instance.",
3610
+ diagnosticAvailability: "available",
3611
+ diagnosticReason: null,
3612
+ diagnosticSummary: "Machine-local Godot editor path is configured. `gdh authoring check` can launch the GDScript LSP and scene/resource validators, but capability status alone is not diagnostic evidence.",
3578
3613
  };
3579
3614
  }
3580
3615
  return {
@@ -3582,6 +3617,9 @@ async function addOperationalCapabilityStatus(capabilities, targetPath) {
3582
3617
  operationalAvailability: "unavailable",
3583
3618
  operationalReason: "godot_editor_not_configured",
3584
3619
  operationalSummary: "Managed authoring.lsp is enabled for this target, but no machine-local Godot editor path is configured yet.",
3620
+ diagnosticAvailability: "unavailable",
3621
+ diagnosticReason: "godot_editor_not_configured",
3622
+ diagnosticSummary: "Authoring diagnostics require `gdh authoring check` plus a machine-local Godot editor path; declared `authoring.lsp` capability is not diagnostic evidence.",
3585
3623
  };
3586
3624
  });
3587
3625
  }
@@ -3610,9 +3648,9 @@ function deriveRepoState(context) {
3610
3648
  function normalizeChangedFiles(files) {
3611
3649
  return [...new Set(files.map((file) => file.trim()).filter((file) => file.length > 0))];
3612
3650
  }
3613
- export { bumpAndRebakePin, } from "./self-update-mechanics.js";
3614
- export { CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH } from "./claude-update-hook-render.js";
3615
3651
  export { CLAUDE_STATUSLINE_RELATIVE_PATH } from "./claude-statusline-render.js";
3652
+ export { CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH } from "./claude-update-hook-render.js";
3653
+ export { bumpAndRebakePin, } from "./self-update-mechanics.js";
3616
3654
  // Internal aggregator exposed for Wave 0 unit tests
3617
3655
  // (packages/adapters/src/lifecycle-compatibility.test.ts). Callers outside this
3618
3656
  // package should continue to use inspectProjectLifecycleCompatibility, which