@hybridlabor-api/aos 4.12.1 → 4.13.1

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 (33) hide show
  1. package/.agents/vendor-manifest.json +6 -0
  2. package/.claude/agents/reviewer.md +1 -1
  3. package/.claude/agents/techlead.md +1 -1
  4. package/.opencode/agents/architect.md +1 -1
  5. package/.opencode/agents/reviewer.md +1 -1
  6. package/.opencode/agents/techlead.md +1 -1
  7. package/README.de.md +10 -9
  8. package/README.md +10 -9
  9. package/README.pt.md +10 -9
  10. package/THIRD_PARTY_NOTICES.md +94 -0
  11. package/bin/aos-store.mjs +48 -45
  12. package/installer.js +22 -20
  13. package/lib/scenario-store-index.json +1 -0
  14. package/lib/store-shared.mjs +81 -4
  15. package/lib/store-ui/index.html +14 -5
  16. package/lib/store-ui/server.mjs +45 -22
  17. package/package.json +2 -2
  18. package/scripts/build-plugin-manifest.mjs +33 -10
  19. package/scripts/build-scenario-store-index.mjs +154 -0
  20. package/skills/bdbrainstorm/SKILL.md +1 -0
  21. package/skills/global_config/agent-pipeline/SKILL.md +4 -0
  22. package/skills/global_config/aos-store/SKILL.md +3 -3
  23. package/skills/global_config/design-control-loop/SKILL.md +184 -0
  24. package/skills/global_config/design-control-loop/references/agent-iteration.ts +174 -0
  25. package/skills/global_config/design-control-loop/references/agent-runner-templates.md +157 -0
  26. package/skills/global_config/design-control-loop/references/control-loop-taxonomy.md +75 -0
  27. package/skills/global_config/design-control-loop/references/example-control-loop.md +57 -0
  28. package/skills/global_config/design-control-loop/references/example-skill.md +171 -0
  29. package/skills/global_config/design-control-loop/references/memory-template.md +7 -0
  30. package/skills/global_config/design-control-loop/references/prompt-template.md +58 -0
  31. package/skills/global_config/design-control-loop/references/response-template.md +103 -0
  32. package/skills/global_config/design-control-loop/references/skill-template.md +57 -0
  33. package/skills/global_config/design-control-loop/references/workflow-template.yml +273 -0
@@ -64,6 +64,12 @@
64
64
  "purpose": "Generator/validator pairs for GitHub Actions, Dockerfile, bash scripts and Makefiles, with reference libraries",
65
65
  "target_skill": "skills/global_config/{github-actions,dockerfile,bash-script,makefile}-{generator,validator}"
66
66
  },
67
+ "humanlayer-skills": {
68
+ "upstream": "https://github.com/humanlayer/skills",
69
+ "pinned_commit": "ca7c8088db69e315a8b2deea43820270457f8f3c",
70
+ "purpose": "Interview-driven generator for recurring agentic control loops in CI (manual, opt-in, not a pipeline node)",
71
+ "target_skill": "design-control-loop"
72
+ },
67
73
  "claude-code-templates": {
68
74
  "upstream": "https://github.com/davila7/claude-code-templates",
69
75
  "pinned_commit": "691832ad9c2506d15a8b752826135f0afa83d197",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: reviewer
3
3
  description: "Adversarial review of build-node output against the plan's stated contract, before Shipping runs its automated gate. Modeled on the `doubt-driven-development` discipline (see `.agents/graph.md`): reads the artifacts and the contract, never the implementer's claim that it's done, never their reasoning — passing the claim biases toward agreement. Prompted adversarially (\"find what is wrong,\" never \"does this look good\"). Classifies every finding by a fixed precedence (contract misread → valid & actionable → valid trade-off → noise). The dispatcher escalates instead of repeating a cycle if a repair round reports the exact same finding ID Reviewer already flagged (a no-progress guard — see `.agents/graph.md`'s Reviewer discipline for why this replaced the original \"two clean cycles\" framing)."
4
- model: o3-mini
4
+ model: opus
5
5
  ---
6
6
  Adversarial review of build-node output against the plan's stated contract, before Shipping runs its automated gate. Modeled on the `doubt-driven-development` discipline (see `.agents/graph.md`): reads the artifacts and the contract, never the implementer's claim that it's done, never their reasoning — passing the claim biases toward agreement. Prompted adversarially ("find what is wrong," never "does this look good"). Classifies every finding by a fixed precedence (contract misread → valid & actionable → valid trade-off → noise). The dispatcher escalates instead of repeating a cycle if a repair round reports the exact same finding ID Reviewer already flagged (a no-progress guard — see `.agents/graph.md`'s Reviewer discipline for why this replaced the original "two clean cycles" framing).
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: techlead
3
3
  description: "Reviews Architect's plan for a capability map (module boundaries, dependency direction, build order) before any build node starts. Approves or rejects the plan back to Architect. Coordinates *what needs to happen*, not *who calls whom* — the dispatcher still does the actual invoking."
4
- model: gemini-3.8-flash-high
4
+ model: sonnet
5
5
  ---
6
6
  Reviews Architect's plan for a capability map (module boundaries, dependency direction, build order) before any build node starts. Approves or rejects the plan back to Architect. Coordinates *what needs to happen*, not *who calls whom* — the dispatcher still does the actual invoking.
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: "Turns the user's goal (or `/bdbrainstorm` / `/grill-me` output) into a system plan. Reads existing architecture before proposing changes. Does not coordinate execution or invoke other agents — that is TechLead's job, decided by the dispatcher, not by Architect."
3
3
  mode: subagent
4
- model: opus
4
+ model: opencode/muse-spark-1.3-contributor-free
5
5
  ---
6
6
  Turns the user's goal (or `/bdbrainstorm` / `/grill-me` output) into a system plan. Reads existing architecture before proposing changes. Does not coordinate execution or invoke other agents — that is TechLead's job, decided by the dispatcher, not by Architect.
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: "Adversarial review of build-node output against the plan's stated contract, before Shipping runs its automated gate. Modeled on the `doubt-driven-development` discipline (see `.agents/graph.md`): reads the artifacts and the contract, never the implementer's claim that it's done, never their reasoning — passing the claim biases toward agreement. Prompted adversarially (\"find what is wrong,\" never \"does this look good\"). Classifies every finding by a fixed precedence (contract misread → valid & actionable → valid trade-off → noise). The dispatcher escalates instead of repeating a cycle if a repair round reports the exact same finding ID Reviewer already flagged (a no-progress guard — see `.agents/graph.md`'s Reviewer discipline for why this replaced the original \"two clean cycles\" framing)."
3
3
  mode: subagent
4
- model: o3-mini
4
+ model: opencode/muse-spark-1.3-contributor-free
5
5
  ---
6
6
  Adversarial review of build-node output against the plan's stated contract, before Shipping runs its automated gate. Modeled on the `doubt-driven-development` discipline (see `.agents/graph.md`): reads the artifacts and the contract, never the implementer's claim that it's done, never their reasoning — passing the claim biases toward agreement. Prompted adversarially ("find what is wrong," never "does this look good"). Classifies every finding by a fixed precedence (contract misread → valid & actionable → valid trade-off → noise). The dispatcher escalates instead of repeating a cycle if a repair round reports the exact same finding ID Reviewer already flagged (a no-progress guard — see `.agents/graph.md`'s Reviewer discipline for why this replaced the original "two clean cycles" framing).
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: "Reviews Architect's plan for a capability map (module boundaries, dependency direction, build order) before any build node starts. Approves or rejects the plan back to Architect. Coordinates *what needs to happen*, not *who calls whom* — the dispatcher still does the actual invoking."
3
3
  mode: subagent
4
- model: gemini-3.8-flash-high
4
+ model: opencode/muse-spark-1.3-contributor-free
5
5
  ---
6
6
  Reviews Architect's plan for a capability map (module boundaries, dependency direction, build order) before any build node starts. Approves or rejects the plan back to Architect. Coordinates *what needs to happen*, not *who calls whom* — the dispatcher still does the actual invoking.
7
7
 
package/README.de.md CHANGED
@@ -11,10 +11,11 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-213%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#mcp-server)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#unterstützte-harnesses)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
18
+ [![skills.sh](https://skills.sh/b/hybridlabor-api/aos)](https://skills.sh/hybridlabor-api/aos)
18
19
 
19
20
  AOS installiert eine kuratierte Skill-Bibliothek, ein Subagent-Verzeichnis, Gate-Hooks und eine ausführbare Multi-Agent-Build-Pipeline in jeden auf deinem Rechner installierten Coding-Agent-Harness.
20
21
 
@@ -26,7 +27,7 @@ Entwickelt für Nutzer, die bereits **Claude Code, Google Antigravity, Codex CLI
26
27
 
27
28
  Nach der Installation hast du:
28
29
 
29
- - **<!-- count:skills -->213<!-- /count --> Skills** in sechs Kategorien, von jedem Harness als `<name>/SKILL.md` auffindbar.
30
+ - **<!-- count:skills -->214<!-- /count --> Skills** in sechs Kategorien, von jedem Harness als `<name>/SKILL.md` auffindbar.
30
31
  - **<!-- count:agents -->13<!-- /count --> Subagents** (Architect, TechLead, Reviewer, die Godmodes, Security- und Silent-Failure-Reviewer) als natives Agenten-Format jedes Harness kompiliert.
31
32
  - **<!-- count:mcps -->21<!-- /count --> MCP-Server** für Creative Software, Betriebssystemsteuerung, Memory und Harness-übergreifende Delegation.
32
33
  - **Drei Pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — und ein **GO-Gate**, das `git push`, `npm publish`, `npm version` und rekursive `rm` mechanisch blockiert.
@@ -173,7 +174,7 @@ Das Erreichen von `ready_to_ship` ist kein Versand. [`.claude/hooks/go-gate.mjs`
173
174
  | Plan Canvas | `aos-plan-canvas open <file>` (skill `plan-canvas`) | Öffnet einen Plan oder HTML-Artefakt in einer lokalen Browser-Canvas, wo du Elemente annotierst, chattest und Änderungen genehmigst oder anforderst. Pläne aus den Pipelines öffnen sich hier standardmäßig. |
174
175
  | agenttrail | `aos-trail` (skill `agenttrail`, port 5330) | Live-Board einer Multi-Agent-Build: welche Komponente, welcher Agent oder Harness, was ist fertig, was ist stecken geblieben. Gespeist von den Trail-Relay-Hooks und von `mcsc`. |
175
176
  | archify | `aos-archify` (skill `archify`) | Validierte Architektur-, Sequenz-, Datenfluss- und State-Diagramme als eigenständige HTML mit SVG-Export; akzeptiert Mermaid. |
176
- | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (auch `aos-store`, slash command `/aos-store`) | Durchsuche und installiere AOS Core und ECC Skills und Agents. Die Web-UI auf `http://127.0.0.1:4322` zeigt, was installiert ist, zeigt die genauen Zielpfade in der Vorschau an und installiert nur nach deiner Bestätigung. Multi-Datei-Skills werden komplett installiert. `list` und `search` lesen einen angehefteten Offline-Index. |
177
+ | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (auch `aos-store`, slash command `/aos-store`) | Durchsuche und installiere Skills und Agents aus AOS Core, ECC und Scenario (scenario-labs/skills, MIT); benötigte Skills werden mitinstalliert, jede Datei wird per SHA-256 geprüft. Die Web-UI auf `http://127.0.0.1:4322` zeigt, was installiert ist, zeigt die genauen Zielpfade in der Vorschau an und installiert nur nach deiner Bestätigung. Multi-Datei-Skills werden komplett installiert. `list` und `search` lesen einen angehefteten Offline-Index. |
177
178
  | Launchpad | `aos-dashboard [--port 7900] [--no-open]` | Eine Seite mit jedem lokalen BDB-Service (memB, Synapse, OpenWiki, AO, Remote, AOS Store): Status, Start/Stop, Logs. Registriert als Autostart-Eintrag. |
178
179
  | Doctor | `aos doctor [--json] [--net]` (auch `aos-doctor`) | Überprüft Abhängigkeiten, Skill-Platzierung pro Harness, Daemons, Hooks und Module; beendet sich mit 1, wenn etwas Aufmerksamkeit benötigt. Das erste, das zu laufen ist, wenn etwas nicht funktioniert. |
179
180
  | Config | `aos-config show \| propose \| set <key> <value>` | Maschinenebene `~/.agents/aos-config.json`: Workspace-Root, Domänen, Benutzer-ID. |
@@ -207,7 +208,7 @@ Installiere es durch den AOS Installer mit dem AOS CLI Target: `npx -y @hybridla
207
208
  npx skills add hybridlabor-api/aos
208
209
  ```
209
210
 
210
- Dies entdeckt alle <!-- count:skills -->213<!-- /count --> kuratierten Skills und installiert sie in das universelle `~/.agents/skills` Verzeichnis (verwendet von allen Harnesses und dem AOS CLI).
211
+ Dies entdeckt alle <!-- count:skills -->214<!-- /count --> kuratierten Skills und installiert sie in das universelle `~/.agents/skills` Verzeichnis (verwendet von allen Harnesses und dem AOS CLI).
211
212
 
212
213
  ---
213
214
 
@@ -248,22 +249,22 @@ Der Dispatcher-Graph kompiliert diese Agents, verfügbar als Claude Code Subagen
248
249
 
249
250
  ### Skills nach Kategorie
250
251
 
251
- <!-- count:skills -->213<!-- /count --> kuratierte Skills, von jedem Harness auffindbar:
252
+ <!-- count:skills -->214<!-- /count --> kuratierte Skills, von jedem Harness auffindbar:
252
253
 
253
- - **bdb-core** (30 Skills): Core AOS Infrastruktur, Pipelines, Tools und Utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` und mehr.
254
+ - **bdb-core** (31 Skills): Core AOS Infrastruktur, Pipelines, Tools und Utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` und mehr.
254
255
  - **design-ui-ux** (19 Skills): Frontend, UI Design, Barrierefreiheit, Tokens, Motion, Anti-Slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns` und mehr.
255
256
  - **engineering-method** (46 Skills): Architektur, Testing, Debugging, CI/CD, Code-Qualität — `software-architecture`, `test-driven-development`, `systematic-debugging`, `ci-pipeline`, `github-actions-generator`, `dockerfile-validator` und mehr.
256
257
  - **library** (98 Skills): Language/Framework-Spezifika — TypeScript, Node.js, Python, React, Postgres, Prisma, Next.js, Drizzle ORM, Go und mehr.
257
258
  - **media-eventtech** (19 Skills): 3D, Video, Show Control, Spatial Design — `godmode-eventtech`, `synapse-integration-skill`, `threejs-skills`, `blender-expert` und mehr.
258
259
  - **engineering-hardware** (1 Skill): PCB und Electrical Design — `godmode-hardware-pcb`.
259
260
 
260
- Der vollständige Katalog mit detaillierten Beschreibungen: [docs/skills_table.md](docs/skills_table.md) — Hinweis: Diese Datei ist veraltet und listet 164 von 213 Skills auf.
261
+ Der vollständige Katalog mit detaillierten Beschreibungen: [docs/skills_table.md](docs/skills_table.md) — Hinweis: Diese Datei ist veraltet und listet 164 von 214 Skills auf.
261
262
 
262
263
  ---
263
264
 
264
265
  ## Skills
265
266
 
266
- <!-- count:skills -->213<!-- /count --> Skills, kuratiert aus Open-Source- und proprietären Sammlungen, die die gesamte Software-Entwicklung und Creative-Pipeline abdecken. Jeder Skill ist ein Verzeichnis mit einem `SKILL.md` Frontmatter, das `name`, `description` und eine `category` erklärt: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->214<!-- /count --> Skills, kuratiert aus Open-Source- und proprietären Sammlungen, die die gesamte Software-Entwicklung und Creative-Pipeline abdecken. Jeder Skill ist ein Verzeichnis mit einem `SKILL.md` Frontmatter, das `name`, `description` und eine `category` erklärt: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
268
 
268
269
  **Persona Layer:** Die **Godmode** Skills sind spezialisierte Personas, die direkt den Build- und Shipping-Knoten des Dispatcher-Graphs zugeordnet sind:
269
270
 
@@ -286,7 +287,7 @@ Der vollständige Katalog mit detaillierten Beschreibungen: [docs/skills_table.m
286
287
  - **Code Qualität** — `bdb-security-audit`, `systematic-debugging`, `silent-failure-hunter`, `bdbresilience`
287
288
  - **Framework Spezialisten** — Vollständige Abdeckung von TypeScript, React, Next.js, Drizzle ORM, Prisma, Python, Go und mehr
288
289
 
289
- Der vollständige Katalog mit Beschreibungen und Details: [docs/skills_table.md](docs/skills_table.md) (Hinweis: listet derzeit 164 von 213).
290
+ Der vollständige Katalog mit Beschreibungen und Details: [docs/skills_table.md](docs/skills_table.md) (Hinweis: listet derzeit 164 von 214).
290
291
 
291
292
  Die Bibliothek ist auch durch die `skills` CLI lesbar:
292
293
 
package/README.md CHANGED
@@ -11,10 +11,11 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-213%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#mcp-servers)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#supported-harnesses)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
18
+ [![skills.sh](https://skills.sh/b/hybridlabor-api/aos)](https://skills.sh/hybridlabor-api/aos)
18
19
 
19
20
  AOS installs a curated skill library, a subagent roster, gate hooks and a runnable multi-agent build pipeline into every coding-agent harness on your machine.
20
21
 
@@ -26,7 +27,7 @@ Built for people who already run **Claude Code, Google Antigravity, Codex CLI, O
26
27
 
27
28
  After install you have:
28
29
 
29
- - **<!-- count:skills -->213<!-- /count --> skills** in six categories, discoverable by every harness as `<name>/SKILL.md`.
30
+ - **<!-- count:skills -->214<!-- /count --> skills** in six categories, discoverable by every harness as `<name>/SKILL.md`.
30
31
  - **<!-- count:agents -->13<!-- /count --> subagents** (Architect, TechLead, Reviewer, the Godmodes, security and silent-failure reviewers) compiled into each harness's native agent format.
31
32
  - **<!-- count:mcps -->21<!-- /count --> MCP servers** for creative software, OS control, memory and cross-harness delegation.
32
33
  - **Three pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — and a **GO gate** that mechanically blocks `git push`, `npm publish`, `npm version` and recursive `rm`.
@@ -173,7 +174,7 @@ Reaching `ready_to_ship` is not shipping. [`.claude/hooks/go-gate.mjs`](.claude/
173
174
  | Plan Canvas | `aos-plan-canvas open <file>` (skill `plan-canvas`) | Opens a plan or HTML artifact in a local browser canvas where you annotate elements, chat, and approve or request changes. Plans from the pipelines open here by default. |
174
175
  | agenttrail | `aos-trail` (skill `agenttrail`, port 5330) | Live board of a multi-agent build: which component, which agent or harness, what is done, what is stuck. Fed by the trail-relay hooks and by `mcsc`. |
175
176
  | archify | `aos-archify` (skill `archify`) | Validated architecture, sequence, data-flow and state diagrams as standalone HTML with SVG export; accepts Mermaid. |
176
- | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (also `aos-store`, slash command `/aos-store`) | Browse and install AOS Core and ECC skills and agents. The web UI on `http://127.0.0.1:4322` shows what is installed, previews the exact target paths, and installs only after you confirm. Multi-file skills are installed completely. `list` and `search` read a pinned offline index. |
177
+ | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (also `aos-store`, slash command `/aos-store`) | Browse and install AOS Core, ECC and Scenario (scenario-labs/skills, MIT) skills and agents; required skills are installed together and every file is SHA-256 verified. The web UI on `http://127.0.0.1:4322` shows what is installed, previews the exact target paths, and installs only after you confirm. Multi-file skills are installed completely. `list` and `search` read a pinned offline index. |
177
178
  | Launchpad | `aos-dashboard [--port 7900] [--no-open]` | One page with every local BDB service (memB, Synapse, OpenWiki, AO, Remote, AOS Store): status, start/stop, logs. Registered as an autostart entry. |
178
179
  | Doctor | `aos doctor [--json] [--net]` (also `aos-doctor`) | Verifies dependencies, skill placement per harness, daemons, hooks and modules; exits 1 when something needs attention. The first thing to run when anything misbehaves. |
179
180
  | Config | `aos-config show \| propose \| set <key> <value>` | Machine-level `~/.agents/aos-config.json`: workspace root, domains, user id. |
@@ -207,7 +208,7 @@ Install it through the AOS installer with the AOS CLI target: `npx -y @hybridlab
207
208
  npx skills add hybridlabor-api/aos
208
209
  ```
209
210
 
210
- This discovers all <!-- count:skills -->213<!-- /count --> curated skills and installs them into the universal `~/.agents/skills` directory (used by all harnesses and the AOS CLI).
211
+ This discovers all <!-- count:skills -->214<!-- /count --> curated skills and installs them into the universal `~/.agents/skills` directory (used by all harnesses and the AOS CLI).
211
212
 
212
213
  ---
213
214
 
@@ -248,22 +249,22 @@ The dispatcher graph compiles these agents, available as Claude Code subagents a
248
249
 
249
250
  ### Skills by Category
250
251
 
251
- <!-- count:skills -->213<!-- /count --> curated skills, discoverable by every harness:
252
+ <!-- count:skills -->214<!-- /count --> curated skills, discoverable by every harness:
252
253
 
253
- - **bdb-core** (30 skills): Core AOS infrastructure, pipelines, tools, and utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill`, and more.
254
+ - **bdb-core** (31 skills): Core AOS infrastructure, pipelines, tools, and utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill`, and more.
254
255
  - **design-ui-ux** (19 skills): Frontend, UI design, accessibility, tokens, motion, anti-slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns`, and more.
255
256
  - **engineering-method** (46 skills): Architecture, testing, debugging, CI/CD, code quality — `software-architecture`, `test-driven-development`, `systematic-debugging`, `ci-pipeline`, `github-actions-generator`, `dockerfile-validator`, and more.
256
257
  - **library** (98 skills): Language/framework specifics — TypeScript, Node.js, Python, React, Postgres, Prisma, Next.js, Drizzle ORM, Go, and more.
257
258
  - **media-eventtech** (19 skills): 3D, video, show control, spatial design — `godmode-eventtech`, `synapse-integration-skill`, `threejs-skills`, `blender-expert`, and more.
258
259
  - **engineering-hardware** (1 skill): PCB and electrical design — `godmode-hardware-pcb`.
259
260
 
260
- The full catalog with detailed descriptions: [docs/skills_table.md](docs/skills_table.md) — note: this file is out of date and lists 164 of 213 skills.
261
+ The full catalog with detailed descriptions: [docs/skills_table.md](docs/skills_table.md) — note: this file is out of date and lists 164 of 214 skills.
261
262
 
262
263
  ---
263
264
 
264
265
  ## Skills
265
266
 
266
- <!-- count:skills -->213<!-- /count --> skills, curated from open-source and proprietary collections, covering the full software development and creative pipeline. Every skill is a directory with a `SKILL.md` frontmatter declaring `name`, `description`, and one `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->214<!-- /count --> skills, curated from open-source and proprietary collections, covering the full software development and creative pipeline. Every skill is a directory with a `SKILL.md` frontmatter declaring `name`, `description`, and one `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
268
 
268
269
  **Persona Layer:** The **Godmode** skills are specialized personas that directly map to the build and ship nodes of the dispatcher graph:
269
270
 
@@ -286,7 +287,7 @@ The full catalog with detailed descriptions: [docs/skills_table.md](docs/skills_
286
287
  - **Code Quality** — `bdb-security-audit`, `systematic-debugging`, `silent-failure-hunter`, `bdbresilience`
287
288
  - **Framework Specialists** — Full coverage of TypeScript, React, Next.js, Drizzle ORM, Prisma, Python, Go, and more
288
289
 
289
- The full catalog with descriptions and details: [docs/skills_table.md](docs/skills_table.md) (note: currently lists 164 of 213).
290
+ The full catalog with descriptions and details: [docs/skills_table.md](docs/skills_table.md) (note: currently lists 164 of 214).
290
291
 
291
292
  The library is also readable by the `skills` CLI:
292
293
 
package/README.pt.md CHANGED
@@ -11,10 +11,11 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-213%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#servidores-mcp)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#harnesses-suportados)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
18
+ [![skills.sh](https://skills.sh/b/hybridlabor-api/aos)](https://skills.sh/hybridlabor-api/aos)
18
19
 
19
20
  AOS instala uma biblioteca de skills curada, um roster de subagentes, hooks de portão e um pipeline multi-agente executável em todos os harnesses de agentes de código da sua máquina.
20
21
 
@@ -26,7 +27,7 @@ Construído para pessoas que já executam **Claude Code, Google Antigravity, Cod
26
27
 
27
28
  Após a instalação, você tem:
28
29
 
29
- - **<!-- count:skills -->213<!-- /count --> skills** em seis categorias, descobríveis por cada harness como `<name>/SKILL.md`.
30
+ - **<!-- count:skills -->214<!-- /count --> skills** em seis categorias, descobríveis por cada harness como `<name>/SKILL.md`.
30
31
  - **<!-- count:agents -->13<!-- /count --> subagentes** (Architect, TechLead, Reviewer, os Godmodes, revisores de segurança e falhas silenciosas) compilados em cada formato nativo de agente do harness.
31
32
  - **<!-- count:mcps -->21<!-- /count --> servidores MCP** para software criativo, controle de SO, memória e delegação entre harnesses.
32
33
  - **Três pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — e um **portão GO** que bloqueia mecanicamente `git push`, `npm publish`, `npm version` e `rm` recursivo.
@@ -173,7 +174,7 @@ Alcançar `ready_to_ship` não é enviar. [`.claude/hooks/go-gate.mjs`](.claude/
173
174
  | Plan Canvas | `aos-plan-canvas open <file>` (skill `plan-canvas`) | Abre um plano ou artefato HTML em um canvas de navegador local onde você anota elementos, conversa e aprova ou solicita mudanças. Planos dos pipelines abrem aqui por padrão. |
174
175
  | agenttrail | `aos-trail` (skill `agenttrail`, porta 5330) | Quadro ao vivo de uma compilação multi-agente: qual componente, qual agente ou harness, o que está pronto, o que está preso. Alimentado pelos hooks trail-relay e por `mcsc`. |
175
176
  | archify | `aos-archify` (skill `archify`) | Arquitetura validada, sequência, fluxo de dados e diagramas de estado como HTML autossuficiente com exportação SVG; aceita Mermaid. |
176
- | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (também `aos-store`, comando slash `/aos-store`) | Procure e instale skills e agentes AOS Core e ECC. A interface web em `http://127.0.0.1:4322` mostra o que está instalado, visualiza o exato caminho de alvo e instala apenas após você confirmar. Skills multi-arquivo são instaladas completamente. `list` e `search` leem um índice fixo offline. |
177
+ | AOS Store | `aos store list \| search <q> \| install <name> [--project]`, `aos store ui` (também `aos-store`, comando slash `/aos-store`) | Procure e instale skills e agentes do AOS Core, do ECC e do Scenario (scenario-labs/skills, MIT); as skills necessárias são instaladas juntas e cada arquivo é verificado por SHA-256. A interface web em `http://127.0.0.1:4322` mostra o que está instalado, visualiza o exato caminho de alvo e instala apenas após você confirmar. Skills multi-arquivo são instaladas completamente. `list` e `search` leem um índice fixo offline. |
177
178
  | Launchpad | `aos-dashboard [--port 7900] [--no-open]` | Uma página com todos os serviços BDB locais (memB, Synapse, OpenWiki, AO, Remote, AOS Store): status, iniciar/parar, logs. Registrado como entrada de inicialização automática. |
178
179
  | Doctor | `aos doctor [--json] [--net]` (também `aos-doctor`) | Verifica dependências, posicionamento de skills por harness, daemons, hooks e módulos; sai com 1 quando algo precisa de atenção. A primeira coisa a executar quando algo se comporta mal. |
179
180
  | Config | `aos-config show \| propose \| set <key> <value>` | Nível de máquina `~/.agents/aos-config.json`: raiz do workspace, domínios, id do usuário. |
@@ -207,7 +208,7 @@ Instale através do instalador AOS com o alvo AOS CLI: `npx -y @hybridlabor-api/
207
208
  npx skills add hybridlabor-api/aos
208
209
  ```
209
210
 
210
- Isto descobre todas as <!-- count:skills -->213<!-- /count --> skills curadas e as instala no diretório universal `~/.agents/skills` (usado por todos os harnesses e o AOS CLI).
211
+ Isto descobre todas as <!-- count:skills -->214<!-- /count --> skills curadas e as instala no diretório universal `~/.agents/skills` (usado por todos os harnesses e o AOS CLI).
211
212
 
212
213
  ---
213
214
 
@@ -248,22 +249,22 @@ O grafo do dispatcher compila estes agentes, disponíveis como subagentes Claude
248
249
 
249
250
  ### Skills por Categoria
250
251
 
251
- <!-- count:skills -->213<!-- /count --> skills curadas, descobríveis por todo harness:
252
+ <!-- count:skills -->214<!-- /count --> skills curadas, descobríveis por todo harness:
252
253
 
253
- - **bdb-core** (30 skills): Infraestrutura AOS principal, pipelines, ferramentas e utilidades — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` e mais.
254
+ - **bdb-core** (31 skills): Infraestrutura AOS principal, pipelines, ferramentas e utilidades — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` e mais.
254
255
  - **design-ui-ux** (19 skills): Frontend, design UI, acessibilidade, tokens, movimento, anti-slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns` e mais.
255
256
  - **engineering-method** (46 skills): Arquitetura, testes, debugging, CI/CD, qualidade de código — `software-architecture`, `test-driven-development`, `systematic-debugging`, `ci-pipeline`, `github-actions-generator`, `dockerfile-validator` e mais.
256
257
  - **library** (98 skills): Especificidades de linguagem/framework — TypeScript, Node.js, Python, React, Postgres, Prisma, Next.js, Drizzle ORM, Go e mais.
257
258
  - **media-eventtech** (19 skills): 3D, vídeo, controle de shows, design espacial — `godmode-eventtech`, `synapse-integration-skill`, `threejs-skills`, `blender-expert` e mais.
258
259
  - **engineering-hardware** (1 skill): Design de PCB e elétrico — `godmode-hardware-pcb`.
259
260
 
260
- O catálogo completo com descrições detalhadas: [docs/skills_table.md](docs/skills_table.md) — nota: este arquivo está desatualizado e lista 164 de 213 skills.
261
+ O catálogo completo com descrições detalhadas: [docs/skills_table.md](docs/skills_table.md) — nota: este arquivo está desatualizado e lista 164 de 214 skills.
261
262
 
262
263
  ---
263
264
 
264
265
  ## Skills
265
266
 
266
- <!-- count:skills -->213<!-- /count --> skills, curadas de coleções de código aberto e proprietárias, cobrindo o pipeline completo de desenvolvimento de software e criativo. Cada skill é um diretório com um `SKILL.md` frontmatter declarando `name`, `description` e uma `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->214<!-- /count --> skills, curadas de coleções de código aberto e proprietárias, cobrindo o pipeline completo de desenvolvimento de software e criativo. Cada skill é um diretório com um `SKILL.md` frontmatter declarando `name`, `description` e uma `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
268
 
268
269
  **Camada de Persona:** As skills **Godmode** são personas especializadas que mapeiam diretamente para os nós de compilação e envio do grafo do dispatcher:
269
270
 
@@ -286,7 +287,7 @@ O catálogo completo com descrições detalhadas: [docs/skills_table.md](docs/sk
286
287
  - **Qualidade de Código** — `bdb-security-audit`, `systematic-debugging`, `silent-failure-hunter`, `bdbresilience`
287
288
  - **Especialistas de Framework** — Cobertura completa de TypeScript, React, Next.js, Drizzle ORM, Prisma, Python, Go e mais
288
289
 
289
- O catálogo completo com descrições e detalhes: [docs/skills_table.md](docs/skills_table.md) (nota: atualmente lista 164 de 213).
290
+ O catálogo completo com descrições e detalhes: [docs/skills_table.md](docs/skills_table.md) (nota: atualmente lista 164 de 214).
290
291
 
291
292
  A biblioteca também é legível pela CLI `skills`:
292
293
 
@@ -413,7 +413,101 @@ store. Reasons are in `docs/handover/` and the branch description for
413
413
 
414
414
  ---
415
415
 
416
+ ## humanlayer/skills
417
+
418
+ <https://github.com/humanlayer/skills> — MIT. Copyright (c) 2026 HumanLayer.
419
+
420
+ Tracked in `.agents/vendor-manifest.json` at pinned commit
421
+ `ca7c8088db69e315a8b2deea43820270457f8f3c`.
422
+
423
+ One skill is vendored as `skills/global_config/design-control-loop/`
424
+ (`SKILL.md` plus its 10 `references/` files, including the unmodified
425
+ `agent-iteration.ts` and `workflow-template.yml` templates). The upstream
426
+ `.claude-plugin/plugin.json` was not carried over.
427
+
428
+ AOS modifications, all in `SKILL.md` only: `category:`, `source:` and `license:`
429
+ added to the frontmatter; one delimited "AOS notes" section inserted directly
430
+ after the H1. Upstream prose and all `references/` files are byte-identical.
431
+
432
+ ```
433
+ MIT License
434
+
435
+ Copyright (c) 2026 HumanLayer
436
+
437
+ Permission is hereby granted, free of charge, to any person obtaining a copy
438
+ of this software and associated documentation files (the "Software"), to deal
439
+ in the Software without restriction, including without limitation the rights
440
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
441
+ copies of the Software, and to permit persons to whom the Software is
442
+ furnished to do so, subject to the following conditions:
443
+
444
+ The above copyright notice and this permission notice shall be included in all
445
+ copies or substantial portions of the Software.
446
+
447
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
448
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
449
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
450
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
451
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
452
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
453
+ SOFTWARE.
454
+ ```
455
+
456
+ ---
457
+
416
458
  ## Note on `mcps/`
417
459
 
418
460
  Sub-repositories vendored under `mcps/` carry their own `LICENSE` files in
419
461
  their own directories and are not restated here.
462
+
463
+ ---
464
+
465
+ ## scenario-labs/skills
466
+
467
+ - **Upstream:** <https://github.com/scenario-labs/skills>
468
+ - **License:** MIT
469
+ - **Copyright:** Copyright (c) 2026 Scenario
470
+ - **Pinned commit:** `5786accd3bb6d79808330230c698898862e8a1d4`
471
+
472
+ ### Store index (second AOS Store source)
473
+
474
+ The AOS Store lists a starter set of skills from this project through
475
+ `lib/scenario-store-index.json` (regenerated by
476
+ `scripts/build-scenario-store-index.mjs` from a local clone and the pinned
477
+ commit). The index holds metadata and a per-file SHA-256 list only. The files
478
+ are not vendored: they are downloaded from
479
+ `https://raw.githubusercontent.com/scenario-labs/skills/<pinned commit>/` on
480
+ demand, only after an explicit `--net` or UI confirmation, and each file is
481
+ verified against its SHA-256 before anything is written.
482
+
483
+ Some of these skills contain Python and C# scripts, one of which
484
+ (`scenario-unity-expert`) executes code received through a local channel
485
+ without authentication. The store and its UI mark this before installation.
486
+
487
+ The MIT license covers the software and documentation in that repository. The
488
+ Scenario name and logo are trademarks of their owner and are **not** licensed
489
+ by it; AOS does not use the logo.
490
+
491
+ ```
492
+ MIT License
493
+
494
+ Copyright (c) 2026 Scenario
495
+
496
+ Permission is hereby granted, free of charge, to any person obtaining a copy
497
+ of this software and associated documentation files (the "Software"), to deal
498
+ in the Software without restriction, including without limitation the rights
499
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
500
+ copies of the Software, and to permit persons to whom the Software is
501
+ furnished to do so, subject to the following conditions:
502
+
503
+ The above copyright notice and this permission notice shall be included in all
504
+ copies or substantial portions of the Software.
505
+
506
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
507
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
508
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
509
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
510
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
511
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
512
+ SOFTWARE.
513
+ ```
package/bin/aos-store.mjs CHANGED
@@ -1,15 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { createHash } from 'node:crypto';
4
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
5
- import { dirname, join, resolve } from 'node:path';
4
+ import { mkdirSync, writeFileSync } from 'node:fs';
5
+ import { dirname, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
- import { fetchSkillFiles, fileTargets, localAgents, localSkills, targetsFor as sharedTargetsFor, validateFiles, writeSkillFiles } from '../lib/store-shared.mjs';
7
+ import { fetchSkillFiles, fileTargets, findItem, installPlan, loadSources, localAgents, localSkills, planSkillFiles, planSummary, targetsFor as sharedTargetsFor, validateFiles, writePlan } from '../lib/store-shared.mjs';
8
8
 
9
9
  const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
10
- const INDEX_PATH = process.env.AOS_STORE_INDEX || join(ROOT, 'lib', 'ecc-store-index.json');
11
- const RAW_BASE = (process.env.AOS_STORE_RAW_BASE || 'https://raw.githubusercontent.com/affaan-m/ECC').replace(/\/+$/, '');
12
- const index = JSON.parse(readFileSync(INDEX_PATH, 'utf8'));
10
+ const sources = loadSources(ROOT);
13
11
  const args = process.argv.slice(2);
14
12
  const dryRun = args.includes('--dry-run');
15
13
  const project = args.includes('--project');
@@ -17,21 +15,9 @@ const net = args.includes('--net');
17
15
  const positional = args.filter((arg) => !arg.startsWith('--'));
18
16
  const option = (name) => args.find((arg) => arg === name || arg.startsWith(`${name}=`))?.split('=').slice(1).join('=');
19
17
 
20
- function loadIndex() {
21
- if (!index.pinned_commit || !index.skills || !index.subagents) throw new Error('Invalid AOS store index');
22
- return index;
23
- }
24
-
25
18
  function allItems(type) {
26
19
  const selected = type === 'agents' || type === 'subagents' ? 'subagents' : 'skills';
27
- return Object.entries(index[selected] || {}).map(([name, item]) => ({ name, item, type: selected }));
28
- }
29
-
30
- function findItem(name) {
31
- for (const type of ['skills', 'subagents']) {
32
- if (index[type]?.[name]) return { name, item: index[type][name], type };
33
- }
34
- return null;
20
+ return sources.flatMap((src) => Object.entries(src.index[selected] || {}).map(([name, item]) => ({ name, item, type: selected, src })));
35
21
  }
36
22
 
37
23
  const localSkillNames = () => new Set(localSkills(ROOT).keys());
@@ -42,15 +28,15 @@ function printItems(items) {
42
28
  console.log('No store items found.');
43
29
  return;
44
30
  }
45
- for (const { name, item, type } of items) {
31
+ for (const { name, item, type, src } of items) {
46
32
  const kind = type === 'skills' ? 'skill' : 'agent';
47
- console.log(`${kind}\t${name}\t${item.category}\t${item.description}`);
33
+ console.log(`${kind}\t${name}\t${item.category}\t${src.label}\t${item.description}`);
48
34
  }
49
35
  console.log(`\n${items.length} item(s).`);
50
36
  }
51
37
 
52
- async function download(upstreamPath) {
53
- const url = `${RAW_BASE}/${index.pinned_commit}/${upstreamPath}`;
38
+ async function download(src, upstreamPath) {
39
+ const url = `${src.raw_base}/${src.pinned_commit}/${upstreamPath}`;
54
40
  const response = await fetch(url, { headers: { 'user-agent': 'aos-store' } });
55
41
  if (!response.ok) throw new Error(`Download failed (${response.status}): ${url}`);
56
42
  return Buffer.from(await response.arrayBuffer());
@@ -60,42 +46,60 @@ const targetsFor = (type, name) => sharedTargetsFor(type, name, { project });
60
46
 
61
47
  async function install(name) {
62
48
  if (!/^[A-Za-z0-9_-]+$/.test(name)) throw new Error(`Invalid store name: ${name}`);
63
- const found = findItem(name);
49
+ const found = findItem(sources, name);
64
50
  if (!found) throw new Error(`Store item not found: ${name}`);
65
- const { item, type } = found;
51
+ const { type, src } = found;
66
52
  const coreNames = type === 'skills' ? localSkillNames() : localAgentNames();
67
53
  if (coreNames.has(name)) {
68
54
  console.log(`Skipped ${name}: AOS core already provides it.`);
69
55
  return;
70
56
  }
71
- const targets = targetsFor(type, name);
72
- const multi = type === 'skills' && item.files?.length > 1;
73
- if (multi) validateFiles(item.files);
57
+ const plan = installPlan(sources, found).filter((p) => !(p.type === 'skills' && p.name !== name && localSkillNames().has(p.name)));
58
+ for (const p of plan) if (p.item.files?.length > 1) validateFiles(p.item.files);
59
+ const multi = (p) => p.type === 'skills' && p.item.files?.length > 1;
60
+ const summary = planSummary(plan);
61
+ const notes = [];
62
+ if (summary.requires.length) notes.push(`also installs required skill(s): ${summary.requires.join(', ')}`);
63
+ if (summary.execBridge) notes.push(`WARNING: contains a script that executes code received over a local socket or file channel without authentication (${summary.execBridgeFiles.map((f) => `${f.skill}/${f.path}`).join(', ')}); install only if you use this bridge`);
64
+ else if (summary.hasScripts) notes.push(`WARNING: contains ${summary.scriptCount} script file(s); review before use`);
74
65
  if (dryRun) {
75
- for (const target of targets) {
76
- if (multi) for (const file of fileTargets(target, item.files)) console.log(`[dry-run] write ${file}`);
77
- else console.log(`[dry-run] write ${target}`);
66
+ for (const note of notes) console.log(note);
67
+ for (const p of plan) {
68
+ for (const target of targetsFor(p.type, p.name)) {
69
+ if (multi(p)) for (const file of fileTargets(target, p.item.files)) console.log(`[dry-run] write ${file}`);
70
+ else console.log(`[dry-run] write ${target}`);
71
+ }
78
72
  }
79
73
  return;
80
74
  }
81
75
  if (!net) {
82
76
  throw new Error(`Downloading '${name}' requires internet access to fetch from upstream GitHub. Pass --net to confirm: aos store install ${name} --net`);
83
77
  }
84
- if (multi) {
85
- const files = await fetchSkillFiles(RAW_BASE, index.pinned_commit, dirname(item.upstream_path), item.files);
86
- for (const target of targets) {
87
- const written = writeSkillFiles(target, files);
88
- console.log(`Installed ${name} (${written.length} files) -> ${dirname(target)}`);
78
+ // All-or-nothing: download, hash-check and path-check every skill in memory before the first write.
79
+ const writes = [];
80
+ for (const p of plan) {
81
+ const pSrc = p.src;
82
+ let files;
83
+ if (multi(p)) {
84
+ files = await fetchSkillFiles(pSrc.raw_base, pSrc.pinned_commit, dirname(p.item.upstream_path), p.item.files);
85
+ } else {
86
+ const content = await download(pSrc, p.item.upstream_path);
87
+ const digest = createHash('sha256').update(content).digest('hex');
88
+ if (digest !== p.item.sha256) throw new Error(`SHA-256 mismatch for ${p.name}: expected ${p.item.sha256}, got ${digest}`);
89
+ files = null;
90
+ for (const target of targetsFor(p.type, p.name)) writes.push({ name: p.name, single: { target, content } });
89
91
  }
90
- return;
92
+ if (files) for (const target of targetsFor(p.type, p.name)) writes.push({ name: p.name, target, plan: planSkillFiles(target, files) });
91
93
  }
92
- const content = await download(item.upstream_path);
93
- const digest = createHash('sha256').update(content).digest('hex');
94
- if (digest !== item.sha256) throw new Error(`SHA-256 mismatch for ${name}: expected ${item.sha256}, got ${digest}`);
95
- for (const target of targets) {
96
- mkdirSync(dirname(target), { recursive: true });
97
- writeFileSync(target, content);
98
- console.log(`Installed ${name} -> ${target}`);
94
+ for (const note of notes) console.log(note);
95
+ for (const w of writes) {
96
+ if (w.single) {
97
+ mkdirSync(dirname(w.single.target), { recursive: true });
98
+ writeFileSync(w.single.target, w.single.content);
99
+ console.log(`Installed ${w.name} -> ${w.single.target}`);
100
+ } else {
101
+ console.log(`Installed ${w.name} (${writePlan(w.plan).length} files) -> ${dirname(w.target)}`);
102
+ }
99
103
  }
100
104
  }
101
105
 
@@ -108,7 +112,6 @@ function usage() {
108
112
  }
109
113
 
110
114
  async function main() {
111
- loadIndex();
112
115
  const command = positional[0] || 'list';
113
116
  if (command === 'list') {
114
117
  printItems(allItems(option('--type') || 'skills'));