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
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/ccstart.svg)](https://www.npmjs.com/package/ccstart)
7
7
 
8
- Quick setup for Claude Code projects with built-in agents, skills, and tickets.
8
+ Quick setup for Claude Code projects with built-in agents, skills, hooks, and ticket tracking.
9
9
 
10
- ## Installation
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 # Project instructions for Claude
42
+ ├── CLAUDE.md # Project instructions for Claude
29
43
  ├── claude/
30
- │ └── tickets/ # Task tracking system
44
+ │ └── tickets/
45
+ │ ├── README.md # Ticket format and structure guide
46
+ │ └── ticket-list.md # Centralized ticket index
31
47
  └── .claude/
32
- ├── agents/ # Agents for Claude Code integration
33
- ├── skills/ # Skills for Claude Code integration
34
- └── hooks/ # Hooks for Claude Code integration
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
- ### How Claude Uses Your Project
40
-
41
- 1. **CLAUDE.md** provides context and instructions
42
- 2. **Agents** handle specialized tasks:
43
- - `planner` - Strategic planning and task breakdown
44
- - `checker` - Quality assurance and code review
45
- - `backend` - Backend architecture and API design
46
- - `frontend` - Frontend architecture and UI design
47
- 3. **Skills** automate common workflows:
48
- - `/commit` - Conventional commits
49
- - `/create-pr` - Structured pull requests
50
- - `/create-ticket` - Task ticket creation
51
- - `/design-feature` - Feature design phases
52
- - `/skill-creator` - Create new skills
53
- - `/update-claude-md` - Update CLAUDE.md sections
54
- 4. **Tickets** track tasks with status emojis
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 three selection prompts:
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 agent selection and include all agents.
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
 
@@ -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
- if (fs.existsSync(templateHooksDir)) {
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 all files from template hooks directory
583
- const hookFiles = fs.readdirSync(templateHooksDir);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccstart",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "Start your Claude Code projects with a well-organized structure including agents, tickets, and skills",
5
5
  "bin": {
6
6
  "ccstart": "bin/create-project.js"
@@ -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