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.
- package/.opencode/plugins/strray-codex-injection.js +6 -0
- package/AGENTS-consumer.md +10 -14
- package/AGENTS.md +10 -14
- package/README.md +6 -8
- package/dist/agents/index.d.ts +1 -14
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -27
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/antigravity-status.d.ts.map +1 -1
- package/dist/cli/commands/antigravity-status.js +40 -36
- package/dist/cli/commands/antigravity-status.js.map +1 -1
- package/dist/cli/commands/skill-install.d.ts.map +1 -1
- package/dist/cli/commands/skill-install.js +65 -36
- package/dist/cli/commands/skill-install.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/config/default-agents.d.ts.map +1 -1
- package/dist/config/default-agents.js +0 -169
- package/dist/config/default-agents.js.map +1 -1
- package/dist/delegation/agent-delegator.d.ts.map +1 -1
- package/dist/delegation/agent-delegator.js +0 -13
- package/dist/delegation/agent-delegator.js.map +1 -1
- package/dist/mcps/agent-resolver.d.ts.map +1 -1
- package/dist/mcps/agent-resolver.js +0 -5
- package/dist/mcps/agent-resolver.js.map +1 -1
- package/dist/mcps/config/server-config-registry.d.ts.map +1 -1
- package/dist/mcps/config/server-config-registry.js +1 -100
- package/dist/mcps/config/server-config-registry.js.map +1 -1
- package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts.map +1 -1
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +3 -15
- package/dist/mcps/knowledge-skills/skill-invocation.server.js.map +1 -1
- package/dist/mcps/mcp-client.d.ts.map +1 -1
- package/dist/mcps/mcp-client.js +0 -15
- package/dist/mcps/mcp-client.js.map +1 -1
- package/dist/mcps/orchestrator/config/agent-capabilities.d.ts.map +1 -1
- package/dist/mcps/orchestrator/config/agent-capabilities.js +0 -5
- package/dist/mcps/orchestrator/config/agent-capabilities.js.map +1 -1
- package/dist/mcps/simulation/index.d.ts +1 -1
- package/dist/mcps/simulation/index.d.ts.map +1 -1
- package/dist/mcps/simulation/index.js +1 -1
- package/dist/mcps/simulation/index.js.map +1 -1
- package/dist/mcps/simulation/server-simulations.d.ts +0 -7
- package/dist/mcps/simulation/server-simulations.d.ts.map +1 -1
- package/dist/mcps/simulation/server-simulations.js +0 -59
- package/dist/mcps/simulation/server-simulations.js.map +1 -1
- package/dist/orchestrator/agent-spawn-governor.d.ts.map +1 -1
- package/dist/orchestrator/agent-spawn-governor.js +1 -5
- package/dist/orchestrator/agent-spawn-governor.js.map +1 -1
- package/dist/orchestrator/multi-agent-orchestration-coordinator.d.ts.map +1 -1
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +2 -21
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js.map +1 -1
- package/dist/plugin/strray-codex-injection.d.ts.map +1 -1
- package/dist/plugin/strray-codex-injection.js +6 -0
- package/dist/plugin/strray-codex-injection.js.map +1 -1
- package/dist/processors/agents-md-validation-processor.d.ts.map +1 -1
- package/dist/processors/agents-md-validation-processor.js +7 -22
- package/dist/processors/agents-md-validation-processor.js.map +1 -1
- package/opencode.json +0 -70
- package/package.json +1 -1
- package/scripts/node/README.md +1 -1
- package/scripts/node/postinstall.cjs +16 -6
- package/scripts/node/universal-version-manager.js +2 -2
- package/scripts/node/version-manager.mjs +3 -2
- package/src/skills/api-design/SKILL.md +1 -0
- package/src/skills/architect-tools/SKILL.md +1 -0
- package/src/skills/architecture-patterns/SKILL.md +1 -0
- package/src/skills/auto-format/SKILL.md +1 -0
- package/src/skills/backend-engineer/SKILL.md +49 -0
- package/src/skills/boot-orchestrator/SKILL.md +1 -0
- package/src/skills/bug-triage/SKILL.md +1 -0
- package/src/skills/code-analyzer/SKILL.md +1 -0
- package/src/skills/code-review/SKILL.md +1 -0
- package/src/skills/content-creator/SKILL.md +38 -0
- package/src/skills/database-engineer/SKILL.md +46 -0
- package/src/skills/devops-engineer/SKILL.md +49 -0
- package/src/skills/enforcer/SKILL.md +1 -0
- package/src/skills/framework-compliance-audit/SKILL.md +1 -0
- package/src/skills/frontend-engineer/SKILL.md +49 -0
- package/src/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
- package/src/skills/git-workflow/SKILL.md +1 -0
- package/src/skills/growth-strategist/SKILL.md +48 -0
- package/src/skills/inference-improve/SKILL.md +1 -0
- package/src/skills/lint/SKILL.md +1 -0
- package/src/skills/log-monitor/SKILL.md +1 -0
- package/src/skills/mobile-developer/SKILL.md +42 -0
- package/src/skills/model-health-check/SKILL.md +1 -0
- package/src/skills/multimodal-looker/SKILL.md +1 -0
- package/src/skills/orchestrator/SKILL.md +1 -0
- package/src/skills/performance-analysis/SKILL.md +1 -0
- package/src/skills/performance-engineer/SKILL.md +41 -0
- package/src/skills/performance-optimization/SKILL.md +1 -0
- package/src/skills/processor-pipeline/SKILL.md +1 -0
- package/src/skills/project-analysis/SKILL.md +1 -0
- package/src/skills/refactoring-strategies/SKILL.md +1 -0
- package/src/skills/researcher/SKILL.md +1 -0
- package/src/skills/security-audit/SKILL.md +1 -0
- package/src/skills/security-scan/SKILL.md +1 -0
- package/src/skills/seo-consultant/SKILL.md +43 -0
- package/src/skills/session-management/SKILL.md +1 -0
- package/src/skills/state-manager/SKILL.md +1 -0
- package/src/skills/storyteller/SKILL.md +130 -0
- package/src/skills/strategist/SKILL.md +32 -0
- package/src/skills/tech-writer/SKILL.md +37 -0
- package/src/skills/testing-best-practices/SKILL.md +1 -0
- package/src/skills/testing-strategy/SKILL.md +1 -0
- package/src/skills/ui-ux-design/SKILL.md +1 -0
- package/.opencode/agents/backend-engineer.yml +0 -88
- package/.opencode/agents/content-creator.yml +0 -46
- package/.opencode/agents/database-engineer.yml +0 -47
- package/.opencode/agents/devops-engineer.yml +0 -57
- package/.opencode/agents/frontend-engineer.yml +0 -89
- package/.opencode/agents/growth-strategist.yml +0 -46
- package/.opencode/agents/mobile-developer.yml +0 -47
- package/.opencode/agents/multimodal-looker.yml +0 -103
- package/.opencode/agents/performance-engineer.yml +0 -56
- package/.opencode/agents/seo-consultant.yml +0 -46
- package/.opencode/agents/storyteller.yml +0 -1140
- package/.opencode/agents/strategist.yml +0 -103
- 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");
|
package/AGENTS-consumer.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
|
|
107
|
+
### Storyteller Skill (formerly @storyteller agent)
|
|
108
108
|
|
|
109
|
-
The
|
|
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` |
|
|
114
|
-
| `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` |
|
|
115
|
-
| `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` |
|
|
116
|
-
| `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` |
|
|
117
|
-
| `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` |
|
|
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
|
-
**
|
|
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
|
|
107
|
+
### Storyteller Skill (formerly @storyteller agent)
|
|
108
108
|
|
|
109
|
-
The
|
|
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` |
|
|
114
|
-
| `saga` | Long-form technical saga spanning multiple sessions | `docs/reflections/deep/SAGA_TEMPLATE.md` |
|
|
115
|
-
| `journey` | Investigation/learning journey | `docs/reflections/JOURNEY_TEMPLATE.md` |
|
|
116
|
-
| `narrative` | Technical narrative - telling the story of code | `docs/reflections/NARRATIVE_TEMPLATE.md` |
|
|
117
|
-
| `deep reflection` | Extended narrative with emotional journey | `docs/reflections/deep/TEMPLATE.md` |
|
|
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
|
-
**
|
|
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
|
-
[](https://npmjs.com/package/strray-ai)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](src/__tests__)
|
|
8
8
|
[](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
|
|
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
|
-
- **🤖
|
|
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
|
-
- **⚡
|
|
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
|
|
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 (
|
|
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
|
package/dist/agents/index.d.ts
CHANGED
|
@@ -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,
|
|
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,
|
|
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"}
|
package/dist/agents/index.js
CHANGED
|
@@ -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,
|
|
25
|
+
export { enforcer, architect, orchestrator, bugTriageSpecialist, codeReviewer, securityAuditor, refactorer, testingLead, logMonitorAgent, researcher, analyzer, };
|
|
52
26
|
//# sourceMappingURL=index.js.map
|
package/dist/agents/index.js.map
CHANGED
|
@@ -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,
|
|
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;
|
|
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(
|
|
24
|
-
const
|
|
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:
|
|
29
|
+
name: rawName,
|
|
27
30
|
source: sourceMatch && sourceMatch[1] ? sourceMatch[1].trim() : "custom",
|
|
28
|
-
|
|
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
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
acc[
|
|
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(`
|
|
75
|
-
console.log(`
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
.sort((
|
|
88
|
-
.forEach((
|
|
89
|
-
console.log(` ${
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
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":"
|
|
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 (
|
|
41
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
171
|
-
console.log("
|
|
172
|
-
console.log("
|
|
173
|
-
console.log("
|
|
174
|
-
console.log("
|
|
175
|
-
console.log(
|
|
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
|
-
|
|
180
|
-
console.log(` ${
|
|
181
|
-
|
|
182
|
-
|
|
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("
|
|
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
|
|
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] =
|
|
297
|
+
existing.sources[idx] = src;
|
|
269
298
|
console.log(` Updated: ${name}`);
|
|
270
299
|
}
|
|
271
300
|
else {
|
|
272
|
-
existing.sources.push(
|
|
301
|
+
existing.sources.push(src);
|
|
273
302
|
console.log(` Added: ${name}`);
|
|
274
303
|
}
|
|
275
304
|
mkdirSync(dirname(localPath), { recursive: true });
|