diff --git a/setup b/setup index 275236cd3..3d1eec386 100755 --- a/setup +++ b/setup @@ -748,8 +748,9 @@ create_agents_sidecar() { local agents_gstack="$repo_root/.agents/skills/gstack" mkdir -p "$agents_gstack" - # Sidecar directories that skills reference at runtime - for asset in bin browse review qa; do + # Sidecar directories that skills reference at runtime. bin scripts import + # shared modules via ../lib, so bin and lib must always travel together. + for asset in bin lib browse review qa; do local src="$SOURCE_GSTACK_DIR/$asset" local dst="$agents_gstack/$asset" if [ -d "$src" ] || [ -f "$src" ]; then @@ -796,6 +797,9 @@ create_codex_runtime_root() { if [ -d "$gstack_dir/bin" ]; then _link_or_copy "$gstack_dir/bin" "$codex_gstack/bin" fi + if [ -d "$gstack_dir/lib" ]; then + _link_or_copy "$gstack_dir/lib" "$codex_gstack/lib" + fi if [ -d "$gstack_dir/browse/dist" ]; then _link_or_copy "$gstack_dir/browse/dist" "$codex_gstack/browse/dist" fi @@ -836,6 +840,9 @@ create_factory_runtime_root() { if [ -d "$gstack_dir/bin" ]; then _link_or_copy "$gstack_dir/bin" "$factory_gstack/bin" fi + if [ -d "$gstack_dir/lib" ]; then + _link_or_copy "$gstack_dir/lib" "$factory_gstack/lib" + fi if [ -d "$gstack_dir/browse/dist" ]; then _link_or_copy "$gstack_dir/browse/dist" "$factory_gstack/browse/dist" fi @@ -874,6 +881,9 @@ create_opencode_runtime_root() { if [ -d "$gstack_dir/bin" ]; then _link_or_copy "$gstack_dir/bin" "$opencode_gstack/bin" fi + if [ -d "$gstack_dir/lib" ]; then + _link_or_copy "$gstack_dir/lib" "$opencode_gstack/lib" + fi if [ -d "$gstack_dir/browse/dist" ]; then _link_or_copy "$gstack_dir/browse/dist" "$opencode_gstack/browse/dist" fi @@ -1115,6 +1125,7 @@ if [ "$INSTALL_KIRO" -eq 1 ]; then [ -L "$KIRO_GSTACK" ] && rm -f "$KIRO_GSTACK" mkdir -p "$KIRO_GSTACK" "$KIRO_GSTACK/browse" "$KIRO_GSTACK/gstack-upgrade" "$KIRO_GSTACK/review" _link_or_copy "$SOURCE_GSTACK_DIR/bin" "$KIRO_GSTACK/bin" + _link_or_copy "$SOURCE_GSTACK_DIR/lib" "$KIRO_GSTACK/lib" _link_or_copy "$SOURCE_GSTACK_DIR/browse/dist" "$KIRO_GSTACK/browse/dist" _link_or_copy "$SOURCE_GSTACK_DIR/browse/bin" "$KIRO_GSTACK/browse/bin" # ETHOS.md — referenced by "Search Before Building" in all skill preambles diff --git a/test/gen-skill-docs.test.ts b/test/gen-skill-docs.test.ts index 2fb783ffd..bc9c1b29b 100644 --- a/test/gen-skill-docs.test.ts +++ b/test/gen-skill-docs.test.ts @@ -2406,6 +2406,7 @@ describe('setup script validation', () => { expect(setupContent).toContain('kiro-cli'); expect(setupContent).toContain('KIRO_SKILLS='); expect(setupContent).toContain('~/.kiro/skills/gstack'); + expect(setupContent).toContain('$KIRO_GSTACK/lib'); }); test('setup supports --host opencode with install section and OpenCode skill path vars', () => { @@ -2421,14 +2422,16 @@ describe('setup script validation', () => { expect(setupContent).toContain('qa/templates'); expect(setupContent).toContain('qa/references'); expect(setupContent).toContain('dx-hall-of-fame.md'); + expect(setupContent).toContain('$opencode_gstack/lib'); }); test('create_agents_sidecar links runtime assets', () => { - // Sidecar must link bin, browse, review, qa + // Sidecar must link bin with its shared lib modules, plus browse, review, qa const fnStart = setupContent.indexOf('create_agents_sidecar()'); const fnEnd = setupContent.indexOf('}', setupContent.indexOf('done', fnStart)); const fnBody = setupContent.slice(fnStart, fnEnd); expect(fnBody).toContain('bin'); + expect(fnBody).toContain('lib'); expect(fnBody).toContain('browse'); expect(fnBody).toContain('review'); expect(fnBody).toContain('qa'); @@ -2439,6 +2442,7 @@ describe('setup script validation', () => { const fnEnd = setupContent.indexOf('}', setupContent.indexOf('done', setupContent.indexOf('review/', fnStart))); const fnBody = setupContent.slice(fnStart, fnEnd); expect(fnBody).toContain('gstack/SKILL.md'); + expect(fnBody).toContain('$codex_gstack/lib'); expect(fnBody).toContain('browse/dist'); expect(fnBody).toContain('browse/bin'); expect(fnBody).toContain('gstack-upgrade/SKILL.md'); @@ -2450,6 +2454,14 @@ describe('setup script validation', () => { expect(fnBody).not.toContain('_link_or_copy "$gstack_dir" "$codex_gstack"'); }); + test('create_factory_runtime_root links shared lib modules beside bin', () => { + const fnStart = setupContent.indexOf('create_factory_runtime_root()'); + const fnEnd = setupContent.indexOf('create_opencode_runtime_root()', fnStart); + const fnBody = setupContent.slice(fnStart, fnEnd); + expect(fnBody).toContain('$factory_gstack/bin'); + expect(fnBody).toContain('$factory_gstack/lib'); + }); + test('direct Codex installs are migrated out of ~/.codex/skills/gstack', () => { expect(setupContent).toContain('migrate_direct_codex_install'); expect(setupContent).toContain('$HOME/.gstack/repos/gstack');