fix(setup): install Factory skills in documented root

This commit is contained in:
morluto 2026-07-16 06:53:43 +08:00
parent a3259400a3
commit 8d060670c7
2 changed files with 23 additions and 7 deletions

17
setup
View File

@ -912,7 +912,7 @@ link_factory_skill_dirs() {
local gstack_dir="$1"
local skills_dir="$2"
local factory_dir="$gstack_dir/.factory/skills"
local linked=()
local installed=()
if [ ! -d "$factory_dir" ]; then
echo " Generating .factory/ skill docs..."
@ -929,14 +929,17 @@ link_factory_skill_dirs() {
skill_name="$(basename "$skill_dir")"
[ "$skill_name" = "gstack" ] && continue
target="$skills_dir/$skill_name"
if [ -L "$target" ] || [ ! -e "$target" ]; then
_link_or_copy "$skill_dir" "$target"
linked+=("$skill_name")
fi
# Factory documents ~/.factory/skills as its user-level skill root. Keep
# the install self-contained there and use a real directory so Droid does
# not have to follow a directory symlink during discovery. These gstack-*
# paths are installer-owned and are refreshed on every setup run.
rm -rf "$target"
cp -R "$skill_dir" "$target"
installed+=("$skill_name")
fi
done
if [ ${#linked[@]} -gt 0 ]; then
echo " linked skills: ${linked[*]}"
if [ ${#installed[@]} -gt 0 ]; then
echo " installed skills: ${installed[*]}"
fi
}

View File

@ -2450,6 +2450,19 @@ describe('setup script validation', () => {
expect(fnBody).not.toContain('_link_or_copy "$gstack_dir" "$codex_gstack"');
});
test('Factory installs real skill directories only in its documented user root', () => {
const fnStart = setupContent.indexOf('link_factory_skill_dirs()');
const fnEnd = setupContent.indexOf('\nlink_opencode_skill_dirs()', fnStart);
const fnBody = setupContent.slice(fnStart, fnEnd);
expect(fnBody).toContain('target="$skills_dir/$skill_name"');
expect(fnBody).toContain('rm -rf "$target"');
expect(fnBody).toContain('cp -R "$skill_dir" "$target"');
expect(fnBody).not.toContain('.agents');
expect(fnBody).not.toContain('.skill-lock.json');
expect(fnBody).not.toContain('_link_or_copy "$skill_dir" "$target"');
});
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');