ccstart 3.0.0 → 3.0.2
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
CHANGED
|
@@ -5,9 +5,23 @@
|
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
6
|
[](https://www.npmjs.com/package/ccstart)
|
|
7
7
|
|
|
8
|
-
Quick setup for Claude Code projects with built-in agents, skills, and
|
|
8
|
+
Quick setup for Claude Code projects with built-in agents, skills, hooks, and ticket tracking.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Why ccstart?
|
|
11
|
+
|
|
12
|
+
Setting up new projects or repositories and plugging in Claude Code into it requires more than just generating a
|
|
13
|
+
CLAUDE.md for most developers who wants a more customized workflow such as manual
|
|
14
|
+
creation of agents, skills, hooks, and project structure.
|
|
15
|
+
|
|
16
|
+
There isn't a standardized approach, leading to inconsistent setups and repeated boilerplate work across projects.
|
|
17
|
+
We already have boilerplate for our codebase to build CRUD and stuff, having one for something heavily customized
|
|
18
|
+
like Claude seems like the obvious solution.
|
|
19
|
+
|
|
20
|
+
ccstart provides a complete, opinionated scaffolding with basic agents, skills, and workflows out of the box so that we
|
|
21
|
+
can focus on immediately prompting and building while trying to keep context bloat and overengineering as low as
|
|
22
|
+
possible.
|
|
23
|
+
|
|
24
|
+
## Quick Start Installation
|
|
11
25
|
|
|
12
26
|
```bash
|
|
13
27
|
# To set up in a specific directory
|
|
@@ -25,33 +39,118 @@ ccstart <project directory>
|
|
|
25
39
|
|
|
26
40
|
```
|
|
27
41
|
my-project/
|
|
28
|
-
├── CLAUDE.md
|
|
42
|
+
├── CLAUDE.md # Project instructions for Claude
|
|
29
43
|
├── claude/
|
|
30
|
-
│ └── tickets/
|
|
44
|
+
│ └── tickets/
|
|
45
|
+
│ ├── README.md # Ticket format and structure guide
|
|
46
|
+
│ └── ticket-list.md # Centralized ticket index
|
|
31
47
|
└── .claude/
|
|
32
|
-
├── agents/
|
|
33
|
-
├──
|
|
34
|
-
|
|
48
|
+
├── agents/
|
|
49
|
+
│ ├── planner.md # Strategic planning
|
|
50
|
+
│ ├── checker.md # QA and code review
|
|
51
|
+
│ ├── backend.md
|
|
52
|
+
│ └── frontend.md
|
|
53
|
+
├── skills/
|
|
54
|
+
│ ├── commit/ # Conventional commits
|
|
55
|
+
│ ├── create-pr/ # Structured pull requests
|
|
56
|
+
│ ├── create-ticket/ # Ticket creation workflow
|
|
57
|
+
│ ├── design-feature/ # Opinionated design phases
|
|
58
|
+
│ ├── create-script/ # Python CLI generation for ideation
|
|
59
|
+
│ ├── skill-creator/ # Create new skills
|
|
60
|
+
│ └── update-claude-md/ # CLAUDE.md maintenance
|
|
61
|
+
└── hooks/
|
|
62
|
+
├── ticket-reminder.sh # Prompts ticket creation after planning
|
|
63
|
+
└── claude-md-reminder.sh # Enforces CLAUDE.md instructions every prompt
|
|
35
64
|
```
|
|
36
65
|
|
|
37
|
-
## The Workflow
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
## The Integrated Workflow
|
|
67
|
+
|
|
68
|
+
ccstart components work together to provide a complete development workflow:
|
|
69
|
+
|
|
70
|
+
Generally, this is what I do personally:
|
|
71
|
+
|
|
72
|
+
1. **Start with `/design-feature`** - Establish requirements and acceptance criteria before writing code
|
|
73
|
+
2. **Persist requirements with `/create-ticket`** - Keep a clear record of work in the ticket system
|
|
74
|
+
3. **Use the Planner agent** - Break down implementation into actionable tasks
|
|
75
|
+
4. **Use Backend/Frontend agents** - Follow established patterns for consistent, high-quality code
|
|
76
|
+
5. **Use the Checker agent** - Review code for quality, security, and performance before merging
|
|
77
|
+
6. **Use `/commit` and `/create-pr`** - Maintain clean git history with conventional commits
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## Agents
|
|
81
|
+
|
|
82
|
+
Agents in Claude's context basically works outside of your main context window, so you can use them for tasks and
|
|
83
|
+
analysis that will not pollute your context and bloat unnecessarily.
|
|
84
|
+
|
|
85
|
+
Invoke them with `@agent-name` in Claude Code or through natural language.
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
## Skills
|
|
89
|
+
|
|
90
|
+
Skills are basically macros, they can be explicitly invoked with `/skill-name` as if using slash commands, or
|
|
91
|
+
through natural language by triggering keywords.
|
|
92
|
+
|
|
93
|
+
They are best suited for repetitive action that you don't want to
|
|
94
|
+
keep typing the same thing for.
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
## Hooks
|
|
98
|
+
|
|
99
|
+
Hooks are shell scripts that run automatically in response to Claude Code events, such as before prompting, after
|
|
100
|
+
prompting.
|
|
101
|
+
|
|
102
|
+
If you know what lifespans are in context of backend development, this is basically it but for lifecycle
|
|
103
|
+
of prompt!
|
|
104
|
+
|
|
105
|
+
### ticket-reminder
|
|
106
|
+
|
|
107
|
+
**Triggers:** After exiting plan mode (PostToolUse on ExitPlanMode)
|
|
108
|
+
|
|
109
|
+
**Purpose:** Prompts Claude to create a ticket for significant features or bug fixes after a plan is approved. Helps ensure work is tracked without manual reminders.
|
|
110
|
+
|
|
111
|
+
### claude-md-reminder
|
|
112
|
+
|
|
113
|
+
**Triggers:** On every user prompt submission
|
|
114
|
+
|
|
115
|
+
**Purpose:** Reminds Claude to:
|
|
116
|
+
1. Review and respect all instructions in CLAUDE.md
|
|
117
|
+
2. Ask clarifying questions instead of making assumptions
|
|
118
|
+
|
|
119
|
+
## Ticket System
|
|
120
|
+
|
|
121
|
+
A lightweight task tracking system built into your project so that you can have persistency for your implementation
|
|
122
|
+
plans across Claude session, while leaving an audit trace that Claude can refer back to whenever needed.
|
|
123
|
+
|
|
124
|
+
### Status Emojis
|
|
125
|
+
|
|
126
|
+
| Emoji | Status | Description |
|
|
127
|
+
|-------|--------|-------------|
|
|
128
|
+
| 🔴 | Todo | Not started |
|
|
129
|
+
| 🟡 | In Progress | Currently being worked on |
|
|
130
|
+
| 🟢 | Done | Completed |
|
|
131
|
+
| 🔵 | Blocked | Waiting on dependencies |
|
|
132
|
+
| ⚫ | Cancelled | No longer needed |
|
|
133
|
+
|
|
134
|
+
### File Structure
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
tickets/
|
|
138
|
+
├── ticket-list.md # Centralized index of all tickets
|
|
139
|
+
├── README.md # Ticket format guide
|
|
140
|
+
├── TICKET-001-user-auth.md # Individual ticket files
|
|
141
|
+
├── TICKET-002-api-docs.md
|
|
142
|
+
└── TICKET-003-testing.md
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Ticket Naming Convention
|
|
146
|
+
|
|
147
|
+
Format: `TICKET-XXX-brief-description.md`
|
|
148
|
+
|
|
149
|
+
Example: `TICKET-042-implement-dark-mode.md`
|
|
150
|
+
|
|
151
|
+
### ticket-list.md
|
|
152
|
+
|
|
153
|
+
The centralized index organizes tickets by priority (High/Medium/Low) with status emojis and links to individual ticket files. Update this file whenever you create, modify, or complete tickets.
|
|
55
154
|
|
|
56
155
|
## Command Line Options
|
|
57
156
|
|
|
@@ -70,11 +169,12 @@ Examples:
|
|
|
70
169
|
ccstart my-app --all-agents # Include all agents
|
|
71
170
|
ccstart . --force # Overwrite in current directory
|
|
72
171
|
ccstart --agents # Preview available agents
|
|
172
|
+
ccstart my-app --dry-run # Preview changes without applying
|
|
73
173
|
```
|
|
74
174
|
|
|
75
175
|
## Interactive Setup
|
|
76
176
|
|
|
77
|
-
When you run `ccstart`, you'll be guided through
|
|
177
|
+
When you run `ccstart`, you'll be guided through selection prompts:
|
|
78
178
|
|
|
79
179
|
### Agent Selection
|
|
80
180
|
|
|
@@ -108,25 +208,7 @@ When you run `ccstart`, you'll be guided through three selection prompts:
|
|
|
108
208
|
Update CLAUDE.md sections through interactive Q&A
|
|
109
209
|
```
|
|
110
210
|
|
|
111
|
-
Use `--all-agents` to skip
|
|
112
|
-
|
|
113
|
-
## Key Features
|
|
114
|
-
|
|
115
|
-
- **Interactive Agent & Skill Selection** - Choose which agents and skills to include during setup
|
|
116
|
-
- **Smart Conflict Resolution** - Handle existing files with skip/rename/overwrite options
|
|
117
|
-
- **Auto-detects Claude Code** - Creates .claude directory structure automatically
|
|
118
|
-
- **Dry Run Mode** - Preview changes before applying them
|
|
119
|
-
- **Force Mode** - Skip all prompts for automated workflows
|
|
120
|
-
|
|
121
|
-
## Quick Start
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
npx ccstart my-project
|
|
125
|
-
cd my-project
|
|
126
|
-
|
|
127
|
-
# Edit CLAUDE.md with your project details
|
|
128
|
-
# Start using Claude Code with pre-configured agents and workflows
|
|
129
|
-
```
|
|
211
|
+
Use `--all-agents` to skip selection and include everything.
|
|
130
212
|
|
|
131
213
|
## Local Development
|
|
132
214
|
|
package/bin/create-project.js
CHANGED
|
@@ -566,8 +566,9 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
566
566
|
// Copy .claude/hooks directory
|
|
567
567
|
const claudeHooksDir = path.join(claudeDir, 'hooks');
|
|
568
568
|
const templateHooksDir = path.join(templateDir, 'claude', 'hooks');
|
|
569
|
-
|
|
570
|
-
|
|
569
|
+
const copiedHookFiles = [];
|
|
570
|
+
|
|
571
|
+
if (fs.existsSync(templateHooksDir) && selectedHookFiles.length > 0) {
|
|
571
572
|
// Create .claude/hooks directory
|
|
572
573
|
if (!fs.existsSync(claudeHooksDir)) {
|
|
573
574
|
if (!dryRun) {
|
|
@@ -578,14 +579,13 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
578
579
|
console.log(' 📁 Would create directory: .claude/hooks/');
|
|
579
580
|
}
|
|
580
581
|
}
|
|
581
|
-
|
|
582
|
-
// Copy
|
|
583
|
-
const
|
|
584
|
-
for (const hookFile of hookFiles) {
|
|
582
|
+
|
|
583
|
+
// Copy only selected hook files
|
|
584
|
+
for (const hookFile of selectedHookFiles) {
|
|
585
585
|
const hookSrc = path.join(templateHooksDir, hookFile);
|
|
586
586
|
const hookDest = path.join(claudeHooksDir, hookFile);
|
|
587
|
-
|
|
588
|
-
if (fs.statSync(hookSrc).isFile()) {
|
|
587
|
+
|
|
588
|
+
if (fs.existsSync(hookSrc) && fs.statSync(hookSrc).isFile()) {
|
|
589
589
|
if (!fs.existsSync(hookDest)) {
|
|
590
590
|
if (!dryRun) {
|
|
591
591
|
fs.copyFileSync(hookSrc, hookDest);
|
|
@@ -594,6 +594,7 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
594
594
|
fs.chmodSync(hookDest, '755');
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
|
+
copiedHookFiles.push(hookFile);
|
|
597
598
|
createdItems.push(`.claude/hooks/${hookFile}`);
|
|
598
599
|
if (dryRun) {
|
|
599
600
|
console.log(` ✨ Would copy: .claude/hooks/${hookFile}`);
|
|
@@ -606,6 +607,7 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
606
607
|
fs.chmodSync(hookDest, '755');
|
|
607
608
|
}
|
|
608
609
|
}
|
|
610
|
+
copiedHookFiles.push(hookFile);
|
|
609
611
|
if (dryRun) {
|
|
610
612
|
console.log(` ♻️ Would replace: .claude/hooks/${hookFile}`);
|
|
611
613
|
}
|
|
@@ -624,6 +626,8 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
624
626
|
fs.chmodSync(newDest, '755');
|
|
625
627
|
}
|
|
626
628
|
}
|
|
629
|
+
const renamedFile = path.basename(newDest);
|
|
630
|
+
copiedHookFiles.push(renamedFile);
|
|
627
631
|
const relativePath = path.relative(claudeDir, newDest);
|
|
628
632
|
createdItems.push(relativePath);
|
|
629
633
|
if (dryRun) {
|
|
@@ -639,6 +643,46 @@ async function initializeClaudeDirectory(selectedAgentFiles, selectedSkillDirs,
|
|
|
639
643
|
}
|
|
640
644
|
}
|
|
641
645
|
}
|
|
646
|
+
|
|
647
|
+
// Create settings.local.json with hooks configuration
|
|
648
|
+
const settingsLocalDest = path.join(claudeDir, 'settings.local.json');
|
|
649
|
+
if (copiedHookFiles.length > 0) {
|
|
650
|
+
const hooksConfig = {
|
|
651
|
+
hooks: {
|
|
652
|
+
UserPromptSubmit: []
|
|
653
|
+
}
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
// Add each copied hook to UserPromptSubmit (all current hooks use this event)
|
|
657
|
+
for (const hookFile of copiedHookFiles) {
|
|
658
|
+
hooksConfig.hooks.UserPromptSubmit.push({
|
|
659
|
+
hooks: [{
|
|
660
|
+
type: "command",
|
|
661
|
+
command: `.claude/hooks/${hookFile}`
|
|
662
|
+
}]
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// Merge with existing settings.local.json if it exists
|
|
667
|
+
if (fs.existsSync(settingsLocalDest)) {
|
|
668
|
+
const existingSettings = JSON.parse(fs.readFileSync(settingsLocalDest, 'utf8'));
|
|
669
|
+
existingSettings.hooks = hooksConfig.hooks;
|
|
670
|
+
if (!dryRun) {
|
|
671
|
+
fs.writeFileSync(settingsLocalDest, JSON.stringify(existingSettings, null, 2));
|
|
672
|
+
}
|
|
673
|
+
if (dryRun) {
|
|
674
|
+
console.log(' ♻️ Would update: .claude/settings.local.json with hooks config');
|
|
675
|
+
}
|
|
676
|
+
} else {
|
|
677
|
+
if (!dryRun) {
|
|
678
|
+
fs.writeFileSync(settingsLocalDest, JSON.stringify(hooksConfig, null, 2));
|
|
679
|
+
}
|
|
680
|
+
if (dryRun) {
|
|
681
|
+
console.log(' ✨ Would create: .claude/settings.local.json with hooks config');
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
createdItems.push('.claude/settings.local.json');
|
|
685
|
+
}
|
|
642
686
|
|
|
643
687
|
// Copy settings.json.example if it doesn't exist
|
|
644
688
|
const settingsExampleSrc = path.join(templateDir, 'settings.json.example');
|
package/package.json
CHANGED
|
@@ -11,5 +11,6 @@ cat << 'EOF'
|
|
|
11
11
|
REMINDER: Before responding to this prompt:
|
|
12
12
|
1. Review and respect all instructions in CLAUDE.md
|
|
13
13
|
2. Ask clarifying questions if any requirements are unclear - do not make assumptions
|
|
14
|
+
3. If you just exited plan mode and the user approved a significant feature or bug fix, consider using /create-ticket to capture the implementation plan
|
|
14
15
|
</user-prompt-submit-hook>
|
|
15
16
|
EOF
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-claude-md
|
|
3
|
+
description: Update CLAUDE.md sections through interactive Q&A. Use when the user wants to update project documentation, refresh CLAUDE.md content, or says "/update-claude-md". Guides user through questions to update auto-generated sections (overview, objectives, commands, notes).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Update CLAUDE.md Skill
|
|
7
|
+
|
|
8
|
+
Update auto-generated sections in CLAUDE.md through interactive Q&A with the user.
|
|
9
|
+
|
|
10
|
+
## Target Sections
|
|
11
|
+
|
|
12
|
+
CLAUDE.md contains auto-generated sections marked with special comments:
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
<!-- auto-generated-start:SECTION_NAME -->
|
|
16
|
+
[content]
|
|
17
|
+
<!-- auto-generated-end:SECTION_NAME -->
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Sections to update:**
|
|
21
|
+
- `overview` - Brief project description
|
|
22
|
+
- `objectives` - Key project objectives (bullet list)
|
|
23
|
+
- `commands` - Common project commands (code block)
|
|
24
|
+
- `notes` - Additional important information
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
1. Read current CLAUDE.md content
|
|
29
|
+
2. Ask user which sections to update (or update all)
|
|
30
|
+
3. For each section, ask targeted questions
|
|
31
|
+
4. Generate updated content based on responses
|
|
32
|
+
5. Replace content between section markers
|
|
33
|
+
|
|
34
|
+
## Questions by Section
|
|
35
|
+
|
|
36
|
+
### Overview
|
|
37
|
+
- "What does this project do in one or two sentences?"
|
|
38
|
+
- "What problem does it solve?"
|
|
39
|
+
|
|
40
|
+
### Objectives
|
|
41
|
+
- "What are the main goals of this project?"
|
|
42
|
+
- "What key features or capabilities should it provide?"
|
|
43
|
+
|
|
44
|
+
### Commands
|
|
45
|
+
- "What commands do you commonly run for development?"
|
|
46
|
+
- "What are the test, build, and run commands?"
|
|
47
|
+
|
|
48
|
+
### Notes
|
|
49
|
+
- "What technology stack does this project use?"
|
|
50
|
+
- "Are there any important dependencies or requirements?"
|
|
51
|
+
- "Any other context that would help when working on this project?"
|
|
52
|
+
|
|
53
|
+
## Update Process
|
|
54
|
+
|
|
55
|
+
1. Find section markers using pattern: `<!-- auto-generated-start:SECTION_NAME -->`
|
|
56
|
+
2. Replace content between start and end markers
|
|
57
|
+
3. Preserve marker comments
|
|
58
|
+
4. Keep all content outside markers unchanged
|
|
59
|
+
|
|
60
|
+
## Example
|
|
61
|
+
|
|
62
|
+
User: "/update-claude-md"
|
|
63
|
+
|
|
64
|
+
Assistant asks: "Which sections would you like to update?"
|
|
65
|
+
- Overview
|
|
66
|
+
- Objectives
|
|
67
|
+
- Commands
|
|
68
|
+
- Notes
|
|
69
|
+
- All sections
|
|
70
|
+
|
|
71
|
+
User selects "Overview"
|
|
72
|
+
|
|
73
|
+
Assistant asks: "What does this project do in one or two sentences?"
|
|
74
|
+
|
|
75
|
+
User responds: "It's a REST API for managing a book library with search and recommendations"
|
|
76
|
+
|
|
77
|
+
Assistant updates:
|
|
78
|
+
```markdown
|
|
79
|
+
<!-- auto-generated-start:overview -->
|
|
80
|
+
A REST API for managing a book library, providing search functionality and personalized book recommendations.
|
|
81
|
+
<!-- auto-generated-end:overview -->
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Guidelines
|
|
85
|
+
|
|
86
|
+
- Keep overview concise (1-3 sentences)
|
|
87
|
+
- Format objectives as bullet points starting with action verbs
|
|
88
|
+
- Include actual commands in the commands section, not placeholders
|
|
89
|
+
- Notes should capture technology-specific details and gotchas
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
: <<'FRONTMATTER'
|
|
3
|
-
---
|
|
4
|
-
name: ticket-reminder
|
|
5
|
-
description: Reminds Claude to create a ticket for significant features or bug fixes after plan approval
|
|
6
|
-
hooks:
|
|
7
|
-
- event: PostToolUse
|
|
8
|
-
matcher: ExitPlanMode
|
|
9
|
-
---
|
|
10
|
-
FRONTMATTER
|
|
11
|
-
|
|
12
|
-
cat << 'EOF'
|
|
13
|
-
<post-tool-use-hook>
|
|
14
|
-
REMINDER: After the user approves this plan, consider whether this feature or bug fix justifies creating a ticket:
|
|
15
|
-
- If this is a significant feature, enhancement, or bug fix, use /create-ticket to create a ticket that captures the plan
|
|
16
|
-
- Include the implementation details from the plan in the ticket
|
|
17
|
-
- Skip ticket creation for trivial changes (typos, minor tweaks, quick fixes)
|
|
18
|
-
</post-tool-use-hook>
|
|
19
|
-
EOF
|