cc-dev-template 0.1.50 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/bin/install.js +30 -6
  2. package/package.json +1 -1
  3. package/src/skills/claude-md/SKILL.md +1 -8
  4. package/src/skills/claude-md/references/audit.md +1 -10
  5. package/src/skills/claude-md/references/create.md +2 -2
  6. package/src/skills/initialize-project/SKILL.md +17 -68
  7. package/src/skills/initialize-project/templates/CLAUDE.md.template +10 -0
  8. package/src/skills/initialize-project/templates/CURRENT_WORK.md.template +13 -0
  9. package/src/skills/initialize-project/templates/INDEX.md.template +7 -0
  10. package/src/skills/prompting/SKILL.md +9 -116
  11. package/src/skills/prompting/references/create.md +59 -0
  12. package/src/skills/prompting/references/principles.md +60 -0
  13. package/src/skills/prompting/references/review.md +78 -0
  14. package/src/skills/spec-interview/SKILL.md +4 -26
  15. package/src/skills/spec-interview/references/step-1-opening.md +21 -0
  16. package/src/skills/spec-interview/references/step-2-deep-dive.md +77 -0
  17. package/src/skills/spec-interview/references/step-3-finalize.md +19 -0
  18. package/src/skills/spec-review/SKILL.md +12 -14
  19. package/src/skills/spec-to-tasks/SKILL.md +3 -85
  20. package/src/skills/spec-to-tasks/references/step-1-identify-spec.md +30 -0
  21. package/src/skills/spec-to-tasks/references/step-2-explore.md +25 -0
  22. package/src/skills/spec-to-tasks/references/step-3-generate.md +31 -0
  23. package/src/skills/spec-to-tasks/templates/tasks.yaml +25 -0
  24. package/src/mcp-servers/qa-server/README.md +0 -122
  25. package/src/mcp-servers/qa-server/package-lock.json +0 -2015
  26. package/src/mcp-servers/qa-server/package.json +0 -28
  27. package/src/mcp-servers/qa-server/src/index.ts +0 -220
  28. package/src/mcp-servers/qa-server/tsconfig.json +0 -17
  29. package/src/skills/spec-interview/references/interview-guide.md +0 -123
  30. package/src/skills/youtube-to-notes/SKILL.md +0 -11
  31. package/src/skills/youtube-to-notes/references/step-1-setup.md +0 -15
  32. package/src/skills/youtube-to-notes/references/step-2-download-transcribe.md +0 -13
  33. package/src/skills/youtube-to-notes/references/step-3-create-documents.md +0 -31
@@ -1,28 +0,0 @@
1
- {
2
- "name": "qa-server",
3
- "version": "1.0.0",
4
- "description": "MCP server that spawns a QA sub-agent for frontend visual inspection",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "bin": {
8
- "qa-server": "./dist/index.js"
9
- },
10
- "scripts": {
11
- "build": "tsc",
12
- "start": "node dist/index.js",
13
- "dev": "tsx src/index.ts"
14
- },
15
- "dependencies": {
16
- "@anthropic-ai/claude-agent-sdk": "^0.1.30",
17
- "@modelcontextprotocol/sdk": "^1.0.0",
18
- "zod": "^3.24.1"
19
- },
20
- "devDependencies": {
21
- "@types/node": "^20.0.0",
22
- "tsx": "^4.7.0",
23
- "typescript": "^5.3.0"
24
- },
25
- "engines": {
26
- "node": ">=18.0.0"
27
- }
28
- }
@@ -1,220 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * QA Server - MCP server that spawns a QA sub-agent for frontend visual inspection
4
- *
5
- * This server exposes a single `inspect_frontend` tool that:
6
- * 1. Takes a URL and task description
7
- * 2. Spawns a Claude sub-agent with Playwright MCP access
8
- * 3. The sub-agent navigates, screenshots, clicks, and inspects
9
- * 4. Returns a structured QA report
10
- *
11
- * Token savings: ~20k (26 browser tools) → ~500 (1 tool)
12
- */
13
-
14
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
15
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
16
- import {
17
- CallToolRequestSchema,
18
- ListToolsRequestSchema,
19
- } from "@modelcontextprotocol/sdk/types.js";
20
- import { query } from "@anthropic-ai/claude-agent-sdk";
21
-
22
- // QA Agent system prompt - follows ADR-002: explain WHY, positive framing, clear context
23
- const QA_SYSTEM_PROMPT = `You are a QA engineer helping developers verify their frontend works correctly.
24
-
25
- **Why this matters:** Catching visual bugs, console errors, and broken interactions early saves significant debugging time. Your detailed assessment helps developers ship with confidence.
26
-
27
- **Your capabilities:** You can navigate pages, take screenshots to see the visual state, click elements, fill forms, and read console messages. Screenshots show you exactly what users see.
28
-
29
- **What makes a great QA report:**
30
- - Visual Assessment: Describe the layout, colors, and overall appearance
31
- - Console Errors: List any errors found (or confirm none exist)
32
- - Task Result: What happened when you performed the requested task
33
- - Issues Found: Any problems discovered during inspection
34
- - Overall: PASS or FAIL with a clear reason
35
-
36
- Focus on what the developer needs to know: visual issues, broken functionality, and console errors. Be thorough in your inspection and clear in your reporting.`;
37
-
38
- // Create MCP server
39
- const server = new Server(
40
- {
41
- name: "qa-server",
42
- version: "1.0.0",
43
- },
44
- {
45
- capabilities: {
46
- tools: {},
47
- },
48
- }
49
- );
50
-
51
- // List available tools
52
- server.setRequestHandler(ListToolsRequestSchema, async () => {
53
- return {
54
- tools: [
55
- {
56
- name: "inspect_frontend",
57
- description:
58
- "Spawn a QA sub-agent to visually inspect a frontend. The sub-agent can navigate, take screenshots, click elements, fill forms, and check console errors. Returns a structured QA report. Uses Opus for best visual understanding.",
59
- inputSchema: {
60
- type: "object",
61
- properties: {
62
- url: {
63
- type: "string",
64
- description: "URL to inspect (e.g., http://localhost:3000, https://example.com)",
65
- },
66
- task: {
67
- type: "string",
68
- description:
69
- "What to inspect or test (e.g., 'Verify the login form works', 'Check for visual regressions on the homepage', 'Test the checkout flow')",
70
- },
71
- },
72
- required: ["url", "task"],
73
- },
74
- },
75
- ],
76
- };
77
- });
78
-
79
- // Handle tool calls
80
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
81
- if (request.params.name !== "inspect_frontend") {
82
- throw new Error(`Unknown tool: ${request.params.name}`);
83
- }
84
-
85
- const { url, task } = request.params.arguments as { url: string; task: string };
86
-
87
- if (!url || !task) {
88
- return {
89
- content: [
90
- {
91
- type: "text",
92
- text: "Error: Both 'url' and 'task' parameters are required",
93
- },
94
- ],
95
- isError: true,
96
- };
97
- }
98
-
99
- console.error(`[QA Server] Starting inspection of ${url}`);
100
- console.error(`[QA Server] Task: ${task}`);
101
-
102
- try {
103
- // Build the task prompt - follows ADR-002: purpose-driven, positive framing
104
- const taskPrompt = `
105
- **QA Inspection Request**
106
-
107
- URL: ${url}
108
- Task: ${task}
109
-
110
- **Context:** A developer needs verification that this frontend is working correctly. Your assessment helps them catch issues before users do.
111
-
112
- **Available tools:**
113
- - browser_navigate: Go to the URL
114
- - browser_take_screenshot: See the visual state (use this to understand what the page looks like)
115
- - browser_click: Click elements
116
- - browser_fill: Fill form fields
117
- - browser_get_text: Read page content
118
- - browser_wait_for: Wait for elements or conditions
119
-
120
- **Success criteria:** Provide a clear QA report covering visual state, console errors, task completion, and overall pass/fail assessment.
121
- `;
122
-
123
- // Spawn sub-agent with Playwright MCP access
124
- const result = query({
125
- prompt: taskPrompt,
126
- options: {
127
- model: "claude-opus-4-5",
128
- cwd: process.cwd(),
129
- systemPrompt: QA_SYSTEM_PROMPT,
130
- mcpServers: {
131
- "playwright": {
132
- command: "npx",
133
- args: ["@playwright/mcp@latest", "--vision", "--headless"],
134
- },
135
- },
136
- allowedTools: [
137
- "mcp__playwright__browser_navigate",
138
- "mcp__playwright__browser_click",
139
- "mcp__playwright__browser_fill",
140
- "mcp__playwright__browser_take_screenshot",
141
- "mcp__playwright__browser_wait_for",
142
- "mcp__playwright__browser_get_text",
143
- "mcp__playwright__browser_hover",
144
- "mcp__playwright__browser_press_key",
145
- "mcp__playwright__browser_scroll",
146
- "mcp__playwright__browser_get_url",
147
- ],
148
- },
149
- });
150
-
151
- // Collect the agent's final response
152
- let report = "";
153
- let totalCost = 0;
154
-
155
- for await (const message of result) {
156
- // Log progress to stderr (visible in server logs, not returned to client)
157
- if (message.type === "system" && message.subtype === "init") {
158
- console.error(`[QA Server] Agent initialized with tools: ${message.tools.length} tools`);
159
- }
160
-
161
- if (message.type === "assistant") {
162
- // Extract text responses from assistant messages
163
- const textBlocks = message.message.content.filter(
164
- (c: any) => c.type === "text"
165
- );
166
- for (const block of textBlocks) {
167
- report = block.text; // Keep latest text as the report
168
- }
169
-
170
- // Log tool calls
171
- const toolCalls = message.message.content.filter(
172
- (c: any) => c.type === "tool_use"
173
- );
174
- for (const tool of toolCalls) {
175
- console.error(`[QA Server] Tool call: ${tool.name}`);
176
- }
177
- }
178
-
179
- if (message.type === "result") {
180
- totalCost = message.total_cost_usd;
181
- console.error(`[QA Server] Completed. Cost: $${totalCost.toFixed(4)}`);
182
- }
183
- }
184
-
185
- // Return the QA report
186
- return {
187
- content: [
188
- {
189
- type: "text",
190
- text: report || "No report generated. The agent may have encountered an issue.",
191
- },
192
- ],
193
- };
194
- } catch (error) {
195
- const errorMessage = error instanceof Error ? error.message : String(error);
196
- console.error(`[QA Server] Error: ${errorMessage}`);
197
-
198
- return {
199
- content: [
200
- {
201
- type: "text",
202
- text: `QA inspection failed: ${errorMessage}`,
203
- },
204
- ],
205
- isError: true,
206
- };
207
- }
208
- });
209
-
210
- // Start the server
211
- async function main() {
212
- const transport = new StdioServerTransport();
213
- await server.connect(transport);
214
- console.error("[QA Server] Started and ready for connections");
215
- }
216
-
217
- main().catch((error) => {
218
- console.error("[QA Server] Fatal error:", error);
219
- process.exit(1);
220
- });
@@ -1,17 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "outDir": "./dist",
7
- "rootDir": "./src",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "declaration": true,
13
- "resolveJsonModule": true
14
- },
15
- "include": ["src/**/*"],
16
- "exclude": ["node_modules", "dist"]
17
- }
@@ -1,123 +0,0 @@
1
- # Interview Guide
2
-
3
- ## The Interview Flow
4
-
5
- This is a conversation, not a checklist march. But ensure all areas get covered naturally.
6
-
7
- ### Opening
8
-
9
- Start with open-ended understanding:
10
- - "Tell me about this feature. What problem does it solve?"
11
- - "Who will use this? What's their goal?"
12
- - "Walk me through what success looks like."
13
-
14
- Let the user talk. Ask follow-ups on anything unclear.
15
-
16
- ### Areas to Cover
17
-
18
- Cover these naturally through conversation. Don't force the order.
19
-
20
- **Intent & Goals**
21
- - What is the user trying to accomplish?
22
- - Why does this matter? What's the business/user value?
23
- - What does success look like? How will we know it's working?
24
-
25
- **Integration Points**
26
- - What existing parts of the system does this touch?
27
- - Are there external services, APIs, or libraries involved?
28
- - What data flows in and out?
29
-
30
- → *Use subagents to investigate the current codebase when integration questions arise.*
31
-
32
- **Data Model**
33
- - What entities/objects are involved?
34
- - What are the relationships between them?
35
- - What constraints exist (required fields, validations, limits)?
36
- - Are we extending existing models or creating new ones?
37
-
38
- **Behavior & Flows**
39
- - What are the main user flows?
40
- - What triggers this feature? What happens step by step?
41
- - Are there different modes or variations?
42
-
43
- **Edge Cases & Error Handling**
44
- - What can go wrong?
45
- - What happens with invalid input?
46
- - What are the boundary conditions?
47
- - How do we handle partial failures?
48
-
49
- **Acceptance Criteria**
50
- - How do we verify this works?
51
- - What are the specific, testable requirements?
52
- - What would make this "done"?
53
-
54
- **Blockers & Dependencies**
55
- - What external dependencies exist? (APIs, services, libraries)
56
- - Are there credentials, API keys, or access needed?
57
- - Are there decisions that need to be made before implementation?
58
- - Is anything waiting on external input?
59
-
60
- ### Research During Interview
61
-
62
- When you need to understand something about the current system, external libraries, or technical feasibility:
63
-
64
- - Use **Explore agents** to investigate the codebase or research external APIs/libraries
65
- - Use **Plan agents** to evaluate technical approaches or architectural decisions
66
-
67
- Keep the main interview context clean. Agents return only the relevant findings you need to continue the conversation.
68
-
69
- ### Writing the Spec
70
-
71
- As you gather information, write to `docs/specs/<name>/spec.md`. Update it incrementally during the conversation.
72
-
73
- **Spec structure:**
74
-
75
- ```markdown
76
- # [Feature Name]
77
-
78
- ## Overview
79
- [2-3 sentences: what this is and why it matters]
80
-
81
- ## Goals
82
- - [Primary goal]
83
- - [Secondary goals if any]
84
-
85
- ## Integration Points
86
- [How this connects to existing system]
87
- - Touches: [existing components]
88
- - External: [APIs, services, libraries]
89
- - Data flows: [in/out]
90
-
91
- ## Data Model
92
- [Entities, relationships, constraints]
93
-
94
- ## Behavior
95
- ### [Flow 1]
96
- [Step by step]
97
-
98
- ### [Flow 2]
99
- [Step by step]
100
-
101
- ## Edge Cases
102
- - [Edge case]: [how handled]
103
-
104
- ## Acceptance Criteria
105
- - [ ] [Testable requirement]
106
- - [ ] [Testable requirement]
107
-
108
- ## Blockers
109
- - [ ] [Blocker]: [what's needed]
110
- - [ ] [Decision needed]: [options]
111
- ```
112
-
113
- ### Completion Check
114
-
115
- When the spec seems complete, invoke the `spec-review` skill and specify which spec to review in the prompt. It analyzes the spec and returns feedback. If gaps are found, ask follow-up questions. Repeat until review passes.
116
-
117
- ### Finalizing
118
-
119
- Once review passes:
120
- 1. Confirm with user and show the final spec
121
- 2. Ask if they want to proceed to task breakdown
122
-
123
- If yes, invoke the `spec-to-tasks` skill and specify which spec to break down.
@@ -1,11 +0,0 @@
1
- ---
2
- name: youtube-to-notes
3
- description: This skill should be used when the user asks to "transcribe this YouTube video", "turn this video into notes", "get me notes from this YouTube talk", "summarize this YouTube video", "convert this video to markdown", or says "youtube to notes". Activate when the user wants to download, transcribe, and summarize a YouTube video into structured Markdown documents.
4
- argument-hint: "[url or search query]"
5
- ---
6
-
7
- # YouTube to Notes
8
-
9
- ## What To Do Now
10
-
11
- Read `references/step-1-setup.md`.
@@ -1,15 +0,0 @@
1
- # Setup
2
-
3
- Verify `yt-dlp` and `whisper` are installed.
4
-
5
- If either is missing, tell the user the exact install command (`brew install yt-dlp` or `brew install openai-whisper`) and stop.
6
-
7
- ## Resolve the Video
8
-
9
- The user provides either a YouTube URL or a search query via `$ARGUMENTS`.
10
-
11
- **If it's a URL:** Store it and move on.
12
-
13
- **If it's a search query:** Use yt-dlp to search YouTube for the top 5 results. Display each result's title, channel, duration, and URL. Ask the user to pick one.
14
-
15
- Read `references/step-2-download-transcribe.md` when a video URL is confirmed.
@@ -1,13 +0,0 @@
1
- # Download and Transcribe
2
-
3
- ## Download Audio
4
-
5
- Use yt-dlp to extract audio as high-quality MP3 from the selected URL. Use the video title as the output filename.
6
-
7
- ## Transcribe
8
-
9
- Run Whisper on the MP3 file using the `base` model. Output format: plain text, current directory.
10
-
11
- If the user requested higher accuracy, use `small` or `medium` instead — warn that these are significantly slower.
12
-
13
- Read `references/step-3-create-documents.md` when the `.txt` transcript file exists.
@@ -1,31 +0,0 @@
1
- # Create Documents
2
-
3
- Read the raw `.txt` transcript from Whisper. Create two Markdown files in the current directory.
4
-
5
- ## Transcript: `<video-title>-transcript.md`
6
-
7
- | Element | Instructions |
8
- |---------|-------------|
9
- | **YAML frontmatter** | `title`, `channel`, `url`, `date` (today), `duration` |
10
- | **Section headers** (`##`) | Insert where the topic shifts |
11
- | **Paragraphs** | Break at natural pause points into short, readable paragraphs |
12
- | **Speaker labels** | Label speakers in conversations when confident from context. Omit when unsure. |
13
- | **Code blocks** | Wrap any code mentioned in the video |
14
- | **Blockquotes** | Use for notable quotes |
15
-
16
- ## Summary: `<video-title>-summary.md`
17
-
18
- | Section | Content |
19
- |---------|---------|
20
- | **YAML frontmatter** | Same fields as transcript, plus `type: summary` |
21
- | **Overview** | 2-3 sentence summary |
22
- | **Key Points** | 5-10 bullets of the most important ideas |
23
- | **Notable Quotes** | 3-5 direct quotes (include approximate timestamps if available from Whisper output) |
24
- | **Action Items / Takeaways** | Concrete recommendations or next steps from the video |
25
- | **Related Topics** | Keywords or topics for further research |
26
-
27
- ## Cleanup
28
-
29
- Delete the intermediate `.mp3` and `.txt` files unless the user asked to keep them.
30
-
31
- Tell the user what files were created and their full paths.