opencastle 0.9.2 → 0.10.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.
- package/README.md +12 -69
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +13 -7
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +2 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.d.ts +17 -0
- package/dist/cli/init.test.d.ts.map +1 -0
- package/dist/cli/init.test.js +881 -0
- package/dist/cli/init.test.js.map +1 -0
- package/dist/cli/mcp.d.ts +9 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +56 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/run/adapters/copilot.d.ts +10 -2
- package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
- package/dist/cli/run/adapters/copilot.js +83 -56
- package/dist/cli/run/adapters/copilot.js.map +1 -1
- package/dist/cli/run.js +2 -2
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stack-config-update.test.d.ts +2 -0
- package/dist/cli/stack-config-update.test.d.ts.map +1 -0
- package/dist/cli/stack-config-update.test.js +185 -0
- package/dist/cli/stack-config-update.test.js.map +1 -0
- package/dist/cli/stack-config.d.ts +27 -0
- package/dist/cli/stack-config.d.ts.map +1 -1
- package/dist/cli/stack-config.js +80 -27
- package/dist/cli/stack-config.js.map +1 -1
- package/dist/cli/types.d.ts +1 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +184 -17
- package/dist/cli/update.js.map +1 -1
- package/dist/orchestrator/plugins/astro/config.d.ts +3 -0
- package/dist/orchestrator/plugins/astro/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/astro/config.js +27 -0
- package/dist/orchestrator/plugins/astro/config.js.map +1 -0
- package/dist/orchestrator/plugins/chrome-devtools/config.js +2 -2
- package/dist/orchestrator/plugins/chrome-devtools/config.js.map +1 -1
- package/dist/orchestrator/plugins/contentful/config.js +1 -1
- package/dist/orchestrator/plugins/contentful/config.js.map +1 -1
- package/dist/orchestrator/plugins/convex/config.js +1 -1
- package/dist/orchestrator/plugins/convex/config.js.map +1 -1
- package/dist/orchestrator/plugins/cypress/config.d.ts +3 -0
- package/dist/orchestrator/plugins/cypress/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/cypress/config.js +15 -0
- package/dist/orchestrator/plugins/cypress/config.js.map +1 -0
- package/dist/orchestrator/plugins/figma/config.d.ts +3 -0
- package/dist/orchestrator/plugins/figma/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/figma/config.js +33 -0
- package/dist/orchestrator/plugins/figma/config.js.map +1 -0
- package/dist/orchestrator/plugins/index.d.ts.map +1 -1
- package/dist/orchestrator/plugins/index.js +20 -0
- package/dist/orchestrator/plugins/index.js.map +1 -1
- package/dist/orchestrator/plugins/jira/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/jira/config.js +2 -3
- package/dist/orchestrator/plugins/jira/config.js.map +1 -1
- package/dist/orchestrator/plugins/linear/config.js +2 -2
- package/dist/orchestrator/plugins/linear/config.js.map +1 -1
- package/dist/orchestrator/plugins/netlify/config.d.ts +3 -0
- package/dist/orchestrator/plugins/netlify/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/netlify/config.js +30 -0
- package/dist/orchestrator/plugins/netlify/config.js.map +1 -0
- package/dist/orchestrator/plugins/nextjs/config.d.ts +3 -0
- package/dist/orchestrator/plugins/nextjs/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/nextjs/config.js +35 -0
- package/dist/orchestrator/plugins/nextjs/config.js.map +1 -0
- package/dist/orchestrator/plugins/nx/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/nx/config.js +2 -3
- package/dist/orchestrator/plugins/nx/config.js.map +1 -1
- package/dist/orchestrator/plugins/playwright/config.d.ts +3 -0
- package/dist/orchestrator/plugins/playwright/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/playwright/config.js +25 -0
- package/dist/orchestrator/plugins/playwright/config.js.map +1 -0
- package/dist/orchestrator/plugins/prisma/config.d.ts +3 -0
- package/dist/orchestrator/plugins/prisma/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/prisma/config.js +25 -0
- package/dist/orchestrator/plugins/prisma/config.js.map +1 -0
- package/dist/orchestrator/plugins/resend/config.d.ts +3 -0
- package/dist/orchestrator/plugins/resend/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/resend/config.js +46 -0
- package/dist/orchestrator/plugins/resend/config.js.map +1 -0
- package/dist/orchestrator/plugins/sanity/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/sanity/config.js +1 -2
- package/dist/orchestrator/plugins/sanity/config.js.map +1 -1
- package/dist/orchestrator/plugins/slack/config.js +1 -1
- package/dist/orchestrator/plugins/slack/config.js.map +1 -1
- package/dist/orchestrator/plugins/strapi/config.js +1 -1
- package/dist/orchestrator/plugins/strapi/config.js.map +1 -1
- package/dist/orchestrator/plugins/supabase/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/supabase/config.js +1 -2
- package/dist/orchestrator/plugins/supabase/config.js.map +1 -1
- package/dist/orchestrator/plugins/teams/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/teams/config.js +1 -2
- package/dist/orchestrator/plugins/teams/config.js.map +1 -1
- package/dist/orchestrator/plugins/turborepo/config.d.ts +3 -0
- package/dist/orchestrator/plugins/turborepo/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/turborepo/config.js +15 -0
- package/dist/orchestrator/plugins/turborepo/config.js.map +1 -0
- package/dist/orchestrator/plugins/types.d.ts +7 -7
- package/dist/orchestrator/plugins/types.d.ts.map +1 -1
- package/dist/orchestrator/plugins/vercel/config.d.ts.map +1 -1
- package/dist/orchestrator/plugins/vercel/config.js +2 -3
- package/dist/orchestrator/plugins/vercel/config.js.map +1 -1
- package/dist/orchestrator/plugins/vitest/config.d.ts +3 -0
- package/dist/orchestrator/plugins/vitest/config.d.ts.map +1 -0
- package/dist/orchestrator/plugins/vitest/config.js +15 -0
- package/dist/orchestrator/plugins/vitest/config.js.map +1 -0
- package/package.json +2 -1
- package/src/cli/doctor.ts +14 -7
- package/src/cli/init.test.ts +1141 -0
- package/src/cli/init.ts +2 -1
- package/src/cli/mcp.ts +77 -1
- package/src/cli/run/adapters/copilot.ts +86 -58
- package/src/cli/run.ts +2 -2
- package/src/cli/stack-config-update.test.ts +210 -0
- package/src/cli/stack-config.ts +110 -37
- package/src/cli/types.ts +1 -1
- package/src/cli/update.ts +230 -23
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- package/src/orchestrator/agents/api-designer.agent.md +1 -11
- package/src/orchestrator/agents/architect.agent.md +1 -9
- package/src/orchestrator/agents/content-engineer.agent.md +1 -5
- package/src/orchestrator/agents/copywriter.agent.md +1 -9
- package/src/orchestrator/agents/data-expert.agent.md +2 -6
- package/src/orchestrator/agents/database-engineer.agent.md +1 -6
- package/src/orchestrator/agents/developer.agent.md +2 -12
- package/src/orchestrator/agents/devops-expert.agent.md +1 -5
- package/src/orchestrator/agents/documentation-writer.agent.md +1 -4
- package/src/orchestrator/agents/performance-expert.agent.md +1 -5
- package/src/orchestrator/agents/release-manager.agent.md +1 -11
- package/src/orchestrator/agents/researcher.agent.md +1 -4
- package/src/orchestrator/agents/security-expert.agent.md +2 -7
- package/src/orchestrator/agents/seo-specialist.agent.md +1 -10
- package/src/orchestrator/agents/testing-expert.agent.md +2 -11
- package/src/orchestrator/agents/ui-ux-expert.agent.md +3 -10
- package/src/orchestrator/customizations/README.md +2 -1
- package/src/orchestrator/customizations/agents/skill-matrix.json +106 -0
- package/src/orchestrator/customizations/agents/skill-matrix.md +58 -121
- package/src/orchestrator/instructions/general.instructions.md +1 -1
- package/src/orchestrator/plugins/astro/SKILL.md +288 -0
- package/src/orchestrator/plugins/astro/config.ts +28 -0
- package/src/orchestrator/plugins/chrome-devtools/config.ts +2 -2
- package/src/orchestrator/plugins/contentful/config.ts +1 -1
- package/src/orchestrator/plugins/convex/config.ts +1 -1
- package/src/orchestrator/plugins/cypress/SKILL.md +145 -0
- package/src/orchestrator/plugins/cypress/config.ts +16 -0
- package/src/orchestrator/plugins/figma/SKILL.md +85 -0
- package/src/orchestrator/plugins/figma/config.ts +34 -0
- package/src/orchestrator/plugins/index.ts +20 -0
- package/src/orchestrator/plugins/jira/config.ts +2 -3
- package/src/orchestrator/plugins/linear/config.ts +2 -2
- package/src/orchestrator/plugins/netlify/SKILL.md +134 -0
- package/src/orchestrator/plugins/netlify/config.ts +31 -0
- package/src/orchestrator/plugins/nextjs/SKILL.md +376 -0
- package/src/orchestrator/plugins/nextjs/config.ts +36 -0
- package/src/orchestrator/plugins/nx/config.ts +2 -3
- package/src/orchestrator/plugins/playwright/SKILL.md +191 -0
- package/src/orchestrator/plugins/playwright/config.ts +26 -0
- package/src/orchestrator/plugins/prisma/SKILL.md +137 -0
- package/src/orchestrator/plugins/prisma/config.ts +26 -0
- package/src/orchestrator/plugins/resend/SKILL.md +187 -0
- package/src/orchestrator/plugins/resend/config.ts +47 -0
- package/src/orchestrator/plugins/sanity/config.ts +1 -2
- package/src/orchestrator/plugins/slack/config.ts +1 -1
- package/src/orchestrator/plugins/strapi/config.ts +1 -1
- package/src/orchestrator/plugins/supabase/config.ts +1 -2
- package/src/orchestrator/plugins/teams/config.ts +1 -2
- package/src/orchestrator/plugins/turborepo/SKILL.md +121 -0
- package/src/orchestrator/plugins/turborepo/config.ts +16 -0
- package/src/orchestrator/plugins/types.ts +7 -7
- package/src/orchestrator/plugins/vercel/SKILL.md +99 -0
- package/src/orchestrator/plugins/vercel/config.ts +2 -3
- package/src/orchestrator/plugins/vitest/SKILL.md +166 -0
- package/src/orchestrator/plugins/vitest/config.ts +16 -0
- package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +6 -4
- package/src/orchestrator/prompts/create-skill.prompt.md +6 -7
- package/src/orchestrator/prompts/generate-task-spec.prompt.md +1 -1
- package/src/orchestrator/skills/agent-hooks/SKILL.md +2 -2
- package/src/orchestrator/skills/memory-merger/SKILL.md +1 -1
- package/src/orchestrator/skills/nextjs-patterns/SKILL.md +0 -200
|
@@ -25,7 +25,8 @@ Skills reference these files with relative links like `../../customizations/stac
|
|
|
25
25
|
| File | Purpose |
|
|
26
26
|
|------|---------|
|
|
27
27
|
| `agent-registry.md` | Specialist agents with model tier assignments and scope examples |
|
|
28
|
-
| `skill-matrix.
|
|
28
|
+
| `skill-matrix.json` | Maps capability slots to concrete skill names per agent role (machine-readable) |
|
|
29
|
+
| `skill-matrix.md` | Documentation companion explaining the skill matrix concept |
|
|
29
30
|
|
|
30
31
|
### `stack/` — Tech stack config
|
|
31
32
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bindings": {
|
|
3
|
+
"framework": {
|
|
4
|
+
"entries": [],
|
|
5
|
+
"description": "SSR/SSG, routing, layouts, Server/Client Components"
|
|
6
|
+
},
|
|
7
|
+
"database": {
|
|
8
|
+
"entries": [],
|
|
9
|
+
"description": "Schema, migrations, auth flow, roles"
|
|
10
|
+
},
|
|
11
|
+
"cms": {
|
|
12
|
+
"entries": [],
|
|
13
|
+
"description": "Document types, queries, schema management"
|
|
14
|
+
},
|
|
15
|
+
"deployment": {
|
|
16
|
+
"entries": [],
|
|
17
|
+
"description": "Hosting, cron jobs, env vars, caching, headers"
|
|
18
|
+
},
|
|
19
|
+
"codebase-tool": {
|
|
20
|
+
"entries": [],
|
|
21
|
+
"description": "Task running, building, linting, testing, code generation"
|
|
22
|
+
},
|
|
23
|
+
"testing": {
|
|
24
|
+
"entries": [],
|
|
25
|
+
"description": "Unit testing frameworks, coverage, test planning"
|
|
26
|
+
},
|
|
27
|
+
"e2e-testing": {
|
|
28
|
+
"entries": [],
|
|
29
|
+
"description": "Browser automation, E2E testing, viewport testing, visual validation"
|
|
30
|
+
},
|
|
31
|
+
"task-management": {
|
|
32
|
+
"entries": [],
|
|
33
|
+
"description": "Issue tracking, naming, priorities, workflow states"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"agents": {
|
|
37
|
+
"Developer": {
|
|
38
|
+
"slots": ["framework"],
|
|
39
|
+
"directSkills": ["validation-gates", "code-commenting", "react-development", "api-patterns"]
|
|
40
|
+
},
|
|
41
|
+
"Database Engineer": {
|
|
42
|
+
"slots": ["database"],
|
|
43
|
+
"directSkills": ["validation-gates", "security-hardening"]
|
|
44
|
+
},
|
|
45
|
+
"UI/UX Expert": {
|
|
46
|
+
"slots": ["e2e-testing"],
|
|
47
|
+
"directSkills": ["validation-gates", "frontend-design", "accessibility-standards", "react-development"]
|
|
48
|
+
},
|
|
49
|
+
"Content Engineer": {
|
|
50
|
+
"slots": ["cms"],
|
|
51
|
+
"directSkills": ["validation-gates"]
|
|
52
|
+
},
|
|
53
|
+
"Testing Expert": {
|
|
54
|
+
"slots": ["e2e-testing", "testing"],
|
|
55
|
+
"directSkills": ["validation-gates", "testing-workflow"]
|
|
56
|
+
},
|
|
57
|
+
"Security Expert": {
|
|
58
|
+
"slots": ["database"],
|
|
59
|
+
"directSkills": ["validation-gates", "documentation-standards", "security-hardening"]
|
|
60
|
+
},
|
|
61
|
+
"Data Expert": {
|
|
62
|
+
"slots": [],
|
|
63
|
+
"directSkills": ["validation-gates", "data-engineering"]
|
|
64
|
+
},
|
|
65
|
+
"DevOps Expert": {
|
|
66
|
+
"slots": ["deployment"],
|
|
67
|
+
"directSkills": ["validation-gates", "documentation-standards"]
|
|
68
|
+
},
|
|
69
|
+
"Performance Expert": {
|
|
70
|
+
"slots": [],
|
|
71
|
+
"directSkills": ["validation-gates", "performance-optimization"]
|
|
72
|
+
},
|
|
73
|
+
"Architect": {
|
|
74
|
+
"slots": ["codebase-tool"],
|
|
75
|
+
"directSkills": ["documentation-standards"]
|
|
76
|
+
},
|
|
77
|
+
"Copywriter": {
|
|
78
|
+
"slots": ["cms"],
|
|
79
|
+
"directSkills": ["documentation-standards"]
|
|
80
|
+
},
|
|
81
|
+
"SEO Specialist": {
|
|
82
|
+
"slots": ["framework", "cms"],
|
|
83
|
+
"directSkills": ["validation-gates", "documentation-standards", "seo-patterns"]
|
|
84
|
+
},
|
|
85
|
+
"API Designer": {
|
|
86
|
+
"slots": ["framework"],
|
|
87
|
+
"directSkills": ["validation-gates", "documentation-standards", "api-patterns", "security-hardening"]
|
|
88
|
+
},
|
|
89
|
+
"Release Manager": {
|
|
90
|
+
"slots": ["codebase-tool", "deployment"],
|
|
91
|
+
"directSkills": ["validation-gates", "documentation-standards"]
|
|
92
|
+
},
|
|
93
|
+
"Documentation Writer": {
|
|
94
|
+
"slots": [],
|
|
95
|
+
"directSkills": ["documentation-standards", "code-commenting"]
|
|
96
|
+
},
|
|
97
|
+
"Researcher": {
|
|
98
|
+
"slots": [],
|
|
99
|
+
"directSkills": ["context-map", "self-improvement"]
|
|
100
|
+
},
|
|
101
|
+
"Team Lead": {
|
|
102
|
+
"slots": ["task-management"],
|
|
103
|
+
"directSkills": ["team-lead-reference", "session-checkpoints", "validation-gates", "fast-review", "panel-majority-vote", "context-map", "memory-merger", "agent-hooks", "decomposition", "orchestration-protocols"]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -1,149 +1,86 @@
|
|
|
1
|
-
````markdown
|
|
2
1
|
# Skill Matrix
|
|
3
2
|
|
|
4
|
-
Maps abstract technology capabilities to concrete skill implementations.
|
|
3
|
+
Maps abstract technology capabilities to concrete skill implementations. The matrix distinguishes two types of skills:
|
|
5
4
|
|
|
6
|
-
**
|
|
5
|
+
- **Binding slots** — Plugin-driven, technology-specific skills resolved at runtime (e.g., `database` → `supabase-database`). These change when the tech stack changes.
|
|
6
|
+
- **Core skills** — Hardcoded, stack-agnostic skills referenced directly in agent files (e.g., `validation-gates`, `security-hardening`, `performance-optimization`). These are always available regardless of plugins.
|
|
7
|
+
|
|
8
|
+
## Data File
|
|
9
|
+
|
|
10
|
+
The machine-readable bindings are in [`skill-matrix.json`](skill-matrix.json). The CLI (`opencastle init` and `opencastle update`) reads and writes this file directly. Agents should read the JSON to resolve capability slots.
|
|
7
11
|
|
|
8
12
|
## How It Works
|
|
9
13
|
|
|
10
14
|
```
|
|
11
|
-
Agent file Skill
|
|
15
|
+
Agent file skill-matrix.json Skill file
|
|
12
16
|
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
13
|
-
│ Developer │ │ framework:
|
|
14
|
-
│ needs: │──lookup──▶│
|
|
15
|
-
│ framework │ │
|
|
16
|
-
│
|
|
17
|
-
│
|
|
18
|
-
│ │ │ │ │ │
|
|
19
|
-
│ │ │ api-layer: │ │ api- │
|
|
20
|
-
│ │ │ nextjs-api │──load────▶│ patterns │
|
|
21
|
-
│ │ │ │ │ │
|
|
17
|
+
│ Developer │ │ "framework": │ │ nextjs- │
|
|
18
|
+
│ needs: │──lookup──▶│ entries: [ │──load────▶│ framework │
|
|
19
|
+
│ framework │ │ {name, │ │ │
|
|
20
|
+
│ │ │ skill} │ │ │
|
|
21
|
+
│ │ │ ] │ │ │
|
|
22
22
|
└──────────────┘ └──────────────┘ └──────────────┘
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
1. **Agents** declare which capability slots they need (e.g., `framework`, `database`)
|
|
26
|
-
2.
|
|
27
|
-
3. **When delegating**, resolve slots through
|
|
28
|
-
4. **To switch tech**, update only the binding
|
|
29
|
-
|
|
30
|
-
##
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
### Tooling
|
|
47
|
-
|
|
48
|
-
| Slot | Technology | Skill | Description |
|
|
49
|
-
|------|-----------|-------|-------------|
|
|
50
|
-
| `api-layer` | | | API routes, validation, search architecture |
|
|
51
|
-
| `data-pipeline` | | | ETL, scraping, data processing |
|
|
52
|
-
| `testing` | | | Unit/integration tests, coverage, test planning |
|
|
53
|
-
| `e2e-testing` | | | Browser automation, viewport testing, visual validation |
|
|
54
|
-
| `task-management` | | | Issue tracking, naming, priorities, workflow states |
|
|
55
|
-
|
|
56
|
-
### Disciplines
|
|
57
|
-
|
|
58
|
-
| Slot | Approach | Skill | Description |
|
|
59
|
-
|------|---------|-------|-------------|
|
|
60
|
-
| `performance` | | `performance-optimization` | Bundle size, rendering, caching, profiling |
|
|
61
|
-
| `security` | | `security-hardening` | Auth, headers, input validation, vulnerability mgmt |
|
|
62
|
-
| `accessibility` | WCAG 2.2 Level AA | `accessibility-standards` | Keyboard nav, screen readers, contrast, semantics |
|
|
63
|
-
| `design-system` | | `frontend-design` | Design thinking, typography, color, motion, layout |
|
|
64
|
-
| `seo` | | `seo-patterns` | Technical SEO patterns for meta tags, JSON-LD, sitemaps, URL strategy |
|
|
65
|
-
|
|
66
|
-
## Agent Capability Matrix
|
|
67
|
-
|
|
68
|
-
Each row shows which capability slots an agent needs (resolved through this matrix) and which process skills it uses directly.
|
|
69
|
-
|
|
70
|
-
| Agent | Capability Slots | Direct Skills |
|
|
71
|
-
|-------|-----------------|---------------|
|
|
72
|
-
| **Developer** | `framework`, `ui-library`, `api-layer` | `validation-gates` |
|
|
73
|
-
| **Database Engineer** | `database`, `security` | — |
|
|
74
|
-
| **UI/UX Expert** | `design-system`, `ui-library`, `accessibility` | `e2e-testing`¹ |
|
|
75
|
-
| **Content Engineer** | `cms` | — |
|
|
76
|
-
| **Testing Expert** | `e2e-testing`, `testing` | `validation-gates` |
|
|
77
|
-
| **Security Expert** | `security`, `database` | — |
|
|
78
|
-
| **Data Expert** | `data-pipeline` | — |
|
|
79
|
-
| **DevOps Expert** | `deployment` | — |
|
|
80
|
-
| **Performance Expert** | `performance` | — |
|
|
81
|
-
| **Architect** | `codebase-tool` | `documentation-standards` |
|
|
82
|
-
| **Copywriter** | `cms` | `documentation-standards` |
|
|
83
|
-
| **SEO Specialist** | `framework`, `cms`, `seo` | — |
|
|
84
|
-
| **API Designer** | `api-layer`, `framework`, `security` | — |
|
|
85
|
-
| **Release Manager** | `codebase-tool`, `deployment` | `validation-gates`, `documentation-standards` |
|
|
86
|
-
| **Documentation Writer** | — | `documentation-standards`, `code-commenting` |
|
|
87
|
-
| **Researcher** | — | `context-map`, `self-improvement` |
|
|
88
|
-
| **Team Lead** | `task-management` | `team-lead-reference`, `session-checkpoints`, `validation-gates`, `fast-review`, `panel-majority-vote`, `context-map`, `memory-merger`, `agent-hooks` |
|
|
89
|
-
|
|
90
|
-
¹ UI/UX Expert uses `e2e-testing` as a utility (viewport resize commands) — resolved through the matrix like other slots.
|
|
91
|
-
|
|
92
|
-
## Process Skills (Always Direct)
|
|
93
|
-
|
|
94
|
-
These are methodology/workflow skills — not tied to any technology. Referenced directly in agent files, never through capability slots.
|
|
95
|
-
|
|
96
|
-
| Skill | Purpose |
|
|
97
|
-
|-------|---------|
|
|
98
|
-
| `self-improvement` | Lessons-learned protocol, retry documentation |
|
|
99
|
-
| `session-checkpoints` | Session state saving, resuming, forking |
|
|
100
|
-
| `context-map` | File impact mapping before complex changes |
|
|
101
|
-
| `panel-majority-vote` | 3-reviewer quality gate (PASS/BLOCK) |
|
|
102
|
-
| `memory-merger` | Graduate lessons into permanent skills/instructions |
|
|
103
|
-
| `code-commenting` | Self-documenting code patterns, annotation tags |
|
|
104
|
-
| `agent-hooks` | Agent lifecycle hooks (session-start, session-end, etc.) |
|
|
105
|
-
| `agent-memory` | Agent expertise tracking, cross-session knowledge graph |
|
|
106
|
-
| `task-management` | Issue tracking conventions, naming, priorities |
|
|
107
|
-
| `team-lead-reference` | Team Lead orchestration reference, model routing |
|
|
108
|
-
| `fast-review` | Mandatory single-reviewer gate after every delegation |
|
|
109
|
-
| `validation-gates` | Shared validation gate definitions (lint, test, build) |
|
|
110
|
-
| `documentation-standards` | Documentation templates, formatting rules |
|
|
26
|
+
2. **`skill-matrix.json`** maps each slot to one or more technologies and their skill files
|
|
27
|
+
3. **When delegating**, resolve slots through the JSON to load the correct skill(s)
|
|
28
|
+
4. **To switch tech**, update only the binding entries — no agent files change
|
|
29
|
+
|
|
30
|
+
## Multiple Technologies Per Slot
|
|
31
|
+
|
|
32
|
+
A slot can have multiple entries. For example, a project using both Supabase and Prisma:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
"database": {
|
|
36
|
+
"entries": [
|
|
37
|
+
{ "name": "Supabase", "skill": "supabase-database" },
|
|
38
|
+
{ "name": "Prisma", "skill": "prisma-database" }
|
|
39
|
+
],
|
|
40
|
+
"description": "Schema, migrations, auth flow, roles"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
When resolving, load **all** skills listed in the slot's entries.
|
|
111
45
|
|
|
112
46
|
## Switching Technologies
|
|
113
47
|
|
|
114
|
-
### Example: Supabase →
|
|
48
|
+
### Example: Migrate to a new plugin (Supabase → Azure)
|
|
115
49
|
|
|
116
|
-
1. Create
|
|
117
|
-
2. Update
|
|
50
|
+
1. Create (or install) the Azure plugin: `plugins/azure/SKILL.md` + `plugins/azure/config.ts`
|
|
51
|
+
2. Update `skill-matrix.json`: replace the database entries
|
|
118
52
|
3. Update `project.instructions.md` to reflect the new tech stack
|
|
119
53
|
4. **No agent files change** — Database Engineer, Security Expert still reference the `database` slot
|
|
120
54
|
|
|
121
|
-
### Example:
|
|
55
|
+
### Example: Migrate to an existing plugin (Linear → Jira)
|
|
122
56
|
|
|
123
|
-
1.
|
|
124
|
-
2. Update
|
|
125
|
-
3.
|
|
126
|
-
4. Update `project.instructions.md` and `general.instructions.md`
|
|
127
|
-
5. **No agent files change** — Developer, UI/UX Expert still reference `framework` and `ui-library` slots
|
|
57
|
+
1. Plugin already exists: `plugins/jira/SKILL.md`
|
|
58
|
+
2. Update `skill-matrix.json`: replace the `task-management` entries
|
|
59
|
+
3. **No agent files change** — Team Lead still references the `task-management` slot
|
|
128
60
|
|
|
129
|
-
### Example:
|
|
61
|
+
### Example: Add a second plugin
|
|
130
62
|
|
|
131
|
-
1.
|
|
132
|
-
2.
|
|
133
|
-
3. **No agent files change** — Testing Expert still references the `testing` slot
|
|
63
|
+
1. Update `skill-matrix.json`: add another entry to the `framework` slot
|
|
64
|
+
2. Both framework skills will be loaded when agents resolve the `framework` slot
|
|
134
65
|
|
|
135
|
-
|
|
66
|
+
## Missing Plugin or Empty Slot
|
|
136
67
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
68
|
+
When resolving a capability slot, two failure cases can occur:
|
|
69
|
+
|
|
70
|
+
1. **Empty slot** — The slot's `entries` array is empty (no plugin installed for that technology). Example: an agent needs `database` but no database plugin was selected during `opencastle init`.
|
|
71
|
+
2. **Missing plugin** — The slot references a skill name (e.g., `"skill": "convex-database"`) but no matching plugin `SKILL.md` file exists on disk.
|
|
72
|
+
|
|
73
|
+
In both cases, **tell the user** that the capability is unavailable and why:
|
|
74
|
+
|
|
75
|
+
- *"The `database` slot has no entries in `skill-matrix.json`. Install a database plugin (e.g., `supabase`, `prisma`) via `opencastle update`, or add entries manually."*
|
|
76
|
+
- *"The `database` slot references skill `convex-database`, but no matching plugin was found. Install the Convex plugin or run `opencastle update` to fix the binding."*
|
|
77
|
+
|
|
78
|
+
**Do NOT silently skip the slot or proceed without the skill.** The agent should surface the gap clearly so the user can resolve it.
|
|
140
79
|
|
|
141
80
|
## Design Principles
|
|
142
81
|
|
|
143
|
-
1. **Single source of truth** —
|
|
82
|
+
1. **Single source of truth** — All skill assignments (slots and direct) live in `skill-matrix.json`, not in agent files
|
|
144
83
|
2. **Agents are stack-agnostic** — They describe *what* they need, not *which* tool they use
|
|
145
|
-
3. **Swap without rewriting** — Changing
|
|
146
|
-
4. **Process skills are stable** — Methodology doesn't change with technology; direct references are fine
|
|
147
|
-
5. **Capability slots are composable** — Agents can combine
|
|
148
|
-
|
|
149
|
-
````
|
|
84
|
+
3. **Swap without rewriting** — Changing entries updates every agent that uses that slot
|
|
85
|
+
4. **Process skills are stable** — Methodology doesn't change with technology; direct skill references in the matrix are fine
|
|
86
|
+
5. **Capability slots are composable** — Agents can combine slots and direct skills freely (e.g., Security Expert uses the `database` slot + `security-hardening` direct skill)
|
|
@@ -34,7 +34,7 @@ applyTo: '**'
|
|
|
34
34
|
|
|
35
35
|
## Technology Standards
|
|
36
36
|
|
|
37
|
-
Load the corresponding skill for detailed conventions before writing code in that domain. These are **not optional**. See `.github/customizations/agents/skill-matrix.
|
|
37
|
+
Load the corresponding skill for detailed conventions before writing code in that domain. These are **not optional**. See `.github/customizations/agents/skill-matrix.json` for the full domain-to-skill mapping.
|
|
38
38
|
|
|
39
39
|
| Domain | Skill |
|
|
40
40
|
|--------|-------|
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: astro-framework
|
|
3
|
+
description: "Astro framework best practices for content-driven sites, islands architecture, routing, integrations, and project structure. Use when creating or modifying Astro pages, layouts, components, or content collections."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- ⚠️ This file is managed by OpenCastle. Edits will be overwritten on update. Customize in the .github/customizations/ directory instead. -->
|
|
7
|
+
|
|
8
|
+
# Astro Framework
|
|
9
|
+
|
|
10
|
+
## Project Structure
|
|
11
|
+
|
|
12
|
+
- **Use `src/pages/` directory** for file-based routing. Each `.astro`, `.md`, or `.mdx` file becomes a route.
|
|
13
|
+
- Top-level: `src/`, `public/`, `astro.config.mjs`.
|
|
14
|
+
- Inside `src/`: `pages/`, `layouts/`, `components/`, `content/`, `styles/`, `assets/`.
|
|
15
|
+
- **`public/`** — static assets served as-is (favicons, robots.txt, fonts).
|
|
16
|
+
- **`src/assets/`** — images and assets processed by Astro's build pipeline.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
src/
|
|
20
|
+
├── pages/
|
|
21
|
+
│ ├── index.astro # → /
|
|
22
|
+
│ ├── about.astro # → /about
|
|
23
|
+
│ └── blog/
|
|
24
|
+
│ ├── index.astro # → /blog
|
|
25
|
+
│ └── [slug].astro # → /blog/:slug
|
|
26
|
+
├── layouts/
|
|
27
|
+
│ └── BaseLayout.astro
|
|
28
|
+
├── components/
|
|
29
|
+
│ ├── Header.astro
|
|
30
|
+
│ └── Counter.tsx # React island
|
|
31
|
+
├── content/
|
|
32
|
+
│ └── blog/ # Content collection
|
|
33
|
+
│ ├── first-post.md
|
|
34
|
+
│ └── second-post.md
|
|
35
|
+
└── styles/
|
|
36
|
+
└── global.css
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Component Model
|
|
40
|
+
|
|
41
|
+
**Default: Zero JS** — Astro components (`.astro`) render to HTML with no client-side JavaScript.
|
|
42
|
+
|
|
43
|
+
**Islands Architecture** — Interactive components use `client:*` directives to hydrate only where needed.
|
|
44
|
+
|
|
45
|
+
### Astro Components
|
|
46
|
+
|
|
47
|
+
```astro
|
|
48
|
+
---
|
|
49
|
+
// Component script (runs at build time / server)
|
|
50
|
+
interface Props {
|
|
51
|
+
title: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
}
|
|
54
|
+
const { title, description = 'Default description' } = Astro.props;
|
|
55
|
+
const data = await fetch('https://api.example.com/data').then(r => r.json());
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
<section>
|
|
59
|
+
<h2>{title}</h2>
|
|
60
|
+
<p>{description}</p>
|
|
61
|
+
<ul>
|
|
62
|
+
{data.items.map((item: { id: string; name: string }) => (
|
|
63
|
+
<li>{item.name}</li>
|
|
64
|
+
))}
|
|
65
|
+
</ul>
|
|
66
|
+
</section>
|
|
67
|
+
|
|
68
|
+
<style>
|
|
69
|
+
/* Scoped by default */
|
|
70
|
+
section { max-width: 800px; margin: 0 auto; }
|
|
71
|
+
</style>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Client Directives (Islands)
|
|
75
|
+
|
|
76
|
+
| Directive | When It Hydrates | Use Case |
|
|
77
|
+
|-----------|-----------------|----------|
|
|
78
|
+
| `client:load` | Immediately on page load | Critical interactive UI |
|
|
79
|
+
| `client:idle` | After page is idle | Non-critical UI (analytics widgets) |
|
|
80
|
+
| `client:visible` | When element enters viewport | Below-the-fold components |
|
|
81
|
+
| `client:media="(max-width: 768px)"` | When media query matches | Mobile-only interactivity |
|
|
82
|
+
| `client:only="react"` | Client-only, no SSR | Components that can't server-render |
|
|
83
|
+
|
|
84
|
+
```astro
|
|
85
|
+
---
|
|
86
|
+
import Counter from '../components/Counter.tsx';
|
|
87
|
+
import HeavyChart from '../components/HeavyChart.tsx';
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
<!-- Hydrates immediately -->
|
|
91
|
+
<Counter client:load />
|
|
92
|
+
|
|
93
|
+
<!-- Hydrates when visible -->
|
|
94
|
+
<HeavyChart client:visible />
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Content Collections
|
|
98
|
+
|
|
99
|
+
Define collections in `src/content.config.ts` (Astro v5+) using the Content Layer API:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { defineCollection, z } from 'astro:content';
|
|
103
|
+
import { glob } from 'astro/loaders';
|
|
104
|
+
|
|
105
|
+
const blog = defineCollection({
|
|
106
|
+
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
|
|
107
|
+
schema: z.object({
|
|
108
|
+
title: z.string(),
|
|
109
|
+
description: z.string(),
|
|
110
|
+
pubDate: z.coerce.date(),
|
|
111
|
+
updatedDate: z.coerce.date().optional(),
|
|
112
|
+
heroImage: z.string().optional(),
|
|
113
|
+
draft: z.boolean().default(false),
|
|
114
|
+
tags: z.array(z.string()).default([]),
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
export const collections = { blog };
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Querying Collections
|
|
122
|
+
|
|
123
|
+
```astro
|
|
124
|
+
---
|
|
125
|
+
import { getCollection, getEntry } from 'astro:content';
|
|
126
|
+
|
|
127
|
+
// All published posts, sorted by date
|
|
128
|
+
const posts = (await getCollection('blog', ({ data }) => !data.draft))
|
|
129
|
+
.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
|
|
130
|
+
|
|
131
|
+
// Single entry
|
|
132
|
+
const entry = await getEntry('blog', 'first-post');
|
|
133
|
+
---
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Routing
|
|
137
|
+
|
|
138
|
+
### Static Routes
|
|
139
|
+
|
|
140
|
+
Every `.astro` or `.md` file in `src/pages/` becomes a route.
|
|
141
|
+
|
|
142
|
+
### Dynamic Routes
|
|
143
|
+
|
|
144
|
+
```astro
|
|
145
|
+
---
|
|
146
|
+
// src/pages/blog/[slug].astro
|
|
147
|
+
import { getCollection } from 'astro:content';
|
|
148
|
+
|
|
149
|
+
export async function getStaticPaths() {
|
|
150
|
+
const posts = await getCollection('blog');
|
|
151
|
+
return posts.map(post => ({
|
|
152
|
+
params: { slug: post.id },
|
|
153
|
+
props: { post },
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const { post } = Astro.props;
|
|
158
|
+
const { Content } = await post.render();
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
<Content />
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Server-Side Rendering (On-Demand)
|
|
165
|
+
|
|
166
|
+
Enable SSR with an adapter in `astro.config.mjs`:
|
|
167
|
+
|
|
168
|
+
```js
|
|
169
|
+
import { defineConfig } from 'astro/config';
|
|
170
|
+
import node from '@astrojs/node';
|
|
171
|
+
|
|
172
|
+
export default defineConfig({
|
|
173
|
+
output: 'server', // or 'hybrid' for mixed static + server
|
|
174
|
+
adapter: node({ mode: 'standalone' }),
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Layouts
|
|
179
|
+
|
|
180
|
+
```astro
|
|
181
|
+
---
|
|
182
|
+
// src/layouts/BaseLayout.astro
|
|
183
|
+
interface Props {
|
|
184
|
+
title: string;
|
|
185
|
+
description?: string;
|
|
186
|
+
}
|
|
187
|
+
const { title, description = 'My Astro Site' } = Astro.props;
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
<!doctype html>
|
|
191
|
+
<html lang="en">
|
|
192
|
+
<head>
|
|
193
|
+
<meta charset="UTF-8" />
|
|
194
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
195
|
+
<meta name="description" content={description} />
|
|
196
|
+
<title>{title}</title>
|
|
197
|
+
</head>
|
|
198
|
+
<body>
|
|
199
|
+
<slot />
|
|
200
|
+
</body>
|
|
201
|
+
</html>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Integrations
|
|
205
|
+
|
|
206
|
+
Use `astro add` for official integrations:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
npx astro add react # Add React support
|
|
210
|
+
npx astro add tailwind # Add Tailwind CSS v4
|
|
211
|
+
npx astro add mdx # Add MDX support
|
|
212
|
+
npx astro add sitemap # Add sitemap generation
|
|
213
|
+
npx astro add node # Add Node.js SSR adapter
|
|
214
|
+
npx astro add vercel # Add Vercel adapter
|
|
215
|
+
npx astro add netlify # Add Netlify adapter
|
|
216
|
+
npx astro add cloudflare # Add Cloudflare adapter
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## API Routes (Endpoints)
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
// src/pages/api/search.ts
|
|
223
|
+
import type { APIRoute } from 'astro';
|
|
224
|
+
|
|
225
|
+
export const GET: APIRoute = async ({ url }) => {
|
|
226
|
+
const query = url.searchParams.get('q');
|
|
227
|
+
const results = await searchDatabase(query);
|
|
228
|
+
return new Response(JSON.stringify(results), {
|
|
229
|
+
headers: { 'Content-Type': 'application/json' },
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
export const POST: APIRoute = async ({ request }) => {
|
|
234
|
+
const body = await request.json();
|
|
235
|
+
// handle mutation
|
|
236
|
+
return new Response(JSON.stringify({ ok: true }), { status: 200 });
|
|
237
|
+
};
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Actions (Server Mutations)
|
|
241
|
+
|
|
242
|
+
Define type-safe server actions in `src/actions/index.ts`:
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
import { defineAction } from 'astro:actions';
|
|
246
|
+
import { z } from 'astro:schema';
|
|
247
|
+
|
|
248
|
+
export const server = {
|
|
249
|
+
subscribe: defineAction({
|
|
250
|
+
accept: 'form',
|
|
251
|
+
input: z.object({ email: z.string().email() }),
|
|
252
|
+
handler: async ({ email }) => {
|
|
253
|
+
await addToNewsletter(email);
|
|
254
|
+
return { success: true };
|
|
255
|
+
},
|
|
256
|
+
}),
|
|
257
|
+
};
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Performance Patterns
|
|
261
|
+
|
|
262
|
+
- **Zero JS by default** — only ship JavaScript for interactive islands.
|
|
263
|
+
- **Image optimization** — use `astro:assets` for automatic image optimization.
|
|
264
|
+
- **View Transitions** — use `<ViewTransitions />` for smooth page navigation.
|
|
265
|
+
- **Prefetching** — enabled by default for visible links.
|
|
266
|
+
- **CSS scoping** — styles in `.astro` files are scoped automatically.
|
|
267
|
+
|
|
268
|
+
```astro
|
|
269
|
+
---
|
|
270
|
+
import { Image } from 'astro:assets';
|
|
271
|
+
import heroImage from '../assets/hero.jpg';
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
<Image src={heroImage} alt="Hero" width={800} />
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Anti-Patterns
|
|
278
|
+
|
|
279
|
+
| Anti-Pattern | Why It's Wrong | Do This Instead |
|
|
280
|
+
|-------------|---------------|-----------------|
|
|
281
|
+
| `client:load` on every component | Defeats zero-JS benefit, bloats bundle | Use `client:idle` or `client:visible` for non-critical UI |
|
|
282
|
+
| Importing large JS libraries in `.astro` | Runs at build but bundles nothing useful | Import in framework components with `client:*` |
|
|
283
|
+
| Skipping content collections for blog/docs | Manual file handling is error-prone | Use content collections with typed schemas |
|
|
284
|
+
| Hardcoding data in pages | Not maintainable, no type safety | Use content collections or fetch from APIs |
|
|
285
|
+
| Using `client:only` when SSR works | Loses SEO benefits and fast first paint | Use `client:load` or `client:visible` instead |
|
|
286
|
+
| Giant monolithic pages | Hard to maintain and test | Split into layouts + reusable components |
|
|
287
|
+
| Ignoring `astro add` for integrations | Manual config is error-prone | Use `astro add` for official integrations |
|
|
288
|
+
| Missing `alt` on images | Accessibility violation | Always provide descriptive `alt` text |
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PluginConfig } from '../types.js';
|
|
2
|
+
|
|
3
|
+
export const config: PluginConfig = {
|
|
4
|
+
id: 'astro',
|
|
5
|
+
name: 'Astro',
|
|
6
|
+
category: 'tech',
|
|
7
|
+
subCategory: 'framework',
|
|
8
|
+
label: 'Astro',
|
|
9
|
+
hint: 'Content-driven web framework with islands architecture and Docs MCP',
|
|
10
|
+
skillName: 'astro-framework',
|
|
11
|
+
mcpServerKey: 'Astro docs',
|
|
12
|
+
mcpConfig: {
|
|
13
|
+
type: 'http',
|
|
14
|
+
url: 'https://mcp.docs.astro.build/mcp',
|
|
15
|
+
},
|
|
16
|
+
authType: 'none',
|
|
17
|
+
envVars: [],
|
|
18
|
+
agentToolMap: {
|
|
19
|
+
'developer': [
|
|
20
|
+
'astro-docs/search_astro_docs',
|
|
21
|
+
],
|
|
22
|
+
'documentation-writer': [
|
|
23
|
+
'astro-docs/search_astro_docs',
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
docsUrl: 'https://www.opencastle.dev/docs/plugins#astro',
|
|
27
|
+
officialDocs: 'https://docs.astro.build',
|
|
28
|
+
};
|
|
@@ -4,7 +4,7 @@ export const config: PluginConfig = {
|
|
|
4
4
|
id: 'chrome-devtools',
|
|
5
5
|
name: 'Chrome DevTools',
|
|
6
6
|
category: 'tech',
|
|
7
|
-
subCategory: 'testing',
|
|
7
|
+
subCategory: 'e2e-testing',
|
|
8
8
|
label: 'Chrome DevTools',
|
|
9
9
|
hint: 'Browser testing, screenshots, DOM inspection',
|
|
10
10
|
skillName: 'browser-testing',
|
|
@@ -22,7 +22,7 @@ export const config: PluginConfig = {
|
|
|
22
22
|
'testing-expert': ['chrome-devtools/*'],
|
|
23
23
|
'ui-ux-expert': ['chrome-devtools/*'],
|
|
24
24
|
},
|
|
25
|
-
docsUrl: '/
|
|
25
|
+
docsUrl: 'https://www.opencastle.dev/docs/plugins#chrome-devtools',
|
|
26
26
|
officialDocs: 'https://developer.chrome.com/docs/devtools',
|
|
27
27
|
mcpPackage: 'chrome-devtools-mcp',
|
|
28
28
|
preselected: true,
|