@skillcap/gdh 0.18.2 → 0.19.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 +4 -4
- package/RELEASE-SPAN-UPDATE-CONTRACTS.json +91 -8
- package/node_modules/@gdh/adapters/dist/authoring-hook-render.d.ts +10 -0
- package/node_modules/@gdh/adapters/dist/authoring-hook-render.d.ts.map +1 -0
- package/node_modules/@gdh/adapters/dist/authoring-hook-render.js +150 -0
- package/node_modules/@gdh/adapters/dist/authoring-hook-render.js.map +1 -0
- package/node_modules/@gdh/adapters/dist/claude-settings-patch.d.ts +2 -0
- package/node_modules/@gdh/adapters/dist/claude-settings-patch.d.ts.map +1 -1
- package/node_modules/@gdh/adapters/dist/claude-settings-patch.js +71 -6
- package/node_modules/@gdh/adapters/dist/claude-settings-patch.js.map +1 -1
- package/node_modules/@gdh/adapters/dist/index.d.ts +18 -30
- package/node_modules/@gdh/adapters/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/adapters/dist/index.js +364 -1128
- package/node_modules/@gdh/adapters/dist/index.js.map +1 -1
- package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts +45 -0
- package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts.map +1 -0
- package/node_modules/@gdh/adapters/dist/skill-rendering.js +419 -0
- package/node_modules/@gdh/adapters/dist/skill-rendering.js.map +1 -0
- package/node_modules/@gdh/adapters/package.json +8 -8
- package/node_modules/@gdh/authoring/dist/diagnostics-summary.d.ts +8 -0
- package/node_modules/@gdh/authoring/dist/diagnostics-summary.d.ts.map +1 -0
- package/node_modules/@gdh/authoring/dist/diagnostics-summary.js +22 -0
- package/node_modules/@gdh/authoring/dist/diagnostics-summary.js.map +1 -0
- package/node_modules/@gdh/authoring/dist/index.d.ts +4 -1
- package/node_modules/@gdh/authoring/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/index.js +17 -2
- package/node_modules/@gdh/authoring/dist/index.js.map +1 -1
- package/node_modules/@gdh/authoring/dist/lsp.d.ts +5 -1
- package/node_modules/@gdh/authoring/dist/lsp.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/lsp.js +95 -1
- 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 +1 -0
- package/node_modules/@gdh/authoring/dist/project.js.map +1 -1
- package/node_modules/@gdh/authoring/dist/scene-resource.d.ts +2 -0
- package/node_modules/@gdh/authoring/dist/scene-resource.d.ts.map +1 -1
- package/node_modules/@gdh/authoring/dist/scene-resource.js +15 -1
- package/node_modules/@gdh/authoring/dist/scene-resource.js.map +1 -1
- 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 +206 -280
- package/node_modules/@gdh/cli/dist/index.js.map +1 -1
- package/node_modules/@gdh/cli/package.json +10 -10
- package/node_modules/@gdh/core/dist/index.d.ts +78 -83
- package/node_modules/@gdh/core/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/core/dist/index.js +4 -4
- 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/agent-contract.js +1 -1
- package/node_modules/@gdh/docs/dist/agent-contract.js.map +1 -1
- package/node_modules/@gdh/docs/dist/guidance.d.ts.map +1 -1
- package/node_modules/@gdh/docs/dist/guidance.js +84 -15
- package/node_modules/@gdh/docs/dist/guidance.js.map +1 -1
- package/node_modules/@gdh/docs/dist/rules.js +3 -3
- 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/dist/guidance-audit.d.ts.map +1 -1
- package/node_modules/@gdh/observability/dist/guidance-audit.js +1 -50
- package/node_modules/@gdh/observability/dist/guidance-audit.js.map +1 -1
- package/node_modules/@gdh/observability/package.json +2 -2
- package/node_modules/@gdh/runtime/dist/bridge-broker-contract.d.ts +23 -0
- package/node_modules/@gdh/runtime/dist/bridge-broker-contract.d.ts.map +1 -0
- package/node_modules/@gdh/runtime/dist/bridge-broker-contract.js +120 -0
- package/node_modules/@gdh/runtime/dist/bridge-broker-contract.js.map +1 -0
- package/node_modules/@gdh/runtime/dist/index.d.ts +2 -1
- package/node_modules/@gdh/runtime/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/runtime/dist/index.js +28 -62
- package/node_modules/@gdh/runtime/dist/index.js.map +1 -1
- package/node_modules/@gdh/runtime/package.json +2 -2
- package/node_modules/@gdh/scan/package.json +3 -3
- package/node_modules/@gdh/verify/dist/index.d.ts +0 -1
- package/node_modules/@gdh/verify/dist/index.d.ts.map +1 -1
- package/node_modules/@gdh/verify/dist/index.js +1 -2
- package/node_modules/@gdh/verify/dist/index.js.map +1 -1
- package/node_modules/@gdh/verify/package.json +7 -7
- package/package.json +11 -11
|
@@ -4,7 +4,7 @@ import fs from "node:fs/promises";
|
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { buildGdhStatusResult,
|
|
7
|
+
import { buildGdhStatusResult, CLAUDE_CHECK_SKILL_RELATIVE_PATH, CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH, CLAUDE_MIGRATE_SKILL_RELATIVE_PATH, CLAUDE_ONBOARD_SKILL_RELATIVE_PATH, CLAUDE_PREPARE_SKILL_RELATIVE_PATH, CLAUDE_SCAN_SKILL_RELATIVE_PATH, CLAUDE_STATUS_SKILL_RELATIVE_PATH, CODEX_CHECK_SKILL_RELATIVE_PATH, CODEX_MIGRATE_SKILL_RELATIVE_PATH, CODEX_ONBOARD_SKILL_RELATIVE_PATH, CODEX_PREPARE_SKILL_RELATIVE_PATH, CODEX_SCAN_SKILL_RELATIVE_PATH, CODEX_STATUS_SKILL_RELATIVE_PATH, CURSOR_CHECK_SKILL_RELATIVE_PATH, CURSOR_MIGRATE_SKILL_RELATIVE_PATH, CURSOR_ONBOARD_SKILL_RELATIVE_PATH, CURSOR_PREPARE_SKILL_RELATIVE_PATH, CURSOR_SCAN_SKILL_RELATIVE_PATH, CURSOR_STATUS_SKILL_RELATIVE_PATH, createGsdSnapshot, getSupportedAgentAdaptersStatus, installSupportedAgentAdapters, } from "@gdh/adapters";
|
|
8
8
|
import { checkManagedLsp, doctorManagedLsp, getManagedLspStatus, hasCompleteOnboardingSurface, inspectCacheState, pruneCacheState, pruneManagedLsp, readProjectConfig, readWorktreeState, resolveAuthoringStatus, resolvePinnedVersion, resolveProjectRoot, resolveTargetGodotDocsVersion, restartManagedLsp, runAuthoringCheck, runImportRefresh, runTargetPrepare, runWarmup, stopManagedLsp, } from "@gdh/authoring";
|
|
9
9
|
import { definePackageBoundary, GDH_AUTHORING_DOGFOOD_VERSION, GDH_AUTHORING_SLICE_REPORT_VERSION, GDH_PRODUCT_NAME, resolveCurrentGdhInstall, resolveGdhProductMetadata, } from "@gdh/core";
|
|
10
10
|
import { fetchOfficialGodotDoc, getGuidanceStatus, resolveGuidanceQuery, searchOfficialGodotDocs, } from "@gdh/docs";
|
|
@@ -12,7 +12,7 @@ import { createMcpManifest, invokeMcpTool, serveMcpOverStdio } from "@gdh/mcp";
|
|
|
12
12
|
import { inspectAuthoringEffectiveness, inspectAuthoringSessions, inspectGuidanceAudit, recordAuthoringSessionEvent, } from "@gdh/observability";
|
|
13
13
|
import { checkRuntimeRecipe, inspectRuntimeBridgeSurface, installRuntimeBridgeSurface, listRuntimeRecipes, removeRuntimeBridgeSurface, repairRuntimeBridgeSurface, runRuntimeRecipe, showRuntimeRecipe, } from "@gdh/runtime";
|
|
14
14
|
import { applyRepairableOnboardingWrites, onboardGodotProject, persistInventoryForTarget, readInventoryCacheOrScan, scanGodotProjectInventory, } from "@gdh/scan";
|
|
15
|
-
import {
|
|
15
|
+
import { exerciseRuntimeCorpusEntry, inspectRuntimeCorpusStatus, inspectRuntimeVerificationBundleState, inspectRuntimeVerificationReadiness, listRuntimeScenarios, materializeRuntimeCorpusEntry, recordRuntimeCorpusValidation, runRuntimeVerificationScenario, showRuntimeScenario, } from "@gdh/verify";
|
|
16
16
|
import { migrateProjectLifecycleSurface } from "./migrate.js";
|
|
17
17
|
import { presentPublicRuntimeTerms } from "./public-terms.js";
|
|
18
18
|
import { runSelfUpdateCommand } from "./self-update.js";
|
|
@@ -695,24 +695,24 @@ async function runDocsFetchCommand(args, io) {
|
|
|
695
695
|
}
|
|
696
696
|
}
|
|
697
697
|
async function runAuthoringCheckCommand(args, io) {
|
|
698
|
+
const usage = [
|
|
699
|
+
"Usage: gdh authoring check [target] [--mode final|post-edit] [--changed <path>...] [--severity-policy errors|all] [--format json|compact]",
|
|
700
|
+
"Usage: gdh authoring check --target <path> [--mode final|post-edit] [--changed <path>...] [--severity-policy errors|all] [--format json|compact]",
|
|
701
|
+
"",
|
|
702
|
+
"Run GDH authoring validation and print structured JSON by default.",
|
|
703
|
+
"Use --mode post-edit with --changed for fast scoped feedback after edits.",
|
|
704
|
+
"Use --mode final before claiming code-validity for task completion.",
|
|
705
|
+
].join("\n");
|
|
698
706
|
if (args.includes("--help")) {
|
|
699
|
-
io.stdout.write(
|
|
700
|
-
"Usage: gdh authoring check [target]",
|
|
701
|
-
"Usage: gdh authoring check --target <path>",
|
|
702
|
-
"",
|
|
703
|
-
"Run the current GDH authoring-check flow and print a structured result as JSON.",
|
|
704
|
-
].join("\n") + "\n");
|
|
707
|
+
io.stdout.write(`${usage}\n`);
|
|
705
708
|
return 0;
|
|
706
709
|
}
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
});
|
|
711
|
-
if (parsedTarget.error !== null) {
|
|
712
|
-
io.stderr.write(parsedTarget.error);
|
|
710
|
+
const parsed = parseAuthoringCheckArgs(args, usage);
|
|
711
|
+
if (parsed.error !== null) {
|
|
712
|
+
io.stderr.write(parsed.error);
|
|
713
713
|
return 1;
|
|
714
714
|
}
|
|
715
|
-
const targetPath =
|
|
715
|
+
const { targetPath, mode, changedFiles, severityPolicy, outputFormat } = parsed;
|
|
716
716
|
const commandStartedAtMs = Date.now();
|
|
717
717
|
try {
|
|
718
718
|
const context = await buildAuthoringContext(targetPath);
|
|
@@ -720,15 +720,18 @@ async function runAuthoringCheckCommand(args, io) {
|
|
|
720
720
|
targetPath,
|
|
721
721
|
status: context.status,
|
|
722
722
|
projectConfig: context.projectConfig,
|
|
723
|
+
mode,
|
|
724
|
+
changedFiles,
|
|
725
|
+
severityPolicy,
|
|
723
726
|
});
|
|
724
727
|
await recordSessionEvent(targetPath, {
|
|
725
728
|
commandStartedAtMs,
|
|
726
729
|
kind: "authoring_check",
|
|
727
|
-
command:
|
|
730
|
+
command: formatAuthoringCheckCommand({ mode, changedFiles, severityPolicy, outputFormat }),
|
|
728
731
|
state: result.status === "unavailable" ? "blocked" : "succeeded",
|
|
729
732
|
summary: result.summary,
|
|
730
733
|
validation: {
|
|
731
|
-
changedFiles
|
|
734
|
+
changedFiles,
|
|
732
735
|
recommendedKinds: ["authoring_check"],
|
|
733
736
|
performedKinds: result.status === "passed" ||
|
|
734
737
|
result.status === "diagnostics" ||
|
|
@@ -737,14 +740,19 @@ async function runAuthoringCheckCommand(args, io) {
|
|
|
737
740
|
: [],
|
|
738
741
|
},
|
|
739
742
|
});
|
|
740
|
-
|
|
743
|
+
if (outputFormat === "compact") {
|
|
744
|
+
io.stdout.write(formatCompactAuthoringCheckResult(result));
|
|
745
|
+
}
|
|
746
|
+
else {
|
|
747
|
+
writeJsonResult(io, result, { presentRuntimeTerms: true });
|
|
748
|
+
}
|
|
741
749
|
return 0;
|
|
742
750
|
}
|
|
743
751
|
catch (error) {
|
|
744
752
|
await recordSessionEvent(targetPath, {
|
|
745
753
|
commandStartedAtMs,
|
|
746
754
|
kind: "authoring_check",
|
|
747
|
-
command:
|
|
755
|
+
command: formatAuthoringCheckCommand({ mode, changedFiles, severityPolicy, outputFormat }),
|
|
748
756
|
state: "failed",
|
|
749
757
|
summary: "GDH authoring check failed before producing a result.",
|
|
750
758
|
errorMessage: formatCliError(error),
|
|
@@ -753,6 +761,151 @@ async function runAuthoringCheckCommand(args, io) {
|
|
|
753
761
|
return 1;
|
|
754
762
|
}
|
|
755
763
|
}
|
|
764
|
+
function parseAuthoringCheckArgs(args, usage) {
|
|
765
|
+
const optionNames = new Set(["--target", "--mode", "--changed", "--severity-policy", "--format"]);
|
|
766
|
+
const unsupportedOptionsError = findUnsupportedOptionsError(args, {
|
|
767
|
+
usage,
|
|
768
|
+
optionsWithValues: [...optionNames],
|
|
769
|
+
});
|
|
770
|
+
if (unsupportedOptionsError !== null) {
|
|
771
|
+
return {
|
|
772
|
+
targetPath: path.resolve("."),
|
|
773
|
+
mode: "final",
|
|
774
|
+
changedFiles: [],
|
|
775
|
+
severityPolicy: "errors",
|
|
776
|
+
outputFormat: "json",
|
|
777
|
+
error: unsupportedOptionsError,
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
for (const optionName of optionNames) {
|
|
781
|
+
if (args.includes(optionName) && hasMissingOptionValue(args, optionName)) {
|
|
782
|
+
return {
|
|
783
|
+
targetPath: path.resolve("."),
|
|
784
|
+
mode: "final",
|
|
785
|
+
changedFiles: [],
|
|
786
|
+
severityPolicy: "errors",
|
|
787
|
+
outputFormat: "json",
|
|
788
|
+
error: `Usage error: ${optionName} requires a value.\n${usage}`,
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
const targetOptionValue = readSingleOptionValue(args, "--target");
|
|
793
|
+
const positionalArgs = extractPositionalArgs(args, optionNames);
|
|
794
|
+
if (positionalArgs.length > 1) {
|
|
795
|
+
return {
|
|
796
|
+
targetPath: path.resolve("."),
|
|
797
|
+
mode: "final",
|
|
798
|
+
changedFiles: [],
|
|
799
|
+
severityPolicy: "errors",
|
|
800
|
+
outputFormat: "json",
|
|
801
|
+
error: `Usage error: command accepts at most one target path.\n${usage}`,
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
if (targetOptionValue !== null && positionalArgs.length > 0) {
|
|
805
|
+
return {
|
|
806
|
+
targetPath: path.resolve("."),
|
|
807
|
+
mode: "final",
|
|
808
|
+
changedFiles: [],
|
|
809
|
+
severityPolicy: "errors",
|
|
810
|
+
outputFormat: "json",
|
|
811
|
+
error: `Usage error: choose either a positional target path or --target <path>.\n${usage}`,
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
const modeValue = readSingleOptionValue(args, "--mode") ?? "final";
|
|
815
|
+
const mode = normalizeAuthoringCheckMode(modeValue);
|
|
816
|
+
if (mode === null) {
|
|
817
|
+
return {
|
|
818
|
+
targetPath: path.resolve("."),
|
|
819
|
+
mode: "final",
|
|
820
|
+
changedFiles: [],
|
|
821
|
+
severityPolicy: "errors",
|
|
822
|
+
outputFormat: "json",
|
|
823
|
+
error: `Usage error: --mode must be final or post-edit.\n${usage}`,
|
|
824
|
+
};
|
|
825
|
+
}
|
|
826
|
+
const severityPolicyValue = readSingleOptionValue(args, "--severity-policy") ?? "errors";
|
|
827
|
+
const severityPolicy = severityPolicyValue === "errors" || severityPolicyValue === "all" ? severityPolicyValue : null;
|
|
828
|
+
if (severityPolicy === null) {
|
|
829
|
+
return {
|
|
830
|
+
targetPath: path.resolve("."),
|
|
831
|
+
mode: "final",
|
|
832
|
+
changedFiles: [],
|
|
833
|
+
severityPolicy: "errors",
|
|
834
|
+
outputFormat: "json",
|
|
835
|
+
error: `Usage error: --severity-policy must be errors or all.\n${usage}`,
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
const outputFormatValue = readSingleOptionValue(args, "--format") ?? "json";
|
|
839
|
+
const outputFormat = outputFormatValue === "json" || outputFormatValue === "compact" ? outputFormatValue : null;
|
|
840
|
+
if (outputFormat === null) {
|
|
841
|
+
return {
|
|
842
|
+
targetPath: path.resolve("."),
|
|
843
|
+
mode: "final",
|
|
844
|
+
changedFiles: [],
|
|
845
|
+
severityPolicy: "errors",
|
|
846
|
+
outputFormat: "json",
|
|
847
|
+
error: `Usage error: --format must be json or compact.\n${usage}`,
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
return {
|
|
851
|
+
targetPath: path.resolve(targetOptionValue ?? positionalArgs[0] ?? "."),
|
|
852
|
+
mode,
|
|
853
|
+
changedFiles: collectOptionValues(args, "--changed"),
|
|
854
|
+
severityPolicy,
|
|
855
|
+
outputFormat,
|
|
856
|
+
error: null,
|
|
857
|
+
};
|
|
858
|
+
}
|
|
859
|
+
function normalizeAuthoringCheckMode(value) {
|
|
860
|
+
if (value === "final") {
|
|
861
|
+
return "final";
|
|
862
|
+
}
|
|
863
|
+
if (value === "post-edit" || value === "post_edit") {
|
|
864
|
+
return "post_edit";
|
|
865
|
+
}
|
|
866
|
+
return null;
|
|
867
|
+
}
|
|
868
|
+
function hasMissingOptionValue(args, optionName) {
|
|
869
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
870
|
+
if (args[index] !== optionName) {
|
|
871
|
+
continue;
|
|
872
|
+
}
|
|
873
|
+
const value = args[index + 1];
|
|
874
|
+
if (!value || value.startsWith("--")) {
|
|
875
|
+
return true;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
return false;
|
|
879
|
+
}
|
|
880
|
+
function formatAuthoringCheckCommand(input) {
|
|
881
|
+
const args = [
|
|
882
|
+
"gdh authoring check",
|
|
883
|
+
`--mode ${input.mode === "post_edit" ? "post-edit" : "final"}`,
|
|
884
|
+
...input.changedFiles.map((changedFile) => `--changed ${changedFile}`),
|
|
885
|
+
`--severity-policy ${input.severityPolicy}`,
|
|
886
|
+
`--format ${input.outputFormat}`,
|
|
887
|
+
];
|
|
888
|
+
return args.join(" ");
|
|
889
|
+
}
|
|
890
|
+
function formatCompactAuthoringCheckResult(result) {
|
|
891
|
+
const lines = result.diagnostics.map((diagnostic) => {
|
|
892
|
+
const pathPart = diagnostic.path === null ? "<unknown>" : `res://${diagnostic.path}`;
|
|
893
|
+
const line = diagnostic.line === null ? "" : `:${diagnostic.line + 1}`;
|
|
894
|
+
const column = diagnostic.column === null ? "" : `:${diagnostic.column + 1}`;
|
|
895
|
+
return `${pathPart}${line}${column} [${diagnostic.severity}] ${diagnostic.message}`;
|
|
896
|
+
});
|
|
897
|
+
const summary = result.blockingSummary;
|
|
898
|
+
const outcome = summary.state === "blocked"
|
|
899
|
+
? "Completion blocked."
|
|
900
|
+
: summary.state === "unconfirmed"
|
|
901
|
+
? "Completion unconfirmed."
|
|
902
|
+
: "Completion allowed.";
|
|
903
|
+
lines.push(`${summary.errorCount} errors, ${summary.warningCount} warnings, ${summary.infoCount} info. ${outcome}`);
|
|
904
|
+
if (summary.reasons.length > 0) {
|
|
905
|
+
lines.push(`Reasons: ${summary.reasons.join(", ")}`);
|
|
906
|
+
}
|
|
907
|
+
return `${lines.join("\n")}\n`;
|
|
908
|
+
}
|
|
756
909
|
async function runLspStatusCommand(args, io) {
|
|
757
910
|
if (args.includes("--help")) {
|
|
758
911
|
io.stdout.write([
|
|
@@ -1103,7 +1256,7 @@ async function runAdaptersCommand(args, io) {
|
|
|
1103
1256
|
" status [target] [--integration-root <path>] Inspect supported-agent reinforcement status as JSON.",
|
|
1104
1257
|
" install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>]",
|
|
1105
1258
|
" Install or repair supported-agent reinforcement surfaces.",
|
|
1106
|
-
" gsd snapshot [target] [--files <path>]
|
|
1259
|
+
" gsd snapshot [target] [--files <path>] Export a read-mostly GSD projection as JSON.",
|
|
1107
1260
|
"",
|
|
1108
1261
|
"Supported agents: codex, claude, cursor",
|
|
1109
1262
|
].join("\n") + "\n");
|
|
@@ -1123,7 +1276,7 @@ async function runAdaptersCommand(args, io) {
|
|
|
1123
1276
|
"",
|
|
1124
1277
|
"Usage: gdh adapters status [target] [--integration-root <path>]",
|
|
1125
1278
|
"Usage: gdh adapters install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>]",
|
|
1126
|
-
"Usage: gdh adapters gsd snapshot [target] [--files <path>]
|
|
1279
|
+
"Usage: gdh adapters gsd snapshot [target] [--files <path>]",
|
|
1127
1280
|
].join("\n") + "\n");
|
|
1128
1281
|
return 1;
|
|
1129
1282
|
}
|
|
@@ -1134,7 +1287,7 @@ async function runGsdAdapterCommand(args, io) {
|
|
|
1134
1287
|
"Usage: gdh adapters gsd <command> [target]",
|
|
1135
1288
|
"",
|
|
1136
1289
|
"Commands:",
|
|
1137
|
-
" snapshot [target] [--files <path>]
|
|
1290
|
+
" snapshot [target] [--files <path>] Export a read-mostly GSD projection as JSON.",
|
|
1138
1291
|
].join("\n") + "\n");
|
|
1139
1292
|
return 0;
|
|
1140
1293
|
}
|
|
@@ -1144,7 +1297,7 @@ async function runGsdAdapterCommand(args, io) {
|
|
|
1144
1297
|
io.stderr.write([
|
|
1145
1298
|
`Unknown adapters gsd command: ${subcommand}`,
|
|
1146
1299
|
"",
|
|
1147
|
-
"Usage: gdh adapters gsd snapshot [target] [--files <path>]
|
|
1300
|
+
"Usage: gdh adapters gsd snapshot [target] [--files <path>]",
|
|
1148
1301
|
].join("\n") + "\n");
|
|
1149
1302
|
return 1;
|
|
1150
1303
|
}
|
|
@@ -1366,10 +1519,6 @@ async function runVerifyCommand(args, io) {
|
|
|
1366
1519
|
" Inspect or record runtime corpus release-readiness evidence as JSON.",
|
|
1367
1520
|
" drift [target]",
|
|
1368
1521
|
" Check whether baked `@skillcap/gdh@<version>` literals (skills + commands) match .gdh/project.yaml gdh_version.",
|
|
1369
|
-
" recommend [target] --files <path> [--files <path>...]",
|
|
1370
|
-
" Recommend authoring-first validation requirements for the supplied change set.",
|
|
1371
|
-
" done [target] --files <path> [--files <path>...] [--performed <kind>]",
|
|
1372
|
-
" Evaluate whether the supplied change set is eligible to be called done.",
|
|
1373
1522
|
].join("\n") + "\n");
|
|
1374
1523
|
return 0;
|
|
1375
1524
|
}
|
|
@@ -1383,12 +1532,6 @@ async function runVerifyCommand(args, io) {
|
|
|
1383
1532
|
const verifyTargetPath = rest.find((arg) => !arg.startsWith("--")) ?? ".";
|
|
1384
1533
|
await emitUpdateBannerIfStale(verifyTargetPath, io);
|
|
1385
1534
|
}
|
|
1386
|
-
if (subcommand === "recommend") {
|
|
1387
|
-
return runVerifyRecommendCommand(rest, io);
|
|
1388
|
-
}
|
|
1389
|
-
if (subcommand === "done") {
|
|
1390
|
-
return runVerifyDoneCommand(rest, io);
|
|
1391
|
-
}
|
|
1392
1535
|
if (subcommand === "run") {
|
|
1393
1536
|
return runVerifyRunCommand(rest, io);
|
|
1394
1537
|
}
|
|
@@ -1415,8 +1558,6 @@ async function runVerifyCommand(args, io) {
|
|
|
1415
1558
|
"Usage: gdh verify corpus exercise --entry <id> [--manifest <path>] [--workspace-root <path>] [--no-prepare]",
|
|
1416
1559
|
"Usage: gdh verify corpus record --entry <id> --target <path> [--manifest <path>] [--workspace-root <path>]",
|
|
1417
1560
|
"Usage: gdh verify drift [target]",
|
|
1418
|
-
"Usage: gdh verify recommend [target] --files <path> [--files <path>...]",
|
|
1419
|
-
"Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]",
|
|
1420
1561
|
].join("\n") + "\n");
|
|
1421
1562
|
return 1;
|
|
1422
1563
|
}
|
|
@@ -2186,23 +2327,23 @@ async function runAdaptersInstallCommand(args, io) {
|
|
|
2186
2327
|
async function runGsdSnapshotCommand(args, io) {
|
|
2187
2328
|
if (args.includes("--help")) {
|
|
2188
2329
|
io.stdout.write([
|
|
2189
|
-
"Usage: gdh adapters gsd snapshot [target] [--files <path>]
|
|
2330
|
+
"Usage: gdh adapters gsd snapshot [target] [--files <path>]",
|
|
2190
2331
|
"",
|
|
2191
2332
|
"Export a read-mostly GSD projection over current GDH status, guidance, and validation surfaces as JSON.",
|
|
2192
2333
|
].join("\n") + "\n");
|
|
2193
2334
|
return 0;
|
|
2194
2335
|
}
|
|
2195
2336
|
const unsupportedOptionsError = findUnsupportedOptionsError(args, {
|
|
2196
|
-
usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]
|
|
2197
|
-
optionsWithValues: ["--files"
|
|
2337
|
+
usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]\n",
|
|
2338
|
+
optionsWithValues: ["--files"],
|
|
2198
2339
|
});
|
|
2199
2340
|
if (unsupportedOptionsError !== null) {
|
|
2200
2341
|
io.stderr.write(unsupportedOptionsError);
|
|
2201
2342
|
return 1;
|
|
2202
2343
|
}
|
|
2203
2344
|
const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
|
|
2204
|
-
usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]
|
|
2205
|
-
additionalOptionsWithValues: new Set(["--files"
|
|
2345
|
+
usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]\n",
|
|
2346
|
+
additionalOptionsWithValues: new Set(["--files"]),
|
|
2206
2347
|
});
|
|
2207
2348
|
if (targetPathError !== null) {
|
|
2208
2349
|
io.stderr.write(targetPathError);
|
|
@@ -2211,7 +2352,6 @@ async function runGsdSnapshotCommand(args, io) {
|
|
|
2211
2352
|
try {
|
|
2212
2353
|
const result = await createGsdSnapshot(targetPath, {
|
|
2213
2354
|
files: collectOptionValues(args, "--files"),
|
|
2214
|
-
performed: collectPerformedValidationKinds(args),
|
|
2215
2355
|
});
|
|
2216
2356
|
io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
2217
2357
|
return 0;
|
|
@@ -2376,149 +2516,6 @@ async function buildAuthoringContext(targetPath, io) {
|
|
|
2376
2516
|
status,
|
|
2377
2517
|
};
|
|
2378
2518
|
}
|
|
2379
|
-
async function runVerifyRecommendCommand(args, io) {
|
|
2380
|
-
if (args.includes("--help")) {
|
|
2381
|
-
io.stdout.write([
|
|
2382
|
-
"Usage: gdh verify recommend [target] --files <path> [--files <path>...]",
|
|
2383
|
-
"",
|
|
2384
|
-
"Recommend authoring-first validation requirements for the supplied change set as JSON.",
|
|
2385
|
-
].join("\n") + "\n");
|
|
2386
|
-
return 0;
|
|
2387
|
-
}
|
|
2388
|
-
const unsupportedOptionsError = findUnsupportedOptionsError(args, {
|
|
2389
|
-
usage: "Usage: gdh verify recommend [target] --files <path> [--files <path>...]\n",
|
|
2390
|
-
optionsWithValues: ["--files"],
|
|
2391
|
-
});
|
|
2392
|
-
if (unsupportedOptionsError !== null) {
|
|
2393
|
-
io.stderr.write(unsupportedOptionsError);
|
|
2394
|
-
return 1;
|
|
2395
|
-
}
|
|
2396
|
-
const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
|
|
2397
|
-
usage: "Usage: gdh verify recommend [target] --files <path> [--files <path>...]\n",
|
|
2398
|
-
additionalOptionsWithValues: new Set(["--files"]),
|
|
2399
|
-
});
|
|
2400
|
-
if (targetPathError !== null) {
|
|
2401
|
-
io.stderr.write(targetPathError);
|
|
2402
|
-
return 1;
|
|
2403
|
-
}
|
|
2404
|
-
const files = collectOptionValues(args, "--files");
|
|
2405
|
-
if (files.length === 0) {
|
|
2406
|
-
io.stderr.write("Usage error: gdh verify recommend requires at least one --files <path> argument.\n");
|
|
2407
|
-
return 1;
|
|
2408
|
-
}
|
|
2409
|
-
const commandStartedAtMs = Date.now();
|
|
2410
|
-
try {
|
|
2411
|
-
const context = await buildAuthoringContext(targetPath);
|
|
2412
|
-
const result = await recommendValidationForChange({
|
|
2413
|
-
targetPath,
|
|
2414
|
-
inventory: context.inventory,
|
|
2415
|
-
status: context.status,
|
|
2416
|
-
projectConfig: context.projectConfig,
|
|
2417
|
-
files,
|
|
2418
|
-
});
|
|
2419
|
-
await recordSessionEvent(targetPath, {
|
|
2420
|
-
commandStartedAtMs,
|
|
2421
|
-
kind: "verify_recommend",
|
|
2422
|
-
command: "gdh verify recommend",
|
|
2423
|
-
state: result.recommendations.length === 0 ? "blocked" : "succeeded",
|
|
2424
|
-
summary: result.summary,
|
|
2425
|
-
changedFiles: files,
|
|
2426
|
-
guidance: buildGuidanceSnapshot(result.guidance),
|
|
2427
|
-
validation: {
|
|
2428
|
-
changedFiles: files,
|
|
2429
|
-
recommendedKinds: result.recommendations.map((item) => item.kind),
|
|
2430
|
-
performedKinds: [],
|
|
2431
|
-
},
|
|
2432
|
-
});
|
|
2433
|
-
io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
2434
|
-
return 0;
|
|
2435
|
-
}
|
|
2436
|
-
catch (error) {
|
|
2437
|
-
await recordSessionEvent(targetPath, {
|
|
2438
|
-
commandStartedAtMs,
|
|
2439
|
-
kind: "verify_recommend",
|
|
2440
|
-
command: "gdh verify recommend",
|
|
2441
|
-
state: "failed",
|
|
2442
|
-
summary: "Validation recommendation failed before producing a result.",
|
|
2443
|
-
changedFiles: files,
|
|
2444
|
-
errorMessage: formatCliError(error),
|
|
2445
|
-
});
|
|
2446
|
-
io.stderr.write(`Failed to recommend validation for "${targetPath}": ${formatCliError(error)}\n`);
|
|
2447
|
-
return 1;
|
|
2448
|
-
}
|
|
2449
|
-
}
|
|
2450
|
-
async function runVerifyDoneCommand(args, io) {
|
|
2451
|
-
if (args.includes("--help")) {
|
|
2452
|
-
io.stdout.write([
|
|
2453
|
-
"Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]",
|
|
2454
|
-
"",
|
|
2455
|
-
"Evaluate whether the supplied change set is eligible to be called done as JSON.",
|
|
2456
|
-
].join("\n") + "\n");
|
|
2457
|
-
return 0;
|
|
2458
|
-
}
|
|
2459
|
-
const unsupportedOptionsError = findUnsupportedOptionsError(args, {
|
|
2460
|
-
usage: "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]\n",
|
|
2461
|
-
optionsWithValues: ["--files", "--performed"],
|
|
2462
|
-
});
|
|
2463
|
-
if (unsupportedOptionsError !== null) {
|
|
2464
|
-
io.stderr.write(unsupportedOptionsError);
|
|
2465
|
-
return 1;
|
|
2466
|
-
}
|
|
2467
|
-
const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
|
|
2468
|
-
usage: "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]\n",
|
|
2469
|
-
additionalOptionsWithValues: new Set(["--files", "--performed"]),
|
|
2470
|
-
});
|
|
2471
|
-
if (targetPathError !== null) {
|
|
2472
|
-
io.stderr.write(targetPathError);
|
|
2473
|
-
return 1;
|
|
2474
|
-
}
|
|
2475
|
-
const files = collectOptionValues(args, "--files");
|
|
2476
|
-
if (files.length === 0) {
|
|
2477
|
-
io.stderr.write("Usage error: gdh verify done requires at least one --files <path> argument.\n");
|
|
2478
|
-
return 1;
|
|
2479
|
-
}
|
|
2480
|
-
const commandStartedAtMs = Date.now();
|
|
2481
|
-
try {
|
|
2482
|
-
const context = await buildAuthoringContext(targetPath);
|
|
2483
|
-
const result = await evaluateDonePolicy({
|
|
2484
|
-
targetPath,
|
|
2485
|
-
inventory: context.inventory,
|
|
2486
|
-
status: context.status,
|
|
2487
|
-
projectConfig: context.projectConfig,
|
|
2488
|
-
files,
|
|
2489
|
-
performed: collectPerformedValidationKinds(args),
|
|
2490
|
-
});
|
|
2491
|
-
await recordSessionEvent(targetPath, {
|
|
2492
|
-
commandStartedAtMs,
|
|
2493
|
-
kind: "verify_done",
|
|
2494
|
-
command: "gdh verify done",
|
|
2495
|
-
state: result.status === "done" ? "succeeded" : "blocked",
|
|
2496
|
-
summary: result.summary,
|
|
2497
|
-
changedFiles: files,
|
|
2498
|
-
guidance: buildGuidanceSnapshot(result.recommendation.guidance),
|
|
2499
|
-
validation: {
|
|
2500
|
-
changedFiles: files,
|
|
2501
|
-
recommendedKinds: result.recommendation.recommendations.map((item) => item.kind),
|
|
2502
|
-
performedKinds: result.performedValidations.map((item) => item.kind),
|
|
2503
|
-
},
|
|
2504
|
-
});
|
|
2505
|
-
io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
2506
|
-
return 0;
|
|
2507
|
-
}
|
|
2508
|
-
catch (error) {
|
|
2509
|
-
await recordSessionEvent(targetPath, {
|
|
2510
|
-
commandStartedAtMs,
|
|
2511
|
-
kind: "verify_done",
|
|
2512
|
-
command: "gdh verify done",
|
|
2513
|
-
state: "failed",
|
|
2514
|
-
summary: "Done-policy evaluation failed before producing a result.",
|
|
2515
|
-
changedFiles: files,
|
|
2516
|
-
errorMessage: formatCliError(error),
|
|
2517
|
-
});
|
|
2518
|
-
io.stderr.write(`Failed to evaluate done policy for "${targetPath}": ${formatCliError(error)}\n`);
|
|
2519
|
-
return 1;
|
|
2520
|
-
}
|
|
2521
|
-
}
|
|
2522
2519
|
async function runVerifyRunCommand(args, io) {
|
|
2523
2520
|
if (args.includes("--help")) {
|
|
2524
2521
|
io.stdout.write([
|
|
@@ -2731,19 +2728,19 @@ const VERIFY_DRIFT_SCANNED_FILES = [
|
|
|
2731
2728
|
{ relativePath: CODEX_MIGRATE_SKILL_RELATIVE_PATH, description: "Codex gdh-migrate skill" },
|
|
2732
2729
|
{ relativePath: CODEX_CHECK_SKILL_RELATIVE_PATH, description: "Codex gdh-check skill" },
|
|
2733
2730
|
{ relativePath: CODEX_PREPARE_SKILL_RELATIVE_PATH, description: "Codex gdh-prepare skill" },
|
|
2734
|
-
{ relativePath:
|
|
2731
|
+
{ relativePath: CODEX_SCAN_SKILL_RELATIVE_PATH, description: "Codex gdh-scan skill" },
|
|
2735
2732
|
{ relativePath: CURSOR_ONBOARD_SKILL_RELATIVE_PATH, description: "Cursor gdh-onboard skill" },
|
|
2736
2733
|
{ relativePath: CURSOR_STATUS_SKILL_RELATIVE_PATH, description: "Cursor gdh-status skill" },
|
|
2737
2734
|
{ relativePath: CURSOR_MIGRATE_SKILL_RELATIVE_PATH, description: "Cursor gdh-migrate skill" },
|
|
2738
2735
|
{ relativePath: CURSOR_CHECK_SKILL_RELATIVE_PATH, description: "Cursor gdh-check skill" },
|
|
2739
2736
|
{ relativePath: CURSOR_PREPARE_SKILL_RELATIVE_PATH, description: "Cursor gdh-prepare skill" },
|
|
2740
|
-
{ relativePath:
|
|
2741
|
-
{ relativePath:
|
|
2742
|
-
{ relativePath:
|
|
2743
|
-
{ relativePath:
|
|
2744
|
-
{ relativePath:
|
|
2745
|
-
{ relativePath:
|
|
2746
|
-
{ relativePath:
|
|
2737
|
+
{ relativePath: CURSOR_SCAN_SKILL_RELATIVE_PATH, description: "Cursor gdh-scan skill" },
|
|
2738
|
+
{ relativePath: CLAUDE_ONBOARD_SKILL_RELATIVE_PATH, description: "Claude gdh-onboard skill" },
|
|
2739
|
+
{ relativePath: CLAUDE_STATUS_SKILL_RELATIVE_PATH, description: "Claude gdh-status skill" },
|
|
2740
|
+
{ relativePath: CLAUDE_MIGRATE_SKILL_RELATIVE_PATH, description: "Claude gdh-migrate skill" },
|
|
2741
|
+
{ relativePath: CLAUDE_CHECK_SKILL_RELATIVE_PATH, description: "Claude gdh-check skill" },
|
|
2742
|
+
{ relativePath: CLAUDE_PREPARE_SKILL_RELATIVE_PATH, description: "Claude gdh-prepare skill" },
|
|
2743
|
+
{ relativePath: CLAUDE_SCAN_SKILL_RELATIVE_PATH, description: "Claude gdh-scan skill" },
|
|
2747
2744
|
// Phase 12 extension — close the Phase 11 coverage gap (research §Baked Version Surface Inventory rows 26-28).
|
|
2748
2745
|
// These files are re-baked at pin time and must be audited by MIG-02's post-condition invariant.
|
|
2749
2746
|
//
|
|
@@ -2771,7 +2768,7 @@ const VERIFY_DRIFT_SCANNED_FILES = [
|
|
|
2771
2768
|
// statusline IS re-baked on every `gdh adapters install` via the renderer pipeline, which ensures
|
|
2772
2769
|
// it stays current with the hook version; pin-literal drift detection is not applicable here.
|
|
2773
2770
|
//
|
|
2774
|
-
// Intentionally excluded: the Claude /gdh-update
|
|
2771
|
+
// Intentionally excluded: the Claude /gdh-update skill (.claude/skills/gdh-update/SKILL.md) —
|
|
2775
2772
|
// the rendered command shells out to `npx -y @skillcap/gdh@latest self-update` (LITERAL @latest,
|
|
2776
2773
|
// not @<pinnedVersion>). The shellout MUST bake @latest so the NEW CLI performs the update,
|
|
2777
2774
|
// not the OLD (potentially buggy) pinned one. Because @latest is not a semver literal, the
|
|
@@ -2794,7 +2791,7 @@ async function runVerifyDriftCommand(args, io) {
|
|
|
2794
2791
|
"Usage: gdh verify drift [target]",
|
|
2795
2792
|
"",
|
|
2796
2793
|
"Compares every baked `@skillcap/gdh@<version>` literal across the managed",
|
|
2797
|
-
"surfaces (regenerated Codex/Cursor/Claude skill
|
|
2794
|
+
"surfaces (regenerated Codex/Cursor/Claude skill files and hooks) against",
|
|
2798
2795
|
".gdh/project.yaml gdh_version. Exits 1 and",
|
|
2799
2796
|
"emits a structured JSON result when ANY file's baked version diverges from",
|
|
2800
2797
|
"the pinned value. Covers ROADMAP Success Criterion #3 (one source of truth).",
|
|
@@ -3463,13 +3460,12 @@ async function runAuthoringSliceDoctor(targetPath) {
|
|
|
3463
3460
|
adapters: null,
|
|
3464
3461
|
dogfood,
|
|
3465
3462
|
authoringCheck: null,
|
|
3466
|
-
donePolicy: null,
|
|
3467
3463
|
};
|
|
3468
3464
|
}
|
|
3469
3465
|
if (dogfood.state === "blocked" ||
|
|
3470
3466
|
dogfood.onboarding === null ||
|
|
3471
3467
|
dogfood.status === null ||
|
|
3472
|
-
dogfood.
|
|
3468
|
+
dogfood.guidanceResolve === null) {
|
|
3473
3469
|
const classification = classifyBlockedDogfoodResult(dogfood);
|
|
3474
3470
|
return {
|
|
3475
3471
|
version: GDH_AUTHORING_SLICE_REPORT_VERSION,
|
|
@@ -3482,7 +3478,6 @@ async function runAuthoringSliceDoctor(targetPath) {
|
|
|
3482
3478
|
adapters: null,
|
|
3483
3479
|
dogfood,
|
|
3484
3480
|
authoringCheck: null,
|
|
3485
|
-
donePolicy: null,
|
|
3486
3481
|
};
|
|
3487
3482
|
}
|
|
3488
3483
|
const validation = await evaluateAuthoringSliceValidation(targetPath);
|
|
@@ -3490,7 +3485,6 @@ async function runAuthoringSliceDoctor(targetPath) {
|
|
|
3490
3485
|
dogfood,
|
|
3491
3486
|
adapters: validation.adapters,
|
|
3492
3487
|
authoringCheck: validation.authoringCheck,
|
|
3493
|
-
donePolicy: validation.donePolicy,
|
|
3494
3488
|
});
|
|
3495
3489
|
return {
|
|
3496
3490
|
version: GDH_AUTHORING_SLICE_REPORT_VERSION,
|
|
@@ -3503,7 +3497,6 @@ async function runAuthoringSliceDoctor(targetPath) {
|
|
|
3503
3497
|
adapters: validation.adapters,
|
|
3504
3498
|
dogfood,
|
|
3505
3499
|
authoringCheck: validation.authoringCheck,
|
|
3506
|
-
donePolicy: validation.donePolicy,
|
|
3507
3500
|
};
|
|
3508
3501
|
}
|
|
3509
3502
|
async function executeAuthoringDogfoodTarget(input) {
|
|
@@ -3527,7 +3520,6 @@ async function executeAuthoringDogfoodTarget(input) {
|
|
|
3527
3520
|
status: null,
|
|
3528
3521
|
guidanceStatus: null,
|
|
3529
3522
|
guidanceResolve: null,
|
|
3530
|
-
validationRecommendation: null,
|
|
3531
3523
|
sessionInspection: null,
|
|
3532
3524
|
blockedReason: input.kind === "pilot" ? "pilot_target_missing" : "fixture_target_missing",
|
|
3533
3525
|
errorMessage: null,
|
|
@@ -3577,7 +3569,6 @@ async function executeAuthoringDogfoodTarget(input) {
|
|
|
3577
3569
|
status: null,
|
|
3578
3570
|
guidanceStatus: null,
|
|
3579
3571
|
guidanceResolve: null,
|
|
3580
|
-
validationRecommendation: null,
|
|
3581
3572
|
sessionInspection,
|
|
3582
3573
|
blockedReason: onboarding.status === "ready" ? "selected_project_missing" : "onboarding_unresolved",
|
|
3583
3574
|
errorMessage: null,
|
|
@@ -3614,52 +3605,35 @@ async function executeAuthoringDogfoodTarget(input) {
|
|
|
3614
3605
|
status: context.status,
|
|
3615
3606
|
guidanceStatus,
|
|
3616
3607
|
guidanceResolve: null,
|
|
3617
|
-
validationRecommendation: null,
|
|
3618
3608
|
sessionInspection,
|
|
3619
3609
|
blockedReason: "no_representative_changed_files",
|
|
3620
3610
|
errorMessage: null,
|
|
3621
3611
|
};
|
|
3622
3612
|
}
|
|
3623
|
-
const
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
files: changedFiles,
|
|
3613
|
+
const guidanceResolve = await resolveGuidanceQuery(workingCopy.targetPath, {
|
|
3614
|
+
taskTypes: ["authoring"],
|
|
3615
|
+
capabilities: context.status.effectiveCapabilities,
|
|
3616
|
+
repoState: deriveGuidanceRepoState(context),
|
|
3617
|
+
keywords: [],
|
|
3629
3618
|
});
|
|
3630
3619
|
await recordAuthoringSessionEvent(workingCopy.targetPath, {
|
|
3631
3620
|
sessionId,
|
|
3632
3621
|
kind: "guidance_resolve",
|
|
3633
3622
|
command: "gdh guidance resolve",
|
|
3634
|
-
state:
|
|
3635
|
-
validationRecommendation.guidance.recommendedUnits.length > 0
|
|
3623
|
+
state: guidanceResolve.requiredUnits.length > 0 || guidanceResolve.recommendedUnits.length > 0
|
|
3636
3624
|
? "succeeded"
|
|
3637
3625
|
: "blocked",
|
|
3638
|
-
summary:
|
|
3639
|
-
guidance: buildGuidanceSnapshot(
|
|
3626
|
+
summary: guidanceResolve.status.summary,
|
|
3627
|
+
guidance: buildGuidanceSnapshot(guidanceResolve),
|
|
3640
3628
|
changedFiles,
|
|
3641
3629
|
});
|
|
3642
|
-
await recordAuthoringSessionEvent(workingCopy.targetPath, {
|
|
3643
|
-
sessionId,
|
|
3644
|
-
kind: "verify_recommend",
|
|
3645
|
-
command: "gdh verify recommend",
|
|
3646
|
-
state: validationRecommendation.recommendations.length > 0 ? "succeeded" : "blocked",
|
|
3647
|
-
summary: validationRecommendation.summary,
|
|
3648
|
-
changedFiles,
|
|
3649
|
-
guidance: buildGuidanceSnapshot(validationRecommendation.guidance),
|
|
3650
|
-
validation: {
|
|
3651
|
-
changedFiles,
|
|
3652
|
-
recommendedKinds: validationRecommendation.recommendations.map((item) => item.kind),
|
|
3653
|
-
performedKinds: [],
|
|
3654
|
-
},
|
|
3655
|
-
});
|
|
3656
3630
|
const sessionInspection = await inspectAuthoringSessions(workingCopy.targetPath, {
|
|
3657
3631
|
sessionId,
|
|
3658
3632
|
});
|
|
3659
3633
|
const state = isHealthyDogfoodTarget({
|
|
3660
3634
|
readiness: context.status.readiness,
|
|
3661
3635
|
guidanceState: guidanceStatus.state,
|
|
3662
|
-
|
|
3636
|
+
guidanceUnitCount: guidanceResolve.requiredUnits.length + guidanceResolve.recommendedUnits.length,
|
|
3663
3637
|
sessionState: sessionInspection.state,
|
|
3664
3638
|
})
|
|
3665
3639
|
? "passed"
|
|
@@ -3668,15 +3642,14 @@ async function executeAuthoringDogfoodTarget(input) {
|
|
|
3668
3642
|
target,
|
|
3669
3643
|
state,
|
|
3670
3644
|
summary: state === "passed"
|
|
3671
|
-
? "Dogfood exercised onboarding, readiness, guidance
|
|
3645
|
+
? "Dogfood exercised onboarding, readiness, guidance resolution, and session evidence successfully."
|
|
3672
3646
|
: "Dogfood exercised the target, but one or more authoring-slice surfaces stayed blocked or incomplete.",
|
|
3673
3647
|
changedFiles,
|
|
3674
3648
|
inventory: onboarding.inventory,
|
|
3675
3649
|
onboarding,
|
|
3676
3650
|
status: context.status,
|
|
3677
3651
|
guidanceStatus,
|
|
3678
|
-
guidanceResolve
|
|
3679
|
-
validationRecommendation,
|
|
3652
|
+
guidanceResolve,
|
|
3680
3653
|
sessionInspection,
|
|
3681
3654
|
blockedReason: state === "passed" ? null : "authoring_slice_incomplete",
|
|
3682
3655
|
errorMessage: null,
|
|
@@ -3693,7 +3666,6 @@ async function executeAuthoringDogfoodTarget(input) {
|
|
|
3693
3666
|
status: null,
|
|
3694
3667
|
guidanceStatus: null,
|
|
3695
3668
|
guidanceResolve: null,
|
|
3696
|
-
validationRecommendation: null,
|
|
3697
3669
|
sessionInspection: null,
|
|
3698
3670
|
blockedReason: null,
|
|
3699
3671
|
errorMessage: formatCliError(error),
|
|
@@ -3752,10 +3724,6 @@ async function evaluateAuthoringSliceValidation(targetPath) {
|
|
|
3752
3724
|
throw new Error("Authoring-slice validation requires an onboarded target with a selected primary project.");
|
|
3753
3725
|
}
|
|
3754
3726
|
const context = await buildAuthoringContext(workingCopy.targetPath);
|
|
3755
|
-
const changedFiles = deriveDogfoodChangedFiles(onboarding.selectedProject);
|
|
3756
|
-
if (changedFiles.length === 0) {
|
|
3757
|
-
throw new Error("Authoring-slice validation could not derive a representative authoring change set.");
|
|
3758
|
-
}
|
|
3759
3727
|
const adapters = await getSupportedAgentAdaptersStatus(workingCopy.targetPath, {
|
|
3760
3728
|
includeUserLocal: false,
|
|
3761
3729
|
});
|
|
@@ -3764,18 +3732,9 @@ async function evaluateAuthoringSliceValidation(targetPath) {
|
|
|
3764
3732
|
status: context.status,
|
|
3765
3733
|
projectConfig: context.projectConfig,
|
|
3766
3734
|
});
|
|
3767
|
-
const donePolicy = await evaluateDonePolicy({
|
|
3768
|
-
targetPath: workingCopy.targetPath,
|
|
3769
|
-
inventory: context.inventory,
|
|
3770
|
-
status: context.status,
|
|
3771
|
-
projectConfig: context.projectConfig,
|
|
3772
|
-
files: changedFiles,
|
|
3773
|
-
performed: [],
|
|
3774
|
-
});
|
|
3775
3735
|
return {
|
|
3776
3736
|
adapters,
|
|
3777
3737
|
authoringCheck,
|
|
3778
|
-
donePolicy,
|
|
3779
3738
|
};
|
|
3780
3739
|
}
|
|
3781
3740
|
finally {
|
|
@@ -3831,7 +3790,7 @@ function classifyAuthoringSliceValidation(input) {
|
|
|
3831
3790
|
].filter((reason) => reason !== null),
|
|
3832
3791
|
};
|
|
3833
3792
|
}
|
|
3834
|
-
if (input.authoringCheck.status === "passed"
|
|
3793
|
+
if (input.authoringCheck.status === "passed") {
|
|
3835
3794
|
return {
|
|
3836
3795
|
state: "ready",
|
|
3837
3796
|
summary: "The current authoring-first slice is healthy enough for internal use on this target.",
|
|
@@ -3857,22 +3816,6 @@ function classifyAuthoringSliceValidation(input) {
|
|
|
3857
3816
|
reasons: input.authoringCheck.diagnostics.map((diagnostic) => diagnostic.message),
|
|
3858
3817
|
};
|
|
3859
3818
|
}
|
|
3860
|
-
if (input.donePolicy.status === "not_done") {
|
|
3861
|
-
return {
|
|
3862
|
-
state: "degraded",
|
|
3863
|
-
summary: "The authoring-first slice ran, but the work would still not be eligible to be called done with the current validation evidence.",
|
|
3864
|
-
failureClass: "agent_judgment_issue",
|
|
3865
|
-
reasons: input.donePolicy.reasons,
|
|
3866
|
-
};
|
|
3867
|
-
}
|
|
3868
|
-
if (input.donePolicy.status === "blocked") {
|
|
3869
|
-
return {
|
|
3870
|
-
state: "blocked",
|
|
3871
|
-
summary: "The authoring-first slice remains blocked because a required validation surface is still unavailable.",
|
|
3872
|
-
failureClass: "environment_issue",
|
|
3873
|
-
reasons: input.donePolicy.reasons,
|
|
3874
|
-
};
|
|
3875
|
-
}
|
|
3876
3819
|
if (input.authoringCheck.status === "degraded") {
|
|
3877
3820
|
return {
|
|
3878
3821
|
state: "degraded",
|
|
@@ -3897,7 +3840,7 @@ function normalizeRelativePath(value) {
|
|
|
3897
3840
|
function isHealthyDogfoodTarget(input) {
|
|
3898
3841
|
return (input.readiness === "authorable" &&
|
|
3899
3842
|
input.guidanceState === "ready" &&
|
|
3900
|
-
input.
|
|
3843
|
+
input.guidanceUnitCount > 0 &&
|
|
3901
3844
|
input.sessionState === "available");
|
|
3902
3845
|
}
|
|
3903
3846
|
function summarizeAuthoringDogfoodState(results) {
|
|
@@ -3952,7 +3895,7 @@ function renderHelp() {
|
|
|
3952
3895
|
" docs fetch <ref-or-url> [target] [--project <relative-path>] Fetch one official version-aware Godot docs page or section.",
|
|
3953
3896
|
" adapters status [target] [--integration-root <path>] Inspect supported-agent reinforcement status.",
|
|
3954
3897
|
" adapters install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>] Install or repair supported-agent reinforcement.",
|
|
3955
|
-
" adapters gsd snapshot [target] [--files <path>]
|
|
3898
|
+
" adapters gsd snapshot [target] [--files <path>] Export a read-only GSD projection.",
|
|
3956
3899
|
" authoring check [target] Run the current authoring-check entrypoint.",
|
|
3957
3900
|
" lsp <status|check|stop|restart|prune|doctor> [target] Manage authoring.lsp lifecycle state.",
|
|
3958
3901
|
" warmup [target] [--dry-run] Inspect or apply authoring worktree warmup.",
|
|
@@ -3985,8 +3928,6 @@ function renderHelp() {
|
|
|
3985
3928
|
" verify corpus materialize --entry <id> Materialize one runtime corpus entry into GDH-managed source state.",
|
|
3986
3929
|
" verify corpus exercise --entry <id> Exercise one runtime corpus entry through onboarding and runtime verification.",
|
|
3987
3930
|
" verify corpus record --entry <id> --target <path> Record runtime corpus evidence for one target.",
|
|
3988
|
-
" verify recommend [target] --files <path> Recommend validation requirements.",
|
|
3989
|
-
" verify done [target] --files <path> Evaluate whether a change is done.",
|
|
3990
3931
|
" cache inspect [target] Inspect namespaced authoring cache state.",
|
|
3991
3932
|
" cache prune [target] [--scope <scope>] Remove namespaced authoring cache state.",
|
|
3992
3933
|
" migrate [target] [--apply] Plan or apply current GDH project-surface migrations.",
|
|
@@ -4201,21 +4142,6 @@ function deriveGuidanceRepoState(context) {
|
|
|
4201
4142
|
}
|
|
4202
4143
|
return [...repoState];
|
|
4203
4144
|
}
|
|
4204
|
-
function collectPerformedValidationKinds(args) {
|
|
4205
|
-
return collectOptionValues(args, "--performed").flatMap((value) => {
|
|
4206
|
-
switch (value) {
|
|
4207
|
-
case "authoring_check":
|
|
4208
|
-
case "unit_tests":
|
|
4209
|
-
case "integration_tests":
|
|
4210
|
-
case "editor_validation":
|
|
4211
|
-
case "runtime_scenario":
|
|
4212
|
-
case "manual_review":
|
|
4213
|
-
return [value];
|
|
4214
|
-
default:
|
|
4215
|
-
return [];
|
|
4216
|
-
}
|
|
4217
|
-
});
|
|
4218
|
-
}
|
|
4219
4145
|
function extractRecipePositionalArgs(args) {
|
|
4220
4146
|
return extractPositionalArgs(args, new Set(["--provider", "--param", "--feature", "--no-feature", "--env"]));
|
|
4221
4147
|
}
|