@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.
Files changed (45) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.ja-JP.md +4 -3
  4. package/README.ko-KR.md +4 -3
  5. package/README.md +4 -3
  6. package/README.pt-BR.md +4 -3
  7. package/README.zh-CN.md +4 -3
  8. package/bin/install.js +33 -15
  9. package/commands/gsd/map-codebase.md +4 -4
  10. package/commands/gsd/ns-project.md +2 -1
  11. package/commands/gsd/onboard.md +46 -0
  12. package/gsd-core/bin/gsd-tools.cjs +47 -2
  13. package/gsd-core/bin/lib/capability-registry.cjs +467 -49
  14. package/gsd-core/bin/lib/capability-state.cjs +117 -18
  15. package/gsd-core/bin/lib/capability-writer.cjs +11 -1
  16. package/gsd-core/bin/lib/claude-orchestration-command-router.cjs +136 -0
  17. package/gsd-core/bin/lib/claude-orchestration.cjs +404 -0
  18. package/gsd-core/bin/lib/clusters.cjs +1 -0
  19. package/gsd-core/bin/lib/command-aliases.cjs +8 -0
  20. package/gsd-core/bin/lib/init-command-router.cjs +4 -0
  21. package/gsd-core/bin/lib/init.cjs +25 -69
  22. package/gsd-core/bin/lib/install-engine.cjs +8 -5
  23. package/gsd-core/bin/lib/install-profiles.cjs +2 -0
  24. package/gsd-core/bin/lib/loop-resolver.cjs +7 -1
  25. package/gsd-core/bin/lib/model-resolver.cjs +69 -4
  26. package/gsd-core/bin/lib/onboard-projection.cjs +309 -0
  27. package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
  28. package/gsd-core/bin/lib/surface.cjs +51 -30
  29. package/gsd-core/bin/shared/model-catalog.json +5 -0
  30. package/gsd-core/references/gsd-run-resolver.md +8 -0
  31. package/gsd-core/templates/project.md +1 -1
  32. package/gsd-core/workflows/do.md +4 -3
  33. package/gsd-core/workflows/help/modes/brief.md +2 -1
  34. package/gsd-core/workflows/help/modes/default.md +2 -1
  35. package/gsd-core/workflows/help/modes/full.md +11 -1
  36. package/gsd-core/workflows/help/modes/topic.md +1 -1
  37. package/gsd-core/workflows/onboard.md +277 -0
  38. package/gsd-core/workflows/quick.md +20 -0
  39. package/package.json +1 -1
  40. package/scripts/gen-golden-install-parity-zcode.cjs +77 -0
  41. package/scripts/run-tests.cjs +5 -3
  42. package/scripts/sync-runtime-launcher.cjs +20 -2
  43. package/skills/gsd-map-codebase/SKILL.md +3 -3
  44. package/skills/gsd-ns-project/SKILL.md +1 -0
  45. 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.3",
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.3",
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 your first project:
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 seu primeiro projeto:
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 CodeBuddy.\n';
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
- const _isSkillsRuntime = isCodex || isCopilot || isAntigravity || isCursor || isWindsurf ||
8597
- isAugment || isTrae || isCodebuddy || isQwen || isHermes ||
8598
- isKimi ||
8599
- (runtime === 'claude' && isGlobal) ||
8600
- (isCline && isGlobal);
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
- // cline is excluded: it takes a rules-only local branch and has a local/global
8982
- // complication that the descriptor-driven path does not handle correctly.
8983
- const _DESCRIPTOR_AGENTS_RUNTIMES = new Set(['cursor', 'windsurf', 'augment', 'trae', 'codebuddy']);
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 = '16';
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}) All
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
- - Before /gsd:new-project (brownfield codebases) - creates codebase map first
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
- - Onboarding to an unfamiliar codebase
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
- capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, {});
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];