skills: single install path — canonical skills ship with the framework

Phase D2 of plan 2026-08-19: single package, single install, single command.

The framework installer already treats skills/** as a shipped, manifest-owned
framework subtree, so the folded skills now install into
$MOSAIC_HOME/skills with the rest of the framework — no second repository,
no separate sync step:

- mosaic-sync-skills (bash + powershell): the fetch machinery is gone (clone,
  pull, dirty-state migration, rsync from sources/agent-skills). The script
  now only links installed skills into runtime homes. --link-only is a compat
  no-op; --no-link exits having nothing to do.
- catalog.ts: the sources/agent-skills fallback is dead and removed.
- install.sh, launch.ts, defaults/README.md, README.md, skills/README.md:
  references to the second repo rewritten to describe the shipped path.

Verified: clean install into a fresh MOSAIC_HOME produces 102 skills with no
sources/ directory; the linker then links the selected skills into the four
runtime homes with no git involvement.
This commit is contained in:
fargo
2026-08-19 14:39:28 -05:00
parent 1a822493ba
commit 1556982dbc
9 changed files with 55 additions and 172 deletions
+1 -1
View File
@@ -1450,7 +1450,7 @@ export function registerLaunchCommands(program: Command): void {
// Direct framework script delegates
const directCommands: Record<string, { desc: string; script: string }> = {
init: { desc: 'Generate SOUL.md (agent identity contract)', script: 'mosaic-init' },
sync: { desc: 'Sync skills from canonical source', script: 'mosaic-sync-skills' },
sync: { desc: 'Link installed skills into runtime homes', script: 'mosaic-sync-skills' },
bootstrap: {
desc: 'Bootstrap a repo with Mosaic standards',
script: 'mosaic-bootstrap-repo',
+2 -1
View File
@@ -94,7 +94,8 @@ export function syncDirectory(
const relPath = relative(relBase, src);
const dirName = relPath.split('/').pop() ?? '';
// Skip any .git directory (top-level or nested, e.g. sources/agent-skills/.git)
// Skip any .git directory (top-level or nested; defensive — the
// framework tree itself is not a git checkout at install time)
if (options.excludeGit && (dirName === '.git' || relPath.includes('/.git'))) return;
// Skip preserved paths at top level
-6
View File
@@ -20,12 +20,6 @@ export function loadSkillsCatalog(mosaicHome: string): SkillEntry[] {
skills.push(...loadSkillsFromDir(canonicalDir, 'canonical'));
}
// Fallback to source repo
const sourceDir = join(mosaicHome, 'sources', 'agent-skills', 'skills');
if (skills.length === 0 && existsSync(sourceDir)) {
skills.push(...loadSkillsFromDir(sourceDir, 'canonical'));
}
// Load local skills
const localDir = join(mosaicHome, 'skills-local');
if (existsSync(localDir)) {