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.
Files changed (182) hide show
  1. package/README.md +12 -69
  2. package/dist/cli/doctor.d.ts.map +1 -1
  3. package/dist/cli/doctor.js +13 -7
  4. package/dist/cli/doctor.js.map +1 -1
  5. package/dist/cli/init.d.ts.map +1 -1
  6. package/dist/cli/init.js +2 -1
  7. package/dist/cli/init.js.map +1 -1
  8. package/dist/cli/init.test.d.ts +17 -0
  9. package/dist/cli/init.test.d.ts.map +1 -0
  10. package/dist/cli/init.test.js +881 -0
  11. package/dist/cli/init.test.js.map +1 -0
  12. package/dist/cli/mcp.d.ts +9 -0
  13. package/dist/cli/mcp.d.ts.map +1 -1
  14. package/dist/cli/mcp.js +56 -0
  15. package/dist/cli/mcp.js.map +1 -1
  16. package/dist/cli/run/adapters/copilot.d.ts +10 -2
  17. package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
  18. package/dist/cli/run/adapters/copilot.js +83 -56
  19. package/dist/cli/run/adapters/copilot.js.map +1 -1
  20. package/dist/cli/run.js +2 -2
  21. package/dist/cli/run.js.map +1 -1
  22. package/dist/cli/stack-config-update.test.d.ts +2 -0
  23. package/dist/cli/stack-config-update.test.d.ts.map +1 -0
  24. package/dist/cli/stack-config-update.test.js +185 -0
  25. package/dist/cli/stack-config-update.test.js.map +1 -0
  26. package/dist/cli/stack-config.d.ts +27 -0
  27. package/dist/cli/stack-config.d.ts.map +1 -1
  28. package/dist/cli/stack-config.js +80 -27
  29. package/dist/cli/stack-config.js.map +1 -1
  30. package/dist/cli/types.d.ts +1 -1
  31. package/dist/cli/types.d.ts.map +1 -1
  32. package/dist/cli/update.d.ts.map +1 -1
  33. package/dist/cli/update.js +184 -17
  34. package/dist/cli/update.js.map +1 -1
  35. package/dist/orchestrator/plugins/astro/config.d.ts +3 -0
  36. package/dist/orchestrator/plugins/astro/config.d.ts.map +1 -0
  37. package/dist/orchestrator/plugins/astro/config.js +27 -0
  38. package/dist/orchestrator/plugins/astro/config.js.map +1 -0
  39. package/dist/orchestrator/plugins/chrome-devtools/config.js +2 -2
  40. package/dist/orchestrator/plugins/chrome-devtools/config.js.map +1 -1
  41. package/dist/orchestrator/plugins/contentful/config.js +1 -1
  42. package/dist/orchestrator/plugins/contentful/config.js.map +1 -1
  43. package/dist/orchestrator/plugins/convex/config.js +1 -1
  44. package/dist/orchestrator/plugins/convex/config.js.map +1 -1
  45. package/dist/orchestrator/plugins/cypress/config.d.ts +3 -0
  46. package/dist/orchestrator/plugins/cypress/config.d.ts.map +1 -0
  47. package/dist/orchestrator/plugins/cypress/config.js +15 -0
  48. package/dist/orchestrator/plugins/cypress/config.js.map +1 -0
  49. package/dist/orchestrator/plugins/figma/config.d.ts +3 -0
  50. package/dist/orchestrator/plugins/figma/config.d.ts.map +1 -0
  51. package/dist/orchestrator/plugins/figma/config.js +33 -0
  52. package/dist/orchestrator/plugins/figma/config.js.map +1 -0
  53. package/dist/orchestrator/plugins/index.d.ts.map +1 -1
  54. package/dist/orchestrator/plugins/index.js +20 -0
  55. package/dist/orchestrator/plugins/index.js.map +1 -1
  56. package/dist/orchestrator/plugins/jira/config.d.ts.map +1 -1
  57. package/dist/orchestrator/plugins/jira/config.js +2 -3
  58. package/dist/orchestrator/plugins/jira/config.js.map +1 -1
  59. package/dist/orchestrator/plugins/linear/config.js +2 -2
  60. package/dist/orchestrator/plugins/linear/config.js.map +1 -1
  61. package/dist/orchestrator/plugins/netlify/config.d.ts +3 -0
  62. package/dist/orchestrator/plugins/netlify/config.d.ts.map +1 -0
  63. package/dist/orchestrator/plugins/netlify/config.js +30 -0
  64. package/dist/orchestrator/plugins/netlify/config.js.map +1 -0
  65. package/dist/orchestrator/plugins/nextjs/config.d.ts +3 -0
  66. package/dist/orchestrator/plugins/nextjs/config.d.ts.map +1 -0
  67. package/dist/orchestrator/plugins/nextjs/config.js +35 -0
  68. package/dist/orchestrator/plugins/nextjs/config.js.map +1 -0
  69. package/dist/orchestrator/plugins/nx/config.d.ts.map +1 -1
  70. package/dist/orchestrator/plugins/nx/config.js +2 -3
  71. package/dist/orchestrator/plugins/nx/config.js.map +1 -1
  72. package/dist/orchestrator/plugins/playwright/config.d.ts +3 -0
  73. package/dist/orchestrator/plugins/playwright/config.d.ts.map +1 -0
  74. package/dist/orchestrator/plugins/playwright/config.js +25 -0
  75. package/dist/orchestrator/plugins/playwright/config.js.map +1 -0
  76. package/dist/orchestrator/plugins/prisma/config.d.ts +3 -0
  77. package/dist/orchestrator/plugins/prisma/config.d.ts.map +1 -0
  78. package/dist/orchestrator/plugins/prisma/config.js +25 -0
  79. package/dist/orchestrator/plugins/prisma/config.js.map +1 -0
  80. package/dist/orchestrator/plugins/resend/config.d.ts +3 -0
  81. package/dist/orchestrator/plugins/resend/config.d.ts.map +1 -0
  82. package/dist/orchestrator/plugins/resend/config.js +46 -0
  83. package/dist/orchestrator/plugins/resend/config.js.map +1 -0
  84. package/dist/orchestrator/plugins/sanity/config.d.ts.map +1 -1
  85. package/dist/orchestrator/plugins/sanity/config.js +1 -2
  86. package/dist/orchestrator/plugins/sanity/config.js.map +1 -1
  87. package/dist/orchestrator/plugins/slack/config.js +1 -1
  88. package/dist/orchestrator/plugins/slack/config.js.map +1 -1
  89. package/dist/orchestrator/plugins/strapi/config.js +1 -1
  90. package/dist/orchestrator/plugins/strapi/config.js.map +1 -1
  91. package/dist/orchestrator/plugins/supabase/config.d.ts.map +1 -1
  92. package/dist/orchestrator/plugins/supabase/config.js +1 -2
  93. package/dist/orchestrator/plugins/supabase/config.js.map +1 -1
  94. package/dist/orchestrator/plugins/teams/config.d.ts.map +1 -1
  95. package/dist/orchestrator/plugins/teams/config.js +1 -2
  96. package/dist/orchestrator/plugins/teams/config.js.map +1 -1
  97. package/dist/orchestrator/plugins/turborepo/config.d.ts +3 -0
  98. package/dist/orchestrator/plugins/turborepo/config.d.ts.map +1 -0
  99. package/dist/orchestrator/plugins/turborepo/config.js +15 -0
  100. package/dist/orchestrator/plugins/turborepo/config.js.map +1 -0
  101. package/dist/orchestrator/plugins/types.d.ts +7 -7
  102. package/dist/orchestrator/plugins/types.d.ts.map +1 -1
  103. package/dist/orchestrator/plugins/vercel/config.d.ts.map +1 -1
  104. package/dist/orchestrator/plugins/vercel/config.js +2 -3
  105. package/dist/orchestrator/plugins/vercel/config.js.map +1 -1
  106. package/dist/orchestrator/plugins/vitest/config.d.ts +3 -0
  107. package/dist/orchestrator/plugins/vitest/config.d.ts.map +1 -0
  108. package/dist/orchestrator/plugins/vitest/config.js +15 -0
  109. package/dist/orchestrator/plugins/vitest/config.js.map +1 -0
  110. package/package.json +2 -1
  111. package/src/cli/doctor.ts +14 -7
  112. package/src/cli/init.test.ts +1141 -0
  113. package/src/cli/init.ts +2 -1
  114. package/src/cli/mcp.ts +77 -1
  115. package/src/cli/run/adapters/copilot.ts +86 -58
  116. package/src/cli/run.ts +2 -2
  117. package/src/cli/stack-config-update.test.ts +210 -0
  118. package/src/cli/stack-config.ts +110 -37
  119. package/src/cli/types.ts +1 -1
  120. package/src/cli/update.ts +230 -23
  121. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  122. package/src/orchestrator/agents/api-designer.agent.md +1 -11
  123. package/src/orchestrator/agents/architect.agent.md +1 -9
  124. package/src/orchestrator/agents/content-engineer.agent.md +1 -5
  125. package/src/orchestrator/agents/copywriter.agent.md +1 -9
  126. package/src/orchestrator/agents/data-expert.agent.md +2 -6
  127. package/src/orchestrator/agents/database-engineer.agent.md +1 -6
  128. package/src/orchestrator/agents/developer.agent.md +2 -12
  129. package/src/orchestrator/agents/devops-expert.agent.md +1 -5
  130. package/src/orchestrator/agents/documentation-writer.agent.md +1 -4
  131. package/src/orchestrator/agents/performance-expert.agent.md +1 -5
  132. package/src/orchestrator/agents/release-manager.agent.md +1 -11
  133. package/src/orchestrator/agents/researcher.agent.md +1 -4
  134. package/src/orchestrator/agents/security-expert.agent.md +2 -7
  135. package/src/orchestrator/agents/seo-specialist.agent.md +1 -10
  136. package/src/orchestrator/agents/testing-expert.agent.md +2 -11
  137. package/src/orchestrator/agents/ui-ux-expert.agent.md +3 -10
  138. package/src/orchestrator/customizations/README.md +2 -1
  139. package/src/orchestrator/customizations/agents/skill-matrix.json +106 -0
  140. package/src/orchestrator/customizations/agents/skill-matrix.md +58 -121
  141. package/src/orchestrator/instructions/general.instructions.md +1 -1
  142. package/src/orchestrator/plugins/astro/SKILL.md +288 -0
  143. package/src/orchestrator/plugins/astro/config.ts +28 -0
  144. package/src/orchestrator/plugins/chrome-devtools/config.ts +2 -2
  145. package/src/orchestrator/plugins/contentful/config.ts +1 -1
  146. package/src/orchestrator/plugins/convex/config.ts +1 -1
  147. package/src/orchestrator/plugins/cypress/SKILL.md +145 -0
  148. package/src/orchestrator/plugins/cypress/config.ts +16 -0
  149. package/src/orchestrator/plugins/figma/SKILL.md +85 -0
  150. package/src/orchestrator/plugins/figma/config.ts +34 -0
  151. package/src/orchestrator/plugins/index.ts +20 -0
  152. package/src/orchestrator/plugins/jira/config.ts +2 -3
  153. package/src/orchestrator/plugins/linear/config.ts +2 -2
  154. package/src/orchestrator/plugins/netlify/SKILL.md +134 -0
  155. package/src/orchestrator/plugins/netlify/config.ts +31 -0
  156. package/src/orchestrator/plugins/nextjs/SKILL.md +376 -0
  157. package/src/orchestrator/plugins/nextjs/config.ts +36 -0
  158. package/src/orchestrator/plugins/nx/config.ts +2 -3
  159. package/src/orchestrator/plugins/playwright/SKILL.md +191 -0
  160. package/src/orchestrator/plugins/playwright/config.ts +26 -0
  161. package/src/orchestrator/plugins/prisma/SKILL.md +137 -0
  162. package/src/orchestrator/plugins/prisma/config.ts +26 -0
  163. package/src/orchestrator/plugins/resend/SKILL.md +187 -0
  164. package/src/orchestrator/plugins/resend/config.ts +47 -0
  165. package/src/orchestrator/plugins/sanity/config.ts +1 -2
  166. package/src/orchestrator/plugins/slack/config.ts +1 -1
  167. package/src/orchestrator/plugins/strapi/config.ts +1 -1
  168. package/src/orchestrator/plugins/supabase/config.ts +1 -2
  169. package/src/orchestrator/plugins/teams/config.ts +1 -2
  170. package/src/orchestrator/plugins/turborepo/SKILL.md +121 -0
  171. package/src/orchestrator/plugins/turborepo/config.ts +16 -0
  172. package/src/orchestrator/plugins/types.ts +7 -7
  173. package/src/orchestrator/plugins/vercel/SKILL.md +99 -0
  174. package/src/orchestrator/plugins/vercel/config.ts +2 -3
  175. package/src/orchestrator/plugins/vitest/SKILL.md +166 -0
  176. package/src/orchestrator/plugins/vitest/config.ts +16 -0
  177. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +6 -4
  178. package/src/orchestrator/prompts/create-skill.prompt.md +6 -7
  179. package/src/orchestrator/prompts/generate-task-spec.prompt.md +1 -1
  180. package/src/orchestrator/skills/agent-hooks/SKILL.md +2 -2
  181. package/src/orchestrator/skills/memory-merger/SKILL.md +1 -1
  182. 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.md` | Maps capability slots to concrete skill names per agent role |
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. Agents reference **capability slots** instead of hardcoded technology skills — when the stack changes, update the bindings here and all agents automatically resolve to the correct skill.
3
+ Maps abstract technology capabilities to concrete skill implementations. The matrix distinguishes two types of skills:
5
4
 
6
- **Process/methodology skills** (session checkpoints, validation gates, self-improvement, etc.) are referenced directly in agent files they don't go through the matrix.
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 Matrix Skill file
15
+ Agent file skill-matrix.json Skill file
12
16
  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
13
- │ Developer │ │ framework: │ │ nextjs- │
14
- │ needs: │──lookup──▶│ nextjs │──load────▶│ patterns
15
- │ framework │ │ │ │ │
16
- ui-library │ │ ui-library: │ │ react-
17
- api-layer │ │ react │──load────▶│ development
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. **This matrix** maps each slot to the current technology and its skill file
27
- 3. **When delegating**, resolve slots through this matrix to load the correct skill
28
- 4. **To switch tech**, update only the binding row — no agent files change
29
-
30
- ## Stack Bindings
31
-
32
- <!-- Populated by the `bootstrap-customizations` prompt based on detected technologies. -->
33
-
34
- ### Primary Stack
35
-
36
- | Slot | Technology | Skill | Description |
37
- |------|-----------|-------|-------------|
38
- | `language` | | _(general.instructions.md)_ | Primary programming language, type system |
39
- | `ui-library` | | | Component architecture, hooks, state, styling |
40
- | `framework` | | | SSR/SSG, routing, layouts, Server/Client Components |
41
- | `database` | | | Schema, migrations, auth flow, roles |
42
- | `cms` | | | Document types, queries, schema management |
43
- | `deployment` | | | Hosting, cron jobs, env vars, caching, headers |
44
- | `codebase-tool` | | | Task running, building, linting, testing, code generation |
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 → Convex
48
+ ### Example: Migrate to a new plugin (Supabase → Azure)
115
49
 
116
- 1. Create a new skill: `skills/convex-database/SKILL.md`
117
- 2. Update this matrix: `database` row Technology: `Convex`, Skill: `convex-database`
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: React Svelte + Next.jsSvelteKit
55
+ ### Example: Migrate to an existing plugin (Linear Jira)
122
56
 
123
- 1. Create skills: `skills/svelte-development/SKILL.md`, `skills/sveltekit-patterns/SKILL.md`
124
- 2. Update matrix: `ui-library` `Svelte` / `svelte-development`
125
- 3. Update matrix: `framework` `SvelteKit` / `sveltekit-patterns`
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: Jest Vitest
61
+ ### Example: Add a second plugin
130
62
 
131
- 1. Create skill: `skills/vitest-workflow/SKILL.md`
132
- 2. Update matrix: `testing` `Vitest` / `vitest-workflow`
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
- ### Example: Linear Jira
66
+ ## Missing Plugin or Empty Slot
136
67
 
137
- 1. Skill already exists: `skills/jira-management/SKILL.md`
138
- 2. Update matrix: `task-management` → `Jira` / `jira-management`
139
- 3. **No agent files change** — Team Lead still references the `task-management` slot
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** — Technology choices live here, not scattered across agent files
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 one matrix row updates every agent that uses that slot
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 any slots (e.g., Security Expert needs both `security` + `database`)
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.md` for the full domain-to-skill mapping.
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: '/guides/plugins#chrome-devtools',
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,