@kennethsolomon/shipkit 1.0.0
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 +321 -0
- package/bin/shipkit.js +146 -0
- package/commands/sk/brainstorm.md +63 -0
- package/commands/sk/branch.md +35 -0
- package/commands/sk/config.md +96 -0
- package/commands/sk/execute-plan.md +85 -0
- package/commands/sk/features.md +238 -0
- package/commands/sk/finish-feature.md +154 -0
- package/commands/sk/help.md +103 -0
- package/commands/sk/hotfix.md +61 -0
- package/commands/sk/plan.md +30 -0
- package/commands/sk/release.md +72 -0
- package/commands/sk/security-check.md +188 -0
- package/commands/sk/set-profile.md +71 -0
- package/commands/sk/status.md +25 -0
- package/commands/sk/update-task.md +35 -0
- package/commands/sk/write-plan.md +72 -0
- package/package.json +23 -0
- package/skills/sk:accessibility/LICENSE.txt +177 -0
- package/skills/sk:accessibility/SKILL.md +150 -0
- package/skills/sk:api-design/LICENSE.txt +177 -0
- package/skills/sk:api-design/SKILL.md +158 -0
- package/skills/sk:brainstorming/SKILL.md +124 -0
- package/skills/sk:debug/SKILL.md +252 -0
- package/skills/sk:debug/debug_conductor.py +177 -0
- package/skills/sk:debug/lib/__init__.py +1 -0
- package/skills/sk:debug/lib/bug_gatherer.py +55 -0
- package/skills/sk:debug/lib/context_reader.py +139 -0
- package/skills/sk:debug/lib/findings_writer.py +76 -0
- package/skills/sk:debug/lib/lessons_writer.py +165 -0
- package/skills/sk:debug/lib/step_runner.py +326 -0
- package/skills/sk:features/SKILL.md +238 -0
- package/skills/sk:frontend-design/LICENSE.txt +177 -0
- package/skills/sk:frontend-design/SKILL.md +191 -0
- package/skills/sk:laravel-init/SKILL.md +37 -0
- package/skills/sk:laravel-new/SKILL.md +68 -0
- package/skills/sk:lint/SKILL.md +113 -0
- package/skills/sk:perf/LICENSE.txt +177 -0
- package/skills/sk:perf/SKILL.md +188 -0
- package/skills/sk:release/SKILL.md +113 -0
- package/skills/sk:release/references/android-checklist.md +269 -0
- package/skills/sk:release/references/ios-checklist.md +339 -0
- package/skills/sk:release/release.sh +378 -0
- package/skills/sk:review/SKILL.md +346 -0
- package/skills/sk:review/references/security-checklist.md +223 -0
- package/skills/sk:schema-migrate/SKILL.md +125 -0
- package/skills/sk:schema-migrate/orms/drizzle.md +546 -0
- package/skills/sk:schema-migrate/orms/laravel.md +367 -0
- package/skills/sk:schema-migrate/orms/prisma.md +357 -0
- package/skills/sk:schema-migrate/orms/rails.md +351 -0
- package/skills/sk:schema-migrate/orms/sqlalchemy.md +385 -0
- package/skills/sk:schema-migrate/references/detection.md +110 -0
- package/skills/sk:setup-claude/SKILL.md +365 -0
- package/skills/sk:setup-claude/references/detection.md +6 -0
- package/skills/sk:setup-claude/references/templates.md +11 -0
- package/skills/sk:setup-claude/scripts/apply_setup_claude.py +443 -0
- package/skills/sk:setup-claude/scripts/detect_arch_changes.py +437 -0
- package/skills/sk:setup-claude/templates/.claude/docs/arch-changelog-guide.md.template +6 -0
- package/skills/sk:setup-claude/templates/.claude/docs/changelog-guide.md.template +12 -0
- package/skills/sk:setup-claude/templates/CHANGELOG.md.template +21 -0
- package/skills/sk:setup-claude/templates/CLAUDE.md.template +299 -0
- package/skills/sk:setup-claude/templates/arch-changelog-guide.md.template +3 -0
- package/skills/sk:setup-claude/templates/changelog-guide.md.template +3 -0
- package/skills/sk:setup-claude/templates/commands/brainstorm.md.template +74 -0
- package/skills/sk:setup-claude/templates/commands/execute-plan.md.template +57 -0
- package/skills/sk:setup-claude/templates/commands/features.md.template +238 -0
- package/skills/sk:setup-claude/templates/commands/finish-feature.md.template +155 -0
- package/skills/sk:setup-claude/templates/commands/plan.md.template +30 -0
- package/skills/sk:setup-claude/templates/commands/re-setup.md.template +38 -0
- package/skills/sk:setup-claude/templates/commands/release.md.template +74 -0
- package/skills/sk:setup-claude/templates/commands/security-check.md.template +172 -0
- package/skills/sk:setup-claude/templates/commands/status.md.template +17 -0
- package/skills/sk:setup-claude/templates/commands/write-plan.md.template +34 -0
- package/skills/sk:setup-claude/templates/finish-feature.md.template +3 -0
- package/skills/sk:setup-claude/templates/plan.md.template +3 -0
- package/skills/sk:setup-claude/templates/status.md.template +3 -0
- package/skills/sk:setup-claude/templates/tasks/findings.md.template +19 -0
- package/skills/sk:setup-claude/templates/tasks/lessons.md.template +26 -0
- package/skills/sk:setup-claude/templates/tasks/progress.md.template +20 -0
- package/skills/sk:setup-claude/templates/tasks/security-findings.md.template +5 -0
- package/skills/sk:setup-claude/templates/tasks/todo.md.template +26 -0
- package/skills/sk:setup-claude/templates/tasks/workflow-status.md.template +31 -0
- package/skills/sk:setup-claude/templates/tasks-findings.md.template +3 -0
- package/skills/sk:setup-claude/templates/tasks-lessons.md.template +3 -0
- package/skills/sk:setup-claude/templates/tasks-progress.md.template +3 -0
- package/skills/sk:setup-claude/templates/tasks-todo.md.template +3 -0
- package/skills/sk:setup-claude/tests/test_apply_setup_claude.py +193 -0
- package/skills/sk:setup-optimizer/SKILL.md +184 -0
- package/skills/sk:setup-optimizer/lib/__init__.py +24 -0
- package/skills/sk:setup-optimizer/lib/detect.py +205 -0
- package/skills/sk:setup-optimizer/lib/discover.py +221 -0
- package/skills/sk:setup-optimizer/lib/enrich.py +163 -0
- package/skills/sk:setup-optimizer/lib/merge.py +277 -0
- package/skills/sk:setup-optimizer/lib/sidecar.py +129 -0
- package/skills/sk:setup-optimizer/optimize_claude.py +174 -0
- package/skills/sk:setup-optimizer/templates/CLAUDE.md.template +105 -0
- package/skills/sk:skill-creator/LICENSE.txt +202 -0
- package/skills/sk:skill-creator/SKILL.md +479 -0
- package/skills/sk:skill-creator/agents/analyzer.md +274 -0
- package/skills/sk:skill-creator/agents/comparator.md +202 -0
- package/skills/sk:skill-creator/agents/grader.md +223 -0
- package/skills/sk:skill-creator/assets/eval_review.html +146 -0
- package/skills/sk:skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/sk:skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/sk:skill-creator/references/schemas.md +430 -0
- package/skills/sk:skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/sk:skill-creator/scripts/generate_report.py +326 -0
- package/skills/sk:skill-creator/scripts/improve_description.py +248 -0
- package/skills/sk:skill-creator/scripts/package_skill.py +136 -0
- package/skills/sk:skill-creator/scripts/quick_validate.py +103 -0
- package/skills/sk:skill-creator/scripts/run_eval.py +310 -0
- package/skills/sk:skill-creator/scripts/run_loop.py +332 -0
- package/skills/sk:skill-creator/scripts/utils.py +47 -0
- package/skills/sk:smart-commit/SKILL.md +175 -0
- package/skills/sk:test/SKILL.md +171 -0
- package/skills/sk:write-tests/SKILL.md +195 -0
- package/skills/sk:write-tests/references/patterns.md +209 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sk:laravel-new
|
|
3
|
+
description: "Scaffold a fresh Laravel app and configure it with opinionated production-ready conventions. Usage: /laravel-new [project-name]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /laravel-new
|
|
7
|
+
|
|
8
|
+
Scaffold a fresh Laravel application and immediately configure it with production-ready conventions.
|
|
9
|
+
|
|
10
|
+
## Steps
|
|
11
|
+
|
|
12
|
+
### 1. Get Project Name
|
|
13
|
+
If no argument was provided, ask: "What should the project be named?"
|
|
14
|
+
|
|
15
|
+
### 2. Check Prerequisites
|
|
16
|
+
Verify these are available:
|
|
17
|
+
```bash
|
|
18
|
+
which composer
|
|
19
|
+
which laravel # or: composer global show laravel/installer
|
|
20
|
+
```
|
|
21
|
+
If `laravel` installer is missing: `composer global require laravel/installer`
|
|
22
|
+
|
|
23
|
+
### 3. Scaffold the App
|
|
24
|
+
```bash
|
|
25
|
+
laravel new {{PROJECT_NAME}}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
When prompted by the Laravel installer:
|
|
29
|
+
- Starter kit: choose based on user preference (ask if not specified — Inertia+React, Inertia+Vue, Livewire, or None/API)
|
|
30
|
+
- Testing framework: **Pest** (always)
|
|
31
|
+
- Database: ask user (default: SQLite for local dev)
|
|
32
|
+
- Run migrations: yes
|
|
33
|
+
|
|
34
|
+
### 4. Enter the Project Directory
|
|
35
|
+
```bash
|
|
36
|
+
cd {{PROJECT_NAME}}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 5. Run /laravel-init
|
|
40
|
+
Immediately invoke the `setup-claude` skill to configure the project:
|
|
41
|
+
- Detect stack from what was just installed
|
|
42
|
+
- Install missing dev tools (PHPStan/Larastan, Rector, Pint)
|
|
43
|
+
- Publish config files
|
|
44
|
+
- Configure strict models
|
|
45
|
+
- Generate CLAUDE.md
|
|
46
|
+
- Bootstrap tasks/ files
|
|
47
|
+
|
|
48
|
+
### 6. Report
|
|
49
|
+
Show a summary:
|
|
50
|
+
```
|
|
51
|
+
Project: {{PROJECT_NAME}}
|
|
52
|
+
Stack: [detected]
|
|
53
|
+
Location: [path]
|
|
54
|
+
|
|
55
|
+
Files created:
|
|
56
|
+
CLAUDE.md
|
|
57
|
+
phpstan.neon
|
|
58
|
+
rector.php
|
|
59
|
+
pint.json
|
|
60
|
+
tasks/findings.md (pre-seeded)
|
|
61
|
+
tasks/lessons.md
|
|
62
|
+
tasks/todo.md
|
|
63
|
+
tasks/progress.md
|
|
64
|
+
.claude/commands/sk:lint.md
|
|
65
|
+
.claude/commands/sk:test.md
|
|
66
|
+
|
|
67
|
+
Next step: /sk:brainstorm
|
|
68
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sk:lint
|
|
3
|
+
description: "Auto-detect and run all linting tools: formatters first (sequential), then analyzers in parallel. Fix and re-run until clean."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sk:lint
|
|
7
|
+
|
|
8
|
+
Auto-detect project linting tools, run them, fix issues, repeat until clean.
|
|
9
|
+
|
|
10
|
+
## Steps
|
|
11
|
+
|
|
12
|
+
### 1. Read Project CLAUDE.md
|
|
13
|
+
|
|
14
|
+
Check for project-specific lint configuration or overrides in `CLAUDE.md` before proceeding.
|
|
15
|
+
|
|
16
|
+
### 2. Detect Stacks
|
|
17
|
+
|
|
18
|
+
Scan the project root for config files. Enable every matching stack:
|
|
19
|
+
|
|
20
|
+
| Config file | Stack | Formatter | Analyzers |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| `composer.json` with pint | Laravel/PHP | `vendor/bin/pint --dirty` | -- |
|
|
23
|
+
| `composer.json` with phpstan | Laravel/PHP | -- | `vendor/bin/phpstan analyse --memory-limit=512M` |
|
|
24
|
+
| `composer.json` with rector | Laravel/PHP | -- | `vendor/bin/rector --dry-run` |
|
|
25
|
+
| `package.json` with prettier | Node/TS | `npx prettier --write .` | -- |
|
|
26
|
+
| `package.json` with eslint | Node/TS | -- | `npx eslint .` |
|
|
27
|
+
| `pyproject.toml` with ruff | Python | `ruff format .` | `ruff check .` |
|
|
28
|
+
| `go.mod` | Go | `gofmt -w .` | `golangci-lint run` |
|
|
29
|
+
| `Cargo.toml` | Rust | `cargo fmt` | `cargo clippy` |
|
|
30
|
+
|
|
31
|
+
Detection logic:
|
|
32
|
+
- For `composer.json`: read `require-dev` keys for `laravel/pint`, `phpstan/phpstan`, `rector/rector`
|
|
33
|
+
- For `package.json`: read `devDependencies` keys for `eslint`, `prettier`
|
|
34
|
+
- For `pyproject.toml`: check `[tool.ruff]` section or `ruff` in `[project.optional-dependencies]` / `[build-system]`
|
|
35
|
+
- For `go.mod` / `Cargo.toml`: presence of file is sufficient
|
|
36
|
+
|
|
37
|
+
Print detected stacks and tools before running anything.
|
|
38
|
+
|
|
39
|
+
### 3. Run Formatters — Sequential
|
|
40
|
+
|
|
41
|
+
Formatters modify files, so run them one at a time in this order:
|
|
42
|
+
|
|
43
|
+
1. **Pint** (if detected): `vendor/bin/pint --dirty`
|
|
44
|
+
2. **Prettier** (if detected): `npx prettier --write .`
|
|
45
|
+
3. **ruff format** (if detected): `ruff format .`
|
|
46
|
+
4. **gofmt** (if detected): `gofmt -w .`
|
|
47
|
+
5. **cargo fmt** (if detected): `cargo fmt`
|
|
48
|
+
|
|
49
|
+
After each formatter, note which files changed. All formatters must finish before step 4.
|
|
50
|
+
|
|
51
|
+
### 4. Run Analyzers — Parallel Sub-Agents
|
|
52
|
+
|
|
53
|
+
Launch all detected analyzers in parallel using the Agent tool in a single message:
|
|
54
|
+
|
|
55
|
+
- **PHPStan**: `vendor/bin/phpstan analyse --memory-limit=512M`
|
|
56
|
+
- **Rector**: `vendor/bin/rector --dry-run`
|
|
57
|
+
- **ESLint**: `npx eslint .`
|
|
58
|
+
- **ruff check**: `ruff check .`
|
|
59
|
+
- **golangci-lint**: `golangci-lint run`
|
|
60
|
+
- **cargo clippy**: `cargo clippy`
|
|
61
|
+
|
|
62
|
+
Example with PHPStan + Rector + ESLint detected:
|
|
63
|
+
```
|
|
64
|
+
Agent 1: "Run vendor/bin/phpstan analyse --memory-limit=512M. Report all errors with file:line."
|
|
65
|
+
Agent 2: "Run vendor/bin/rector --dry-run. Report all suggested changes with file:line."
|
|
66
|
+
Agent 3: "Run npx eslint . Report all errors with file:line."
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 5. Fix and Re-run
|
|
70
|
+
|
|
71
|
+
If any analyzer reports errors:
|
|
72
|
+
1. Fix all reported issues
|
|
73
|
+
2. Re-run formatters (fixes may need formatting)
|
|
74
|
+
3. Re-launch all analyzers in parallel
|
|
75
|
+
4. Loop until every tool exits clean
|
|
76
|
+
|
|
77
|
+
### 6. Report Results
|
|
78
|
+
|
|
79
|
+
Print one line per tool:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Pint: X files formatted / clean
|
|
83
|
+
Prettier: X files formatted / clean
|
|
84
|
+
ruff format: X files formatted / clean
|
|
85
|
+
gofmt: X files formatted / clean
|
|
86
|
+
cargo fmt: X files formatted / clean
|
|
87
|
+
PHPStan: X errors fixed / clean
|
|
88
|
+
Rector: X changes applied / clean
|
|
89
|
+
ESLint: X errors fixed / clean
|
|
90
|
+
ruff check: X issues fixed / clean
|
|
91
|
+
golangci-lint: X issues fixed / clean
|
|
92
|
+
cargo clippy: X warnings fixed / clean
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Only include lines for detected tools. All must show "clean" before this skill passes.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Model Routing
|
|
100
|
+
|
|
101
|
+
Read `.shipkit/sk:config.json` from the project root if it exists.
|
|
102
|
+
|
|
103
|
+
- If `model_overrides["sk:lint"]` is set, use that model — it takes precedence.
|
|
104
|
+
- Otherwise use the `profile` field. Default: `balanced`.
|
|
105
|
+
|
|
106
|
+
| Profile | Model |
|
|
107
|
+
|---------|-------|
|
|
108
|
+
| `full-sail` | sonnet |
|
|
109
|
+
| `quality` | sonnet |
|
|
110
|
+
| `balanced` | haiku |
|
|
111
|
+
| `budget` | haiku |
|
|
112
|
+
|
|
113
|
+
> `opus` = inherit (uses the current session model). When spawning sub-agents via the Agent tool, pass `model: "<resolved-model>"`.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sk:perf
|
|
3
|
+
description: Performance audit. Use before /sk:review to catch performance issues: bundle size, N+1 queries, slow DB queries, Core Web Vitals, memory leaks, caching opportunities. Auto-detects stack. Reports findings — does NOT fix code.
|
|
4
|
+
license: Complete terms in LICENSE.txt
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Audit the implementation for performance issues before the final review. This is an audit skill — it identifies issues and produces a findings report. It does NOT fix code.
|
|
10
|
+
|
|
11
|
+
Run this skill after implementing and passing lint/tests, but before `/sk:review`.
|
|
12
|
+
|
|
13
|
+
## Hard Rules
|
|
14
|
+
|
|
15
|
+
- **DO NOT fix code.** Report only. The user decides what to fix.
|
|
16
|
+
- **Every finding must cite a specific file and line number.**
|
|
17
|
+
- **Every finding must include an estimated impact** (high/medium/low) and a recommendation.
|
|
18
|
+
- **Auto-detect the stack** — only run checks relevant to what's present.
|
|
19
|
+
|
|
20
|
+
## Before You Start
|
|
21
|
+
|
|
22
|
+
1. Detect the stack: read `CLAUDE.md`, check for `package.json`, `composer.json`, `go.mod`, `requirements.txt`, `Cargo.toml`, etc.
|
|
23
|
+
2. Determine scope: `git diff main..HEAD --name-only` to find changed files.
|
|
24
|
+
3. If `tasks/perf-findings.md` exists, read it — check if prior findings have been addressed.
|
|
25
|
+
4. If `tasks/lessons.md` exists, read it — apply performance-related lessons.
|
|
26
|
+
|
|
27
|
+
## Stack Detection
|
|
28
|
+
|
|
29
|
+
| Indicator | Checks to run |
|
|
30
|
+
|-----------|--------------|
|
|
31
|
+
| `package.json` with React/Next/Vue | Frontend bundle, render performance, Core Web Vitals |
|
|
32
|
+
| `package.json` with Express/Node | Node.js backend performance |
|
|
33
|
+
| `composer.json` (Laravel/PHP) | PHP/Laravel backend performance |
|
|
34
|
+
| `go.mod` | Go performance checks |
|
|
35
|
+
| `requirements.txt` / `pyproject.toml` | Python performance checks |
|
|
36
|
+
| Any ORM detected | Database query performance |
|
|
37
|
+
|
|
38
|
+
## Audit Checklist
|
|
39
|
+
|
|
40
|
+
### Frontend Performance
|
|
41
|
+
|
|
42
|
+
**Bundle & Loading**
|
|
43
|
+
- Unused imports or dependencies included in the bundle
|
|
44
|
+
- Large dependencies that could be code-split or lazy-loaded
|
|
45
|
+
- Images without lazy loading (`loading="lazy"`) or without `width`/`height` attributes
|
|
46
|
+
- Fonts without `font-display: swap` or preloaded without need
|
|
47
|
+
- No tree-shaking unfriendly imports (`import * from` large libraries)
|
|
48
|
+
|
|
49
|
+
**Render Performance**
|
|
50
|
+
- React: missing `memo`, `useMemo`, `useCallback` on expensive operations in hot render paths
|
|
51
|
+
- React: unnecessary re-renders from unstable object/array/function references passed as props
|
|
52
|
+
- React: large lists without virtualization (`react-window` or similar)
|
|
53
|
+
- Synchronous operations blocking the main thread (large loops, heavy computation in render)
|
|
54
|
+
- Missing Suspense boundaries for code-split routes
|
|
55
|
+
|
|
56
|
+
**Core Web Vitals**
|
|
57
|
+
- LCP (Largest Contentful Paint): hero image/text not prioritized, no preload hint
|
|
58
|
+
- CLS (Cumulative Layout Shift): images/embeds without reserved dimensions, dynamic content inserted above existing content
|
|
59
|
+
- INP (Interaction to Next Paint): heavy click/input event handlers, no debouncing on frequent events
|
|
60
|
+
|
|
61
|
+
### Backend Performance
|
|
62
|
+
|
|
63
|
+
**Database (all ORMs)**
|
|
64
|
+
- N+1 query patterns: loops that query inside a loop without eager loading
|
|
65
|
+
- Missing indexes on foreign keys, frequently filtered columns, or join columns
|
|
66
|
+
- `SELECT *` where only specific columns are needed
|
|
67
|
+
- Unindexed `WHERE` clauses on large tables
|
|
68
|
+
- Missing pagination on endpoints that return collections
|
|
69
|
+
- Queries inside loops that could be batched
|
|
70
|
+
|
|
71
|
+
**Laravel-Specific**
|
|
72
|
+
- Missing `with()` eager loading on Eloquent relationships
|
|
73
|
+
- `all()` on large tables without `limit()`/`paginate()`
|
|
74
|
+
- Expensive operations not queued (emails, notifications, file processing)
|
|
75
|
+
- Missing cache on expensive repeated queries
|
|
76
|
+
- Missing database indexes defined in migrations
|
|
77
|
+
|
|
78
|
+
**Node.js-Specific**
|
|
79
|
+
- Blocking `fs.readFileSync` / `execSync` in request handlers
|
|
80
|
+
- Missing connection pooling on database clients
|
|
81
|
+
- Unbounded promise arrays (`Promise.all` on thousands of items)
|
|
82
|
+
- Memory leaks from event listeners not removed
|
|
83
|
+
|
|
84
|
+
**Go-Specific**
|
|
85
|
+
- Missing goroutine cleanup (goroutine leaks)
|
|
86
|
+
- Repeated allocations in hot paths that could use `sync.Pool`
|
|
87
|
+
- Blocking operations in goroutines without context cancellation
|
|
88
|
+
|
|
89
|
+
**General Backend**
|
|
90
|
+
- Missing HTTP response caching headers (`Cache-Control`, `ETag`) on static/infrequently-changing resources
|
|
91
|
+
- Missing compression (gzip/brotli) on text responses
|
|
92
|
+
- API responses without pagination on collection endpoints
|
|
93
|
+
- Expensive computations not cached (Redis, in-memory, etc.)
|
|
94
|
+
- External API calls in the critical path without timeout or circuit breaker
|
|
95
|
+
|
|
96
|
+
### Memory & Reliability
|
|
97
|
+
|
|
98
|
+
- Memory leaks: global caches/maps that grow without bounds
|
|
99
|
+
- Missing cleanup in component unmount / service shutdown
|
|
100
|
+
- Large objects held in memory longer than needed
|
|
101
|
+
- Recursive functions without memoization on repeated inputs
|
|
102
|
+
|
|
103
|
+
## Severity Levels
|
|
104
|
+
|
|
105
|
+
- **Critical**: Will cause production degradation at scale (N+1 on large table, unbounded memory growth)
|
|
106
|
+
- **High**: Measurable user-facing impact (LCP > 2.5s, missing pagination, blocking I/O in handler)
|
|
107
|
+
- **Medium**: Noticeable but not breaking (unnecessary re-renders, missing cache on moderate traffic)
|
|
108
|
+
- **Low**: Best practice / minor optimization (missing `loading="lazy"`, minor bundle bloat)
|
|
109
|
+
|
|
110
|
+
## Generate Report
|
|
111
|
+
|
|
112
|
+
Write findings to `tasks/perf-findings.md`:
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
# Performance Audit — YYYY-MM-DD
|
|
116
|
+
|
|
117
|
+
**Scope:** Changed files on branch `<branch-name>`
|
|
118
|
+
**Stack:** [detected stack]
|
|
119
|
+
**Files audited:** N
|
|
120
|
+
|
|
121
|
+
## Critical
|
|
122
|
+
|
|
123
|
+
- **[FILE:LINE]** Description
|
|
124
|
+
**Impact:** What happens at scale
|
|
125
|
+
**Recommendation:** How to fix
|
|
126
|
+
|
|
127
|
+
## High
|
|
128
|
+
|
|
129
|
+
- **[FILE:LINE]** Description
|
|
130
|
+
**Impact:** ...
|
|
131
|
+
**Recommendation:** ...
|
|
132
|
+
|
|
133
|
+
## Medium
|
|
134
|
+
|
|
135
|
+
- **[FILE:LINE]** Description
|
|
136
|
+
**Recommendation:** ...
|
|
137
|
+
|
|
138
|
+
## Low
|
|
139
|
+
|
|
140
|
+
- **[FILE:LINE]** Description
|
|
141
|
+
**Recommendation:** ...
|
|
142
|
+
|
|
143
|
+
## Passed Checks
|
|
144
|
+
|
|
145
|
+
- [Categories with no findings]
|
|
146
|
+
|
|
147
|
+
## Summary
|
|
148
|
+
|
|
149
|
+
| Severity | Count |
|
|
150
|
+
|----------|-------|
|
|
151
|
+
| Critical | N |
|
|
152
|
+
| High | N |
|
|
153
|
+
| Medium | N |
|
|
154
|
+
| Low | N |
|
|
155
|
+
| **Total** | **N** |
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Never overwrite** `tasks/perf-findings.md` — append new audits with a date header.
|
|
159
|
+
|
|
160
|
+
## When Done
|
|
161
|
+
|
|
162
|
+
Tell the user:
|
|
163
|
+
|
|
164
|
+
> "Performance audit complete. Findings saved to `tasks/perf-findings.md`.
|
|
165
|
+
> - **Critical:** N | **High:** N | **Medium:** N | **Low:** N
|
|
166
|
+
>
|
|
167
|
+
> Address critical and high findings, then run `/sk:review` to proceed."
|
|
168
|
+
|
|
169
|
+
If there are no critical or high findings:
|
|
170
|
+
> "No critical or high performance issues found. N medium/low findings noted in `tasks/perf-findings.md`. Run `/sk:review` to proceed."
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Model Routing
|
|
175
|
+
|
|
176
|
+
Read `.shipkit/sk:config.json` from the project root if it exists.
|
|
177
|
+
|
|
178
|
+
- If `model_overrides["sk:perf"]` is set, use that model — it takes precedence.
|
|
179
|
+
- Otherwise use the `profile` field. Default: `balanced`.
|
|
180
|
+
|
|
181
|
+
| Profile | Model |
|
|
182
|
+
|---------|-------|
|
|
183
|
+
| `full-sail` | opus (inherit) |
|
|
184
|
+
| `quality` | sonnet |
|
|
185
|
+
| `balanced` | sonnet |
|
|
186
|
+
| `budget` | haiku |
|
|
187
|
+
|
|
188
|
+
> `opus` = inherit (uses the current session model). When spawning sub-agents via the Agent tool, pass `model: "<resolved-model>"`.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sk:release
|
|
3
|
+
description: "Automate releases: bump version, update CHANGELOG, create git tag, push to GitHub. Supports --android and --ios flags to run a full App Store / Play Store readiness audit before release — checks configs, permissions, signing, icons, store listing requirements, and guides you step-by-step through fixes. Use this whenever someone wants to release, publish, deploy, or submit an app to the App Store, Play Store, Google Play, or Apple App Store."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Release Automation Skill
|
|
7
|
+
|
|
8
|
+
Automate the release process with optional mobile store submission review.
|
|
9
|
+
|
|
10
|
+
## Modes
|
|
11
|
+
|
|
12
|
+
| Invocation | What happens |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `/sk:release` | Git release only: version bump, CHANGELOG, tag, push |
|
|
15
|
+
| `/sk:release --android` | Git release + Play Store readiness audit |
|
|
16
|
+
| `/sk:release --ios` | Git release + App Store readiness audit |
|
|
17
|
+
| `/sk:release --android --ios` | Git release + both store audits |
|
|
18
|
+
|
|
19
|
+
## Step 1: Detect Flags
|
|
20
|
+
|
|
21
|
+
Parse the user's invocation for `--android` and/or `--ios` flags.
|
|
22
|
+
|
|
23
|
+
- If **no flags**: run the standard git release flow (Step 2 only)
|
|
24
|
+
- If **flags present**: run Step 2 (git release), then Step 3 (store audit for each flag)
|
|
25
|
+
|
|
26
|
+
## Step 2: Standard Git Release
|
|
27
|
+
|
|
28
|
+
Run the existing release script (`release.sh`) which handles:
|
|
29
|
+
|
|
30
|
+
1. Auto-detect project info (name, version, GitHub URL)
|
|
31
|
+
2. Prompt for new version number (semver)
|
|
32
|
+
3. Update CHANGELOG.md ([Unreleased] -> [Version])
|
|
33
|
+
4. Update version in CLAUDE.md
|
|
34
|
+
5. Create git commit + annotated tag
|
|
35
|
+
6. Push tag to GitHub
|
|
36
|
+
|
|
37
|
+
If no flags were passed, stop here.
|
|
38
|
+
|
|
39
|
+
## Step 3: Mobile Store Audit
|
|
40
|
+
|
|
41
|
+
When `--android` or `--ios` flags are present, run the store readiness audit AFTER the git release completes.
|
|
42
|
+
|
|
43
|
+
### 3a. Auto-Detect Framework
|
|
44
|
+
|
|
45
|
+
Detect the mobile framework by checking for these files (in order):
|
|
46
|
+
|
|
47
|
+
| Check | Framework |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `app.json` or `app.config.js` or `app.config.ts` with `"expo"` key | **Expo** |
|
|
50
|
+
| `react-native.config.js` or `node_modules/react-native` | **React Native (bare)** |
|
|
51
|
+
| `pubspec.yaml` with `flutter` dependency | **Flutter** |
|
|
52
|
+
| `build.gradle` + `AndroidManifest.xml` (no RN/Flutter markers) | **Native Android (Kotlin/Java)** |
|
|
53
|
+
| `*.xcodeproj` or `*.xcworkspace` (no RN/Flutter markers) | **Native iOS (Swift/ObjC)** |
|
|
54
|
+
| `.NET MAUI` or `maui` in csproj | **.NET MAUI** |
|
|
55
|
+
| `capacitor.config.ts` or `capacitor.config.json` | **Capacitor/Ionic** |
|
|
56
|
+
|
|
57
|
+
Report the detected framework to the user. If detection fails, ask them.
|
|
58
|
+
|
|
59
|
+
### 3b. Detect Store History
|
|
60
|
+
|
|
61
|
+
Check if the app has been previously submitted:
|
|
62
|
+
|
|
63
|
+
- **Android**: Look for `android/app/sk:release/` builds, `google-services.json`, existing `sa_key.json` (service account), or `android/app/build.gradle` with a `versionCode` > 1
|
|
64
|
+
- **iOS**: Look for existing provisioning profiles in `ios/`, `ExportOptions.plist`, or `app.json` with an existing `bundleIdentifier` that follows reverse-domain convention with a real domain
|
|
65
|
+
|
|
66
|
+
Report whether this appears to be a **first-time submission** or an **update to an existing app**.
|
|
67
|
+
|
|
68
|
+
### 3c. Run the Audit
|
|
69
|
+
|
|
70
|
+
Based on the detected flags, read and execute the corresponding checklist:
|
|
71
|
+
|
|
72
|
+
- `--android`: Read `references/android-checklist.md` and walk through every section
|
|
73
|
+
- `--ios`: Read `references/ios-checklist.md` and walk through every section
|
|
74
|
+
|
|
75
|
+
For each checklist item:
|
|
76
|
+
|
|
77
|
+
1. **Check** — Read the relevant config file and evaluate the requirement
|
|
78
|
+
2. **Report** — Tell the user the status (PASS / FAIL / WARN / MANUAL CHECK NEEDED)
|
|
79
|
+
3. **Fix** — If it's a config issue you can fix, propose the fix and apply it with user approval
|
|
80
|
+
4. **Guide** — If it requires manual action (screenshots, store listing, etc.), give clear step-by-step instructions
|
|
81
|
+
|
|
82
|
+
### 3d. Summary Report
|
|
83
|
+
|
|
84
|
+
After completing the audit, present a summary:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
## Store Readiness Report
|
|
88
|
+
|
|
89
|
+
### Android (Play Store) <-- if --android
|
|
90
|
+
- [x] App signing configured
|
|
91
|
+
- [x] Version code incremented
|
|
92
|
+
- [ ] Privacy policy URL missing <-- actionable items
|
|
93
|
+
- [ ] Store listing screenshots needed
|
|
94
|
+
|
|
95
|
+
### iOS (App Store) <-- if --ios
|
|
96
|
+
- [x] Bundle ID configured
|
|
97
|
+
- [x] Info.plist permissions
|
|
98
|
+
- [ ] App Transport Security exception needs justification
|
|
99
|
+
|
|
100
|
+
### Next Steps
|
|
101
|
+
1. Fix the items marked above
|
|
102
|
+
2. [Framework-specific build command]
|
|
103
|
+
3. [Framework-specific submit command]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Important Behaviors
|
|
107
|
+
|
|
108
|
+
- Always check files before suggesting changes — never assume config values
|
|
109
|
+
- For first-time submissions, include account setup guidance (Developer Console / App Store Connect)
|
|
110
|
+
- For Expo projects, prefer EAS Build/Submit commands over manual native builds
|
|
111
|
+
- Be explicit about costs ($25 Google Play one-time fee, $99/year Apple Developer Program)
|
|
112
|
+
- When fixing config files, show the diff and get approval before applying
|
|
113
|
+
- If both `--android` and `--ios` are passed, run Android audit first, then iOS
|