@skillcap/gdh 0.23.0 → 0.25.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 (165) hide show
  1. package/INSTALL-BUNDLE.json +1 -1
  2. package/RELEASE-SPAN-UPDATE-CONTRACTS.json +122 -0
  3. package/node_modules/@gdh/adapters/dist/authoring-hook-render.d.ts.map +1 -1
  4. package/node_modules/@gdh/adapters/dist/authoring-hook-render.js +9 -131
  5. package/node_modules/@gdh/adapters/dist/authoring-hook-render.js.map +1 -1
  6. package/node_modules/@gdh/adapters/dist/claude-statusline-render.d.ts.map +1 -1
  7. package/node_modules/@gdh/adapters/dist/claude-statusline-render.js +6 -28
  8. package/node_modules/@gdh/adapters/dist/claude-statusline-render.js.map +1 -1
  9. package/node_modules/@gdh/adapters/dist/claude-update-hook-render.d.ts.map +1 -1
  10. package/node_modules/@gdh/adapters/dist/claude-update-hook-render.js +7 -40
  11. package/node_modules/@gdh/adapters/dist/claude-update-hook-render.js.map +1 -1
  12. package/node_modules/@gdh/adapters/dist/claude-update-worker-render.d.ts.map +1 -1
  13. package/node_modules/@gdh/adapters/dist/claude-update-worker-render.js +7 -68
  14. package/node_modules/@gdh/adapters/dist/claude-update-worker-render.js.map +1 -1
  15. package/node_modules/@gdh/adapters/dist/deferred-actions-advisory.d.ts +71 -0
  16. package/node_modules/@gdh/adapters/dist/deferred-actions-advisory.d.ts.map +1 -0
  17. package/node_modules/@gdh/adapters/dist/deferred-actions-advisory.js +89 -0
  18. package/node_modules/@gdh/adapters/dist/deferred-actions-advisory.js.map +1 -0
  19. package/node_modules/@gdh/adapters/dist/durable-backup.d.ts +209 -0
  20. package/node_modules/@gdh/adapters/dist/durable-backup.d.ts.map +1 -0
  21. package/node_modules/@gdh/adapters/dist/durable-backup.js +346 -0
  22. package/node_modules/@gdh/adapters/dist/durable-backup.js.map +1 -0
  23. package/node_modules/@gdh/adapters/dist/index.d.ts +11 -3
  24. package/node_modules/@gdh/adapters/dist/index.d.ts.map +1 -1
  25. package/node_modules/@gdh/adapters/dist/index.js +79 -43
  26. package/node_modules/@gdh/adapters/dist/index.js.map +1 -1
  27. package/node_modules/@gdh/adapters/dist/inventory-sweep.d.ts +53 -0
  28. package/node_modules/@gdh/adapters/dist/inventory-sweep.d.ts.map +1 -0
  29. package/node_modules/@gdh/adapters/dist/inventory-sweep.js +98 -0
  30. package/node_modules/@gdh/adapters/dist/inventory-sweep.js.map +1 -0
  31. package/node_modules/@gdh/adapters/dist/process-orchestration.d.ts +223 -0
  32. package/node_modules/@gdh/adapters/dist/process-orchestration.d.ts.map +1 -0
  33. package/node_modules/@gdh/adapters/dist/process-orchestration.js +368 -0
  34. package/node_modules/@gdh/adapters/dist/process-orchestration.js.map +1 -0
  35. package/node_modules/@gdh/adapters/dist/self-update-mechanics.d.ts +157 -14
  36. package/node_modules/@gdh/adapters/dist/self-update-mechanics.d.ts.map +1 -1
  37. package/node_modules/@gdh/adapters/dist/self-update-mechanics.js +570 -89
  38. package/node_modules/@gdh/adapters/dist/self-update-mechanics.js.map +1 -1
  39. package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts +2 -5
  40. package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts.map +1 -1
  41. package/node_modules/@gdh/adapters/dist/skill-rendering.js +39 -56
  42. package/node_modules/@gdh/adapters/dist/skill-rendering.js.map +1 -1
  43. package/node_modules/@gdh/adapters/dist/template-assets.d.ts +2 -0
  44. package/node_modules/@gdh/adapters/dist/template-assets.d.ts.map +1 -0
  45. package/node_modules/@gdh/adapters/dist/template-assets.js +26 -0
  46. package/node_modules/@gdh/adapters/dist/template-assets.js.map +1 -0
  47. package/node_modules/@gdh/adapters/dist/templates/authoring-hook.js.tpl +128 -0
  48. package/node_modules/@gdh/adapters/dist/templates/claude-check-update-hook.js.tpl +37 -0
  49. package/node_modules/@gdh/adapters/dist/templates/claude-check-update-worker.js.tpl +65 -0
  50. package/node_modules/@gdh/adapters/dist/templates/claude-statusline.js.tpl +25 -0
  51. package/node_modules/@gdh/adapters/package.json +8 -8
  52. package/node_modules/@gdh/authoring/package.json +2 -2
  53. package/node_modules/@gdh/cli/dist/index.d.ts +9 -0
  54. package/node_modules/@gdh/cli/dist/index.d.ts.map +1 -1
  55. package/node_modules/@gdh/cli/dist/index.js +249 -6
  56. package/node_modules/@gdh/cli/dist/index.js.map +1 -1
  57. package/node_modules/@gdh/cli/dist/migrate.d.ts +152 -1
  58. package/node_modules/@gdh/cli/dist/migrate.d.ts.map +1 -1
  59. package/node_modules/@gdh/cli/dist/migrate.js +355 -8
  60. package/node_modules/@gdh/cli/dist/migrate.js.map +1 -1
  61. package/node_modules/@gdh/cli/dist/self-update.d.ts +14 -0
  62. package/node_modules/@gdh/cli/dist/self-update.d.ts.map +1 -1
  63. package/node_modules/@gdh/cli/dist/self-update.js +197 -15
  64. package/node_modules/@gdh/cli/dist/self-update.js.map +1 -1
  65. package/node_modules/@gdh/cli/dist/setup.d.ts +4 -0
  66. package/node_modules/@gdh/cli/dist/setup.d.ts.map +1 -1
  67. package/node_modules/@gdh/cli/dist/setup.js +8 -67
  68. package/node_modules/@gdh/cli/dist/setup.js.map +1 -1
  69. package/node_modules/@gdh/cli/package.json +10 -10
  70. package/node_modules/@gdh/core/dist/index.d.ts +99 -5
  71. package/node_modules/@gdh/core/dist/index.d.ts.map +1 -1
  72. package/node_modules/@gdh/core/dist/index.js +24 -5
  73. package/node_modules/@gdh/core/dist/index.js.map +1 -1
  74. package/node_modules/@gdh/core/dist/migrations/entries/s2c2_to_s2c3_rules_schema_v2_to_v3.d.ts +3 -0
  75. package/node_modules/@gdh/core/dist/migrations/entries/s2c2_to_s2c3_rules_schema_v2_to_v3.d.ts.map +1 -0
  76. package/node_modules/@gdh/core/dist/migrations/entries/s2c2_to_s2c3_rules_schema_v2_to_v3.js +247 -0
  77. package/node_modules/@gdh/core/dist/migrations/entries/s2c2_to_s2c3_rules_schema_v2_to_v3.js.map +1 -0
  78. package/node_modules/@gdh/core/dist/migrations/entries/s3c8_to_s3c9_register_runtime_bridge_autoload.d.ts +3 -0
  79. package/node_modules/@gdh/core/dist/migrations/entries/s3c8_to_s3c9_register_runtime_bridge_autoload.d.ts.map +1 -0
  80. package/node_modules/@gdh/core/dist/migrations/entries/s3c8_to_s3c9_register_runtime_bridge_autoload.js +152 -0
  81. package/node_modules/@gdh/core/dist/migrations/entries/s3c8_to_s3c9_register_runtime_bridge_autoload.js.map +1 -0
  82. package/node_modules/@gdh/core/dist/migrations/envelopes/envelope-output-validator.d.ts +3 -0
  83. package/node_modules/@gdh/core/dist/migrations/envelopes/envelope-output-validator.d.ts.map +1 -0
  84. package/node_modules/@gdh/core/dist/migrations/envelopes/envelope-output-validator.js +67 -0
  85. package/node_modules/@gdh/core/dist/migrations/envelopes/envelope-output-validator.js.map +1 -0
  86. package/node_modules/@gdh/core/dist/migrations/envelopes/index.d.ts +37 -0
  87. package/node_modules/@gdh/core/dist/migrations/envelopes/index.d.ts.map +1 -0
  88. package/node_modules/@gdh/core/dist/migrations/envelopes/index.js +60 -0
  89. package/node_modules/@gdh/core/dist/migrations/envelopes/index.js.map +1 -0
  90. package/node_modules/@gdh/core/dist/migrations/envelopes/types.d.ts +121 -0
  91. package/node_modules/@gdh/core/dist/migrations/envelopes/types.d.ts.map +1 -0
  92. package/node_modules/@gdh/core/dist/migrations/envelopes/types.js +2 -0
  93. package/node_modules/@gdh/core/dist/migrations/envelopes/types.js.map +1 -0
  94. package/node_modules/@gdh/core/dist/migrations/golden-harness.d.ts +40 -0
  95. package/node_modules/@gdh/core/dist/migrations/golden-harness.d.ts.map +1 -0
  96. package/node_modules/@gdh/core/dist/migrations/golden-harness.js +71 -0
  97. package/node_modules/@gdh/core/dist/migrations/golden-harness.js.map +1 -0
  98. package/node_modules/@gdh/core/dist/migrations/managed-surface-classes.d.ts +322 -0
  99. package/node_modules/@gdh/core/dist/migrations/managed-surface-classes.d.ts.map +1 -0
  100. package/node_modules/@gdh/core/dist/migrations/managed-surface-classes.js +384 -0
  101. package/node_modules/@gdh/core/dist/migrations/managed-surface-classes.js.map +1 -0
  102. package/node_modules/@gdh/core/dist/migrations/managed-target-surface-inventory.d.ts +294 -0
  103. package/node_modules/@gdh/core/dist/migrations/managed-target-surface-inventory.d.ts.map +1 -0
  104. package/node_modules/@gdh/core/dist/migrations/managed-target-surface-inventory.js +365 -0
  105. package/node_modules/@gdh/core/dist/migrations/managed-target-surface-inventory.js.map +1 -0
  106. package/node_modules/@gdh/core/dist/migrations/probes.d.ts +58 -0
  107. package/node_modules/@gdh/core/dist/migrations/probes.d.ts.map +1 -0
  108. package/node_modules/@gdh/core/dist/migrations/probes.js +112 -0
  109. package/node_modules/@gdh/core/dist/migrations/probes.js.map +1 -0
  110. package/node_modules/@gdh/core/dist/migrations/registry.d.ts +205 -0
  111. package/node_modules/@gdh/core/dist/migrations/registry.d.ts.map +1 -0
  112. package/node_modules/@gdh/core/dist/migrations/registry.js +214 -0
  113. package/node_modules/@gdh/core/dist/migrations/registry.js.map +1 -0
  114. package/node_modules/@gdh/core/dist/state/atomic-write.d.ts +19 -0
  115. package/node_modules/@gdh/core/dist/state/atomic-write.d.ts.map +1 -0
  116. package/node_modules/@gdh/core/dist/state/atomic-write.js +34 -0
  117. package/node_modules/@gdh/core/dist/state/atomic-write.js.map +1 -0
  118. package/node_modules/@gdh/core/dist/state/migration-state.d.ts +135 -0
  119. package/node_modules/@gdh/core/dist/state/migration-state.d.ts.map +1 -0
  120. package/node_modules/@gdh/core/dist/state/migration-state.js +186 -0
  121. package/node_modules/@gdh/core/dist/state/migration-state.js.map +1 -0
  122. package/node_modules/@gdh/core/dist/state/processes-snapshot.d.ts +72 -0
  123. package/node_modules/@gdh/core/dist/state/processes-snapshot.d.ts.map +1 -0
  124. package/node_modules/@gdh/core/dist/state/processes-snapshot.js +113 -0
  125. package/node_modules/@gdh/core/dist/state/processes-snapshot.js.map +1 -0
  126. package/node_modules/@gdh/core/dist/state/render-inventory.d.ts +54 -0
  127. package/node_modules/@gdh/core/dist/state/render-inventory.d.ts.map +1 -0
  128. package/node_modules/@gdh/core/dist/state/render-inventory.js +77 -0
  129. package/node_modules/@gdh/core/dist/state/render-inventory.js.map +1 -0
  130. package/node_modules/@gdh/core/package.json +1 -1
  131. package/node_modules/@gdh/docs/dist/agent-contract.d.ts +2 -1
  132. package/node_modules/@gdh/docs/dist/agent-contract.d.ts.map +1 -1
  133. package/node_modules/@gdh/docs/dist/agent-contract.js +5 -3
  134. package/node_modules/@gdh/docs/dist/agent-contract.js.map +1 -1
  135. package/node_modules/@gdh/docs/dist/guidance.d.ts +2 -0
  136. package/node_modules/@gdh/docs/dist/guidance.d.ts.map +1 -1
  137. package/node_modules/@gdh/docs/dist/guidance.js +29 -255
  138. package/node_modules/@gdh/docs/dist/guidance.js.map +1 -1
  139. package/node_modules/@gdh/docs/dist/index.d.ts +1 -1
  140. package/node_modules/@gdh/docs/dist/index.d.ts.map +1 -1
  141. package/node_modules/@gdh/docs/dist/index.js +1 -1
  142. package/node_modules/@gdh/docs/dist/index.js.map +1 -1
  143. package/node_modules/@gdh/docs/dist/query.d.ts.map +1 -1
  144. package/node_modules/@gdh/docs/dist/query.js +4 -5
  145. package/node_modules/@gdh/docs/dist/query.js.map +1 -1
  146. package/node_modules/@gdh/docs/dist/recovery-hints.js +1 -1
  147. package/node_modules/@gdh/docs/dist/recovery-hints.js.map +1 -1
  148. package/node_modules/@gdh/docs/dist/template-assets.d.ts +2 -0
  149. package/node_modules/@gdh/docs/dist/template-assets.d.ts.map +1 -0
  150. package/node_modules/@gdh/docs/dist/template-assets.js +26 -0
  151. package/node_modules/@gdh/docs/dist/template-assets.js.map +1 -0
  152. package/node_modules/@gdh/docs/dist/templates/guidance/authoring-and-validation.md.tpl +111 -0
  153. package/node_modules/@gdh/docs/dist/templates/guidance/gdh-glossary.md.tpl +34 -0
  154. package/node_modules/@gdh/docs/dist/templates/guidance/persistence-semantics.md.tpl +24 -0
  155. package/node_modules/@gdh/docs/dist/templates/guidance/project-migration.md.tpl +19 -0
  156. package/node_modules/@gdh/docs/dist/templates/guidance/project-surfaces.md.tpl +14 -0
  157. package/node_modules/@gdh/docs/package.json +2 -2
  158. package/node_modules/@gdh/mcp/package.json +8 -8
  159. package/node_modules/@gdh/observability/package.json +2 -2
  160. package/node_modules/@gdh/runtime/dist/bridge-surface.js +63 -2
  161. package/node_modules/@gdh/runtime/dist/bridge-surface.js.map +1 -1
  162. package/node_modules/@gdh/runtime/package.json +2 -2
  163. package/node_modules/@gdh/scan/package.json +3 -3
  164. package/node_modules/@gdh/verify/package.json +7 -7
  165. package/package.json +11 -11
@@ -0,0 +1,365 @@
1
+ import { GDH_MANAGED_SURFACE_CLASSES } from "./managed-surface-classes.js";
2
+ const GDH_SKILL_IDS = [
3
+ "onboard",
4
+ "status",
5
+ "scan",
6
+ "migrate",
7
+ "update",
8
+ "check",
9
+ "prepare",
10
+ "run-game",
11
+ ];
12
+ const GDH_SKILL_PURPOSES = {
13
+ onboard: "first-use readiness handoff",
14
+ status: "readiness and lifecycle status interpretation",
15
+ scan: "Godot target discovery",
16
+ migrate: "managed surface migration and repair",
17
+ update: "pinned GDH self-update",
18
+ check: "authoring validation evidence",
19
+ prepare: "cold worktree and import-state preparation",
20
+ "run-game": "runtime run configuration execution",
21
+ };
22
+ const AGENT_SKILL_LOCATIONS = {
23
+ claude: ".claude/skills",
24
+ codex: ".agents/skills",
25
+ cursor: ".cursor/skills",
26
+ };
27
+ const AGENT_SKILL_DISCOVERY_NOTES = {
28
+ claude: "Claude Code loads project skills from the provider-native .claude/skills surface.",
29
+ codex: "Codex consumes shared project skills from .agents/skills; legacy .codex/skills files are cleanup-only.",
30
+ cursor: "Cursor consumes project skills from the provider-native .cursor/skills surface.",
31
+ };
32
+ const skillEntries = Object.entries(AGENT_SKILL_LOCATIONS).flatMap(([agent, basePath]) => GDH_SKILL_IDS.map((skillId) => ({
33
+ surfaceId: `skill.${agent}.${skillId}`,
34
+ purpose: `${agent} ${GDH_SKILL_PURPOSES[skillId]} skill wrapper around GDH CLI/MCP behavior.`,
35
+ owner: "gdh",
36
+ targetLocations: [`${basePath}/gdh-${skillId}/SKILL.md`],
37
+ discoveryRequirement: "provider_skill",
38
+ migrationBehavior: "Deterministically re-render from the current GDH version during setup, migrate, repair, and self-update.",
39
+ staleBehavior: "Treat version or marker drift as stale; replace the managed skill and remove known legacy duplicates where the adapter installer owns them.",
40
+ finalDisposition: skillId === "check" ? "replace_with_hook_mcp_or_cli_behavior" : "move_into_skill",
41
+ dispositionRationale: skillId === "check"
42
+ ? `${AGENT_SKILL_DISCOVERY_NOTES[agent]} Retire this validation skill; validation evidence belongs to GDH hooks, MCP/CLI status, and explicit authoring-check commands.`
43
+ : `${AGENT_SKILL_DISCOVERY_NOTES[agent]} Keep workflow instructions inside the skill instead of leaking command guidance into target docs.`,
44
+ followUpPhase: skillId === "check" ? null : "78",
45
+ })));
46
+ const staticEntries = [
47
+ {
48
+ surfaceId: "cursor_rule",
49
+ purpose: "Minimal Cursor rule that routes GDH work to the installed GDH skills and target-local surfaces.",
50
+ owner: "gdh",
51
+ targetLocations: [".cursor/rules/gdh-agent.mdc"],
52
+ discoveryRequirement: "provider_rule",
53
+ migrationBehavior: "Deterministically re-render when adapter surfaces are installed or repaired.",
54
+ staleBehavior: "Replace marker-owned drift; keep user-authored Cursor rules outside the managed file untouched.",
55
+ finalDisposition: "keep_discoverability_shim",
56
+ dispositionRationale: "Cursor rules are a provider-native discovery hook. They should stay thin and point to skills instead of duplicating guidance.",
57
+ followUpPhase: "78",
58
+ },
59
+ {
60
+ surfaceId: "claude_onboard_command",
61
+ purpose: "Legacy Claude command compatibility for the onboard workflow.",
62
+ owner: "gdh",
63
+ targetLocations: [".claude/skills/gdh-onboard/SKILL.md"],
64
+ discoveryRequirement: "provider_skill",
65
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/onboard.md files are removed when GDH owns them.",
66
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
67
+ finalDisposition: "move_into_skill",
68
+ dispositionRationale: "The onboard workflow belongs in the gdh-onboard skill; command shims should not carry separate instructions.",
69
+ followUpPhase: "78",
70
+ },
71
+ {
72
+ surfaceId: "claude_status_command",
73
+ purpose: "Legacy Claude command compatibility for status interpretation.",
74
+ owner: "gdh",
75
+ targetLocations: [".claude/skills/gdh-status/SKILL.md"],
76
+ discoveryRequirement: "provider_skill",
77
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/status.md files are removed when GDH owns them.",
78
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
79
+ finalDisposition: "move_into_skill",
80
+ dispositionRationale: "Status interpretation belongs in the gdh-status skill, backed by structured GDH CLI output.",
81
+ followUpPhase: "78",
82
+ },
83
+ {
84
+ surfaceId: "claude_scan_command",
85
+ purpose: "Legacy Claude command compatibility for Godot target discovery.",
86
+ owner: "gdh",
87
+ targetLocations: [".claude/skills/gdh-scan/SKILL.md"],
88
+ discoveryRequirement: "provider_skill",
89
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/scan.md files are removed when GDH owns them.",
90
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
91
+ finalDisposition: "move_into_skill",
92
+ dispositionRationale: "Scan workflow instructions belong in the gdh-scan skill, not in a second command document.",
93
+ followUpPhase: "78",
94
+ },
95
+ {
96
+ surfaceId: "claude_migrate_command",
97
+ purpose: "Legacy Claude command compatibility for managed surface migration.",
98
+ owner: "gdh",
99
+ targetLocations: [".claude/skills/gdh-migrate/SKILL.md"],
100
+ discoveryRequirement: "provider_skill",
101
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/migrate.md files are removed when GDH owns them.",
102
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
103
+ finalDisposition: "move_into_skill",
104
+ dispositionRationale: "Migration approval and terminal-state guidance belongs in the gdh-migrate skill.",
105
+ followUpPhase: "78",
106
+ },
107
+ {
108
+ surfaceId: "claude_update_command",
109
+ purpose: "Legacy Claude command compatibility for GDH self-update.",
110
+ owner: "gdh",
111
+ targetLocations: [".claude/skills/gdh-update/SKILL.md"],
112
+ discoveryRequirement: "provider_skill",
113
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/update.md files are removed when GDH owns them.",
114
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
115
+ finalDisposition: "move_into_skill",
116
+ dispositionRationale: "Update workflow guidance belongs in the gdh-update skill and should not be duplicated as a command doc.",
117
+ followUpPhase: "78",
118
+ },
119
+ {
120
+ surfaceId: "claude_check_command",
121
+ purpose: "Legacy Claude command compatibility for authoring validation checks.",
122
+ owner: "gdh",
123
+ targetLocations: [".claude/skills/gdh-check/SKILL.md"],
124
+ discoveryRequirement: "provider_skill",
125
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/check.md files are removed when GDH owns them.",
126
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
127
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
128
+ dispositionRationale: "Validation should be driven by hook, MCP, and CLI behavior. The legacy command and generated check skill are retired.",
129
+ followUpPhase: null,
130
+ },
131
+ {
132
+ surfaceId: "claude_prepare_command",
133
+ purpose: "Legacy Claude command compatibility for target preparation.",
134
+ owner: "gdh",
135
+ targetLocations: [".claude/skills/gdh-prepare/SKILL.md"],
136
+ discoveryRequirement: "provider_skill",
137
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/prepare.md files are removed when GDH owns them.",
138
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
139
+ finalDisposition: "move_into_skill",
140
+ dispositionRationale: "Preparation workflow guidance belongs in the gdh-prepare skill, backed by GDH commands.",
141
+ followUpPhase: "78",
142
+ },
143
+ {
144
+ surfaceId: "claude_run_game_command",
145
+ purpose: "Legacy Claude command compatibility for run configuration execution.",
146
+ owner: "gdh",
147
+ targetLocations: [".claude/skills/gdh-run-game/SKILL.md"],
148
+ discoveryRequirement: "provider_skill",
149
+ migrationBehavior: "Current installs use Claude skills; legacy .claude/commands/gdh/run-game.md files are removed when GDH owns them.",
150
+ staleBehavior: "Treat legacy command files as stale owned duplicates after the skill exists.",
151
+ finalDisposition: "move_into_skill",
152
+ dispositionRationale: "Runtime workflow guidance belongs in the gdh-run-game skill and should reference .gdh run configurations.",
153
+ followUpPhase: "78",
154
+ },
155
+ {
156
+ surfaceId: "mcp_config_entry",
157
+ purpose: "Managed GDH MCP server entry inside Claude and Cursor project MCP files.",
158
+ owner: "mixed",
159
+ targetLocations: [".mcp.json#mcpServers.gdh", ".cursor/mcp.json#mcpServers.gdh"],
160
+ discoveryRequirement: "provider_mcp_config",
161
+ migrationBehavior: "Patch only the GDH-owned MCP entry; leave surrounding project/user MCP config as project-native data.",
162
+ staleBehavior: "Replace only the managed server entry when pin or invocation drifts.",
163
+ finalDisposition: "keep_discoverability_shim",
164
+ dispositionRationale: "Claude and Cursor require provider-visible MCP config. GDH should own the smallest possible entry, not the whole file.",
165
+ followUpPhase: "79",
166
+ },
167
+ {
168
+ surfaceId: "codex_project_mcp_section",
169
+ purpose: "Managed GDH MCP server section inside repo-local Codex config.",
170
+ owner: "mixed",
171
+ targetLocations: [".codex/config.toml#[mcp_servers.gdh]"],
172
+ discoveryRequirement: "provider_mcp_config",
173
+ migrationBehavior: "Patch the GDH-owned TOML section in repo-local config; do not register user-local Codex MCP as part of normal setup.",
174
+ staleBehavior: "Replace the managed section when the pin or invocation drifts.",
175
+ finalDisposition: "keep_discoverability_shim",
176
+ dispositionRationale: "Codex needs a provider-readable MCP declaration. GDH should keep it repo-local and marker-bounded where possible.",
177
+ followUpPhase: "79",
178
+ },
179
+ {
180
+ surfaceId: "codex_authoring_hook_block",
181
+ purpose: "Codex authoring hook registration for post-edit GDH validation behavior.",
182
+ owner: "gdh",
183
+ targetLocations: [".codex/config.toml#GDH managed authoring hooks"],
184
+ discoveryRequirement: "provider_hook_config",
185
+ migrationBehavior: "Patch the managed hook block and feature flag in repo-local Codex config.",
186
+ staleBehavior: "Replace the managed hook block when version, command, or path drifts.",
187
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
188
+ dispositionRationale: "Validation enforcement should be behavior, not guidance. The config block exists only to wire the behavior.",
189
+ followUpPhase: "79",
190
+ },
191
+ {
192
+ surfaceId: "authoring_hook",
193
+ purpose: "Provider hook script that turns authoring edits into GDH diagnostics/check feedback.",
194
+ owner: "gdh",
195
+ targetLocations: [
196
+ ".claude/hooks/gdh-authoring-guard.js",
197
+ ".codex/hooks/gdh-authoring-guard.js",
198
+ ],
199
+ discoveryRequirement: "provider_hook_config",
200
+ migrationBehavior: "Deterministically re-render hook scripts for providers that support GDH hooks.",
201
+ staleBehavior: "Replace marker-owned script drift; never depend on agents remembering validation instructions.",
202
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
203
+ dispositionRationale: "Authoring validation should run through hooks and GDH CLI evidence rather than prose instructions.",
204
+ followUpPhase: "79",
205
+ },
206
+ {
207
+ surfaceId: "claude_update_hook",
208
+ purpose: "Claude SessionStart hook that checks whether the pinned GDH install is stale.",
209
+ owner: "gdh",
210
+ targetLocations: [".claude/hooks/gdh-check-update.js"],
211
+ discoveryRequirement: "provider_hook_config",
212
+ migrationBehavior: "Deterministically re-render the managed hook script.",
213
+ staleBehavior: "Replace marker-owned script drift; stale update awareness should not live in docs.",
214
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
215
+ dispositionRationale: "Update awareness is event-driven behavior. Guidance should only explain outcomes when surfaced.",
216
+ followUpPhase: "79",
217
+ },
218
+ {
219
+ surfaceId: "claude_update_worker",
220
+ purpose: "Background worker used by the Claude update-check hook.",
221
+ owner: "gdh",
222
+ targetLocations: [".claude/hooks/gdh-check-update-worker.js"],
223
+ discoveryRequirement: "provider_hook_config",
224
+ migrationBehavior: "Deterministically re-render the managed worker script.",
225
+ staleBehavior: "Replace marker-owned worker drift with the current version.",
226
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
227
+ dispositionRationale: "This is implementation machinery for a hook, not a target-project documentation surface.",
228
+ followUpPhase: "79",
229
+ },
230
+ {
231
+ surfaceId: "claude_statusline",
232
+ purpose: "Optional Claude statusline script for surfacing GDH target status.",
233
+ owner: "gdh",
234
+ targetLocations: [".claude/hooks/gdh-statusline.js"],
235
+ discoveryRequirement: "provider_hook_config",
236
+ migrationBehavior: "Deterministically re-render the optional script; statusline registration remains opt-in.",
237
+ staleBehavior: "Replace marker-owned script drift; do not overwrite unrelated statusline settings.",
238
+ finalDisposition: "replace_with_hook_mcp_or_cli_behavior",
239
+ dispositionRationale: "Statusline behavior belongs in an executable script with opt-in registration, not in general guidance.",
240
+ followUpPhase: "79",
241
+ },
242
+ {
243
+ surfaceId: "agents_md_managed_block",
244
+ purpose: "Root agent-instruction pointer that tells agents this target is GDH-managed.",
245
+ owner: "mixed",
246
+ targetLocations: ["AGENTS.md#GDH managed block"],
247
+ discoveryRequirement: "root_agent_instruction",
248
+ migrationBehavior: "Patch only the GDH-owned marker block; preserve user-authored AGENTS.md content around it.",
249
+ staleBehavior: "Replace the managed block when its version or target pointers drift.",
250
+ finalDisposition: "keep_discoverability_shim",
251
+ dispositionRationale: "A tiny root pointer is useful for discoverability, but full GDH docs must not live in root instructions.",
252
+ followUpPhase: "77",
253
+ },
254
+ {
255
+ surfaceId: "guidance_unit_set",
256
+ purpose: "Generated GDH guidance units currently emitted as target-local docs.",
257
+ owner: "gdh",
258
+ targetLocations: [".gdh/guidance/*.md"],
259
+ discoveryRequirement: "durable_gdh_truth",
260
+ migrationBehavior: "Current versions deterministically re-render units from package templates.",
261
+ staleBehavior: "Version drift replaces generated units in the GDH-owned guidance directory.",
262
+ finalDisposition: "move_under_gdh",
263
+ dispositionRationale: "Durable GDH target guidance belongs under .gdh. Command-specific/onboarding guidance should be folded into skills during the skill repack.",
264
+ followUpPhase: null,
265
+ },
266
+ {
267
+ surfaceId: "guidance_index",
268
+ purpose: "Generated index for GDH guidance units.",
269
+ owner: "gdh",
270
+ targetLocations: [".gdh/guidance/README.md"],
271
+ discoveryRequirement: "durable_gdh_truth",
272
+ migrationBehavior: "Current versions deterministically re-render the index from generated units.",
273
+ staleBehavior: "Version drift replaces the generated index in the GDH-owned guidance directory.",
274
+ finalDisposition: "move_under_gdh",
275
+ dispositionRationale: "The index should move with the guidance corpus under .gdh, leaving only minimal root/provider pointers.",
276
+ followUpPhase: null,
277
+ },
278
+ {
279
+ surfaceId: "gdh_project_yaml",
280
+ purpose: "Durable GDH project configuration and pinned GDH version.",
281
+ owner: "mixed",
282
+ targetLocations: [".gdh/project.yaml"],
283
+ discoveryRequirement: "durable_gdh_truth",
284
+ migrationBehavior: "Schema migrations preserve user-selected values while updating GDH-owned shape.",
285
+ staleBehavior: "Schema/pin drift is handled by migration planning and explicit apply.",
286
+ finalDisposition: "move_under_gdh",
287
+ dispositionRationale: "This already lives in the correct durable GDH namespace.",
288
+ followUpPhase: null,
289
+ },
290
+ {
291
+ surfaceId: "gdh_rules_yaml",
292
+ purpose: "Durable GDH project rules and policy defaults.",
293
+ owner: "mixed",
294
+ targetLocations: [".gdh/rules.yaml"],
295
+ discoveryRequirement: "durable_gdh_truth",
296
+ migrationBehavior: "Byte-equal defaults can be upgraded automatically; user-customized rules require conflict-aware migration.",
297
+ staleBehavior: "Default drift is auto-replaceable only when prior content is still known GDH default content.",
298
+ finalDisposition: "move_under_gdh",
299
+ dispositionRationale: "Rules are durable GDH target truth and already live under .gdh.",
300
+ followUpPhase: null,
301
+ },
302
+ {
303
+ surfaceId: "run_configuration_set",
304
+ purpose: "User-authored run configurations managed by GDH schema.",
305
+ owner: "mixed",
306
+ targetLocations: [".gdh/run-configurations/*.yaml"],
307
+ discoveryRequirement: "durable_gdh_truth",
308
+ migrationBehavior: "Schema migrations preserve user-authored run intent and route semantic changes through review.",
309
+ staleBehavior: "Schema drift requires migration; user values are not overwritten as deterministic render output.",
310
+ finalDisposition: "move_under_gdh",
311
+ dispositionRationale: "Run configurations are durable GDH target truth and already live under .gdh.",
312
+ followUpPhase: null,
313
+ },
314
+ {
315
+ surfaceId: "verification_scenario_set",
316
+ purpose: "User-authored verification scenarios managed by GDH schema.",
317
+ owner: "mixed",
318
+ targetLocations: [".gdh/verification-scenarios/*.yaml"],
319
+ discoveryRequirement: "durable_gdh_truth",
320
+ migrationBehavior: "Schema migrations preserve user-authored verification intent and route semantic changes through review.",
321
+ staleBehavior: "Schema drift requires migration; user values are not overwritten as deterministic render output.",
322
+ finalDisposition: "move_under_gdh",
323
+ dispositionRationale: "Verification scenarios are durable GDH target truth and already live under .gdh.",
324
+ followUpPhase: null,
325
+ },
326
+ {
327
+ surfaceId: "project_godot",
328
+ purpose: "Godot project manifest touched only through explicit allowlisted project-native operations.",
329
+ owner: "project",
330
+ targetLocations: ["project.godot"],
331
+ discoveryRequirement: "project_native",
332
+ migrationBehavior: "GDH may only apply registered allowlisted operations such as autoload/plugin updates.",
333
+ staleBehavior: "Unallowlisted drift is project-owned and must not be treated as GDH stale content.",
334
+ finalDisposition: "keep_project_native",
335
+ dispositionRationale: "This is not GDH-owned target guidance. It remains Godot project truth with explicit operation allowlists.",
336
+ followUpPhase: null,
337
+ },
338
+ ];
339
+ export const GDH_MANAGED_TARGET_SURFACE_INVENTORY = [
340
+ ...skillEntries,
341
+ ...staticEntries,
342
+ ];
343
+ export function assertManagedTargetSurfaceInventoryComplete() {
344
+ const classIds = GDH_MANAGED_SURFACE_CLASSES.map((entry) => entry.surfaceId);
345
+ const inventoryIds = GDH_MANAGED_TARGET_SURFACE_INVENTORY.map((entry) => entry.surfaceId);
346
+ const duplicateIds = inventoryIds.filter((id, index) => inventoryIds.indexOf(id) !== index);
347
+ if (duplicateIds.length > 0) {
348
+ throw new Error(`Duplicate managed target surface inventory entries: ${[...new Set(duplicateIds)].join(", ")}`);
349
+ }
350
+ const classIdSet = new Set(classIds);
351
+ const inventoryIdSet = new Set(inventoryIds);
352
+ const missing = classIds.filter((id) => !inventoryIdSet.has(id));
353
+ const extra = inventoryIds.filter((id) => !classIdSet.has(id));
354
+ if (missing.length > 0 || extra.length > 0) {
355
+ throw new Error([
356
+ "GDH managed target surface inventory does not match GDH_MANAGED_SURFACE_CLASSES.",
357
+ missing.length > 0 ? `Missing: ${missing.join(", ")}` : null,
358
+ extra.length > 0 ? `Extra: ${extra.join(", ")}` : null,
359
+ ]
360
+ .filter((line) => line !== null)
361
+ .join(" "));
362
+ }
363
+ }
364
+ assertManagedTargetSurfaceInventoryComplete();
365
+ //# sourceMappingURL=managed-target-surface-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-target-surface-inventory.js","sourceRoot":"","sources":["../../src/migrations/managed-target-surface-inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { GdhDeferredAction, GdhDeferredActionStatus } from "../state/migration-state.js";
2
+ /**
3
+ * Result of running a deferred-action probe (D-12 / D-27).
4
+ *
5
+ * `status` is the closed enumeration from {@link GdhDeferredActionStatus}.
6
+ * `reason` is a free-form discriminator string (not a translation key) — it
7
+ * names the failure mode for diagnostics; the advisory gate consumes only
8
+ * `status`. `last_checked_at` is the ISO timestamp of this probe call.
9
+ */
10
+ export interface GdhDeferredActionProbeResult {
11
+ readonly status: GdhDeferredActionStatus;
12
+ readonly reason?: string;
13
+ readonly last_checked_at: string;
14
+ }
15
+ /**
16
+ * Host-harness introspection adapter — caller injects this so the probe runner
17
+ * remains pure-data and testable.
18
+ *
19
+ * Returns the latest reload timestamp (ISO 8601) for the given skill id, or
20
+ * `null` if the skill is not registered in the host. `null` for the entire
21
+ * adapter means the host cannot be introspected; the probe runner downgrades
22
+ * to `pending` with reason `host_harness_not_introspectable`.
23
+ */
24
+ export type GdhHostHarnessIntrospect = ((skillId: string) => Promise<string | null>) | null;
25
+ /**
26
+ * Process probe adapter — caller injects this so the probe runner does not
27
+ * depend on Plan 06's process orchestration directly.
28
+ *
29
+ * Returns `true` if every snapshot row referenced in `payload` is currently
30
+ * running, `false` if any are not, and `null` when the probe cannot be
31
+ * evaluated (e.g. no processes-snapshot.json on disk yet). `null` for the
32
+ * entire adapter means the process probe is unavailable (e.g. Plan 06 not
33
+ * yet integrated); the probe runner downgrades to `pending` with reason
34
+ * `process_probe_not_available`.
35
+ */
36
+ export type GdhProcessRestartProbe = ((payload: Record<string, unknown>) => Promise<boolean | null>) | null;
37
+ export interface GdhDeferredActionProbeRunInput {
38
+ readonly targetPath: string;
39
+ readonly hostHarnessIntrospect: GdhHostHarnessIntrospect;
40
+ readonly processProbe: GdhProcessRestartProbe;
41
+ /** Optional ISO-timestamp injector for deterministic tests. */
42
+ readonly nowIso?: () => string;
43
+ }
44
+ /**
45
+ * Run the probe for a single deferred action (closed-kind dispatch).
46
+ *
47
+ * Threat mitigations:
48
+ * - T-72-05-01 (shell injection): no shells, no eval, no child_process; the
49
+ * `verify.payload` is structured data only. The dispatch is a `switch`
50
+ * over the closed `verify.kind` enum.
51
+ * - T-72-05-06 (unknown kind passes through as clean): the default branch
52
+ * returns `status: "stale"`, never `clean`. The advisory gate (Task 05-03)
53
+ * refuses to emit when any probe is stale.
54
+ * - probe never throws — host failure is captured into `status: "stale"` so
55
+ * that the advisory layer cannot crash on a misbehaving adapter.
56
+ */
57
+ export declare function runDeferredActionProbe(action: GdhDeferredAction, input: GdhDeferredActionProbeRunInput): Promise<GdhDeferredActionProbeResult>;
58
+ //# sourceMappingURL=probes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/migrations/probes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EAExB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAChC,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAC7C,IAAI,CAAC;AAET;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAC9B,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,GAC/D,IAAI,CAAC;AAET,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;IACzD,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,4BAA4B,CAAC,CAuBvC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Run the probe for a single deferred action (closed-kind dispatch).
3
+ *
4
+ * Threat mitigations:
5
+ * - T-72-05-01 (shell injection): no shells, no eval, no child_process; the
6
+ * `verify.payload` is structured data only. The dispatch is a `switch`
7
+ * over the closed `verify.kind` enum.
8
+ * - T-72-05-06 (unknown kind passes through as clean): the default branch
9
+ * returns `status: "stale"`, never `clean`. The advisory gate (Task 05-03)
10
+ * refuses to emit when any probe is stale.
11
+ * - probe never throws — host failure is captured into `status: "stale"` so
12
+ * that the advisory layer cannot crash on a misbehaving adapter.
13
+ */
14
+ export async function runDeferredActionProbe(action, input) {
15
+ const nowIso = (input.nowIso ?? (() => new Date().toISOString()))();
16
+ try {
17
+ const kind = action.verify.kind;
18
+ switch (kind) {
19
+ case "agent_skill_metadata_reload":
20
+ return await probeAgentSkillMetadataReload(action, input, nowIso);
21
+ case "process_restart":
22
+ return await probeProcessRestart(action, input, nowIso);
23
+ default:
24
+ return {
25
+ status: "stale",
26
+ reason: "unknown_verify_kind",
27
+ last_checked_at: nowIso,
28
+ };
29
+ }
30
+ }
31
+ catch (error) {
32
+ return {
33
+ status: "stale",
34
+ reason: `probe_threw:${error instanceof Error ? error.message : String(error)}`,
35
+ last_checked_at: nowIso,
36
+ };
37
+ }
38
+ }
39
+ async function probeAgentSkillMetadataReload(action, input, nowIso) {
40
+ if (input.hostHarnessIntrospect === null) {
41
+ return {
42
+ status: "pending",
43
+ reason: "host_harness_not_introspectable",
44
+ last_checked_at: nowIso,
45
+ };
46
+ }
47
+ const payload = action.verify.payload;
48
+ const requiredSkillsRaw = payload["required_skills"];
49
+ const minObservedAfterRaw = payload["min_observed_after"];
50
+ if (!Array.isArray(requiredSkillsRaw) ||
51
+ !requiredSkillsRaw.every((s) => typeof s === "string") ||
52
+ typeof minObservedAfterRaw !== "string") {
53
+ return {
54
+ status: "stale",
55
+ reason: "agent_skill_metadata_reload_payload_malformed",
56
+ last_checked_at: nowIso,
57
+ };
58
+ }
59
+ const minObservedAfter = new Date(minObservedAfterRaw).getTime();
60
+ if (Number.isNaN(minObservedAfter)) {
61
+ return {
62
+ status: "stale",
63
+ reason: "agent_skill_metadata_reload_min_observed_after_invalid",
64
+ last_checked_at: nowIso,
65
+ };
66
+ }
67
+ const requiredSkills = requiredSkillsRaw;
68
+ for (const skillId of requiredSkills) {
69
+ const reloadIso = await input.hostHarnessIntrospect(skillId);
70
+ if (reloadIso === null) {
71
+ return {
72
+ status: "pending",
73
+ reason: `skill_missing:${skillId}`,
74
+ last_checked_at: nowIso,
75
+ };
76
+ }
77
+ const reloadTs = new Date(reloadIso).getTime();
78
+ if (Number.isNaN(reloadTs) || reloadTs < minObservedAfter) {
79
+ return {
80
+ status: "pending",
81
+ reason: `skill_metadata_not_reloaded:${skillId}`,
82
+ last_checked_at: nowIso,
83
+ };
84
+ }
85
+ }
86
+ return { status: "clean", last_checked_at: nowIso };
87
+ }
88
+ async function probeProcessRestart(action, input, nowIso) {
89
+ if (input.processProbe === null) {
90
+ return {
91
+ status: "pending",
92
+ reason: "process_probe_not_available",
93
+ last_checked_at: nowIso,
94
+ };
95
+ }
96
+ const allRunning = await input.processProbe(action.verify.payload);
97
+ if (allRunning === null) {
98
+ return {
99
+ status: "pending",
100
+ reason: "process_probe_indeterminate",
101
+ last_checked_at: nowIso,
102
+ };
103
+ }
104
+ return allRunning
105
+ ? { status: "clean", last_checked_at: nowIso }
106
+ : {
107
+ status: "pending",
108
+ reason: "process_not_running",
109
+ last_checked_at: nowIso,
110
+ };
111
+ }
112
+ //# sourceMappingURL=probes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.js","sourceRoot":"","sources":["../../src/migrations/probes.ts"],"names":[],"mappings":"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"}