@opengsd/gsd-core 1.7.0-rc.3 → 1.7.0-rc.4
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.ja-JP.md +4 -3
- package/README.ko-KR.md +4 -3
- package/README.md +4 -3
- package/README.pt-BR.md +4 -3
- package/README.zh-CN.md +4 -3
- package/bin/install.js +33 -15
- package/commands/gsd/map-codebase.md +4 -4
- package/commands/gsd/ns-project.md +2 -1
- package/commands/gsd/onboard.md +46 -0
- package/gsd-core/bin/gsd-tools.cjs +47 -2
- package/gsd-core/bin/lib/capability-registry.cjs +467 -49
- package/gsd-core/bin/lib/capability-state.cjs +117 -18
- package/gsd-core/bin/lib/capability-writer.cjs +11 -1
- package/gsd-core/bin/lib/claude-orchestration-command-router.cjs +136 -0
- package/gsd-core/bin/lib/claude-orchestration.cjs +404 -0
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/command-aliases.cjs +8 -0
- package/gsd-core/bin/lib/init-command-router.cjs +4 -0
- package/gsd-core/bin/lib/init.cjs +25 -69
- package/gsd-core/bin/lib/install-engine.cjs +8 -5
- package/gsd-core/bin/lib/install-profiles.cjs +2 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +7 -1
- package/gsd-core/bin/lib/model-resolver.cjs +69 -4
- package/gsd-core/bin/lib/onboard-projection.cjs +309 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/surface.cjs +51 -30
- package/gsd-core/bin/shared/model-catalog.json +5 -0
- package/gsd-core/references/gsd-run-resolver.md +8 -0
- package/gsd-core/templates/project.md +1 -1
- package/gsd-core/workflows/do.md +4 -3
- package/gsd-core/workflows/help/modes/brief.md +2 -1
- package/gsd-core/workflows/help/modes/default.md +2 -1
- package/gsd-core/workflows/help/modes/full.md +11 -1
- package/gsd-core/workflows/help/modes/topic.md +1 -1
- package/gsd-core/workflows/onboard.md +277 -0
- package/gsd-core/workflows/quick.md +20 -0
- package/package.json +1 -1
- package/scripts/gen-golden-install-parity-zcode.cjs +77 -0
- package/scripts/run-tests.cjs +5 -3
- package/scripts/sync-runtime-launcher.cjs +20 -2
- package/skills/gsd-map-codebase/SKILL.md +3 -3
- package/skills/gsd-ns-project/SKILL.md +1 -0
- package/skills/gsd-onboard/SKILL.md +46 -0
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
{
|
|
10
10
|
"name": "gsd-core",
|
|
11
11
|
"description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
|
|
12
|
-
"version": "1.7.0-rc.
|
|
12
|
+
"version": "1.7.0-rc.4",
|
|
13
13
|
"source": "./",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "open-gsd",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-core",
|
|
3
3
|
"displayName": "GSD Core",
|
|
4
|
-
"version": "1.7.0-rc.
|
|
4
|
+
"version": "1.7.0-rc.4",
|
|
5
5
|
"description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "open-gsd",
|
package/README.ja-JP.md
CHANGED
|
@@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest
|
|
|
47
47
|
|
|
48
48
|
別のランタイムをお使いの場合や Node.js がない場合は [ランタイムへのインストール](docs/ja-JP/how-to/install-on-your-runtime.md) を参照してください。
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
インストール後、新規プロジェクトを開始するか、既存リポジトリをオンボーディングします。
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
/gsd-new-project
|
|
53
|
+
/gsd-new-project # グリーンフィールドプロジェクト
|
|
54
|
+
/gsd-onboard # 既存コードベース
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
初めての方は [はじめてのプロジェクト](docs/ja-JP/tutorials/your-first-project.md)
|
|
57
|
+
初めての方は [はじめてのプロジェクト](docs/ja-JP/tutorials/your-first-project.md) で、インストールから最初のフェーズ出荷までのガイド付きチュートリアルをご覧ください。既存リポジトリの場合は [既存コードベースのオンボーディング](docs/ja-JP/tutorials/onboarding-an-existing-codebase.md) を参照してください。
|
|
57
58
|
|
|
58
59
|
---
|
|
59
60
|
|
package/README.ko-KR.md
CHANGED
|
@@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest
|
|
|
47
47
|
|
|
48
48
|
다른 런타임이나 Node.js가 없는 환경은 [런타임에 설치하기](docs/ko-KR/how-to/install-on-your-runtime.md)를 참조하세요.
|
|
49
49
|
|
|
50
|
-
설치 후
|
|
50
|
+
설치 후 새 프로젝트를 시작하거나 기존 저장소를 온보딩합니다:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
/gsd-new-project
|
|
53
|
+
/gsd-new-project # 그린필드 프로젝트
|
|
54
|
+
/gsd-onboard # 기존 코드베이스
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
처음 사용하시나요? [첫 번째 프로젝트](docs/ko-KR/tutorials/your-first-project.md)를 따라 설치부터 첫 단계 출시까지 안내받으세요.
|
|
57
|
+
처음 사용하시나요? [첫 번째 프로젝트](docs/ko-KR/tutorials/your-first-project.md)를 따라 설치부터 첫 단계 출시까지 안내받으세요. 기존 저장소라면 [기존 코드베이스 온보딩](docs/ko-KR/tutorials/onboarding-an-existing-codebase.md)을 참고하세요.
|
|
57
58
|
|
|
58
59
|
---
|
|
59
60
|
|
package/README.md
CHANGED
|
@@ -47,13 +47,14 @@ The installer prompts for your runtime (Claude Code, OpenCode, Antigravity CLI,
|
|
|
47
47
|
|
|
48
48
|
On another runtime or without Node.js? See [Install on your runtime](docs/how-to/install-on-your-runtime.md).
|
|
49
49
|
|
|
50
|
-
Once installed, start
|
|
50
|
+
Once installed, start a new project or onboard an existing repo:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
/gsd-new-project
|
|
53
|
+
/gsd-new-project # greenfield project
|
|
54
|
+
/gsd-onboard # existing codebase
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
New here? Follow [Your first project](docs/tutorials/your-first-project.md) for a guided walkthrough from install to first shipped phase.
|
|
57
|
+
New here? Follow [Your first project](docs/tutorials/your-first-project.md) for a guided walkthrough from install to first shipped phase, or [Onboarding an existing codebase](docs/tutorials/onboarding-an-existing-codebase.md) for brownfield setup.
|
|
57
58
|
|
|
58
59
|
---
|
|
59
60
|
|
package/README.pt-BR.md
CHANGED
|
@@ -47,13 +47,14 @@ O instalador solicita seu ambiente de execução (Claude Code, OpenCode, Gemini
|
|
|
47
47
|
|
|
48
48
|
Em outro runtime ou sem Node.js? Consulte [Instalar no seu runtime](docs/pt-BR/how-to/install-on-your-runtime.md).
|
|
49
49
|
|
|
50
|
-
Após a instalação, inicie
|
|
50
|
+
Após a instalação, inicie um projeto novo ou integre um repositório existente:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
/gsd-new-project
|
|
53
|
+
/gsd-new-project # projeto greenfield
|
|
54
|
+
/gsd-onboard # base de código existente
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
É a primeira vez? Siga [Seu primeiro projeto](docs/pt-BR/tutorials/your-first-project.md) para um passo a passo guiado, desde a instalação até a primeira fase entregue.
|
|
57
|
+
É a primeira vez? Siga [Seu primeiro projeto](docs/pt-BR/tutorials/your-first-project.md) para um passo a passo guiado, desde a instalação até a primeira fase entregue. Para um repositório existente, consulte [Integrar uma base de código existente](docs/pt-BR/tutorials/onboarding-an-existing-codebase.md).
|
|
57
58
|
|
|
58
59
|
---
|
|
59
60
|
|
package/README.zh-CN.md
CHANGED
|
@@ -47,13 +47,14 @@ npx @opengsd/gsd-core@latest
|
|
|
47
47
|
|
|
48
48
|
使用其他运行时或没有 Node.js?请参阅[在你的运行时上安装](docs/zh-CN/how-to/install-on-your-runtime.md)。
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
安装完成后,启动一个新项目或接入现有仓库:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
/gsd-new-project
|
|
53
|
+
/gsd-new-project # 新建项目
|
|
54
|
+
/gsd-onboard # 现有代码库
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
初次使用?请按照[你的第一个项目](docs/zh-CN/tutorials/your-first-project.md)
|
|
57
|
+
初次使用?请按照[你的第一个项目](docs/zh-CN/tutorials/your-first-project.md)进行引导式操作,从安装到完成第一个交付阶段。对于现有仓库,请参阅[接入现有代码库](docs/zh-CN/tutorials/onboarding-an-existing-codebase.md)。
|
|
57
58
|
|
|
58
59
|
---
|
|
59
60
|
|
package/bin/install.js
CHANGED
|
@@ -434,7 +434,7 @@ if (hasMinimal && _profileArgRaw) {
|
|
|
434
434
|
|
|
435
435
|
function selectRuntimesFromArgs(runtimeArgs) {
|
|
436
436
|
if (runtimeArgs.includes('--all')) {
|
|
437
|
-
return ['claude', 'kimi', 'kilo', 'opencode', 'codex', 'copilot', 'antigravity', 'cursor', 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline'];
|
|
437
|
+
return ['claude', 'kimi', 'kilo', 'opencode', 'codex', 'copilot', 'antigravity', 'cursor', 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'zcode'];
|
|
438
438
|
}
|
|
439
439
|
if (runtimeArgs.includes('--both')) {
|
|
440
440
|
return ['claude', 'opencode'];
|
|
@@ -456,6 +456,7 @@ function selectRuntimesFromArgs(runtimeArgs) {
|
|
|
456
456
|
if (runtimeArgs.includes('--kimi')) selected.push('kimi');
|
|
457
457
|
if (runtimeArgs.includes('--codebuddy')) selected.push('codebuddy');
|
|
458
458
|
if (runtimeArgs.includes('--cline')) selected.push('cline');
|
|
459
|
+
if (runtimeArgs.includes('--zcode')) selected.push('zcode');
|
|
459
460
|
return selected;
|
|
460
461
|
}
|
|
461
462
|
|
|
@@ -579,7 +580,7 @@ const banner = '\n' +
|
|
|
579
580
|
' GSD Core ' + dim + 'v' + pkg.version + reset + '\n' +
|
|
580
581
|
' Git. Ship. Done.\n' +
|
|
581
582
|
' A meta-prompting, context engineering and spec-driven\n' +
|
|
582
|
-
' development workflows for Claude Code, OpenCode, Kimi CLI, Kilo, Codex, Copilot, Antigravity, Cursor, Windsurf, Augment, Trae, Qwen Code, Hermes Agent, Cline and
|
|
583
|
+
' development workflows for Claude Code, OpenCode, Kimi CLI, Kilo, Codex, Copilot, Antigravity, Cursor, Windsurf, Augment, Trae, Qwen Code, Hermes Agent, Cline, CodeBuddy and ZCode.\n';
|
|
583
584
|
|
|
584
585
|
// Pure seam: parse --config-dir / -c from an arbitrary args array.
|
|
585
586
|
// Returns the path string, '' for an empty equals-form value, or null when the
|
|
@@ -636,7 +637,7 @@ if (hasUninstall) {
|
|
|
636
637
|
|
|
637
638
|
// Show help if requested
|
|
638
639
|
if (hasHelp) {
|
|
639
|
-
console.log(` ${yellow}Usage:${reset} npx ${pkg.name} [options]\n\n ${yellow}Options:${reset}\n ${cyan}-g, --global${reset} Install globally (to config directory)\n ${cyan}-l, --local${reset} Install locally (to current directory)\n ${cyan}--claude${reset} Install for Claude Code only\n ${cyan}--opencode${reset} Install for OpenCode only\n ${cyan}--kilo${reset} Install for Kilo only\n ${cyan}--codex${reset} Install for Codex only\n ${cyan}--kimi${reset} Install for Kimi CLI only\n ${cyan}--copilot${reset} Install for Copilot only\n ${cyan}--antigravity${reset} Install for Antigravity only\n ${cyan}--cursor${reset} Install for Cursor only\n ${cyan}--windsurf${reset} Install for Windsurf only\n ${cyan}--augment${reset} Install for Augment only\n ${cyan}--trae${reset} Install for Trae only\n ${cyan}--qwen${reset} Install for Qwen Code only\n ${cyan}--hermes${reset} Install for Hermes Agent only\n ${cyan}--cline${reset} Install for Cline only\n ${cyan}--codebuddy${reset} Install for CodeBuddy only\n ${cyan}--all${reset} Install for all runtimes\n ${cyan}-u, --uninstall${reset} Uninstall GSD (remove all GSD files)\n ${cyan}-c, --config-dir <path>${reset} Specify custom config directory\n ${cyan}-h, --help${reset} Show this help message\n ${cyan}--force-statusline${reset} Replace existing statusline config\n ${cyan}--portable-hooks${reset} Emit \$HOME-relative hook paths in settings.json\n (for WSL/Docker bind-mount setups; also GSD_PORTABLE_HOOKS=1)\n ${cyan}--profile=<name>${reset} Install a named skill profile. Profiles:\n core — ${PROFILES.core.length} main-loop skills incl. phase (~130 desc tokens)\n standard — ${PROFILES.standard.length} skills incl. phase, review, config (~700)\n full — all skills (default)\n Composable: --profile=core,audit installs union of closures.\n Profile is persisted and respected by \`gsd update\`.\n ${cyan}--minimal${reset} Alias for --profile=core (back-compat).\n Cuts cold-start overhead from ~12k tokens to ~700.\n Alias: --core-only.\n\n ${yellow}Examples:${reset}\n ${dim}# Interactive install (prompts for runtime and location)${reset}\n npx ${pkg.name}\n\n ${dim}# Install for Claude Code globally${reset}\n npx ${pkg.name} --claude --global\n\n ${dim}# Install for Kilo globally${reset}\n npx ${pkg.name} --kilo --global\n\n ${dim}# Install for Codex globally${reset}\n npx ${pkg.name} --codex --global\n\n ${dim}# Install for Kimi CLI globally${reset}\n npx ${pkg.name} --kimi --global\n\n ${dim}# Install for Kimi CLI under ~/.kimi-code${reset}\n npx ${pkg.name} --kimi --global --config-dir ~/.kimi-code\n\n ${dim}# Install for Copilot globally${reset}\n npx ${pkg.name} --copilot --global\n\n ${dim}# Install for Copilot locally${reset}\n npx ${pkg.name} --copilot --local\n\n ${dim}# Install for Antigravity globally${reset}\n npx ${pkg.name} --antigravity --global\n\n ${dim}# Install for Antigravity locally${reset}\n npx ${pkg.name} --antigravity --local\n\n ${dim}# Install for Cursor globally${reset}\n npx ${pkg.name} --cursor --global\n\n ${dim}# Install for Cursor locally${reset}\n npx ${pkg.name} --cursor --local\n\n ${dim}# Install for Windsurf globally${reset}\n npx ${pkg.name} --windsurf --global\n\n ${dim}# Install for Windsurf locally${reset}\n npx ${pkg.name} --windsurf --local\n\n ${dim}# Install for Augment globally${reset}\n npx ${pkg.name} --augment --global\n\n ${dim}# Install for Augment locally${reset}\n npx ${pkg.name} --augment --local\n\n ${dim}# Install for Trae globally${reset}\n npx ${pkg.name} --trae --global\n\n ${dim}# Install for Trae locally${reset}\n npx ${pkg.name} --trae --local\n\n ${dim}# Install for Hermes Agent globally${reset}\n npx ${pkg.name} --hermes --global\n\n ${dim}# Install for Hermes Agent locally${reset}\n npx ${pkg.name} --hermes --local\n\n ${dim}# Install for Cline globally${reset}\n npx ${pkg.name} --cline --global\n\n ${dim}# Install for Cline locally${reset}\n npx ${pkg.name} --cline --local\n\n ${dim}# Install for CodeBuddy globally${reset}\n npx ${pkg.name} --codebuddy --global\n\n ${dim}# Install for CodeBuddy locally${reset}\n npx ${pkg.name} --codebuddy --local\n\n ${dim}# Install for all runtimes globally${reset}\n npx ${pkg.name} --all --global\n\n ${dim}# Install to custom config directory${reset}\n npx ${pkg.name} --kilo --global --config-dir ~/.kilo-work\n\n ${dim}# Install to current project only${reset}\n npx ${pkg.name} --claude --local\n\n ${dim}# Uninstall GSD from Cursor globally${reset}\n npx ${pkg.name} --cursor --global --uninstall\n\n ${yellow}Notes:${reset}\n The --config-dir option is useful when you have multiple configurations.\n It takes priority over CLAUDE_CONFIG_DIR / OPENCODE_CONFIG_DIR / KILO_CONFIG_DIR / CODEX_HOME / KIMI_CONFIG_DIR / COPILOT_CONFIG_DIR / COPILOT_HOME / ANTIGRAVITY_CONFIG_DIR / CURSOR_CONFIG_DIR / WINDSURF_CONFIG_DIR / AUGMENT_CONFIG_DIR / TRAE_CONFIG_DIR / QWEN_CONFIG_DIR / HERMES_HOME / CLINE_CONFIG_DIR / CODEBUDDY_CONFIG_DIR environment variables.\n Kimi CLI defaults to the first existing generic skills root: ${cyan}~/.config/agents/skills${reset}, then ${cyan}~/.agents/skills${reset}; if neither exists, GSD creates ${cyan}~/.config/agents${reset}.\n Use ${cyan}--config-dir ~/.kimi-code${reset} or ${cyan}KIMI_CONFIG_DIR=~/.kimi-code${reset} for brand-specific Kimi installs.\n`);
|
|
640
|
+
console.log(` ${yellow}Usage:${reset} npx ${pkg.name} [options]\n\n ${yellow}Options:${reset}\n ${cyan}-g, --global${reset} Install globally (to config directory)\n ${cyan}-l, --local${reset} Install locally (to current directory)\n ${cyan}--claude${reset} Install for Claude Code only\n ${cyan}--opencode${reset} Install for OpenCode only\n ${cyan}--kilo${reset} Install for Kilo only\n ${cyan}--codex${reset} Install for Codex only\n ${cyan}--kimi${reset} Install for Kimi CLI only\n ${cyan}--copilot${reset} Install for Copilot only\n ${cyan}--antigravity${reset} Install for Antigravity only\n ${cyan}--cursor${reset} Install for Cursor only\n ${cyan}--windsurf${reset} Install for Windsurf only\n ${cyan}--augment${reset} Install for Augment only\n ${cyan}--trae${reset} Install for Trae only\n ${cyan}--qwen${reset} Install for Qwen Code only\n ${cyan}--hermes${reset} Install for Hermes Agent only\n ${cyan}--cline${reset} Install for Cline only\n ${cyan}--codebuddy${reset} Install for CodeBuddy only\n ${cyan}--zcode${reset} Install for ZCode only\n ${cyan}--all${reset} Install for all runtimes\n ${cyan}-u, --uninstall${reset} Uninstall GSD (remove all GSD files)\n ${cyan}-c, --config-dir <path>${reset} Specify custom config directory\n ${cyan}-h, --help${reset} Show this help message\n ${cyan}--force-statusline${reset} Replace existing statusline config\n ${cyan}--portable-hooks${reset} Emit \$HOME-relative hook paths in settings.json\n (for WSL/Docker bind-mount setups; also GSD_PORTABLE_HOOKS=1)\n ${cyan}--profile=<name>${reset} Install a named skill profile. Profiles:\n core — ${PROFILES.core.length} main-loop skills incl. phase (~130 desc tokens)\n standard — ${PROFILES.standard.length} skills incl. phase, review, config (~700)\n full — all skills (default)\n Composable: --profile=core,audit installs union of closures.\n Profile is persisted and respected by \`gsd update\`.\n ${cyan}--minimal${reset} Alias for --profile=core (back-compat).\n Cuts cold-start overhead from ~12k tokens to ~700.\n Alias: --core-only.\n\n ${yellow}Examples:${reset}\n ${dim}# Interactive install (prompts for runtime and location)${reset}\n npx ${pkg.name}\n\n ${dim}# Install for Claude Code globally${reset}\n npx ${pkg.name} --claude --global\n\n ${dim}# Install for Kilo globally${reset}\n npx ${pkg.name} --kilo --global\n\n ${dim}# Install for Codex globally${reset}\n npx ${pkg.name} --codex --global\n\n ${dim}# Install for Kimi CLI globally${reset}\n npx ${pkg.name} --kimi --global\n\n ${dim}# Install for Kimi CLI under ~/.kimi-code${reset}\n npx ${pkg.name} --kimi --global --config-dir ~/.kimi-code\n\n ${dim}# Install for Copilot globally${reset}\n npx ${pkg.name} --copilot --global\n\n ${dim}# Install for Copilot locally${reset}\n npx ${pkg.name} --copilot --local\n\n ${dim}# Install for Antigravity globally${reset}\n npx ${pkg.name} --antigravity --global\n\n ${dim}# Install for Antigravity locally${reset}\n npx ${pkg.name} --antigravity --local\n\n ${dim}# Install for Cursor globally${reset}\n npx ${pkg.name} --cursor --global\n\n ${dim}# Install for Cursor locally${reset}\n npx ${pkg.name} --cursor --local\n\n ${dim}# Install for Windsurf globally${reset}\n npx ${pkg.name} --windsurf --global\n\n ${dim}# Install for Windsurf locally${reset}\n npx ${pkg.name} --windsurf --local\n\n ${dim}# Install for Augment globally${reset}\n npx ${pkg.name} --augment --global\n\n ${dim}# Install for Augment locally${reset}\n npx ${pkg.name} --augment --local\n\n ${dim}# Install for Trae globally${reset}\n npx ${pkg.name} --trae --global\n\n ${dim}# Install for Trae locally${reset}\n npx ${pkg.name} --trae --local\n\n ${dim}# Install for Hermes Agent globally${reset}\n npx ${pkg.name} --hermes --global\n\n ${dim}# Install for Hermes Agent locally${reset}\n npx ${pkg.name} --hermes --local\n\n ${dim}# Install for Cline globally${reset}\n npx ${pkg.name} --cline --global\n\n ${dim}# Install for Cline locally${reset}\n npx ${pkg.name} --cline --local\n\n ${dim}# Install for CodeBuddy globally${reset}\n npx ${pkg.name} --codebuddy --global\n\n ${dim}# Install for CodeBuddy locally${reset}\n npx ${pkg.name} --codebuddy --local\n\n ${dim}# Install for all runtimes globally${reset}\n npx ${pkg.name} --all --global\n\n ${dim}# Install to custom config directory${reset}\n npx ${pkg.name} --kilo --global --config-dir ~/.kilo-work\n\n ${dim}# Install to current project only${reset}\n npx ${pkg.name} --claude --local\n\n ${dim}# Uninstall GSD from Cursor globally${reset}\n npx ${pkg.name} --cursor --global --uninstall\n\n ${yellow}Notes:${reset}\n The --config-dir option is useful when you have multiple configurations.\n It takes priority over CLAUDE_CONFIG_DIR / OPENCODE_CONFIG_DIR / KILO_CONFIG_DIR / CODEX_HOME / KIMI_CONFIG_DIR / COPILOT_CONFIG_DIR / COPILOT_HOME / ANTIGRAVITY_CONFIG_DIR / CURSOR_CONFIG_DIR / WINDSURF_CONFIG_DIR / AUGMENT_CONFIG_DIR / TRAE_CONFIG_DIR / QWEN_CONFIG_DIR / HERMES_HOME / CLINE_CONFIG_DIR / CODEBUDDY_CONFIG_DIR environment variables.\n Kimi CLI defaults to the first existing generic skills root: ${cyan}~/.config/agents/skills${reset}, then ${cyan}~/.agents/skills${reset}; if neither exists, GSD creates ${cyan}~/.config/agents${reset}.\n Use ${cyan}--config-dir ~/.kimi-code${reset} or ${cyan}KIMI_CONFIG_DIR=~/.kimi-code${reset} for brand-specific Kimi installs.\n`);
|
|
640
641
|
process.exit(0);
|
|
641
642
|
}
|
|
642
643
|
|
|
@@ -8593,11 +8594,24 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8593
8594
|
// applyRuntimeContentRewritesInPlace (called inside installRuntimeArtifacts)
|
|
8594
8595
|
// handles per-runtime path + branding rewrites, including Qwen/Hermes.
|
|
8595
8596
|
// Cline global: emit skills to ~/.cline/skills/ (Cline >= v3.48.0 — #782).
|
|
8596
|
-
|
|
8597
|
-
|
|
8598
|
-
|
|
8599
|
-
|
|
8600
|
-
|
|
8597
|
+
// Descriptor-driven (ADR-1016 / ADR-1239): a runtime takes the layout-driven
|
|
8598
|
+
// installRuntimeArtifacts path when its scoped artifactLayout is non-empty
|
|
8599
|
+
// (it declares any skills/commands/agents/kimi-agents kind for this scope).
|
|
8600
|
+
// This replaces the prior hardcoded `isCodex || isCopilot || ...` roster so a
|
|
8601
|
+
// newly-added runtime with an artifact layout installs without a per-runtime
|
|
8602
|
+
// branch — the add-a-host tax ADR-1239 Phase B retires. Three legacy
|
|
8603
|
+
// special-cased paths are preserved: opencode/kilo (combined commands+skills
|
|
8604
|
+
// via copyFlattenedCommands + installOpencodeFamilySkills) and claude-local
|
|
8605
|
+
// (copyWithPathReplacement + stale-skills cleanup).
|
|
8606
|
+
const _isSkillsRuntime = (() => {
|
|
8607
|
+
if (isOpencode || isKilo) return false; // specialized combined path
|
|
8608
|
+
if (runtime === 'claude' && !isGlobal) return false; // claude-local legacy path
|
|
8609
|
+
const cap = _capabilityRegistry && _capabilityRegistry.runtimes && _capabilityRegistry.runtimes[runtime];
|
|
8610
|
+
const layout = cap && cap.runtime && cap.runtime.artifactLayout;
|
|
8611
|
+
if (!layout) return false;
|
|
8612
|
+
const scopeLayout = isGlobal ? layout.global : layout.local;
|
|
8613
|
+
return Array.isArray(scopeLayout) && scopeLayout.length > 0;
|
|
8614
|
+
})();
|
|
8601
8615
|
|
|
8602
8616
|
if (_isSkillsRuntime) {
|
|
8603
8617
|
// Layout-driven install for skills-based runtimes (full and minimal modes)
|
|
@@ -8978,9 +8992,11 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8978
8992
|
// (by installRuntimeArtifacts at line 8912), which also performs its own
|
|
8979
8993
|
// stale-file prune pass. The inline stale-removal + inline loop both skip them.
|
|
8980
8994
|
// Trivial group (cursor/windsurf/augment/trae/codebuddy) cut over together.
|
|
8981
|
-
//
|
|
8982
|
-
//
|
|
8983
|
-
|
|
8995
|
+
// #1575: copilot and antigravity cut over — copilot gets .agent.md filename
|
|
8996
|
+
// rename via _copyStaged(runtime); antigravity uses scope-aware converter.
|
|
8997
|
+
// cline remains excluded: rules-only local branch + local/global complication
|
|
8998
|
+
// that the descriptor-driven path does not handle correctly.
|
|
8999
|
+
const _DESCRIPTOR_AGENTS_RUNTIMES = new Set(['cursor', 'windsurf', 'augment', 'trae', 'codebuddy', 'copilot', 'antigravity']);
|
|
8984
9000
|
|
|
8985
9001
|
// Always remove stale gsd-* agents first so re-installing with
|
|
8986
9002
|
// `--minimal` actually shrinks a previously-full install.
|
|
@@ -10401,10 +10417,11 @@ const runtimeMap = {
|
|
|
10401
10417
|
'12': 'opencode',
|
|
10402
10418
|
'13': 'qwen',
|
|
10403
10419
|
'14': 'trae',
|
|
10404
|
-
'15': 'windsurf'
|
|
10420
|
+
'15': 'windsurf',
|
|
10421
|
+
'16': 'zcode'
|
|
10405
10422
|
};
|
|
10406
|
-
const allRuntimes = ['claude', 'antigravity', 'augment', 'cline', 'codebuddy', 'codex', 'copilot', 'cursor', 'hermes', 'kimi', 'kilo', 'opencode', 'qwen', 'trae', 'windsurf'];
|
|
10407
|
-
const ALL_RUNTIMES_OPTION = '
|
|
10423
|
+
const allRuntimes = ['claude', 'antigravity', 'augment', 'cline', 'codebuddy', 'codex', 'copilot', 'cursor', 'hermes', 'kimi', 'kilo', 'opencode', 'qwen', 'trae', 'windsurf', 'zcode'];
|
|
10424
|
+
const ALL_RUNTIMES_OPTION = '17';
|
|
10408
10425
|
|
|
10409
10426
|
/**
|
|
10410
10427
|
* Build the runtime-selection prompt text shown by the interactive installer.
|
|
@@ -10427,7 +10444,8 @@ function buildRuntimePromptText() {
|
|
|
10427
10444
|
${cyan}13${reset}) Qwen Code ${dim}(~/.qwen)${reset}
|
|
10428
10445
|
${cyan}14${reset}) Trae ${dim}(~/.trae)${reset}
|
|
10429
10446
|
${cyan}15${reset}) Windsurf ${dim}(~/.codeium/windsurf)${reset}
|
|
10430
|
-
${cyan}16${reset})
|
|
10447
|
+
${cyan}16${reset}) ZCode ${dim}(~/.zcode)${reset}
|
|
10448
|
+
${cyan}17${reset}) All
|
|
10431
10449
|
|
|
10432
10450
|
${dim}Select multiple: 1,2,6 or 1 2 6${reset}
|
|
10433
10451
|
`;
|
|
@@ -9,7 +9,7 @@ allowed-tools:
|
|
|
9
9
|
- Grep
|
|
10
10
|
- Write
|
|
11
11
|
- Agent
|
|
12
|
-
requires: [config, new-project, plan-phase]
|
|
12
|
+
requires: [config, new-project, plan-phase, onboard]
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
<objective>
|
|
@@ -42,7 +42,7 @@ Parse the first token of $ARGUMENTS:
|
|
|
42
42
|
Check for .planning/STATE.md - loads context if project already initialized
|
|
43
43
|
|
|
44
44
|
**This command can run:**
|
|
45
|
-
-
|
|
45
|
+
- Via /gsd:onboard for first-time brownfield setup - creates codebase map first
|
|
46
46
|
- After /gsd:new-project (greenfield codebases) - updates codebase map as code evolves
|
|
47
47
|
- Anytime to refresh codebase understanding
|
|
48
48
|
</context>
|
|
@@ -51,7 +51,7 @@ Check for .planning/STATE.md - loads context if project already initialized
|
|
|
51
51
|
**Use map-codebase for:**
|
|
52
52
|
- Brownfield projects before initialization (understand existing code first)
|
|
53
53
|
- Refreshing codebase map after significant changes
|
|
54
|
-
-
|
|
54
|
+
- Refreshing or deepening an onboarded codebase map
|
|
55
55
|
- Before major refactoring (understand current state)
|
|
56
56
|
- When STATE.md references outdated codebase info
|
|
57
57
|
|
|
@@ -71,7 +71,7 @@ Check for .planning/STATE.md - loads context if project already initialized
|
|
|
71
71
|
4. Wait for agents to complete, collect confirmations (NOT document contents)
|
|
72
72
|
5. Verify all 7 documents exist with line counts
|
|
73
73
|
6. Commit codebase map
|
|
74
|
-
7. Offer next steps (typically: /gsd:new-project or /gsd:plan-phase)
|
|
74
|
+
7. Offer next steps (typically: /gsd:onboard, /gsd:new-project, or /gsd:plan-phase)
|
|
75
75
|
</process>
|
|
76
76
|
|
|
77
77
|
<success_criteria>
|
|
@@ -5,7 +5,7 @@ argument-hint: ""
|
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Read
|
|
7
7
|
- Skill
|
|
8
|
-
requires: [new-project, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog]
|
|
8
|
+
requires: [new-project, onboard, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Route to the appropriate project / milestone skill based on the user's intent.
|
|
@@ -15,6 +15,7 @@ inline as part of `gsd-audit-milestone`'s output.
|
|
|
15
15
|
| User wants | Invoke |
|
|
16
16
|
|---|---|
|
|
17
17
|
| Start a new project | gsd-new-project |
|
|
18
|
+
| Onboard an existing codebase | gsd-onboard |
|
|
18
19
|
| Create a new milestone | gsd-new-milestone |
|
|
19
20
|
| Complete the current milestone | gsd-complete-milestone |
|
|
20
21
|
| Audit a milestone for issues | gsd-audit-milestone |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd:onboard
|
|
3
|
+
description: Guide existing codebase onboarding through mapping, doc ingest, and planning setup
|
|
4
|
+
argument-hint: "[--fast] [--text]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Bash
|
|
8
|
+
- Write
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
- Agent
|
|
12
|
+
- AskUserQuestion
|
|
13
|
+
requires: [config, new-project, map-codebase, ingest-docs, manager]
|
|
14
|
+
---
|
|
15
|
+
<runtime_note>
|
|
16
|
+
**Copilot (VS Code):** Use `vscode_askquestions` wherever this workflow calls `AskUserQuestion`. They are equivalent — `vscode_askquestions` is the VS Code Copilot implementation of the same interactive question API.
|
|
17
|
+
</runtime_note>
|
|
18
|
+
|
|
19
|
+
<objective>
|
|
20
|
+
Guide brownfield onboarding for an existing codebase by routing through the existing GSD primitives in the safe order: codebase map → docs ingest → project initialization → onboarding summary.
|
|
21
|
+
|
|
22
|
+
**Creates or confirms:**
|
|
23
|
+
- `.planning/codebase/` — evidence-backed codebase map from `/gsd:map-codebase`
|
|
24
|
+
- `.planning/PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md` — project setup from `/gsd:new-project` or `/gsd:ingest-docs`
|
|
25
|
+
- `.planning/onboarding/SUMMARY.md` — lightweight index of what was learned and the next command
|
|
26
|
+
|
|
27
|
+
**Non-goals:** This command does not execute phases, ship work, or overwrite existing planning artifacts without an explicit gate.
|
|
28
|
+
</objective>
|
|
29
|
+
|
|
30
|
+
<execution_context>
|
|
31
|
+
@~/.claude/gsd-core/workflows/onboard.md
|
|
32
|
+
@~/.claude/gsd-core/references/ui-brand.md
|
|
33
|
+
@~/.claude/gsd-core/references/gate-prompts.md
|
|
34
|
+
</execution_context>
|
|
35
|
+
|
|
36
|
+
<context>
|
|
37
|
+
Arguments: $ARGUMENTS
|
|
38
|
+
|
|
39
|
+
Flags:
|
|
40
|
+
- `--fast` — prefer `/gsd:map-codebase --fast` for the mapping handoff; the complete map is still required before `/gsd:new-project`.
|
|
41
|
+
- `--text` — use plain-text numbered lists instead of TUI menus.
|
|
42
|
+
</context>
|
|
43
|
+
|
|
44
|
+
<process>
|
|
45
|
+
Execute the onboard workflow end-to-end. Preserve all safety gates, text-mode fallbacks, idempotency checks, and top-level handoff rules for nested interactive commands.
|
|
46
|
+
</process>
|
|
@@ -179,14 +179,23 @@
|
|
|
179
179
|
*
|
|
180
180
|
* Loop Extension Point Queries (ADR-857 phase 3c):
|
|
181
181
|
* loop render-hooks <point> Resolve + render active Capability hooks at a loop point
|
|
182
|
+
* [--config-dir <path>] [--runtime <r>] [--active-cap <capId>]
|
|
182
183
|
* Returns JSON envelope { point, activeHooks, rendered }
|
|
183
184
|
* Valid points: discuss:pre/post, plan:pre/post,
|
|
184
185
|
* execute:pre/wave:pre/wave:post/post, verify:pre/post, ship:pre/post
|
|
186
|
+
* --runtime: override the auto-detected runtime (#2003) so the config
|
|
187
|
+
* dir resolves to that runtime's home even when
|
|
188
|
+
* .planning/config.json persists a different runtime.
|
|
185
189
|
*
|
|
186
190
|
* Capability State (ADR-857 phase 4b):
|
|
187
|
-
* capability state [--config-dir <path>] Resolve per-capability install/surface/hook-activation state
|
|
191
|
+
* capability state [--config-dir <path>] [--runtime <r>] Resolve per-capability install/surface/hook-activation state
|
|
188
192
|
* Returns JSON envelope { runtimeConfigDir, capabilities[] }
|
|
189
193
|
* --config-dir: runtime config dir (default: auto-detect current runtime)
|
|
194
|
+
* --runtime: override the auto-detected runtime (#2003); bypasses the
|
|
195
|
+
* GSD_RUNTIME → config.runtime → 'claude' precedence so a
|
|
196
|
+
* repo with a persisted runtime can still resolve another
|
|
197
|
+
* runtime's config dir (e.g. driving Claude Code from a
|
|
198
|
+
* repo that persists runtime:"codex").
|
|
190
199
|
*
|
|
191
200
|
* GSD-2 Migration:
|
|
192
201
|
* from-gsd2 [--path <dir>] [--force] [--dry-run]
|
|
@@ -1598,9 +1607,28 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand
|
|
|
1598
1607
|
}
|
|
1599
1608
|
loopActiveCap = value;
|
|
1600
1609
|
}
|
|
1610
|
+
// --runtime <r> (#2003): explicit runtime override so the config-dir
|
|
1611
|
+
// resolution bypasses the persisted-runtime fallback (GSD_RUNTIME →
|
|
1612
|
+
// config.runtime). Mirrors the --config-dir dual-form (--runtime X /
|
|
1613
|
+
// --runtime=X) and the capability-set --runtime precedent.
|
|
1614
|
+
let loopRuntime = undefined;
|
|
1615
|
+
const runtimeEqArg = args.find(arg => arg.startsWith('--runtime='));
|
|
1616
|
+
const runtimeIdx = args.indexOf('--runtime');
|
|
1617
|
+
if (runtimeEqArg) {
|
|
1618
|
+
const value = runtimeEqArg.slice('--runtime='.length).trim();
|
|
1619
|
+
if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
|
1620
|
+
loopRuntime = value;
|
|
1621
|
+
} else if (runtimeIdx !== -1) {
|
|
1622
|
+
const value = args[runtimeIdx + 1];
|
|
1623
|
+
if (!value || value.startsWith('--')) {
|
|
1624
|
+
error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
|
1625
|
+
}
|
|
1626
|
+
loopRuntime = value;
|
|
1627
|
+
}
|
|
1601
1628
|
loopResolver.cmdLoopRenderHooks(cwd, args[2], raw, {
|
|
1602
1629
|
configDir: loopConfigDir ? path.resolve(loopConfigDir) : undefined,
|
|
1603
1630
|
activeCap: loopActiveCap,
|
|
1631
|
+
runtime: loopRuntime,
|
|
1604
1632
|
});
|
|
1605
1633
|
} else {
|
|
1606
1634
|
error(
|
|
@@ -1752,7 +1780,24 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand
|
|
|
1752
1780
|
configDir = configDirVal;
|
|
1753
1781
|
}
|
|
1754
1782
|
const resolvedConfigDir = configDir ? path.resolve(configDir) : null;
|
|
1755
|
-
|
|
1783
|
+
// --runtime <r> (#2003): explicit runtime override so the config-dir
|
|
1784
|
+
// resolution bypasses the persisted-runtime fallback. Dual-form like
|
|
1785
|
+
// --config-dir (--runtime X / --runtime=X).
|
|
1786
|
+
let stateRuntime = undefined;
|
|
1787
|
+
const stateRuntimeEqArg = args.find(arg => arg.startsWith('--runtime='));
|
|
1788
|
+
const stateRuntimeIdx = args.indexOf('--runtime');
|
|
1789
|
+
if (stateRuntimeEqArg) {
|
|
1790
|
+
const value = stateRuntimeEqArg.slice('--runtime='.length).trim();
|
|
1791
|
+
if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
|
1792
|
+
stateRuntime = value;
|
|
1793
|
+
} else if (stateRuntimeIdx !== -1) {
|
|
1794
|
+
const value = args[stateRuntimeIdx + 1];
|
|
1795
|
+
if (!value || value.startsWith('--')) {
|
|
1796
|
+
error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
|
1797
|
+
}
|
|
1798
|
+
stateRuntime = value;
|
|
1799
|
+
}
|
|
1800
|
+
capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, { runtime: stateRuntime });
|
|
1756
1801
|
} else if (capSubcommand === 'set') {
|
|
1757
1802
|
// capability set <id> [--on|--off|--enable|--disable] [--gate <key>=<bool>]... [--config-dir <dir>] [--runtime <r>] [--scope <s>]
|
|
1758
1803
|
const capId = args[2];
|