@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.
Files changed (117) hide show
  1. package/README.md +321 -0
  2. package/bin/shipkit.js +146 -0
  3. package/commands/sk/brainstorm.md +63 -0
  4. package/commands/sk/branch.md +35 -0
  5. package/commands/sk/config.md +96 -0
  6. package/commands/sk/execute-plan.md +85 -0
  7. package/commands/sk/features.md +238 -0
  8. package/commands/sk/finish-feature.md +154 -0
  9. package/commands/sk/help.md +103 -0
  10. package/commands/sk/hotfix.md +61 -0
  11. package/commands/sk/plan.md +30 -0
  12. package/commands/sk/release.md +72 -0
  13. package/commands/sk/security-check.md +188 -0
  14. package/commands/sk/set-profile.md +71 -0
  15. package/commands/sk/status.md +25 -0
  16. package/commands/sk/update-task.md +35 -0
  17. package/commands/sk/write-plan.md +72 -0
  18. package/package.json +23 -0
  19. package/skills/sk:accessibility/LICENSE.txt +177 -0
  20. package/skills/sk:accessibility/SKILL.md +150 -0
  21. package/skills/sk:api-design/LICENSE.txt +177 -0
  22. package/skills/sk:api-design/SKILL.md +158 -0
  23. package/skills/sk:brainstorming/SKILL.md +124 -0
  24. package/skills/sk:debug/SKILL.md +252 -0
  25. package/skills/sk:debug/debug_conductor.py +177 -0
  26. package/skills/sk:debug/lib/__init__.py +1 -0
  27. package/skills/sk:debug/lib/bug_gatherer.py +55 -0
  28. package/skills/sk:debug/lib/context_reader.py +139 -0
  29. package/skills/sk:debug/lib/findings_writer.py +76 -0
  30. package/skills/sk:debug/lib/lessons_writer.py +165 -0
  31. package/skills/sk:debug/lib/step_runner.py +326 -0
  32. package/skills/sk:features/SKILL.md +238 -0
  33. package/skills/sk:frontend-design/LICENSE.txt +177 -0
  34. package/skills/sk:frontend-design/SKILL.md +191 -0
  35. package/skills/sk:laravel-init/SKILL.md +37 -0
  36. package/skills/sk:laravel-new/SKILL.md +68 -0
  37. package/skills/sk:lint/SKILL.md +113 -0
  38. package/skills/sk:perf/LICENSE.txt +177 -0
  39. package/skills/sk:perf/SKILL.md +188 -0
  40. package/skills/sk:release/SKILL.md +113 -0
  41. package/skills/sk:release/references/android-checklist.md +269 -0
  42. package/skills/sk:release/references/ios-checklist.md +339 -0
  43. package/skills/sk:release/release.sh +378 -0
  44. package/skills/sk:review/SKILL.md +346 -0
  45. package/skills/sk:review/references/security-checklist.md +223 -0
  46. package/skills/sk:schema-migrate/SKILL.md +125 -0
  47. package/skills/sk:schema-migrate/orms/drizzle.md +546 -0
  48. package/skills/sk:schema-migrate/orms/laravel.md +367 -0
  49. package/skills/sk:schema-migrate/orms/prisma.md +357 -0
  50. package/skills/sk:schema-migrate/orms/rails.md +351 -0
  51. package/skills/sk:schema-migrate/orms/sqlalchemy.md +385 -0
  52. package/skills/sk:schema-migrate/references/detection.md +110 -0
  53. package/skills/sk:setup-claude/SKILL.md +365 -0
  54. package/skills/sk:setup-claude/references/detection.md +6 -0
  55. package/skills/sk:setup-claude/references/templates.md +11 -0
  56. package/skills/sk:setup-claude/scripts/apply_setup_claude.py +443 -0
  57. package/skills/sk:setup-claude/scripts/detect_arch_changes.py +437 -0
  58. package/skills/sk:setup-claude/templates/.claude/docs/arch-changelog-guide.md.template +6 -0
  59. package/skills/sk:setup-claude/templates/.claude/docs/changelog-guide.md.template +12 -0
  60. package/skills/sk:setup-claude/templates/CHANGELOG.md.template +21 -0
  61. package/skills/sk:setup-claude/templates/CLAUDE.md.template +299 -0
  62. package/skills/sk:setup-claude/templates/arch-changelog-guide.md.template +3 -0
  63. package/skills/sk:setup-claude/templates/changelog-guide.md.template +3 -0
  64. package/skills/sk:setup-claude/templates/commands/brainstorm.md.template +74 -0
  65. package/skills/sk:setup-claude/templates/commands/execute-plan.md.template +57 -0
  66. package/skills/sk:setup-claude/templates/commands/features.md.template +238 -0
  67. package/skills/sk:setup-claude/templates/commands/finish-feature.md.template +155 -0
  68. package/skills/sk:setup-claude/templates/commands/plan.md.template +30 -0
  69. package/skills/sk:setup-claude/templates/commands/re-setup.md.template +38 -0
  70. package/skills/sk:setup-claude/templates/commands/release.md.template +74 -0
  71. package/skills/sk:setup-claude/templates/commands/security-check.md.template +172 -0
  72. package/skills/sk:setup-claude/templates/commands/status.md.template +17 -0
  73. package/skills/sk:setup-claude/templates/commands/write-plan.md.template +34 -0
  74. package/skills/sk:setup-claude/templates/finish-feature.md.template +3 -0
  75. package/skills/sk:setup-claude/templates/plan.md.template +3 -0
  76. package/skills/sk:setup-claude/templates/status.md.template +3 -0
  77. package/skills/sk:setup-claude/templates/tasks/findings.md.template +19 -0
  78. package/skills/sk:setup-claude/templates/tasks/lessons.md.template +26 -0
  79. package/skills/sk:setup-claude/templates/tasks/progress.md.template +20 -0
  80. package/skills/sk:setup-claude/templates/tasks/security-findings.md.template +5 -0
  81. package/skills/sk:setup-claude/templates/tasks/todo.md.template +26 -0
  82. package/skills/sk:setup-claude/templates/tasks/workflow-status.md.template +31 -0
  83. package/skills/sk:setup-claude/templates/tasks-findings.md.template +3 -0
  84. package/skills/sk:setup-claude/templates/tasks-lessons.md.template +3 -0
  85. package/skills/sk:setup-claude/templates/tasks-progress.md.template +3 -0
  86. package/skills/sk:setup-claude/templates/tasks-todo.md.template +3 -0
  87. package/skills/sk:setup-claude/tests/test_apply_setup_claude.py +193 -0
  88. package/skills/sk:setup-optimizer/SKILL.md +184 -0
  89. package/skills/sk:setup-optimizer/lib/__init__.py +24 -0
  90. package/skills/sk:setup-optimizer/lib/detect.py +205 -0
  91. package/skills/sk:setup-optimizer/lib/discover.py +221 -0
  92. package/skills/sk:setup-optimizer/lib/enrich.py +163 -0
  93. package/skills/sk:setup-optimizer/lib/merge.py +277 -0
  94. package/skills/sk:setup-optimizer/lib/sidecar.py +129 -0
  95. package/skills/sk:setup-optimizer/optimize_claude.py +174 -0
  96. package/skills/sk:setup-optimizer/templates/CLAUDE.md.template +105 -0
  97. package/skills/sk:skill-creator/LICENSE.txt +202 -0
  98. package/skills/sk:skill-creator/SKILL.md +479 -0
  99. package/skills/sk:skill-creator/agents/analyzer.md +274 -0
  100. package/skills/sk:skill-creator/agents/comparator.md +202 -0
  101. package/skills/sk:skill-creator/agents/grader.md +223 -0
  102. package/skills/sk:skill-creator/assets/eval_review.html +146 -0
  103. package/skills/sk:skill-creator/eval-viewer/generate_review.py +471 -0
  104. package/skills/sk:skill-creator/eval-viewer/viewer.html +1325 -0
  105. package/skills/sk:skill-creator/references/schemas.md +430 -0
  106. package/skills/sk:skill-creator/scripts/aggregate_benchmark.py +401 -0
  107. package/skills/sk:skill-creator/scripts/generate_report.py +326 -0
  108. package/skills/sk:skill-creator/scripts/improve_description.py +248 -0
  109. package/skills/sk:skill-creator/scripts/package_skill.py +136 -0
  110. package/skills/sk:skill-creator/scripts/quick_validate.py +103 -0
  111. package/skills/sk:skill-creator/scripts/run_eval.py +310 -0
  112. package/skills/sk:skill-creator/scripts/run_loop.py +332 -0
  113. package/skills/sk:skill-creator/scripts/utils.py +47 -0
  114. package/skills/sk:smart-commit/SKILL.md +175 -0
  115. package/skills/sk:test/SKILL.md +171 -0
  116. package/skills/sk:write-tests/SKILL.md +195 -0
  117. 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