@kennethsolomon/shipkit 3.0.4 → 3.0.7

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
@@ -84,7 +84,7 @@ Brainstorm → Plan → Branch → [Schema] → Write Tests → Implement → Co
84
84
  | 1 | read `tasks/todo.md` | Pick the next task |
85
85
  | 2 | read `tasks/lessons.md` | Review past corrections |
86
86
  | 3 | `/sk:brainstorm` | Clarify requirements — no code |
87
- | 4 | `/sk:frontend-design` | UI design spec *(skip if backend-only)* |
87
+ | 4 | `/sk:frontend-design` | UI design spec *(skip if backend-only)*. Add `--pencil` to also generate a Pencil visual mockup |
88
88
  | 5 | `/sk:api-design` | API contracts *(skip if no new endpoints)* |
89
89
  | 6 | `/sk:accessibility` | WCAG 2.1 AA audit on design *(skip if no frontend)* |
90
90
  | 7 | `/sk:write-plan` | Write plan to `tasks/todo.md` |
@@ -170,7 +170,7 @@ Requirement changes → /sk:change → re-enter at correct step
170
170
  | Command | Description |
171
171
  |---------|-------------|
172
172
  | `/sk:brainstorm` | Explore requirements and design before writing any code |
173
- | `/sk:frontend-design` | Create UI design specs and mockups |
173
+ | `/sk:frontend-design` | Create UI design specs and mockups. After the design summary, it asks if you want a Pencil visual mockup. Use `--pencil` flag to jump directly to the Pencil phase *(requires Pencil app + MCP)* |
174
174
  | `/sk:api-design` | Design REST or GraphQL API contracts |
175
175
  | `/sk:accessibility` | WCAG 2.1 AA audit on design or existing frontend |
176
176
  | `/sk:write-plan` | Write a decision-complete plan to `tasks/todo.md` |
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env python3
2
+ """Manage ShipKit project configuration."""
3
+
4
+ import json
5
+ import os
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ def get_defaults():
10
+ return {
11
+ "profile": "balanced",
12
+ "auto_commit": True,
13
+ "skip_gates": [],
14
+ "coverage_threshold": 100,
15
+ "branch_pattern": "feature/{slug}",
16
+ "model_overrides": {}
17
+ }
18
+
19
+ def get_config():
20
+ """Read current config or return defaults."""
21
+ config_file = Path(".shipkit/config.json")
22
+ if config_file.exists():
23
+ try:
24
+ with open(config_file) as f:
25
+ return json.load(f)
26
+ except json.JSONDecodeError:
27
+ return get_defaults()
28
+ return get_defaults()
29
+
30
+ def get_models_for_profile(profile):
31
+ """Get model assignments for a profile."""
32
+ models = {
33
+ "full-sail": {"planning": "opus", "implementation": "opus", "audits": "opus", "gates": "sonnet"},
34
+ "quality": {"planning": "opus", "implementation": "sonnet", "audits": "sonnet", "gates": "sonnet"},
35
+ "balanced": {"planning": "sonnet", "implementation": "sonnet", "audits": "sonnet", "gates": "haiku"},
36
+ "budget": {"planning": "sonnet", "implementation": "sonnet", "audits": "haiku", "gates": "haiku"}
37
+ }
38
+ return models.get(profile, models["balanced"])
39
+
40
+ def display_config(config):
41
+ """Display current configuration in a table."""
42
+ print("\n## Current Configuration\n")
43
+ print("| Setting | Value | Description |")
44
+ print("|---------|-------|-------------|")
45
+ print(f"| `profile` | `{config['profile']}` | Model routing profile (full-sail / quality / balanced / budget) |")
46
+ print(f"| `auto_commit` | `{str(config['auto_commit']).lower()}` | Auto-run `/sk:smart-commit` after each gate passes |")
47
+ skip_gates_str = ", ".join(config['skip_gates']) if config['skip_gates'] else "(none)"
48
+ print(f"| `skip_gates` | `{skip_gates_str}` | Gates to skip |")
49
+ print(f"| `coverage_threshold` | `{config['coverage_threshold']}%` | Minimum test coverage on new code |")
50
+ print(f"| `branch_pattern` | `{config['branch_pattern']}` | Branch naming pattern |")
51
+ print(f"| `model_overrides` | `{json.dumps(config['model_overrides'])}` | Per-skill model overrides |")
52
+
53
+ profile = config['profile']
54
+ models = get_models_for_profile(profile)
55
+ print(f"\n## Model Assignments — `{profile}` profile\n")
56
+ print("| Skill group | Model |")
57
+ print("|-------------|-------|")
58
+ print(f"| brainstorm, write-plan, debug, execute-plan, review | `{models['planning']}` |")
59
+ print(f"| write-tests, frontend-design, api-design, security-check | `{models['implementation']}` |")
60
+ print(f"| perf, schema-migrate, accessibility | `{models['audits']}` |")
61
+ print(f"| lint, test | `{models['gates']}` |")
62
+ print(f"| smart-commit, branch, update-task | `haiku` |")
63
+
64
+ def save_config(config):
65
+ """Save config to .shipkit/config.json."""
66
+ Path(".shipkit").mkdir(exist_ok=True)
67
+ config_file = Path(".shipkit/config.json")
68
+
69
+ with open(config_file, "w") as f:
70
+ json.dump(config, f, indent=2)
71
+
72
+ # Add to .gitignore
73
+ gitignore = Path(".gitignore")
74
+ if gitignore.exists():
75
+ content = gitignore.read_text()
76
+ if ".shipkit/config.json" not in content:
77
+ with open(gitignore, "a") as f:
78
+ f.write("\n.shipkit/config.json\n")
79
+ else:
80
+ gitignore.write_text(".shipkit/config.json\n")
81
+
82
+ print(f"\n✅ Config saved to `.shipkit/config.json`")
83
+
84
+ def main():
85
+ config = get_config()
86
+ display_config(config)
87
+
88
+ print("\n---\n")
89
+ print("To change a setting, run: `/sk:set-profile <profile>` or edit `.shipkit/config.json` directly")
90
+
91
+ if __name__ == "__main__":
92
+ main()
@@ -1,7 +1,10 @@
1
- <!-- Generated by /sk:setup-claude -->
2
- <!-- Template Hash: 7deba6efd53c -->
1
+ ---
2
+ description: "Finalize a feature/bug-fix: changelog, arch log, verification, and PR creation."
3
+ ---
3
4
 
4
- # Finish Feature Command
5
+ # /sk:finish-feature
6
+
7
+ Finalize a feature/bug-fix branch and create a pull request.
5
8
 
6
9
  Finalize a feature/bug-fix branch: changelog, arch log, security gate, verification, and PR creation.
7
10
 
@@ -80,22 +83,24 @@ If unresolved Critical/High findings remain, warn the user before proceeding.
80
83
 
81
84
  Tests should have been created during `/sk:execute-plan`. Verify:
82
85
 
86
+ Detect the project stack from `CLAUDE.md`, `package.json`, `composer.json`, etc. before running checks.
87
+
83
88
  a) **Automated Tests**
84
- - Execute: `npm test`
89
+ - Execute the detected test runner (e.g. `npm test`, `./vendor/bin/pest`, `python -m pytest`)
85
90
  - Verify all tests pass with no failures
86
- - Check test coverage (target: >80% for new code in `Unknown` projects)
91
+ - Check test coverage (target: >80% for new code)
87
92
  - No skipped tests (`test.skip`, `it.skip`, `@skip`, etc.)
88
- - Run other CI checks: lint (`npm run lint` or equivalent), build (`npm run build` or equivalent)
93
+ - Run other CI checks: lint and build using project-detected commands
89
94
 
90
- b) **Manual Testing - Unknown / Unknown**
91
- - For frontend (Unknown): Render the component/page in browser, verify state updates work correctly, test all user interactions (clicks, form inputs, navigation), verify conditional rendering, check edge cases and error states
92
- - For backend/API (Unknown): Test HTTP status codes and responses, verify request/response bodies match spec, test error cases and input validation, check database transactions/state, verify authentication/authorization if applicable
93
- - For CLI/desktop (Unknown): Test command-line arguments and flags, verify output format and readability, test error messages and help text, check file I/O operations
94
- - Using Unknown framework: Verify test structure matches project conventions, assertions are clear and specific, setup/teardown is properly handled
95
+ b) **Manual Testing**
96
+ - For frontend (if detected): Render the component/page in browser, verify state updates work correctly, test all user interactions (clicks, form inputs, navigation), verify conditional rendering, check edge cases and error states
97
+ - For backend/API (if detected): Test HTTP status codes and responses, verify request/response bodies match spec, test error cases and input validation, check database transactions/state, verify authentication/authorization if applicable
98
+ - For CLI/desktop (if detected): Test command-line arguments and flags, verify output format and readability, test error messages and help text, check file I/O operations
99
+ - Verify test structure matches project conventions, assertions are clear and specific, setup/teardown is properly handled
95
100
 
96
101
  c) **Regression Testing**
97
102
  - Test related existing functionality to ensure no breakage
98
- - For Unknown projects: check related components/endpoints/commands work correctly
103
+ - Check related components/endpoints/commands work correctly
99
104
  - Verify no new console errors, warnings, or debug statements
100
105
  - Confirm existing tests still pass
101
106
 
@@ -104,7 +109,7 @@ If unresolved Critical/High findings remain, warn the user before proceeding.
104
109
  - Proper error handling and validation
105
110
  - No debugging code (`console.log`, `debugger`, `pdb`, `print` statements, etc.)
106
111
  - Comments explain *why*, not *what*
107
- - Follows Unknown conventions and style guide (see `CLAUDE.md`)
112
+ - Follows project conventions and style guide (see `CLAUDE.md`)
108
113
 
109
114
  6. **Security Gate**
110
115
  - If `/sk:security-check` has not been run on this branch, recommend: "Run `/sk:security-check` before creating a PR."
@@ -2,6 +2,16 @@
2
2
  description: "Show all ShipKit commands and workflow overview."
3
3
  ---
4
4
 
5
+ # Meta
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `/sk:help` | Show all commands and workflow overview |
10
+ | `/sk:status` | Show workflow and task status at a glance |
11
+ | `/sk:skill-creator` | Create or improve ShipKit skills |
12
+
13
+ ---
14
+
5
15
  # /sk:help — ShipKit
6
16
 
7
17
  A structured workflow toolkit for Claude Code.
@@ -19,7 +29,6 @@ Run these commands in order for a complete, quality-gated feature build.
19
29
  | `/sk:schema-migrate` | Analyze schema changes *(skip if no DB changes)* |
20
30
  | `/sk:write-tests` | TDD red: write failing tests first |
21
31
  | `/sk:execute-plan` | TDD green: implement until tests pass |
22
- | `/sk:change` | Requirements changed? Re-enter at the right step |
23
32
  | `/sk:smart-commit` | Conventional commit with approval |
24
33
  | `/sk:lint` | **GATE** — all linters must pass |
25
34
  | `/sk:test` | **GATE** — 100% coverage on new code |
@@ -63,14 +72,14 @@ Requirements change mid-workflow? Run `/sk:change` — it classifies the scope a
63
72
  | `/sk:execute-plan` | Implement plan in batches |
64
73
  | `/sk:features` | Sync docs/sk:features/ specs with codebase |
65
74
  | `/sk:finish-feature` | Changelog + PR creation |
66
- | `/sk:frontend-design` | UI mockup + design spec before implementation |
75
+ | `/sk:frontend-design` | UI mockup + design spec before implementation. Add `--pencil` to also generate a Pencil visual mockup (requires Pencil app + MCP) |
67
76
  | `/sk:hotfix` | Emergency fix workflow (skips design/TDD) |
68
77
  | `/sk:laravel-init` | Configure existing Laravel project |
69
78
  | `/sk:laravel-new` | Scaffold new Laravel project |
70
79
  | `/sk:lint` | Auto-detect and run all linters |
71
80
  | `/sk:perf` | Performance audit |
72
81
  | `/sk:plan` | Create/refresh task planning files |
73
- | `/sk:release` | Version bump + changelog + tag |
82
+ | `/sk:release` | Automate releases: bump version, update CHANGELOG, create tag, push to GitHub. Use --android and/or --ios flags for App Store / Play Store readiness audit |
74
83
  | `/sk:review` | Self-review of branch changes |
75
84
  | `/sk:schema-migrate` | Multi-ORM schema change analysis |
76
85
  | `/sk:security-check` | OWASP security audit |
@@ -113,4 +122,4 @@ Config lives in `.shipkit/config.json` — per project, gitignored by default.
113
122
 
114
123
  ---
115
124
 
116
- **ShipKit** by Kenneth Solomon · `npm install -g @kennethsolomon/shipkit` to install/update
125
+ **ShipKit** by Kenneth Solomon · `npx @kennethsolomon/shipkit` to install/update
@@ -53,36 +53,38 @@ Read each file in scope before auditing.
53
53
  - **A09 Logging Failures** — Missing audit logs, PII in logs, no alerting on security events
54
54
  - **A10 SSRF** — Unvalidated URLs, internal network access, DNS rebinding
55
55
 
56
- ### 2. Stack-Specific Checks (Unknown / Unknown)
56
+ ### 2. Stack-Specific Checks
57
57
 
58
- **If Unknown includes React/Next.js:**
58
+ Detect the project stack from `CLAUDE.md`, `package.json`, `composer.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, etc. Apply the relevant checks below for every detected framework/language.
59
+
60
+ **If the project uses React/Next.js:**
59
61
  - `dangerouslySetInnerHTML` usage without sanitization
60
62
  - Client-side secrets (API keys in browser bundles)
61
63
  - Missing CSP headers
62
64
  - Server component data leaking to client
63
65
  - `getServerSideProps`/Server Actions exposing internal data
64
66
 
65
- **If Unknown includes Express/Node.js:**
67
+ **If the project uses Express/Node.js:**
66
68
  - Missing helmet/security headers
67
69
  - Unsanitized user input in `req.params`, `req.query`, `req.body`
68
70
  - Path traversal via `req.params` in file operations
69
71
  - Missing rate limiting on auth endpoints
70
72
  - Prototype pollution
71
73
 
72
- **If Unknown is Python:**
74
+ **If the project uses Python:**
73
75
  - `eval()`, `exec()`, `pickle.loads()` with untrusted input
74
76
  - SQL string formatting instead of parameterized queries
75
77
  - `subprocess.shell=True` with user input
76
78
  - Missing input validation on FastAPI/Django endpoints
77
79
  - Jinja2 `| safe` filter misuse
78
80
 
79
- **If Unknown is Go:**
81
+ **If the project uses Go:**
80
82
  - Unchecked error returns on security-critical operations
81
83
  - `html/template` vs `text/template` confusion
82
84
  - Missing context cancellation/timeouts
83
85
  - Race conditions on shared state
84
86
 
85
- **If Unknown is PHP:**
87
+ **If the project uses PHP/Laravel:**
86
88
  - `include`/`require` with user-controlled paths
87
89
  - `mysqli_query` without prepared statements
88
90
  - Missing CSRF tokens
@@ -112,7 +114,7 @@ Write findings to `tasks/security-findings.md` using this format:
112
114
  # Security Audit — YYYY-MM-DD
113
115
 
114
116
  **Scope:** Changed files on branch `<branch-name>` | Full project scan
115
- **Stack:** Unknown / Unknown
117
+ **Stack:** `<detected stack — e.g. Laravel / React>`
116
118
  **Files audited:** N
117
119
 
118
120
  ## Critical (must fix before deploy)
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ """Switch ShipKit model routing profile."""
3
+
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ VALID_PROFILES = ["full-sail", "quality", "balanced", "budget"]
9
+
10
+ def get_defaults():
11
+ return {
12
+ "profile": "balanced",
13
+ "auto_commit": True,
14
+ "skip_gates": [],
15
+ "coverage_threshold": 100,
16
+ "branch_pattern": "feature/{slug}",
17
+ "model_overrides": {}
18
+ }
19
+
20
+ def get_config():
21
+ """Read current config or return defaults."""
22
+ config_file = Path(".shipkit/config.json")
23
+ if config_file.exists():
24
+ try:
25
+ with open(config_file) as f:
26
+ return json.load(f)
27
+ except json.JSONDecodeError:
28
+ return get_defaults()
29
+ return get_defaults()
30
+
31
+ def get_models_for_profile(profile):
32
+ """Get model assignments for a profile."""
33
+ models = {
34
+ "full-sail": {"planning": "opus", "implementation": "opus", "audits": "opus", "gates": "sonnet"},
35
+ "quality": {"planning": "opus", "implementation": "sonnet", "audits": "sonnet", "gates": "sonnet"},
36
+ "balanced": {"planning": "sonnet", "implementation": "sonnet", "audits": "sonnet", "gates": "haiku"},
37
+ "budget": {"planning": "sonnet", "implementation": "sonnet", "audits": "haiku", "gates": "haiku"}
38
+ }
39
+ return models.get(profile, models["balanced"])
40
+
41
+ def get_profile_description(profile):
42
+ """Get profile philosophy and use case."""
43
+ descriptions = {
44
+ "full-sail": ("Opus on everything that matters", "High-stakes work, client projects, production features"),
45
+ "quality": ("Opus for planning + review, Sonnet for implementation", "Most professional projects"),
46
+ "balanced": ("Sonnet across the board", "Day-to-day development (default)"),
47
+ "budget": ("Haiku where possible, Sonnet for gates", "Side projects, exploration, prototyping")
48
+ }
49
+ return descriptions.get(profile, ("", ""))
50
+
51
+ def save_config(config):
52
+ """Save config to .shipkit/config.json."""
53
+ Path(".shipkit").mkdir(exist_ok=True)
54
+ config_file = Path(".shipkit/config.json")
55
+
56
+ with open(config_file, "w") as f:
57
+ json.dump(config, f, indent=2)
58
+
59
+ # Add to .gitignore
60
+ gitignore = Path(".gitignore")
61
+ if gitignore.exists():
62
+ content = gitignore.read_text()
63
+ if ".shipkit/config.json" not in content:
64
+ with open(gitignore, "a") as f:
65
+ f.write("\n.shipkit/config.json\n")
66
+ else:
67
+ gitignore.write_text(".shipkit/config.json\n")
68
+
69
+ def main():
70
+ # Get profile argument
71
+ profile = None
72
+ if len(sys.argv) > 1:
73
+ profile = sys.argv[1].lower()
74
+
75
+ # Validate profile
76
+ if profile and profile not in VALID_PROFILES:
77
+ print(f"❌ Invalid profile: `{profile}`")
78
+ print(f"\nValid profiles: {' · '.join(VALID_PROFILES)}")
79
+ sys.exit(1)
80
+
81
+ # If no profile provided, show options
82
+ if not profile:
83
+ print("## Available Profiles\n")
84
+ print("| Profile | Philosophy | Best for |")
85
+ print("|---------|-----------|---------|")
86
+ for p in VALID_PROFILES:
87
+ philosophy, use_case = get_profile_description(p)
88
+ default = " *(default)*" if p == "balanced" else ""
89
+ print(f"| `{p}` | {philosophy}{default} | {use_case} |")
90
+ print("\nUsage: `/sk:set-profile <profile>`")
91
+ sys.exit(0)
92
+
93
+ # Read current config
94
+ config = get_config()
95
+ old_profile = config['profile']
96
+
97
+ # Update profile
98
+ config['profile'] = profile
99
+ save_config(config)
100
+
101
+ # Confirm and display new assignments
102
+ models = get_models_for_profile(profile)
103
+ print(f"\n✅ Profile set to: `{profile}` (was `{old_profile}`)\n")
104
+ print("## Model assignments for this project:\n")
105
+ print(f" brainstorm, write-plan, debug, execute-plan, review → `{models['planning']}`")
106
+ print(f" write-tests, frontend-design, api-design, security-check → `{models['implementation']}`")
107
+ print(f" perf, schema-migrate, accessibility → `{models['audits']}`")
108
+ print(f" lint, test → `{models['gates']}`")
109
+ print(f" smart-commit, branch, update-task → `haiku`\n")
110
+ print("Run `/sk:config` to see all settings or make further changes.")
111
+
112
+ if __name__ == "__main__":
113
+ main()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kennethsolomon/shipkit",
3
- "version": "3.0.4",
3
+ "version": "3.0.7",
4
4
  "description": "A structured workflow toolkit for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sk:frontend-design
3
- description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Produces design direction, mockups, and visual specifications — NOT code.
3
+ description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Produces design direction, mockups, and visual specifications — NOT code. Use --pencil flag to also generate a Pencil visual mockup (requires Pencil app + MCP).
4
4
  license: Complete terms in LICENSE.txt
5
5
  ---
6
6
 
@@ -95,15 +95,21 @@ End every `/sk:frontend-design` session with a structured summary:
95
95
  [Specific Tailwind classes, CSS patterns, or gotchas for /sk:execute-plan]
96
96
  ```
97
97
 
98
- After presenting the design summary, ask the user:
98
+ After presenting the design summary, you **MUST** stop and ask do not continue or summarize further:
99
99
 
100
- **"Would you like me to create a Pencil visual mockup? (y/n)"**
100
+ > **"Would you like me to create a Pencil visual mockup? (Requires Pencil app open + Pencil MCP connected) (y/n)"**
101
+
102
+ Wait for the user's response before doing anything else.
103
+
104
+ You can also trigger the Pencil phase directly by running `/sk:frontend-design --pencil`.
101
105
 
102
106
  ---
103
107
 
104
108
  ## Pencil Visual Mockup Phase
105
109
 
106
- Only run this phase if the user answers **y** or **yes**.
110
+ Only run this phase if:
111
+ - The user answers **y** or **yes** to the prompt above, OR
112
+ - The user invoked the skill with `--pencil`
107
113
 
108
114
  ### Step 1 — Find or create the .pen file
109
115
 
@@ -36,7 +36,6 @@ After bootstrapping a project, the recommended workflow becomes:
36
36
  - `plan.md` — creates/refreshes planning files and starts planning
37
37
  - `status.md` — prints a compact progress summary
38
38
  - `finish-feature.md` — branch finalization checklist (stack-aware)
39
- - `features.md` — sync `docs/sk:features/` specs with current codebase; creates the spec system from scratch if it doesn't exist
40
39
  - `security-check.md` — audit changed files (or full project with `--all`) for security best practices, OWASP Top 10, and production-grade quality
41
40
 
42
41
  ### Project Docs (in `.claude/docs/`)
@@ -70,7 +70,7 @@ Progress is tracked in `tasks/workflow-status.md`. This file persists across con
70
70
  1. **Read** `tasks/todo.md` — pick the next incomplete task
71
71
  2. **Read** `tasks/lessons.md` — review past corrections before writing code
72
72
  3. **Explore** — run `/brainstorm` to clarify requirements, constraints, and approach. No code in this step.
73
- 4. **Design** — run `/frontend-design` for UI mockup or `/api-design` for API contracts. No code — design only. Skip if pure backend with no UI and no new API. After `/frontend-design`, the skill prompts to create a Pencil visual mockup (saved to `docs/design/`). Requires Pencil app open and Pencil MCP connected.
73
+ 4. **Design** — run `/frontend-design` for UI mockup or `/api-design` for API contracts. No code — design only. Skip if pure backend with no UI and no new API. After the design summary, the skill asks if you want a Pencil visual mockup answer `y` only if you have the Pencil app open and Pencil MCP connected. Use `/frontend-design --pencil` to jump directly to the Pencil phase.
74
74
  5. **Accessibility** — run `/accessibility` to audit the design spec for WCAG 2.1 AA compliance. Produces `tasks/accessibility-findings.md`. Skip if backend-only with no frontend.
75
75
  6. **Plan** — run `/write-plan` to write a decision-complete plan into `tasks/todo.md` using brainstorm + design outputs. No code in this step.
76
76
  7. **Branch** — run `/branch` to create a feature branch auto-named from the current task.
@@ -72,7 +72,7 @@ npm install -D vitest @testing-library/react @testing-library/jest-dom @testing-
72
72
 
73
73
  Create `vitest.config.ts`:
74
74
  ```ts
75
- import { defineConfig } from 'vitest/sk:config';
75
+ import { defineConfig } from 'vitest/config';
76
76
  import react from '@vitejs/plugin-react';
77
77
 
78
78
  export default defineConfig({
@@ -1,238 +0,0 @@
1
- ---
2
- name: features
3
- description: "Sync docs/sk:features/ specs with the current codebase. Auto-detects changed areas and updates only affected specs. Creates the spec system from scratch if it doesn't exist."
4
- ---
5
-
6
- <!-- Generated by /sk:setup-claude -->
7
-
8
- # /sk:features
9
-
10
- Keep feature specifications in `docs/sk:features/` in sync with the actual codebase.
11
- Works with **any project** — framework-agnostic, auto-discovers source structure.
12
-
13
- ## What This Does
14
-
15
- Maintains `docs/sk:features/` as a platform-agnostic feature specification system —
16
- the single source of truth shared between web, mobile, and any other platform
17
- that uses the same backend. Each spec covers: DB schema, business logic, API
18
- contract, permissions, edge cases, error states, web/mobile UI behavior, and
19
- platform divergences.
20
-
21
- ---
22
-
23
- ## Steps
24
-
25
- ### Step 1: Detect Project State
26
-
27
- Check what exists:
28
-
29
- ```bash
30
- ls docs/sk:features/ 2>/dev/null && echo "EXISTS" || echo "MISSING"
31
- ls docs/FEATURES.md 2>/dev/null && echo "INDEX_EXISTS" || echo "INDEX_MISSING"
32
- ```
33
-
34
- **If `docs/sk:features/` does not exist:**
35
- Ask the user: "No feature specification system found. Create one from scratch?"
36
- - Yes → jump to **[Create From Scratch](#create-from-scratch)** below
37
- - No → stop
38
-
39
- **If `docs/sk:features/` exists:**
40
- Continue to Step 2.
41
-
42
- ---
43
-
44
- ### Step 2: Determine Update Scope
45
-
46
- Present three options:
47
-
48
- > **What would you like to update?**
49
- > **A. Auto-detect** *(recommended)* — scan recent git changes, update only affected specs
50
- > **B. Select features** — pick which specs to update from the list
51
- > **C. Refresh all** — update every spec from current source code
52
-
53
- Wait for the user's choice.
54
-
55
- ---
56
-
57
- ### Step 3A: Auto-detect Changed Features
58
-
59
- ```bash
60
- git log --since="7 days ago" --name-only --pretty=format: | grep -v '^$' | sort -u
61
- ```
62
-
63
- Map changed file paths to feature specs using these rules:
64
-
65
- 1. **Read `docs/FEATURES.md`** to get the list of all spec files and their names.
66
- 2. For each changed file, determine which spec it belongs to:
67
- - Match by **feature name similarity**: if the spec is `expenses.md`, look for changed files containing `expense` in their path.
68
- - Match by **directory**: if the spec is `budgets.md`, match files under any `budgets/` or `budget/` directory.
69
- - Match by **schema files**: if any migration file, `schema.sql`, `schema.prisma`, `database.ts`, or similar schema file changed → mark ALL specs as potentially affected (schema changes ripple everywhere).
70
- 3. Deduplicate the affected spec list.
71
- 4. Report which specs will be updated and ask for confirmation.
72
-
73
- ---
74
-
75
- ### Step 3B: User Selects Features
76
-
77
- List all `.md` files in `docs/sk:features/` (excluding `_template.md`).
78
- Let the user pick which ones to update.
79
-
80
- ---
81
-
82
- ### Step 3C: Refresh All
83
-
84
- Set update list = all `.md` files in `docs/sk:features/` (excluding `_template.md`).
85
-
86
- ---
87
-
88
- ### Step 4: Update Each Affected Spec
89
-
90
- For each spec file to update, follow this sequence:
91
-
92
- #### 4a. Read the existing spec
93
- Understand its current content and section structure.
94
-
95
- #### 4b. Discover relevant source files
96
-
97
- Use a three-step lookup — no hardcoded paths:
98
-
99
- 1. **Name-based search**: the feature name from the spec filename (e.g., `expenses.md` → feature name `expenses`). Search the repo:
100
- ```bash
101
- # Find files whose name contains the feature keyword
102
- find . -type f \( -name "*expense*" -o -name "*expenses*" \) \
103
- ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/docs/*" \
104
- 2>/dev/null | head -30
105
- ```
106
- Adjust the keyword to match the feature name.
107
-
108
- 2. **Related Docs in spec**: read the `## Related Docs` section of the existing spec — it lists previously referenced files. Read those files too.
109
-
110
- 3. **DB schema hint**: read the `## Database Schema` section — it names tables. Search migrations and schema files for those table names.
111
-
112
- #### 4c. Read the source files
113
- Read all discovered source files to understand the current implementation.
114
-
115
- #### 4d. Identify what changed
116
- Compare the current source code against what the spec describes:
117
- - New or removed DB columns / tables / constraints
118
- - Changed business logic rules or state transitions
119
- - New/changed API payloads or query patterns
120
- - Updated permission keys or tier requirements
121
- - New edge cases, error codes, or recovery paths
122
-
123
- #### 4e. Update only changed sections
124
- Rewrite only the sections that are out of date. **Preserve all unchanged sections verbatim.**
125
- Update the `> Status` block if the implementation status on either platform changed.
126
-
127
- ---
128
-
129
- ### Step 5: Handle New Features
130
-
131
- If source code has a clear new feature (new hook, new route group, new major component) with no corresponding spec:
132
-
133
- 1. Create `docs/sk:features/<feature-name>.md` using `docs/sk:features/_template.md` as base.
134
- If `_template.md` doesn't exist, use this 11-section structure:
135
- ```
136
- Status → Overview → Database Schema → Business Logic → API Contract
137
- → Permissions & Access Control → Edge Cases → Error States
138
- → UI/UX Behavior (### Web + ### Mobile) → Platform Notes → Related Docs
139
- ```
140
- 2. Fill all 11 sections from current source code.
141
- 3. Add the new spec to `docs/FEATURES.md` under the appropriate section.
142
-
143
- ---
144
-
145
- ### Step 6: Update Master Index
146
-
147
- Review `docs/FEATURES.md`:
148
- - Add links for any new specs
149
- - Update status columns (Web / Mobile) if implementation status changed
150
- - Update any tier/feature tables if permissions changed
151
-
152
- ---
153
-
154
- ### Step 7: Report and Commit
155
-
156
- Show a summary:
157
- - ✅ **Updated**: `spec-name.md` — what changed (1 sentence each)
158
- - ➕ **Added**: any new spec files
159
- - ⏭️ **Skipped**: specs with no detected changes
160
-
161
- Ask: **"Commit the updated specs?"**
162
- - Yes → stage only files under `docs/` and commit:
163
- `docs(features): update feature specs to reflect current implementation`
164
- - No → leave changes unstaged for the user to review
165
-
166
- ---
167
-
168
- ## Create From Scratch
169
-
170
- When `docs/sk:features/` doesn't exist, discover and document all features:
171
-
172
- ### Discovery Phase
173
-
174
- 1. **Detect source structure** — find where feature logic lives:
175
- ```bash
176
- # Look for hooks, services, controllers, models, routes
177
- ls src/ lib/ app/ 2>/dev/null
178
- find . -maxdepth 4 -type f \
179
- \( -name "use-*.ts" -o -name "use-*.js" \
180
- -o -name "*.service.ts" -o -name "*.controller.ts" \
181
- -o -name "*.model.ts" -o -name "*.router.ts" \) \
182
- ! -path "*/node_modules/*" ! -path "*/.git/*" 2>/dev/null | head -50
183
- ```
184
-
185
- 2. **Detect schema files** — migrations, ORM schemas:
186
- ```bash
187
- find . -maxdepth 5 \
188
- \( -name "schema.sql" -o -name "*.schema.prisma" \
189
- -o -name "database.ts" -o -name "*.migration.*" \) \
190
- ! -path "*/node_modules/*" ! -path "*/.git/*" 2>/dev/null
191
- ls supabase/migrations/ 2>/dev/null | tail -10
192
- ls prisma/ 2>/dev/null
193
- ```
194
-
195
- 3. **Identify feature domains** from the discovered files — group related files into named features.
196
-
197
- 4. **Report discovered features** and ask the user to confirm/adjust the list before creating anything.
198
-
199
- ### Creation Phase
200
-
201
- For each confirmed feature:
202
- 1. Read all relevant source files.
203
- 2. Create `docs/sk:features/<feature-name>.md` with all 11 sections — based entirely on source code.
204
-
205
- Also create:
206
- - `docs/FEATURES.md` — master index with:
207
- - How-to-use section (web path + mobile path via `../project-name/docs/`)
208
- - Feature table grouped by domain
209
- - Tier/subscription overview (if the project has tiers)
210
- - `docs/sk:features/_template.md` — 11-section template for future specs
211
-
212
- Commit: `docs: add feature specification system`
213
-
214
- ---
215
-
216
- ## Quality Rules (Always Apply)
217
-
218
- - **Source-verified only** — every claim must be findable in source code; never invent behavior
219
- - **No placeholders** — no `// TODO`, no `false // will be computed`, no assumed values
220
- - **Surgical updates** — only rewrite what changed; preserve unchanged sections verbatim
221
- - **Numeric JSX coercion** — when documenting frontend behavior, note `!!value` (not `value &&`) for numerics to avoid rendering `0` as text in React/React Native
222
- - **Local date, not UTC** — for any time-bounded query (current month, today, etc.), document that implementations must use local `new Date()`, not `toISOString()` which returns UTC and causes off-by-one for users in non-UTC timezones
223
- - **All 11 sections required** — mark "N/A" only if genuinely not applicable
224
-
225
- ## Source Discovery Heuristics (Reference)
226
-
227
- When locating source files for a feature named `<name>`:
228
-
229
- | What to look for | Search pattern |
230
- |---|---|
231
- | Hooks / composables | `use-<name>.*`, `use<Name>.*` |
232
- | Components | directories or files matching `<name>/`, `*<name>*` |
233
- | API routes / controllers | `<name>.route.*`, `<name>.controller.*`, `api/<name>/` |
234
- | Services / repositories | `<name>.service.*`, `<name>.repo.*` |
235
- | DB schema | `migrations/` containing table name, `schema.prisma`, `database.ts` |
236
- | Tests | `<name>.test.*`, `<name>.spec.*` |
237
-
238
- These are starting points — read broadly and verify before updating any section.
@@ -1,72 +0,0 @@
1
- ---
2
- description: "Automate releases: bump version, update CHANGELOG, create tag, push to GitHub. Use --android and/or --ios flags for App Store / Play Store readiness audit."
3
- ---
4
-
5
- <!-- Generated by /sk:setup-claude -->
6
-
7
- # /sk:release
8
-
9
- Automate the release process for your project. Supports optional mobile store submission review.
10
-
11
- ## Usage
12
-
13
- ```
14
- /sk:release # Git release only
15
- /sk:release --android # Git release + Play Store audit
16
- /sk:release --ios # Git release + App Store audit
17
- /sk:release --android --ios # Git release + both store audits
18
- ```
19
-
20
- ## Hard Rules
21
-
22
- - **DO NOT** release without reviewing CHANGELOG.md changes
23
- - **DO NOT** proceed if CHANGELOG.md has no [Unreleased] section
24
- - You **must** have a git remote origin (GitHub, GitLab, etc.)
25
- - Version format must follow semantic versioning (e.g., v1.0.0, v0.2.0-beta)
26
- - When `--android` or `--ios` flags are present, **always run the store audit after the git release**
27
-
28
- ## Steps
29
-
30
- 1. **Parse flags** — Check for `--android` and/or `--ios` in the user's invocation.
31
-
32
- 2. **Verify CHANGELOG.md** — Check that the [Unreleased] section has the changes you want to release. If not, update CHANGELOG.md first and commit.
33
-
34
- 3. **Run the release script** — This will:
35
- - Auto-detect: project name, current version, GitHub URL
36
- - Prompt for: new version number
37
- - Suggest: release title based on changes
38
- - Update: CHANGELOG.md (move [Unreleased] -> [Version])
39
- - Update: version in CLAUDE.md (if it has a Version line)
40
- - Create: git commit with release message
41
- - Create: annotated git tag
42
- - Push: tag to GitHub (with confirmation at each step)
43
-
44
- 4. **Complete the release on GitHub** — The script will show you the GitHub releases link. Go there and:
45
- - Click "Create release from tag"
46
- - Use the suggested title
47
- - Copy the changelog section as release notes
48
- - Publish the release
49
-
50
- 5. **(If --android or --ios)** **Run Store Readiness Audit** — The release skill will:
51
- - Auto-detect the mobile framework (Expo, React Native, Flutter, native, Capacitor)
52
- - Detect if this is a first-time submission or an update
53
- - Walk through every item in the store checklist, checking config files
54
- - Report status for each item: PASS / FAIL / WARN / MANUAL CHECK NEEDED
55
- - Propose fixes for config issues (with your approval)
56
- - Guide you through manual steps (screenshots, store listing, etc.)
57
- - Present a summary report with next steps and build/submit commands
58
-
59
- ## When Done
60
-
61
- > "Release {version} completed! Check GitHub to finalize the release."
62
-
63
- If store flags were used:
64
- > "Store readiness audit complete. See the summary report above for remaining action items."
65
-
66
- ## Notes
67
-
68
- - Each step (commit, tag, push) requires your confirmation
69
- - You can skip any step and do it manually later
70
- - The script works with any project type: Node, Python, Go, Rust, etc.
71
- - Requires: CHANGELOG.md file with [Unreleased] section
72
- - Store audits support: Expo, React Native, Flutter, native Android/iOS, Capacitor/Ionic, .NET MAUI
@@ -1,238 +0,0 @@
1
- ---
2
- name: features
3
- description: "Sync docs/features/ specs with the current codebase. Auto-detects changed areas and updates only affected specs. Creates the spec system from scratch if it doesn't exist."
4
- ---
5
-
6
- <!-- Generated by /setup-claude -->
7
-
8
- # /features
9
-
10
- Keep feature specifications in `docs/features/` in sync with the actual codebase.
11
- Works with **any project** — framework-agnostic, auto-discovers source structure.
12
-
13
- ## What This Does
14
-
15
- Maintains `docs/features/` as a platform-agnostic feature specification system —
16
- the single source of truth shared between web, mobile, and any other platform
17
- that uses the same backend. Each spec covers: DB schema, business logic, API
18
- contract, permissions, edge cases, error states, web/mobile UI behavior, and
19
- platform divergences.
20
-
21
- ---
22
-
23
- ## Steps
24
-
25
- ### Step 1: Detect Project State
26
-
27
- Check what exists:
28
-
29
- ```bash
30
- ls docs/features/ 2>/dev/null && echo "EXISTS" || echo "MISSING"
31
- ls docs/FEATURES.md 2>/dev/null && echo "INDEX_EXISTS" || echo "INDEX_MISSING"
32
- ```
33
-
34
- **If `docs/features/` does not exist:**
35
- Ask the user: "No feature specification system found. Create one from scratch?"
36
- - Yes → jump to **[Create From Scratch](#create-from-scratch)** below
37
- - No → stop
38
-
39
- **If `docs/features/` exists:**
40
- Continue to Step 2.
41
-
42
- ---
43
-
44
- ### Step 2: Determine Update Scope
45
-
46
- Present three options:
47
-
48
- > **What would you like to update?**
49
- > **A. Auto-detect** *(recommended)* — scan recent git changes, update only affected specs
50
- > **B. Select features** — pick which specs to update from the list
51
- > **C. Refresh all** — update every spec from current source code
52
-
53
- Wait for the user's choice.
54
-
55
- ---
56
-
57
- ### Step 3A: Auto-detect Changed Features
58
-
59
- ```bash
60
- git log --since="7 days ago" --name-only --pretty=format: | grep -v '^$' | sort -u
61
- ```
62
-
63
- Map changed file paths to feature specs using these rules:
64
-
65
- 1. **Read `docs/FEATURES.md`** to get the list of all spec files and their names.
66
- 2. For each changed file, determine which spec it belongs to:
67
- - Match by **feature name similarity**: if the spec is `expenses.md`, look for changed files containing `expense` in their path.
68
- - Match by **directory**: if the spec is `budgets.md`, match files under any `budgets/` or `budget/` directory.
69
- - Match by **schema files**: if any migration file, `schema.sql`, `schema.prisma`, `database.ts`, or similar schema file changed → mark ALL specs as potentially affected (schema changes ripple everywhere).
70
- 3. Deduplicate the affected spec list.
71
- 4. Report which specs will be updated and ask for confirmation.
72
-
73
- ---
74
-
75
- ### Step 3B: User Selects Features
76
-
77
- List all `.md` files in `docs/features/` (excluding `_template.md`).
78
- Let the user pick which ones to update.
79
-
80
- ---
81
-
82
- ### Step 3C: Refresh All
83
-
84
- Set update list = all `.md` files in `docs/features/` (excluding `_template.md`).
85
-
86
- ---
87
-
88
- ### Step 4: Update Each Affected Spec
89
-
90
- For each spec file to update, follow this sequence:
91
-
92
- #### 4a. Read the existing spec
93
- Understand its current content and section structure.
94
-
95
- #### 4b. Discover relevant source files
96
-
97
- Use a three-step lookup — no hardcoded paths:
98
-
99
- 1. **Name-based search**: the feature name from the spec filename (e.g., `expenses.md` → feature name `expenses`). Search the repo:
100
- ```bash
101
- # Find files whose name contains the feature keyword
102
- find . -type f \( -name "*expense*" -o -name "*expenses*" \) \
103
- ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/docs/*" \
104
- 2>/dev/null | head -30
105
- ```
106
- Adjust the keyword to match the feature name.
107
-
108
- 2. **Related Docs in spec**: read the `## Related Docs` section of the existing spec — it lists previously referenced files. Read those files too.
109
-
110
- 3. **DB schema hint**: read the `## Database Schema` section — it names tables. Search migrations and schema files for those table names.
111
-
112
- #### 4c. Read the source files
113
- Read all discovered source files to understand the current implementation.
114
-
115
- #### 4d. Identify what changed
116
- Compare the current source code against what the spec describes:
117
- - New or removed DB columns / tables / constraints
118
- - Changed business logic rules or state transitions
119
- - New/changed API payloads or query patterns
120
- - Updated permission keys or tier requirements
121
- - New edge cases, error codes, or recovery paths
122
-
123
- #### 4e. Update only changed sections
124
- Rewrite only the sections that are out of date. **Preserve all unchanged sections verbatim.**
125
- Update the `> Status` block if the implementation status on either platform changed.
126
-
127
- ---
128
-
129
- ### Step 5: Handle New Features
130
-
131
- If source code has a clear new feature (new hook, new route group, new major component) with no corresponding spec:
132
-
133
- 1. Create `docs/features/<feature-name>.md` using `docs/features/_template.md` as base.
134
- If `_template.md` doesn't exist, use this 11-section structure:
135
- ```
136
- Status → Overview → Database Schema → Business Logic → API Contract
137
- → Permissions & Access Control → Edge Cases → Error States
138
- → UI/UX Behavior (### Web + ### Mobile) → Platform Notes → Related Docs
139
- ```
140
- 2. Fill all 11 sections from current source code.
141
- 3. Add the new spec to `docs/FEATURES.md` under the appropriate section.
142
-
143
- ---
144
-
145
- ### Step 6: Update Master Index
146
-
147
- Review `docs/FEATURES.md`:
148
- - Add links for any new specs
149
- - Update status columns (Web / Mobile) if implementation status changed
150
- - Update any tier/feature tables if permissions changed
151
-
152
- ---
153
-
154
- ### Step 7: Report and Commit
155
-
156
- Show a summary:
157
- - ✅ **Updated**: `spec-name.md` — what changed (1 sentence each)
158
- - ➕ **Added**: any new spec files
159
- - ⏭️ **Skipped**: specs with no detected changes
160
-
161
- Ask: **"Commit the updated specs?"**
162
- - Yes → stage only files under `docs/` and commit:
163
- `docs(features): update feature specs to reflect current implementation`
164
- - No → leave changes unstaged for the user to review
165
-
166
- ---
167
-
168
- ## Create From Scratch
169
-
170
- When `docs/features/` doesn't exist, discover and document all features:
171
-
172
- ### Discovery Phase
173
-
174
- 1. **Detect source structure** — find where feature logic lives:
175
- ```bash
176
- # Look for hooks, services, controllers, models, routes
177
- ls src/ lib/ app/ 2>/dev/null
178
- find . -maxdepth 4 -type f \
179
- \( -name "use-*.ts" -o -name "use-*.js" \
180
- -o -name "*.service.ts" -o -name "*.controller.ts" \
181
- -o -name "*.model.ts" -o -name "*.router.ts" \) \
182
- ! -path "*/node_modules/*" ! -path "*/.git/*" 2>/dev/null | head -50
183
- ```
184
-
185
- 2. **Detect schema files** — migrations, ORM schemas:
186
- ```bash
187
- find . -maxdepth 5 \
188
- \( -name "schema.sql" -o -name "*.schema.prisma" \
189
- -o -name "database.ts" -o -name "*.migration.*" \) \
190
- ! -path "*/node_modules/*" ! -path "*/.git/*" 2>/dev/null
191
- ls supabase/migrations/ 2>/dev/null | tail -10
192
- ls prisma/ 2>/dev/null
193
- ```
194
-
195
- 3. **Identify feature domains** from the discovered files — group related files into named features.
196
-
197
- 4. **Report discovered features** and ask the user to confirm/adjust the list before creating anything.
198
-
199
- ### Creation Phase
200
-
201
- For each confirmed feature:
202
- 1. Read all relevant source files.
203
- 2. Create `docs/features/<feature-name>.md` with all 11 sections — based entirely on source code.
204
-
205
- Also create:
206
- - `docs/FEATURES.md` — master index with:
207
- - How-to-use section (web path + mobile path via `../project-name/docs/`)
208
- - Feature table grouped by domain
209
- - Tier/subscription overview (if the project has tiers)
210
- - `docs/features/_template.md` — 11-section template for future specs
211
-
212
- Commit: `docs: add feature specification system`
213
-
214
- ---
215
-
216
- ## Quality Rules (Always Apply)
217
-
218
- - **Source-verified only** — every claim must be findable in source code; never invent behavior
219
- - **No placeholders** — no `// TODO`, no `false // will be computed`, no assumed values
220
- - **Surgical updates** — only rewrite what changed; preserve unchanged sections verbatim
221
- - **Numeric JSX coercion** — when documenting frontend behavior, note `!!value` (not `value &&`) for numerics to avoid rendering `0` as text in React/React Native
222
- - **Local date, not UTC** — for any time-bounded query (current month, today, etc.), document that implementations must use local `new Date()`, not `toISOString()` which returns UTC and causes off-by-one for users in non-UTC timezones
223
- - **All 11 sections required** — mark "N/A" only if genuinely not applicable
224
-
225
- ## Source Discovery Heuristics (Reference)
226
-
227
- When locating source files for a feature named `<name>`:
228
-
229
- | What to look for | Search pattern |
230
- |---|---|
231
- | Hooks / composables | `use-<name>.*`, `use<Name>.*` |
232
- | Components | directories or files matching `<name>/`, `*<name>*` |
233
- | API routes / controllers | `<name>.route.*`, `<name>.controller.*`, `api/<name>/` |
234
- | Services / repositories | `<name>.service.*`, `<name>.repo.*` |
235
- | DB schema | `migrations/` containing table name, `schema.prisma`, `database.ts` |
236
- | Tests | `<name>.test.*`, `<name>.spec.*` |
237
-
238
- These are starting points — read broadly and verify before updating any section.
@@ -1,74 +0,0 @@
1
- ---
2
- description: "Automate releases: bump version, update CHANGELOG, create tag, push to GitHub. Use --android and/or --ios flags for App Store / Play Store readiness audit."
3
- ---
4
-
5
- <!-- Generated by /setup-claude -->
6
-
7
- # /release
8
-
9
- **Workflow:** Read → Explore → Design → Accessibility → Plan → Branch → Migrate → Write Tests → Implement → Lint → Verify Tests → Security → Performance → Review → Finalize → **Release**
10
-
11
- Automate the release process for your project. Supports optional mobile store submission review.
12
-
13
- ## Usage
14
-
15
- ```
16
- /release # Git release only
17
- /release --android # Git release + Play Store audit
18
- /release --ios # Git release + App Store audit
19
- /release --android --ios # Git release + both store audits
20
- ```
21
-
22
- ## Hard Rules
23
-
24
- - **DO NOT** release without reviewing CHANGELOG.md changes
25
- - **DO NOT** proceed if CHANGELOG.md has no [Unreleased] section
26
- - You **must** have a git remote origin (GitHub, GitLab, etc.)
27
- - Version format must follow semantic versioning (e.g., v1.0.0, v0.2.0-beta)
28
- - When `--android` or `--ios` flags are present, **always run the store audit after the git release**
29
-
30
- ## Steps
31
-
32
- 1. **Parse flags** — Check for `--android` and/or `--ios` in the user's invocation.
33
-
34
- 2. **Verify CHANGELOG.md** — Check that the [Unreleased] section has the changes you want to release. If not, update CHANGELOG.md first and commit.
35
-
36
- 3. **Run the release script** — This will:
37
- - Auto-detect: project name, current version, GitHub URL
38
- - Prompt for: new version number
39
- - Suggest: release title based on changes
40
- - Update: CHANGELOG.md (move [Unreleased] -> [Version])
41
- - Update: version in CLAUDE.md (if it has a Version line)
42
- - Create: git commit with release message
43
- - Create: annotated git tag
44
- - Push: tag to GitHub (with confirmation at each step)
45
-
46
- 4. **Complete the release on GitHub** — The script will show you the GitHub releases link. Go there and:
47
- - Click "Create release from tag"
48
- - Use the suggested title
49
- - Copy the changelog section as release notes
50
- - Publish the release
51
-
52
- 5. **(If --android or --ios)** **Run Store Readiness Audit** — The release skill will:
53
- - Auto-detect the mobile framework (Expo, React Native, Flutter, native, Capacitor)
54
- - Detect if this is a first-time submission or an update
55
- - Walk through every item in the store checklist, checking config files
56
- - Report status for each item: PASS / FAIL / WARN / MANUAL CHECK NEEDED
57
- - Propose fixes for config issues (with your approval)
58
- - Guide you through manual steps (screenshots, store listing, etc.)
59
- - Present a summary report with next steps and build/submit commands
60
-
61
- ## When Done
62
-
63
- > "Release {version} completed! Check GitHub to finalize the release."
64
-
65
- If store flags were used:
66
- > "Store readiness audit complete. See the summary report above for remaining action items."
67
-
68
- ## Notes
69
-
70
- - Each step (commit, tag, push) requires your confirmation
71
- - You can skip any step and do it manually later
72
- - The script works with any project type: Node, Python, Go, Rust, etc.
73
- - Requires: CHANGELOG.md file with [Unreleased] section
74
- - Store audits support: Expo, React Native, Flutter, native Android/iOS, Capacitor/Ionic, .NET MAUI