strray-ai 1.14.3 → 1.14.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 (120) hide show
  1. package/.opencode/plugins/strray-codex-injection.js +6 -0
  2. package/AGENTS-consumer.md +10 -14
  3. package/AGENTS.md +10 -14
  4. package/README.md +6 -8
  5. package/dist/agents/index.d.ts +1 -14
  6. package/dist/agents/index.d.ts.map +1 -1
  7. package/dist/agents/index.js +1 -27
  8. package/dist/agents/index.js.map +1 -1
  9. package/dist/cli/commands/antigravity-status.d.ts.map +1 -1
  10. package/dist/cli/commands/antigravity-status.js +40 -36
  11. package/dist/cli/commands/antigravity-status.js.map +1 -1
  12. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  13. package/dist/cli/commands/skill-install.js +65 -36
  14. package/dist/cli/commands/skill-install.js.map +1 -1
  15. package/dist/cli/commands/status.d.ts.map +1 -1
  16. package/dist/cli/commands/status.js +0 -1
  17. package/dist/cli/commands/status.js.map +1 -1
  18. package/dist/config/default-agents.d.ts.map +1 -1
  19. package/dist/config/default-agents.js +0 -169
  20. package/dist/config/default-agents.js.map +1 -1
  21. package/dist/delegation/agent-delegator.d.ts.map +1 -1
  22. package/dist/delegation/agent-delegator.js +0 -13
  23. package/dist/delegation/agent-delegator.js.map +1 -1
  24. package/dist/mcps/agent-resolver.d.ts.map +1 -1
  25. package/dist/mcps/agent-resolver.js +0 -5
  26. package/dist/mcps/agent-resolver.js.map +1 -1
  27. package/dist/mcps/config/server-config-registry.d.ts.map +1 -1
  28. package/dist/mcps/config/server-config-registry.js +1 -100
  29. package/dist/mcps/config/server-config-registry.js.map +1 -1
  30. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts.map +1 -1
  31. package/dist/mcps/knowledge-skills/skill-invocation.server.js +3 -15
  32. package/dist/mcps/knowledge-skills/skill-invocation.server.js.map +1 -1
  33. package/dist/mcps/mcp-client.d.ts.map +1 -1
  34. package/dist/mcps/mcp-client.js +0 -15
  35. package/dist/mcps/mcp-client.js.map +1 -1
  36. package/dist/mcps/orchestrator/config/agent-capabilities.d.ts.map +1 -1
  37. package/dist/mcps/orchestrator/config/agent-capabilities.js +0 -5
  38. package/dist/mcps/orchestrator/config/agent-capabilities.js.map +1 -1
  39. package/dist/mcps/simulation/index.d.ts +1 -1
  40. package/dist/mcps/simulation/index.d.ts.map +1 -1
  41. package/dist/mcps/simulation/index.js +1 -1
  42. package/dist/mcps/simulation/index.js.map +1 -1
  43. package/dist/mcps/simulation/server-simulations.d.ts +0 -7
  44. package/dist/mcps/simulation/server-simulations.d.ts.map +1 -1
  45. package/dist/mcps/simulation/server-simulations.js +0 -59
  46. package/dist/mcps/simulation/server-simulations.js.map +1 -1
  47. package/dist/orchestrator/agent-spawn-governor.d.ts.map +1 -1
  48. package/dist/orchestrator/agent-spawn-governor.js +1 -5
  49. package/dist/orchestrator/agent-spawn-governor.js.map +1 -1
  50. package/dist/orchestrator/multi-agent-orchestration-coordinator.d.ts.map +1 -1
  51. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +2 -21
  52. package/dist/orchestrator/multi-agent-orchestration-coordinator.js.map +1 -1
  53. package/dist/plugin/strray-codex-injection.d.ts.map +1 -1
  54. package/dist/plugin/strray-codex-injection.js +6 -0
  55. package/dist/plugin/strray-codex-injection.js.map +1 -1
  56. package/dist/processors/agents-md-validation-processor.d.ts.map +1 -1
  57. package/dist/processors/agents-md-validation-processor.js +7 -22
  58. package/dist/processors/agents-md-validation-processor.js.map +1 -1
  59. package/opencode.json +0 -70
  60. package/package.json +1 -1
  61. package/scripts/node/README.md +1 -1
  62. package/scripts/node/postinstall.cjs +16 -6
  63. package/scripts/node/universal-version-manager.js +2 -2
  64. package/scripts/node/version-manager.mjs +3 -2
  65. package/src/skills/api-design/SKILL.md +1 -0
  66. package/src/skills/architect-tools/SKILL.md +1 -0
  67. package/src/skills/architecture-patterns/SKILL.md +1 -0
  68. package/src/skills/auto-format/SKILL.md +1 -0
  69. package/src/skills/backend-engineer/SKILL.md +49 -0
  70. package/src/skills/boot-orchestrator/SKILL.md +1 -0
  71. package/src/skills/bug-triage/SKILL.md +1 -0
  72. package/src/skills/code-analyzer/SKILL.md +1 -0
  73. package/src/skills/code-review/SKILL.md +1 -0
  74. package/src/skills/content-creator/SKILL.md +38 -0
  75. package/src/skills/database-engineer/SKILL.md +46 -0
  76. package/src/skills/devops-engineer/SKILL.md +49 -0
  77. package/src/skills/enforcer/SKILL.md +1 -0
  78. package/src/skills/framework-compliance-audit/SKILL.md +1 -0
  79. package/src/skills/frontend-engineer/SKILL.md +49 -0
  80. package/src/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  81. package/src/skills/git-workflow/SKILL.md +1 -0
  82. package/src/skills/growth-strategist/SKILL.md +48 -0
  83. package/src/skills/inference-improve/SKILL.md +1 -0
  84. package/src/skills/lint/SKILL.md +1 -0
  85. package/src/skills/log-monitor/SKILL.md +1 -0
  86. package/src/skills/mobile-developer/SKILL.md +42 -0
  87. package/src/skills/model-health-check/SKILL.md +1 -0
  88. package/src/skills/multimodal-looker/SKILL.md +1 -0
  89. package/src/skills/orchestrator/SKILL.md +1 -0
  90. package/src/skills/performance-analysis/SKILL.md +1 -0
  91. package/src/skills/performance-engineer/SKILL.md +41 -0
  92. package/src/skills/performance-optimization/SKILL.md +1 -0
  93. package/src/skills/processor-pipeline/SKILL.md +1 -0
  94. package/src/skills/project-analysis/SKILL.md +1 -0
  95. package/src/skills/refactoring-strategies/SKILL.md +1 -0
  96. package/src/skills/researcher/SKILL.md +1 -0
  97. package/src/skills/security-audit/SKILL.md +1 -0
  98. package/src/skills/security-scan/SKILL.md +1 -0
  99. package/src/skills/seo-consultant/SKILL.md +43 -0
  100. package/src/skills/session-management/SKILL.md +1 -0
  101. package/src/skills/state-manager/SKILL.md +1 -0
  102. package/src/skills/storyteller/SKILL.md +130 -0
  103. package/src/skills/strategist/SKILL.md +32 -0
  104. package/src/skills/tech-writer/SKILL.md +37 -0
  105. package/src/skills/testing-best-practices/SKILL.md +1 -0
  106. package/src/skills/testing-strategy/SKILL.md +1 -0
  107. package/src/skills/ui-ux-design/SKILL.md +1 -0
  108. package/.opencode/agents/backend-engineer.yml +0 -88
  109. package/.opencode/agents/content-creator.yml +0 -46
  110. package/.opencode/agents/database-engineer.yml +0 -47
  111. package/.opencode/agents/devops-engineer.yml +0 -57
  112. package/.opencode/agents/frontend-engineer.yml +0 -89
  113. package/.opencode/agents/growth-strategist.yml +0 -46
  114. package/.opencode/agents/mobile-developer.yml +0 -47
  115. package/.opencode/agents/multimodal-looker.yml +0 -103
  116. package/.opencode/agents/performance-engineer.yml +0 -56
  117. package/.opencode/agents/seo-consultant.yml +0 -46
  118. package/.opencode/agents/storyteller.yml +0 -1140
  119. package/.opencode/agents/strategist.yml +0 -103
  120. package/.opencode/agents/tech-writer.yml +0 -84
@@ -602,6 +602,12 @@ export default async function strrayCodexPlugin(input) {
602
602
  priority: 20,
603
603
  enabled: true,
604
604
  });
605
+ processorManager.registerProcessor({
606
+ name: "agentsMdValidation",
607
+ type: "post",
608
+ priority: 30,
609
+ enabled: true,
610
+ });
605
611
  // Store for future use
606
612
  stateManager.set("processor:manager", processorManager);
607
613
  logger.log("✅ Processors registered successfully");
@@ -104,22 +104,19 @@ StringRay uses **two reflection folders** for different purposes:
104
104
  | Quick learning/insight | `docs/reflections/` |
105
105
  | Deep investigation with many discoveries | `docs/reflections/deep/` |
106
106
 
107
- ### Storyteller Story Types
107
+ ### Storyteller Skill (formerly @storyteller agent)
108
108
 
109
- The `@storyteller` agent supports multiple story types:
109
+ The storyteller is now a **skill** (not an agent) so it runs with full session context. Invoke it by asking for a reflection/narrative in your current session:
110
110
 
111
- | Type | Description | Template Path | Invoke |
112
- |------|-------------|---------------|--------|
113
- | `reflection` | Technical deep reflections on development process | `docs/reflections/TEMPLATE.md` | `@storyteller write a reflection about X` |
114
- | `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` | `@storyteller write a saga about X` |
115
- | `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` | `@storyteller write a journey about X` |
116
- | `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` | `@storyteller write a narrative about X` |
117
- | `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` | `@storyteller write a deep reflection about X` |
111
+ | Type | Description | Template Path | How to Invoke |
112
+ |------|-------------|---------------|---------------|
113
+ | `reflection` | Technical deep reflections on development process | `docs/reflections/TEMPLATE.md` | "write a reflection about X" |
114
+ | `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` | "write a saga about X" |
115
+ | `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` | "write a journey about X" |
116
+ | `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` | "write a narrative about X" |
117
+ | `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` | "write a deep reflection about X" |
118
118
 
119
- **Example:**
120
- ```
121
- @storyteller write a reflection about fixing the memory leak
122
- ```
119
+ **Why a skill?** As an agent, @storyteller spawned fresh with zero context and wasted tokens reconstructing what just happened. As a skill, it uses the conversation you are already in -- the LLM knows exactly what occurred.
123
120
 
124
121
  ## Available Agents
125
122
 
@@ -133,7 +130,6 @@ The `@storyteller` agent supports multiple story types:
133
130
  | `@refactorer` | Technical debt elimination | `@refactorer optimize code` |
134
131
  | `@testing-lead` | Testing strategy | `@testing-lead plan tests` |
135
132
  | `@bug-triage-specialist` | Error investigation | `@bug-triage-specialist debug error` |
136
- | `@storyteller` | Narrative deep reflections | `@storyteller write a journey` |
137
133
  | `@researcher` | Codebase exploration | `@researcher find implementation` |
138
134
 
139
135
 
package/AGENTS.md CHANGED
@@ -104,22 +104,19 @@ StringRay uses **two reflection folders** for different purposes:
104
104
  | Quick learning/insight | `docs/reflections/` |
105
105
  | Deep investigation with many discoveries | `docs/reflections/deep/` |
106
106
 
107
- ### Storyteller Story Types
107
+ ### Storyteller Skill (formerly @storyteller agent)
108
108
 
109
- The `@storyteller` agent supports multiple story types:
109
+ The storyteller is now a **skill** (not an agent) so it runs with full session context. Invoke it by asking for a reflection/narrative in your current session:
110
110
 
111
- | Type | Description | Template Path | Invoke |
112
- |------|-------------|---------------|--------|
113
- | `reflection` | Technical deep reflections on development process | `docs/reflections/TEMPLATE.md` | `@storyteller write a reflection about X` |
114
- | `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` | `@storyteller write a saga about X` |
115
- | `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` | `@storyteller write a journey about X` |
116
- | `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` | `@storyteller write a narrative about X` |
117
- | `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` | `@storyteller write a deep reflection about X` |
111
+ | Type | Description | Template Path | How to Invoke |
112
+ |------|-------------|---------------|---------------|
113
+ | `reflection` | Technical deep reflections on development process | `docs/reflections/TEMPLATE.md` | "write a reflection about X" |
114
+ | `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` | "write a saga about X" |
115
+ | `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` | "write a journey about X" |
116
+ | `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` | "write a narrative about X" |
117
+ | `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` | "write a deep reflection about X" |
118
118
 
119
- **Example:**
120
- ```
121
- @storyteller write a reflection about fixing the memory leak
122
- ```
119
+ **Why a skill?** As an agent, @storyteller spawned fresh with zero context and wasted tokens reconstructing what just happened. As a skill, it uses the conversation you are already in -- the LLM knows exactly what occurred.
123
120
 
124
121
  ## Available Agents
125
122
 
@@ -133,7 +130,6 @@ The `@storyteller` agent supports multiple story types:
133
130
  | `@refactorer` | Technical debt elimination | `@refactorer optimize code` |
134
131
  | `@testing-lead` | Testing strategy | `@testing-lead plan tests` |
135
132
  | `@bug-triage-specialist` | Error investigation | `@bug-triage-specialist debug error` |
136
- | `@storyteller` | Narrative deep reflections | `@storyteller write a journey` |
137
133
  | `@researcher` | Codebase exploration | `@researcher find implementation` |
138
134
 
139
135
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Enterprise AI Orchestration Framework for OpenCode/Claude Code**
4
4
 
5
- [![Version](https://img.shields.io/badge/version-1.14.3-blue?style=flat-square)](https://npmjs.com/package/strray-ai)
5
+ [![Version](https://img.shields.io/badge/version-1.14.4-blue?style=flat-square)](https://npmjs.com/package/strray-ai)
6
6
  [![License](https://img.shields.io/badge/license-MIT-green?style=flat-square)](LICENSE)
7
7
  [![Tests](https://img.shields.io/badge/tests-2368%20passed-brightgreen?style=flat-square)](src/__tests__)
8
8
  [![GitHub stars](https://img.shields.io/github/stars/htafolla/stringray?style=social)](https://github.com/htafolla/stringray)
@@ -47,16 +47,16 @@ npm install strray-ai
47
47
 
48
48
  **What happens during install?**
49
49
  - Copies OpenCode configuration files to your project
50
- - Configures 26 agents with proper capabilities
50
+ - Configures 13 agents with proper capabilities
51
51
  - Sets up Codex enforcement rules
52
52
  - Enables webhook triggers for CI/CD integration
53
53
  - Ready to use with Claude Code immediately
54
54
 
55
55
  ## ✨ Features
56
56
 
57
- - **🤖 26 Specialized Agents** - From code review to mobile development
57
+ - **🤖 13 Specialized Agents** - Autonomous agents that read/write code, run commands, and enforce compliance
58
58
  - **📏 99.6% Error Prevention** - Universal Development Codex (60 terms)
59
- - **⚡ 30 Framework Skills** + 10 curated community sources (170+ additional skills available)
59
+ - **⚡ 43 Framework Skills** + 10 curated community sources (170+ additional skills available)
60
60
  - **🛡️ Enterprise Security** - Comprehensive validation and scanning
61
61
  - **📦 Skills Registry** - Browse and install community skills from GitHub repos
62
62
  - **🔄 Complexity-Based Routing** - Intelligent task delegation
@@ -75,13 +75,11 @@ npm install strray-ai
75
75
  | `@refactorer` | Technical debt elimination |
76
76
  | `@testing-lead` | Testing strategy & coverage |
77
77
  | `@bug-triage-specialist` | Error investigation |
78
- | `@storyteller` | Narrative deep reflections |
79
78
  | `@researcher` | Codebase exploration |
80
- | `@mobile-developer` | iOS/Android/React Native/Flutter |
81
79
 
82
80
  > **Note:** StringRay auto-configures all agents during installation. To customize agent settings, see the [Agent Configuration Guide](https://github.com/htafolla/stringray/blob/main/docs/AGENT_CONFIG.md).
83
81
 
84
- [View all 26 agents →](https://github.com/htafolla/stringray/blob/main/AGENTS.md)
82
+ [View all 13 agents →](https://github.com/htafolla/stringray/blob/main/AGENTS.md)
85
83
 
86
84
  ## 📦 OpenClaw Integration
87
85
 
@@ -256,7 +254,7 @@ stringray/
256
254
  │ ├── validation/ # Agent config & estimation validators
257
255
  │ └── jobs/ # Background job management
258
256
  ├── .opencode/ # OpenCode configuration
259
- │ ├── agents/ # Agent configs (26 agents)
257
+ │ ├── agents/ # Agent configs (13 agents)
260
258
  │ ├── strray/ # StringRay config
261
259
  │ │ ├── codex.json # 60-term development codex
262
260
  │ │ ├── features.json # Feature flags
@@ -9,20 +9,7 @@ import { refactorer } from "./refactorer.js";
9
9
  import { testingLead } from "./testing-lead.js";
10
10
  import { logMonitorAgent } from "./log-monitor.js";
11
11
  import { researcher } from "./researcher.js";
12
- import { multimodalLooker } from "./multimodal-looker.js";
13
12
  import { analyzer } from "./analyzer.js";
14
- import { seoSpecialist } from "./seo-consultant.js";
15
- import { seoCopywriter } from "./content-creator.js";
16
- import { marketingExpert } from "./growth-strategist.js";
17
- import { databaseEngineer } from "./database-engineer.js";
18
- import { devopsEngineer } from "./devops-engineer.js";
19
- import { backendEngineer } from "./backend-engineer.js";
20
- import { frontendEngineer } from "./frontend-engineer.js";
21
- import { frontendUiUxEngineer } from "./frontend-ui-ux-engineer.js";
22
- import { documentationWriter } from "./tech-writer.js";
23
- import { performanceEngineer } from "./performance-engineer.js";
24
- import { mobileDeveloper } from "./mobile-developer.js";
25
- import { strategist } from "./strategist.js";
26
13
  export declare const builtinAgents: Record<string, AgentConfig>;
27
- export { enforcer, architect, orchestrator, bugTriageSpecialist, codeReviewer, securityAuditor, refactorer, testingLead, logMonitorAgent, researcher, multimodalLooker, analyzer, seoSpecialist, seoCopywriter, marketingExpert, databaseEngineer, devopsEngineer, backendEngineer, frontendEngineer, frontendUiUxEngineer, documentationWriter, performanceEngineer, mobileDeveloper, strategist, };
14
+ export { enforcer, architect, orchestrator, bugTriageSpecialist, codeReviewer, securityAuditor, refactorer, testingLead, logMonitorAgent, researcher, analyzer, };
28
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyBrD,CAAC;AAEF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,UAAU,GACX,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAYrD,CAAC;AAEF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,GACT,CAAC"}
@@ -8,20 +8,7 @@ import { refactorer } from "./refactorer.js";
8
8
  import { testingLead } from "./testing-lead.js";
9
9
  import { logMonitorAgent } from "./log-monitor.js";
10
10
  import { researcher } from "./researcher.js";
11
- import { multimodalLooker } from "./multimodal-looker.js";
12
11
  import { analyzer } from "./analyzer.js";
13
- import { seoSpecialist } from "./seo-consultant.js";
14
- import { seoCopywriter } from "./content-creator.js";
15
- import { marketingExpert } from "./growth-strategist.js";
16
- import { databaseEngineer } from "./database-engineer.js";
17
- import { devopsEngineer } from "./devops-engineer.js";
18
- import { backendEngineer } from "./backend-engineer.js";
19
- import { frontendEngineer } from "./frontend-engineer.js";
20
- import { frontendUiUxEngineer } from "./frontend-ui-ux-engineer.js";
21
- import { documentationWriter } from "./tech-writer.js";
22
- import { performanceEngineer } from "./performance-engineer.js";
23
- import { mobileDeveloper } from "./mobile-developer.js";
24
- import { strategist } from "./strategist.js";
25
12
  export const builtinAgents = {
26
13
  enforcer,
27
14
  architect,
@@ -33,20 +20,7 @@ export const builtinAgents = {
33
20
  "testing-lead": testingLead,
34
21
  "log-monitor": logMonitorAgent,
35
22
  researcher,
36
- "multimodal-looker": multimodalLooker,
37
23
  "code-analyzer": analyzer,
38
- "seo-consultant": seoSpecialist,
39
- "content-creator": seoCopywriter,
40
- "growth-strategist": marketingExpert,
41
- "database-engineer": databaseEngineer,
42
- "devops-engineer": devopsEngineer,
43
- "backend-engineer": backendEngineer,
44
- "frontend-engineer": frontendEngineer,
45
- "frontend-ui-ux-engineer": frontendUiUxEngineer,
46
- "tech-writer": documentationWriter,
47
- "performance-engineer": performanceEngineer,
48
- "mobile-developer": mobileDeveloper,
49
- strategist,
50
24
  };
51
- export { enforcer, architect, orchestrator, bugTriageSpecialist, codeReviewer, securityAuditor, refactorer, testingLead, logMonitorAgent, researcher, multimodalLooker, analyzer, seoSpecialist, seoCopywriter, marketingExpert, databaseEngineer, devopsEngineer, backendEngineer, frontendEngineer, frontendUiUxEngineer, documentationWriter, performanceEngineer, mobileDeveloper, strategist, };
25
+ export { enforcer, architect, orchestrator, bugTriageSpecialist, codeReviewer, securityAuditor, refactorer, testingLead, logMonitorAgent, researcher, analyzer, };
52
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,uBAAuB,EAAE,mBAAmB;IAC5C,eAAe,EAAE,YAAY;IAC7B,kBAAkB,EAAE,eAAe;IACnC,UAAU;IACV,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,eAAe;IAC9B,UAAU;IACV,mBAAmB,EAAE,gBAAgB;IACrC,eAAe,EAAE,QAAQ;IACzB,gBAAgB,EAAE,aAAa;IAC/B,iBAAiB,EAAE,aAAa;IAChC,mBAAmB,EAAE,eAAe;IACpC,mBAAmB,EAAE,gBAAgB;IACrC,iBAAiB,EAAE,cAAc;IACjC,kBAAkB,EAAE,eAAe;IACnC,mBAAmB,EAAE,gBAAgB;IACrC,yBAAyB,EAAE,oBAAoB;IAC/C,aAAa,EAAE,mBAAmB;IAClC,sBAAsB,EAAE,mBAAmB;IAC3C,kBAAkB,EAAE,eAAe;IACnC,UAAU;CACX,CAAC;AAEF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,UAAU,GACX,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,uBAAuB,EAAE,mBAAmB;IAC5C,eAAe,EAAE,YAAY;IAC7B,kBAAkB,EAAE,eAAe;IACnC,UAAU;IACV,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,eAAe;IAC9B,UAAU;IACV,eAAe,EAAE,QAAQ;CAC1B,CAAC;AAEF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,GACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"antigravity-status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/antigravity-status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmEH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyD9D;AAED,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"antigravity-status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/antigravity-status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyEH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoD9D;AAED,eAAe,wBAAwB,CAAC"}
@@ -20,12 +20,16 @@ function getSkillsFromSkills(cwd) {
20
20
  for (const dir of dirs) {
21
21
  const skillPath = join(skillsPath, dir, "SKILL.md");
22
22
  const content = readFileSync(skillPath, "utf-8");
23
- const sourceMatch = content.match(/source:\s*(.+)/i);
24
- const licenseMatch = content.match(/(?:license|attribution):\s*\[([^\]]+)\]|\b(MIT|Apache|GPL|BSD)\b/i);
23
+ const sourceMatch = content.match(/^source:\s*(.+)/m);
24
+ const sourceNameMatch = content.match(/^source_name:\s*(.+)/m);
25
+ const licenseMatch = content.match(/License:\s*(.+)/m);
26
+ const rawName = dir.includes("--") ? dir.split("--").slice(1).join("--") : dir;
27
+ const communitySource = sourceNameMatch ? sourceNameMatch[1].trim() : null;
25
28
  skills.push({
26
- name: dir,
29
+ name: rawName,
27
30
  source: sourceMatch && sourceMatch[1] ? sourceMatch[1].trim() : "custom",
28
- license: licenseMatch ? (licenseMatch[1] || licenseMatch[2] || "unknown") : "unknown",
31
+ communitySource,
32
+ license: licenseMatch ? licenseMatch[1].trim() : "unknown",
29
33
  category: extractCategory(content),
30
34
  path: skillPath,
31
35
  });
@@ -54,48 +58,48 @@ function extractCategory(content) {
54
58
  export async function antigravityStatusCommand() {
55
59
  const cwd = process.cwd();
56
60
  const skills = getSkillsFromSkills(cwd);
57
- const skillsByCategory = skills.reduce((acc, skill) => {
58
- if (!acc[skill.category]) {
59
- acc[skill.category] = [];
60
- }
61
- acc[skill.category].push(skill);
61
+ const frameworkSkills = skills.filter((s) => s.source === "framework");
62
+ const communitySkills = skills.filter((s) => s.source === "community");
63
+ const communityBySource = communitySkills.reduce((acc, skill) => {
64
+ const key = skill.communitySource || "unknown";
65
+ if (!acc[key])
66
+ acc[key] = [];
67
+ acc[key].push(skill);
62
68
  return acc;
63
69
  }, {});
64
- const licenseCounts = {};
65
- skills.forEach((skill) => {
66
- const license = skill.license.toUpperCase();
67
- licenseCounts[license] = (licenseCounts[license] || 0) + 1;
68
- });
69
70
  console.log("");
70
71
  console.log("╔══════════════════════════════════════════════════╗");
71
72
  console.log("║ Installed Skills Status ║");
72
73
  console.log("╚══════════════════════════════════════════════════╝");
73
74
  console.log("");
74
- console.log(`Total Skills: ${skills.length}`);
75
- console.log(`Categories: ${Object.keys(skillsByCategory).length}`);
75
+ console.log(`Framework Skills: ${frameworkSkills.length}`);
76
+ console.log(`Community Skills: ${communitySkills.length} (from ${Object.keys(communityBySource).length} sources)`);
77
+ console.log(`Total: ${skills.length}`);
76
78
  console.log("");
77
- if (Object.keys(licenseCounts).length > 0) {
78
- console.log("Licenses:");
79
- Object.entries(licenseCounts).forEach(([license, count]) => {
80
- console.log(` - ${license}: ${count} skill${count > 1 ? "s" : ""}`);
81
- });
82
- console.log("");
83
- }
84
- console.log("Skills by Category:");
79
+ console.log("── Framework Skills ──");
85
80
  console.log("");
86
- Object.entries(skillsByCategory)
87
- .sort(([a], [b]) => a.localeCompare(b))
88
- .forEach(([category, categorySkills]) => {
89
- console.log(` ${category.toUpperCase()} (${categorySkills.length})`);
90
- categorySkills
91
- .sort((a, b) => a.name.localeCompare(b.name))
92
- .forEach((skill) => {
93
- const licenseBadge = skill.license.toUpperCase().substring(0, 3);
94
- const source = skill.source !== "unknown" ? skill.source : "custom";
95
- console.log(` - ${skill.name} [${licenseBadge}] (${source})`);
96
- });
97
- console.log("");
81
+ frameworkSkills
82
+ .sort((a, b) => a.name.localeCompare(b.name))
83
+ .forEach((skill) => {
84
+ console.log(` ${skill.name}`);
98
85
  });
86
+ console.log("");
87
+ if (Object.keys(communityBySource).length > 0) {
88
+ console.log("── Community Skills (by source) ──");
89
+ console.log("");
90
+ Object.entries(communityBySource)
91
+ .sort(([a], [b]) => a.localeCompare(b))
92
+ .forEach(([source, sourceSkills]) => {
93
+ console.log(` ${source} (${sourceSkills.length})`);
94
+ sourceSkills
95
+ .sort((a, b) => a.name.localeCompare(b.name))
96
+ .forEach((skill) => {
97
+ const licenseBadge = skill.license.toUpperCase().substring(0, 3);
98
+ console.log(` - ${skill.name} [${licenseBadge}]`);
99
+ });
100
+ console.log("");
101
+ });
102
+ }
99
103
  console.log("-".repeat(50));
100
104
  }
101
105
  export default antigravityStatusCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"antigravity-status.js","sourceRoot":"","sources":["../../../src/cli/commands/antigravity-status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"antigravity-status.js","sourceRoot":"","sources":["../../../src/cli/commands/antigravity-status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill-install.ts"],"names":[],"mappings":"AAsLA,wBAAsB,mBAAmB,CACvC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiFf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Ff"}
1
+ {"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill-install.ts"],"names":[],"mappings":"AAsMA,wBAAsB,mBAAmB,CACvC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CA+Ff;AAED,wBAAsB,oBAAoB,CACxC,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Ff"}
@@ -1,4 +1,4 @@
1
- import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, cpSync } from "fs";
1
+ import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync, cpSync, rmSync } from "fs";
2
2
  import { join, basename, dirname } from "path";
3
3
  import { execSync } from "child_process";
4
4
  function getLocalRegistryPath() {
@@ -36,10 +36,30 @@ function getRegistry() {
36
36
  function findSource(name) {
37
37
  return getRegistry().sources.find((s) => s.name === name || s.url === name);
38
38
  }
39
+ function resolveSourcePrefix(sourceArg, source) {
40
+ if (source?.name)
41
+ return source.name;
42
+ const match = sourceArg.match(/\/([^/]+?)(?:\.git)?$/);
43
+ return match?.[1] ?? sourceArg.replace(/[^a-zA-Z0-9-]/g, "-");
44
+ }
45
+ function cleanSourceSkills(skillsDir, sourcePrefix) {
46
+ let removed = 0;
47
+ const prefix = `${sourcePrefix}--`;
48
+ if (!existsSync(skillsDir))
49
+ return 0;
50
+ for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
51
+ if (entry.isDirectory() && entry.name.startsWith(prefix)) {
52
+ rmSync(join(skillsDir, entry.name), { recursive: true });
53
+ removed++;
54
+ }
55
+ }
56
+ return removed;
57
+ }
39
58
  function cloneRepo(url, targetDir) {
40
- if (!existsSync(targetDir)) {
41
- execSync(`git clone --depth 1 ${url} "${targetDir}"`, { stdio: "pipe" });
59
+ if (existsSync(targetDir)) {
60
+ rmSync(targetDir, { recursive: true });
42
61
  }
62
+ execSync(`git clone --depth 1 ${url} "${targetDir}"`, { stdio: "pipe" });
43
63
  }
44
64
  function detectFormat(repoDir) {
45
65
  if (existsSync(join(repoDir, "skills"))) {
@@ -81,22 +101,20 @@ function extractFrontmatter(content) {
81
101
  body,
82
102
  };
83
103
  }
84
- function installSkillFolders(sourceRoot, skillsDir, sourceUrl, license) {
104
+ function installSkillFolders(sourceRoot, skillsDir, sourcePrefix, sourceUrl, license) {
85
105
  let count = 0;
86
106
  const dirs = readdirSync(sourceRoot, { withFileTypes: true }).filter((d) => d.isDirectory());
87
107
  for (const d of dirs) {
88
108
  const skillMd = join(sourceRoot, d.name, "SKILL.md");
89
109
  if (!existsSync(skillMd))
90
110
  continue;
91
- const destDir = join(skillsDir, d.name);
92
- if (existsSync(destDir))
93
- continue;
94
111
  const { name, description, body } = extractFrontmatter(readFileSync(skillMd, "utf-8"));
95
112
  const finalName = name || d.name;
96
113
  const finalDesc = description;
114
+ const destDir = join(skillsDir, `${sourcePrefix}--${d.name}`);
97
115
  mkdirSync(destDir, { recursive: true });
98
116
  if (finalName && finalDesc) {
99
- writeFileSync(join(destDir, "SKILL.md"), `---\nname: ${finalName}\ndescription: ${finalDesc}\nsource: community\nattribution: |\n Originally from ${sourceUrl}\n License: ${license || "unknown"}\n---\n\n${body}\n`);
117
+ writeFileSync(join(destDir, "SKILL.md"), `---\nname: ${finalName}\ndescription: ${finalDesc}\nsource: community\nsource_name: ${sourcePrefix}\nattribution: |\n Originally from ${sourceUrl}\n License: ${license || "unknown"}\n---\n\n${body}\n`);
100
118
  }
101
119
  else {
102
120
  cpSync(skillMd, join(destDir, "SKILL.md"));
@@ -115,7 +133,7 @@ function installSkillFolders(sourceRoot, skillsDir, sourceUrl, license) {
115
133
  }
116
134
  return count;
117
135
  }
118
- function installFlatMd(repoDir, skillsDir, sourceUrl, license) {
136
+ function installFlatMd(repoDir, skillsDir, sourcePrefix, sourceUrl, license) {
119
137
  let count = 0;
120
138
  const subdirs = readdirSync(repoDir, { withFileTypes: true })
121
139
  .filter((d) => d.isDirectory() && !d.name.startsWith(".") && d.name !== "integrations" && d.name !== "examples" && d.name !== "scripts" && d.name !== "node_modules");
@@ -133,11 +151,9 @@ function installFlatMd(repoDir, skillsDir, sourceUrl, license) {
133
151
  slug = slug.slice(prefixMatch[0].length);
134
152
  if (!slug)
135
153
  continue;
136
- const destDir = join(skillsDir, slug);
137
- if (existsSync(destDir))
138
- continue;
154
+ const destDir = join(skillsDir, `${sourcePrefix}--${slug}`);
139
155
  mkdirSync(destDir, { recursive: true });
140
- writeFileSync(join(destDir, "SKILL.md"), `---\nname: ${name}\ndescription: ${description}\nsource: community\nattribution: |\n Originally from ${sourceUrl}\n License: ${license || "unknown"}\n---\n\n${body}\n`);
156
+ writeFileSync(join(destDir, "SKILL.md"), `---\nname: ${name}\ndescription: ${description}\nsource: community\nsource_name: ${sourcePrefix}\nattribution: |\n Originally from ${sourceUrl}\n License: ${license || "unknown"}\n---\n\n${body}\n`);
141
157
  count++;
142
158
  }
143
159
  }
@@ -149,37 +165,40 @@ export async function skillInstallCommand(sourceArg, options) {
149
165
  if (!sourceArg) {
150
166
  console.log("\n Recommended Starter Packs");
151
167
  console.log(" ────────────────────────\n");
152
- console.log(" Minimal Viable Power (3 skills):");
168
+ console.log(" Minimal Viable Power (3 sources):");
153
169
  console.log(" npx strray-ai skill:install superpowers");
154
170
  console.log(" npx strray-ai skill:install anthropic-skills");
155
171
  console.log(" npx strray-ai skill:install ui-ux-pro-max");
156
172
  console.log(" → 80% of daily gains for most devs\n");
157
- console.log(" Full Pro Setup (5 skills):");
173
+ console.log(" Full Pro Setup (5 sources):");
158
174
  console.log(" npx strray-ai skill:install superpowers");
159
175
  console.log(" npx strray-ai skill:install anthropic-skills");
160
176
  console.log(" npx strray-ai skill:install antigravity");
161
- console.log(" npx strray-ai skill:install ui-ux-pro-max");
162
177
  console.log(" npx strray-ai skill:install impeccable");
178
+ console.log(" npx strray-ai skill:install ui-ux-pro-max");
163
179
  console.log(" → The current meta for power users\n");
164
- console.log(" Agency / Team Mode (4 skills):");
180
+ console.log(" Agency / Team Mode (4 sources):");
165
181
  console.log(" npx strray-ai skill:install agency-agents");
166
182
  console.log(" npx strray-ai skill:install superpowers");
167
183
  console.log(" npx strray-ai skill:install antigravity");
168
184
  console.log(" npx strray-ai skill:install ui-ux-pro-max");
169
185
  console.log();
170
- console.log(" Add specialized skills as needed:");
171
- console.log(" SEO → npx strray-ai skill:install claude-seo");
172
- console.log(" Web3 → npx strray-ai skill:install ai-web3-security");
173
- console.log(" Vue → npx strray-ai skill:install vuejs-nuxt");
174
- console.log(" Gemini → npx strray-ai skill:install gemini-skills");
175
- console.log(" Gemini → npx strray-ai skill:install minimax");
186
+ console.log(" Add specialized sources as needed:");
187
+ console.log(" Web3 → npx strray-ai skill:install ai-web3-security");
188
+ console.log(" Vue → npx strray-ai skill:install vuejs-nuxt");
189
+ console.log(" Gemini → npx strray-ai skill:install gemini-skills");
190
+ console.log(" MiniMax → npx strray-ai skill:install minimax");
191
+ console.log();
192
+ console.log(" Re-install to update community skills:");
193
+ console.log(" npx strray-ai skill:install <source-name> # removes old, installs fresh");
176
194
  console.log();
177
195
  console.log(" Available sources:\n");
178
196
  for (const s of registry.sources) {
179
- console.log(` ${s.name.padEnd(20)} ${s.description || s.url}`);
180
- console.log(` ${"".padEnd(20)} ${s.url}`);
181
- if (s.license)
182
- console.log(` ${"".padEnd(20)} License: ${s.license}`);
197
+ const installed = existsSync(join(skillsDir, `${s.name}--`));
198
+ console.log(` ${s.name.padEnd(22)} [${installed ? "installed" : "available"}] ${s.license ? `(${s.license})` : ""}`);
199
+ console.log(` ${"".padEnd(22)} ${s.url}`);
200
+ if (s.description)
201
+ console.log(` ${"".padEnd(22)} ${s.description}`);
183
202
  console.log();
184
203
  }
185
204
  console.log(" Usage:");
@@ -187,13 +206,20 @@ export async function skillInstallCommand(sourceArg, options) {
187
206
  console.log(" npx strray-ai skill:install <github-url>");
188
207
  console.log(" npx strray-ai skill:install <url> --path <subdir>");
189
208
  console.log();
190
- console.log(" Formats auto-detected: SKILL.md folders, flat .md with frontmatter");
209
+ console.log(" Community skills are namespaced (e.g., agency-agents--code-review)");
210
+ console.log(" Framework skills are never overwritten.");
211
+ console.log(" Re-installing a source refreshes all its skills.");
191
212
  return;
192
213
  }
193
214
  const source = findSource(sourceArg);
194
215
  const url = source?.url || sourceArg;
195
216
  const license = source?.license || "unknown";
217
+ const sourcePrefix = resolveSourcePrefix(sourceArg, source);
196
218
  mkdirSync(skillsDir, { recursive: true });
219
+ const removed = cleanSourceSkills(skillsDir, sourcePrefix);
220
+ if (removed > 0) {
221
+ console.log(` Removed ${removed} existing skills from ${sourcePrefix} (re-install)`);
222
+ }
197
223
  const tmpDir = join(process.cwd(), ".opencode", "_tmp", "install");
198
224
  console.log(` Cloning ${url}...`);
199
225
  cloneRepo(url, tmpDir);
@@ -201,20 +227,23 @@ export async function skillInstallCommand(sourceArg, options) {
201
227
  const { format, root } = detectFormat(searchDir);
202
228
  let count = 0;
203
229
  if (format === "skill-folders") {
204
- count = installSkillFolders(root, skillsDir, url, license);
230
+ count = installSkillFolders(root, skillsDir, sourcePrefix, url, license);
205
231
  }
206
232
  else if (format === "flat-md") {
207
- count = installFlatMd(root, skillsDir, url, license);
233
+ count = installFlatMd(root, skillsDir, sourcePrefix, url, license);
208
234
  }
209
235
  else {
210
236
  console.log(" Could not detect skill format. Looking for SKILL.md folders at root...");
211
- count = installSkillFolders(searchDir, skillsDir, url, license);
237
+ count = installSkillFolders(searchDir, skillsDir, sourcePrefix, url, license);
212
238
  if (count === 0) {
213
- count = installFlatMd(searchDir, skillsDir, url, license);
239
+ count = installFlatMd(searchDir, skillsDir, sourcePrefix, url, license);
214
240
  }
215
241
  }
216
242
  execSync(`rm -rf "${tmpDir}"`, { stdio: "pipe" });
217
- console.log(` Installed ${count} skills (${format}) → .opencode/skills/`);
243
+ console.log(` Installed ${count} skills (${format}) → .opencode/skills/${sourcePrefix}--*/`);
244
+ if (removed > 0) {
245
+ console.log(` (refreshed: ${removed} removed, ${count} installed)`);
246
+ }
218
247
  const total = readdirSync(skillsDir).filter((d) => existsSync(join(skillsDir, d, "SKILL.md"))).length;
219
248
  console.log(` Total skills available: ${total}`);
220
249
  }
@@ -257,7 +286,7 @@ export async function skillRegistryCommand(action, args) {
257
286
  if (existsSync(localPath)) {
258
287
  existing = JSON.parse(readFileSync(localPath, "utf-8"));
259
288
  }
260
- const source = {
289
+ const src = {
261
290
  name,
262
291
  url,
263
292
  description: args?.desc || args?.description,
@@ -265,11 +294,11 @@ export async function skillRegistryCommand(action, args) {
265
294
  };
266
295
  const idx = existing.sources.findIndex((s) => s.name === name);
267
296
  if (idx >= 0) {
268
- existing.sources[idx] = source;
297
+ existing.sources[idx] = src;
269
298
  console.log(` Updated: ${name}`);
270
299
  }
271
300
  else {
272
- existing.sources.push(source);
301
+ existing.sources.push(src);
273
302
  console.log(` Added: ${name}`);
274
303
  }
275
304
  mkdirSync(dirname(localPath), { recursive: true });