@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.
- package/INSTALL-BUNDLE.json +1 -1
- package/README.md +37 -108
- package/RELEASE-SPAN-UPDATE-CONTRACTS.json +184 -0
- package/node_modules/@gdh/adapters/dist/index.d.ts +2 -2
- package/node_modules/@gdh/adapters/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/adapters/dist/index.js +148 -110
- package/node_modules/@gdh/adapters/dist/index.js.map +1 -1
- package/node_modules/@gdh/adapters/package.json +8 -8
- package/node_modules/@gdh/authoring/dist/index.d.ts +4 -3
- package/node_modules/@gdh/authoring/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/index.js +80 -9
- package/node_modules/@gdh/authoring/dist/index.js.map +1 -1
- package/node_modules/@gdh/authoring/dist/lsp-client.d.ts +47 -0
- package/node_modules/@gdh/authoring/dist/lsp-client.d.ts.map +1 -0
- package/node_modules/@gdh/authoring/dist/lsp-client.js +371 -0
- package/node_modules/@gdh/authoring/dist/lsp-client.js.map +1 -0
- package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.d.ts +35 -0
- package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.d.ts.map +1 -0
- package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.js +194 -0
- package/node_modules/@gdh/authoring/dist/lsp-test-server.test-utils.js.map +1 -0
- package/node_modules/@gdh/authoring/dist/lsp.d.ts +62 -1
- package/node_modules/@gdh/authoring/dist/lsp.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/lsp.js +1207 -109
- package/node_modules/@gdh/authoring/dist/lsp.js.map +1 -1
- package/node_modules/@gdh/authoring/dist/project.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/project.js +28 -1
- package/node_modules/@gdh/authoring/dist/project.js.map +1 -1
- package/node_modules/@gdh/authoring/dist/scene-resource.d.ts +39 -0
- package/node_modules/@gdh/authoring/dist/scene-resource.d.ts.map +1 -0
- package/node_modules/@gdh/authoring/dist/scene-resource.js +544 -0
- package/node_modules/@gdh/authoring/dist/scene-resource.js.map +1 -0
- package/node_modules/@gdh/authoring/package.json +2 -2
- package/node_modules/@gdh/cli/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/cli/dist/index.js +121 -35
- package/node_modules/@gdh/cli/dist/index.js.map +1 -1
- package/node_modules/@gdh/cli/dist/migrate.d.ts +1 -0
- package/node_modules/@gdh/cli/dist/migrate.d.ts.map +1 -1
- package/node_modules/@gdh/cli/dist/migrate.js +140 -13
- package/node_modules/@gdh/cli/dist/migrate.js.map +1 -1
- package/node_modules/@gdh/cli/package.json +10 -10
- package/node_modules/@gdh/core/dist/index.d.ts +109 -14
- package/node_modules/@gdh/core/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/core/dist/index.js +16 -18
- package/node_modules/@gdh/core/dist/index.js.map +1 -1
- package/node_modules/@gdh/core/package.json +1 -1
- package/node_modules/@gdh/docs/dist/guidance.d.ts.map +1 -1
- package/node_modules/@gdh/docs/dist/guidance.js +34 -2
- package/node_modules/@gdh/docs/dist/guidance.js.map +1 -1
- package/node_modules/@gdh/docs/dist/rules.d.ts.map +1 -1
- package/node_modules/@gdh/docs/dist/rules.js +2 -2
- package/node_modules/@gdh/docs/dist/rules.js.map +1 -1
- package/node_modules/@gdh/docs/package.json +2 -2
- package/node_modules/@gdh/mcp/package.json +8 -8
- package/node_modules/@gdh/observability/package.json +2 -2
- package/node_modules/@gdh/runtime/dist/bridge-surface.d.ts.map +1 -1
- package/node_modules/@gdh/runtime/dist/bridge-surface.js +128 -16
- package/node_modules/@gdh/runtime/dist/bridge-surface.js.map +1 -1
- package/node_modules/@gdh/runtime/dist/index.d.ts +1 -0
- package/node_modules/@gdh/runtime/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/runtime/dist/index.js +189 -0
- package/node_modules/@gdh/runtime/dist/index.js.map +1 -1
- package/node_modules/@gdh/runtime/dist/knowledge-surface.d.ts +6 -0
- package/node_modules/@gdh/runtime/dist/knowledge-surface.d.ts.map +1 -0
- package/node_modules/@gdh/runtime/dist/knowledge-surface.js +216 -0
- package/node_modules/@gdh/runtime/dist/knowledge-surface.js.map +1 -0
- package/node_modules/@gdh/runtime/package.json +2 -2
- package/node_modules/@gdh/scan/dist/onboard.d.ts.map +1 -1
- package/node_modules/@gdh/scan/dist/onboard.js +13 -0
- package/node_modules/@gdh/scan/dist/onboard.js.map +1 -1
- package/node_modules/@gdh/scan/package.json +3 -3
- package/node_modules/@gdh/verify/dist/policy.d.ts.map +1 -1
- package/node_modules/@gdh/verify/dist/policy.js +157 -29
- package/node_modules/@gdh/verify/dist/policy.js.map +1 -1
- package/node_modules/@gdh/verify/package.json +7 -7
- 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,
|
|
8
|
-
import {
|
|
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 = [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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}
|
|
1003
|
-
|
|
1004
|
-
"3.
|
|
1005
|
-
"4.
|
|
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}
|
|
1043
|
-
|
|
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}
|
|
1081
|
-
|
|
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.
|
|
1232
|
-
"5.
|
|
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
|
-
"-
|
|
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
|
-
"-
|
|
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
|
|
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
|
|
1627
|
-
|
|
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
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
const
|
|
1636
|
-
|
|
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
|
|
1727
|
-
|
|
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
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
const
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
const
|
|
1739
|
-
|
|
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
|
|
1831
|
-
|
|
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
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
const
|
|
1840
|
-
|
|
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
|
|
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
|