gsd-pi 2.28.0-dev.e19bf89 → 2.29.0-dev.2ccf3fb
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/README.md +24 -17
- package/dist/cli.js +15 -9
- package/dist/resource-loader.js +80 -8
- package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +186 -65
- package/dist/resources/extensions/gsd/auto-post-unit.ts +14 -6
- package/dist/resources/extensions/gsd/auto-recovery.ts +33 -23
- package/dist/resources/extensions/gsd/auto-start.ts +25 -10
- package/dist/resources/extensions/gsd/auto-verification.ts +41 -7
- package/dist/resources/extensions/gsd/auto-worktree-sync.ts +21 -6
- package/dist/resources/extensions/gsd/auto.ts +67 -22
- package/dist/resources/extensions/gsd/commands-handlers.ts +3 -11
- package/dist/resources/extensions/gsd/commands-logs.ts +536 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +90 -47
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/dist/resources/extensions/gsd/commands.ts +75 -29
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +2 -1
- package/dist/resources/extensions/gsd/doctor-types.ts +13 -0
- package/dist/resources/extensions/gsd/doctor.ts +2 -6
- package/dist/resources/extensions/gsd/export.ts +28 -2
- package/dist/resources/extensions/gsd/gsd-db.ts +19 -0
- package/dist/resources/extensions/gsd/index.ts +2 -1
- package/dist/resources/extensions/gsd/json-persistence.ts +67 -0
- package/dist/resources/extensions/gsd/metrics.ts +17 -31
- package/dist/resources/extensions/gsd/paths.ts +0 -8
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/dist/resources/extensions/gsd/queue-order.ts +10 -11
- package/dist/resources/extensions/gsd/routing-history.ts +13 -17
- package/dist/resources/extensions/gsd/session-lock.ts +284 -0
- package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +136 -7
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/dist/resources/extensions/gsd/types.ts +1 -0
- package/dist/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/dist/resources/extensions/gsd/verification-evidence.ts +2 -0
- package/dist/resources/extensions/gsd/verification-gate.ts +13 -2
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/dist/resources/extensions/mcp-client/index.ts +459 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
- package/dist/resources/extensions/remote-questions/notify.ts +1 -2
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/dist/resources/extensions/remote-questions/types.ts +3 -0
- package/dist/resources/extensions/shared/mod.ts +3 -0
- package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/dist/resources/skills/create-skill/SKILL.md +184 -0
- package/dist/resources/skills/create-skill/references/api-security.md +226 -0
- package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
- package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/package.json +6 -3
- package/packages/native/dist/native.d.ts +2 -0
- package/packages/native/dist/native.js +19 -5
- package/packages/native/src/native.ts +23 -9
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +39 -8
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +11 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +11 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -1
- package/packages/pi-tui/dist/autocomplete.d.ts +3 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +14 -0
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/src/autocomplete.ts +19 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +186 -65
- package/src/resources/extensions/gsd/auto-post-unit.ts +14 -6
- package/src/resources/extensions/gsd/auto-recovery.ts +33 -23
- package/src/resources/extensions/gsd/auto-start.ts +25 -10
- package/src/resources/extensions/gsd/auto-verification.ts +41 -7
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +21 -6
- package/src/resources/extensions/gsd/auto.ts +67 -22
- package/src/resources/extensions/gsd/commands-handlers.ts +3 -11
- package/src/resources/extensions/gsd/commands-logs.ts +536 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +90 -47
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/src/resources/extensions/gsd/commands.ts +75 -29
- package/src/resources/extensions/gsd/dashboard-overlay.ts +2 -1
- package/src/resources/extensions/gsd/doctor-types.ts +13 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -6
- package/src/resources/extensions/gsd/export.ts +28 -2
- package/src/resources/extensions/gsd/gsd-db.ts +19 -0
- package/src/resources/extensions/gsd/index.ts +2 -1
- package/src/resources/extensions/gsd/json-persistence.ts +67 -0
- package/src/resources/extensions/gsd/metrics.ts +17 -31
- package/src/resources/extensions/gsd/paths.ts +0 -8
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/src/resources/extensions/gsd/queue-order.ts +10 -11
- package/src/resources/extensions/gsd/routing-history.ts +13 -17
- package/src/resources/extensions/gsd/session-lock.ts +284 -0
- package/src/resources/extensions/gsd/session-status-io.ts +23 -41
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +136 -7
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/src/resources/extensions/gsd/verification-evidence.ts +2 -0
- package/src/resources/extensions/gsd/verification-gate.ts +13 -2
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/src/resources/extensions/mcp-client/index.ts +459 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/src/resources/extensions/remote-questions/http-client.ts +76 -0
- package/src/resources/extensions/remote-questions/notify.ts +1 -2
- package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/src/resources/extensions/remote-questions/types.ts +3 -0
- package/src/resources/extensions/shared/mod.ts +3 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/src/resources/skills/create-skill/SKILL.md +184 -0
- package/src/resources/skills/create-skill/references/api-security.md +226 -0
- package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/src/resources/skills/create-skill/references/core-principles.md +437 -0
- package/src/resources/skills/create-skill/references/executable-code.md +175 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/src/resources/skills/create-skill/references/using-templates.md +112 -0
- package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/dist/resources/extensions/gsd/preferences-hooks.ts +0 -10
- package/dist/resources/extensions/mcporter/index.ts +0 -525
- package/dist/resources/extensions/shared/progress-widget.ts +0 -282
- package/dist/resources/extensions/shared/thinking-widget.ts +0 -107
- package/src/resources/extensions/gsd/preferences-hooks.ts +0 -10
- package/src/resources/extensions/mcporter/index.ts +0 -525
- package/src/resources/extensions/shared/progress-widget.ts +0 -282
- package/src/resources/extensions/shared/thinking-widget.ts +0 -107
|
@@ -22,6 +22,33 @@ import {
|
|
|
22
22
|
import { loadFile, saveFile, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
23
23
|
import { runClaudeImportFlow } from "./claude-import.js";
|
|
24
24
|
|
|
25
|
+
/** Extract body content after frontmatter closing delimiter, or null if none. */
|
|
26
|
+
function extractBodyAfterFrontmatter(content: string): string | null {
|
|
27
|
+
const closingIdx = content.indexOf("\n---", content.indexOf("---"));
|
|
28
|
+
if (closingIdx === -1) return null;
|
|
29
|
+
const afterFrontmatter = content.slice(closingIdx + 4);
|
|
30
|
+
return afterFrontmatter.trim() ? afterFrontmatter : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ─── Numeric validation helpers ──────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
/** Parse a string as a non-negative integer, or return null on failure. */
|
|
36
|
+
function tryParseInteger(val: string): number | null {
|
|
37
|
+
return /^\d+$/.test(val) ? Number(val) : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Parse a string as a finite number, or return null on failure. */
|
|
41
|
+
function tryParseNumber(val: string): number | null {
|
|
42
|
+
const n = Number(val);
|
|
43
|
+
return !isNaN(n) && isFinite(n) ? n : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Parse a string as a number in the 0–100 range, or return null on failure. */
|
|
47
|
+
function tryParsePercentage(val: string): number | null {
|
|
48
|
+
const n = Number(val);
|
|
49
|
+
return !isNaN(n) && n >= 0 && n <= 100 ? n : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
25
52
|
export async function handlePrefs(args: string, ctx: ExtensionCommandContext): Promise<void> {
|
|
26
53
|
const trimmed = args.trim();
|
|
27
54
|
|
|
@@ -98,12 +125,8 @@ export async function handleImportClaude(ctx: ExtensionCommandContext, scope: "g
|
|
|
98
125
|
const frontmatter = serializePreferencesToFrontmatter(prefs);
|
|
99
126
|
let body = "\n# GSD Skill Preferences\n\nSee `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation and examples.\n";
|
|
100
127
|
if (existsSync(path)) {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
if (closingIdx !== -1) {
|
|
104
|
-
const afterFrontmatter = existingContent.slice(closingIdx + 4);
|
|
105
|
-
if (afterFrontmatter.trim()) body = afterFrontmatter;
|
|
106
|
-
}
|
|
128
|
+
const preserved = extractBodyAfterFrontmatter(readFileSync(path, "utf-8"));
|
|
129
|
+
if (preserved) body = preserved;
|
|
107
130
|
}
|
|
108
131
|
await saveFile(path, `---\n${frontmatter}---${body}`);
|
|
109
132
|
};
|
|
@@ -124,14 +147,8 @@ export async function handlePrefsMode(ctx: ExtensionCommandContext, scope: "glob
|
|
|
124
147
|
|
|
125
148
|
let body = "\n# GSD Skill Preferences\n\nSee `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation and examples.\n";
|
|
126
149
|
if (existsSync(path)) {
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
if (closingIdx !== -1) {
|
|
130
|
-
const afterFrontmatter = existingContent.slice(closingIdx + 4);
|
|
131
|
-
if (afterFrontmatter.trim()) {
|
|
132
|
-
body = afterFrontmatter;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
150
|
+
const preserved = extractBodyAfterFrontmatter(readFileSync(path, "utf-8"));
|
|
151
|
+
if (preserved) body = preserved;
|
|
135
152
|
}
|
|
136
153
|
|
|
137
154
|
const content = `---\n${frontmatter}---${body}`;
|
|
@@ -243,27 +260,57 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
243
260
|
group.push(m);
|
|
244
261
|
}
|
|
245
262
|
const providers = Array.from(byProvider.keys()).sort((a, b) => a.localeCompare(b));
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
const group = byProvider.get(provider)!;
|
|
250
|
-
modelOptions.push(`─── ${provider} (${group.length}) ───`);
|
|
251
|
-
for (const m of group) {
|
|
252
|
-
modelOptions.push(`${m.id} · ${m.provider}`);
|
|
253
|
-
}
|
|
263
|
+
// Sort models within each provider
|
|
264
|
+
for (const group of byProvider.values()) {
|
|
265
|
+
group.sort((a, b) => a.id.localeCompare(b.id));
|
|
254
266
|
}
|
|
255
|
-
|
|
267
|
+
|
|
268
|
+
// Build provider menu with model counts
|
|
269
|
+
const providerOptions = providers.map(p => {
|
|
270
|
+
const count = byProvider.get(p)!.length;
|
|
271
|
+
return `${p} (${count} models)`;
|
|
272
|
+
});
|
|
273
|
+
providerOptions.push("(keep current)", "(clear)", "(type manually)");
|
|
256
274
|
|
|
257
275
|
for (const phase of modelPhases) {
|
|
258
276
|
const current = models[phase] ?? "";
|
|
259
|
-
const
|
|
260
|
-
|
|
277
|
+
const phaseLabel = `Model for ${phase} phase${current ? ` (current: ${current})` : ""}`;
|
|
278
|
+
|
|
279
|
+
// Step 1: pick provider
|
|
280
|
+
const providerChoice = await ctx.ui.select(`${phaseLabel} — choose provider:`, providerOptions);
|
|
281
|
+
if (!providerChoice || typeof providerChoice !== "string" || providerChoice === "(keep current)") continue;
|
|
282
|
+
|
|
283
|
+
if (providerChoice === "(clear)") {
|
|
284
|
+
delete models[phase];
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (providerChoice === "(type manually)") {
|
|
289
|
+
const input = await ctx.ui.input(
|
|
290
|
+
`${phaseLabel} — enter model ID:`,
|
|
291
|
+
current || "e.g. claude-sonnet-4-20250514",
|
|
292
|
+
);
|
|
293
|
+
if (input !== null && input !== undefined) {
|
|
294
|
+
const val = input.trim();
|
|
295
|
+
if (val) models[phase] = val;
|
|
296
|
+
}
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Step 2: pick model within provider
|
|
301
|
+
const providerName = providerChoice.replace(/ \(\d+ models?\)$/, "");
|
|
302
|
+
const group = byProvider.get(providerName);
|
|
303
|
+
if (!group) continue;
|
|
261
304
|
|
|
262
|
-
|
|
263
|
-
|
|
305
|
+
const modelOptions = group.map(m => m.id);
|
|
306
|
+
modelOptions.push("(keep current)", "(clear)");
|
|
307
|
+
|
|
308
|
+
const modelChoice = await ctx.ui.select(`${phaseLabel} — ${providerName}:`, modelOptions);
|
|
309
|
+
if (modelChoice && typeof modelChoice === "string" && modelChoice !== "(keep current)") {
|
|
310
|
+
if (modelChoice === "(clear)") {
|
|
264
311
|
delete models[phase];
|
|
265
312
|
} else {
|
|
266
|
-
models[phase] =
|
|
313
|
+
models[phase] = modelChoice;
|
|
267
314
|
}
|
|
268
315
|
}
|
|
269
316
|
}
|
|
@@ -306,9 +353,10 @@ async function configureTimeouts(ctx: ExtensionCommandContext, prefs: Record<str
|
|
|
306
353
|
);
|
|
307
354
|
if (input !== null && input !== undefined) {
|
|
308
355
|
const val = input.trim();
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
356
|
+
const parsed = tryParseInteger(val);
|
|
357
|
+
if (val && parsed !== null) {
|
|
358
|
+
autoSup[field.key] = parsed;
|
|
359
|
+
} else if (val) {
|
|
312
360
|
ctx.ui.notify(`Invalid value "${val}" for ${field.label} — must be a whole number. Keeping previous value.`, "warning");
|
|
313
361
|
} else if (!val && currentStr) {
|
|
314
362
|
delete autoSup[field.key];
|
|
@@ -467,9 +515,10 @@ async function configureBudget(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
467
515
|
);
|
|
468
516
|
if (ceilingInput !== null && ceilingInput !== undefined) {
|
|
469
517
|
const val = ceilingInput.trim().replace(/^\$/, "");
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
518
|
+
const parsed = tryParseNumber(val);
|
|
519
|
+
if (val && parsed !== null) {
|
|
520
|
+
prefs.budget_ceiling = parsed;
|
|
521
|
+
} else if (val) {
|
|
473
522
|
ctx.ui.notify(`Invalid budget ceiling "${val}" — must be a number. Keeping previous value.`, "warning");
|
|
474
523
|
} else if (!val && ceilingStr) {
|
|
475
524
|
delete prefs.budget_ceiling;
|
|
@@ -493,14 +542,14 @@ async function configureBudget(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
493
542
|
);
|
|
494
543
|
if (contextPauseInput !== null && contextPauseInput !== undefined) {
|
|
495
544
|
const val = contextPauseInput.trim().replace(/%$/, "");
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
if (
|
|
545
|
+
const parsed = tryParsePercentage(val);
|
|
546
|
+
if (val && parsed !== null) {
|
|
547
|
+
if (parsed === 0) {
|
|
499
548
|
delete prefs.context_pause_threshold;
|
|
500
549
|
} else {
|
|
501
|
-
prefs.context_pause_threshold =
|
|
550
|
+
prefs.context_pause_threshold = parsed;
|
|
502
551
|
}
|
|
503
|
-
} else if (val
|
|
552
|
+
} else if (val) {
|
|
504
553
|
ctx.ui.notify(`Invalid context pause threshold "${val}" — must be 0-100. Keeping previous value.`, "warning");
|
|
505
554
|
}
|
|
506
555
|
}
|
|
@@ -622,14 +671,8 @@ export async function handlePrefsWizard(
|
|
|
622
671
|
// Preserve existing body content (everything after closing ---)
|
|
623
672
|
let body = "\n# GSD Skill Preferences\n\nSee `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation and examples.\n";
|
|
624
673
|
if (existsSync(path)) {
|
|
625
|
-
const
|
|
626
|
-
|
|
627
|
-
if (closingIdx !== -1) {
|
|
628
|
-
const afterFrontmatter = existingContent.slice(closingIdx + 4); // skip past "\n---"
|
|
629
|
-
if (afterFrontmatter.trim()) {
|
|
630
|
-
body = afterFrontmatter;
|
|
631
|
-
}
|
|
632
|
-
}
|
|
674
|
+
const preserved = extractBodyAfterFrontmatter(readFileSync(path, "utf-8"));
|
|
675
|
+
if (preserved) body = preserved;
|
|
633
676
|
}
|
|
634
677
|
|
|
635
678
|
const content = `---\n${frontmatter}---${body}`;
|