swe-workflow-skills 0.1.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/LICENSE +21 -0
- package/README.md +144 -0
- package/VERSION +1 -0
- package/bin/cli.mjs +44 -0
- package/catalog.json +225 -0
- package/commands/role.md +34 -0
- package/hooks/session-start.mjs +118 -0
- package/install.mjs +318 -0
- package/package.json +47 -0
- package/roles.json +194 -0
- package/scripts/resolve.mjs +296 -0
- package/skills/accessibility-design/SKILL.md +128 -0
- package/skills/accessibility-design/evals/evals.json +51 -0
- package/skills/accessibility-design/references/accessibility-patterns.md +321 -0
- package/skills/api-design/SKILL.md +144 -0
- package/skills/api-design/evals/evals.json +48 -0
- package/skills/api-design/references/rest-conventions.md +147 -0
- package/skills/api-design/templates/api-spec.md +156 -0
- package/skills/architecture-design/SKILL.md +86 -0
- package/skills/architecture-design/evals/evals.json +44 -0
- package/skills/architecture-design/references/clean-architecture.md +147 -0
- package/skills/architecture-design/references/component-principles.md +129 -0
- package/skills/architecture-design/references/principles.md +81 -0
- package/skills/architecture-design/references/solid-principles.md +106 -0
- package/skills/architecture-design/templates/adr.md +63 -0
- package/skills/architecture-documentation/SKILL.md +126 -0
- package/skills/architecture-documentation/evals/evals.json +44 -0
- package/skills/architecture-documentation/references/abstraction-levels.md +91 -0
- package/skills/architecture-documentation/references/diagram-tooling.md +141 -0
- package/skills/architecture-documentation/templates/architecture-doc.md +171 -0
- package/skills/bug-investigating/SKILL.md +133 -0
- package/skills/bug-investigating/evals/evals.json +56 -0
- package/skills/bug-investigating/references/common-bugs.md +62 -0
- package/skills/bug-investigating/references/debugging-patterns.md +94 -0
- package/skills/cicd-pipeline/SKILL.md +87 -0
- package/skills/cicd-pipeline/evals/evals.json +34 -0
- package/skills/cicd-pipeline/references/pipeline-patterns.md +206 -0
- package/skills/cicd-pipeline/templates/github-actions.md +206 -0
- package/skills/code-reviewing/SKILL.md +92 -0
- package/skills/code-reviewing/evals/evals.json +62 -0
- package/skills/code-reviewing/references/error-handling.md +108 -0
- package/skills/code-reviewing/references/review-checklist.md +144 -0
- package/skills/configuration-strategy/SKILL.md +109 -0
- package/skills/configuration-strategy/evals/evals.json +41 -0
- package/skills/configuration-strategy/references/config-patterns.md +161 -0
- package/skills/containerization/SKILL.md +90 -0
- package/skills/containerization/evals/evals.json +36 -0
- package/skills/containerization/references/dockerfile-patterns.md +168 -0
- package/skills/containerization/templates/dockerfile.md +154 -0
- package/skills/data-modeling/SKILL.md +83 -0
- package/skills/data-modeling/evals/evals.json +43 -0
- package/skills/data-modeling/references/conventions.md +57 -0
- package/skills/data-modeling/templates/schema.md +120 -0
- package/skills/dependency-impact-analysis/SKILL.md +113 -0
- package/skills/dependency-impact-analysis/evals/evals.json +41 -0
- package/skills/dependency-impact-analysis/references/impact-patterns.md +150 -0
- package/skills/dependency-management/SKILL.md +161 -0
- package/skills/dependency-management/evals/evals.json +48 -0
- package/skills/dependency-management/references/evaluation-checklist.md +127 -0
- package/skills/deployment-checklist/SKILL.md +132 -0
- package/skills/deployment-checklist/evals/evals.json +58 -0
- package/skills/deployment-checklist/references/pre-deploy-gates.md +91 -0
- package/skills/deployment-repo/SKILL.md +190 -0
- package/skills/deployment-repo/evals/evals.json +44 -0
- package/skills/deployment-repo/references/deployment-repo-patterns.md +258 -0
- package/skills/deployment-repo/references/version-compatibility.md +227 -0
- package/skills/deployment-repo/templates/deployment-repo-structure.md +226 -0
- package/skills/effort-estimation/SKILL.md +95 -0
- package/skills/effort-estimation/evals/evals.json +32 -0
- package/skills/effort-estimation/references/estimation-methods.md +154 -0
- package/skills/feature-planning/SKILL.md +84 -0
- package/skills/feature-planning/evals/evals.json +44 -0
- package/skills/feature-planning/templates/plan.md +55 -0
- package/skills/feature-planning/templates/task.md +26 -0
- package/skills/frontend-architecture/SKILL.md +154 -0
- package/skills/frontend-architecture/evals/evals.json +34 -0
- package/skills/frontend-architecture/references/component-patterns.md +264 -0
- package/skills/frontend-architecture/templates/folder-structure.md +203 -0
- package/skills/git-workflow/SKILL.md +127 -0
- package/skills/git-workflow/evals/evals.json +44 -0
- package/skills/git-workflow/references/conventions.md +142 -0
- package/skills/git-workflow/templates/pull-request.md +57 -0
- package/skills/gitops-delivery/SKILL.md +319 -0
- package/skills/gitops-delivery/evals/evals.json +44 -0
- package/skills/gitops-delivery/references/gitops-patterns.md +478 -0
- package/skills/gitops-delivery/templates/gitops-config.md +196 -0
- package/skills/incident-response/SKILL.md +130 -0
- package/skills/incident-response/evals/evals.json +55 -0
- package/skills/incident-response/references/communication-templates.md +134 -0
- package/skills/incident-response/references/severity-levels.md +77 -0
- package/skills/incident-response/templates/incident-timeline.md +57 -0
- package/skills/infrastructure-as-code/SKILL.md +86 -0
- package/skills/infrastructure-as-code/evals/evals.json +33 -0
- package/skills/infrastructure-as-code/references/iac-patterns.md +179 -0
- package/skills/infrastructure-as-code/templates/terraform-module.md +158 -0
- package/skills/metrics-and-okrs/SKILL.md +113 -0
- package/skills/metrics-and-okrs/evals/evals.json +33 -0
- package/skills/metrics-and-okrs/references/metric-catalog.md +90 -0
- package/skills/metrics-and-okrs/templates/okr-document.md +61 -0
- package/skills/ml-experiment-tracking/SKILL.md +96 -0
- package/skills/ml-experiment-tracking/evals/evals.json +32 -0
- package/skills/ml-experiment-tracking/references/tracking-tools.md +127 -0
- package/skills/ml-model-deployment/SKILL.md +106 -0
- package/skills/ml-model-deployment/evals/evals.json +34 -0
- package/skills/ml-model-deployment/references/serving-patterns.md +162 -0
- package/skills/ml-pipeline-design/SKILL.md +162 -0
- package/skills/ml-pipeline-design/evals/evals.json +34 -0
- package/skills/ml-pipeline-design/references/pipeline-components.md +174 -0
- package/skills/observability-design/SKILL.md +162 -0
- package/skills/observability-design/evals/evals.json +52 -0
- package/skills/observability-design/references/logging-patterns.md +229 -0
- package/skills/observability-design/references/slo-framework.md +151 -0
- package/skills/observability-design/templates/slo-document.md +80 -0
- package/skills/performance-optimization/SKILL.md +83 -0
- package/skills/performance-optimization/evals/evals.json +47 -0
- package/skills/performance-optimization/references/bottleneck-patterns.md +256 -0
- package/skills/performance-optimization/references/concurrency.md +101 -0
- package/skills/prd-writing/SKILL.md +109 -0
- package/skills/prd-writing/evals/evals.json +33 -0
- package/skills/prd-writing/references/prd-examples.md +132 -0
- package/skills/prd-writing/templates/prd.md +71 -0
- package/skills/prd-writing/templates/rfc.md +79 -0
- package/skills/project-documentation/SKILL.md +104 -0
- package/skills/project-documentation/evals/evals.json +48 -0
- package/skills/project-documentation/references/contributing-guide.md +100 -0
- package/skills/project-documentation/templates/changelog.md +59 -0
- package/skills/project-documentation/templates/readme.md +121 -0
- package/skills/project-proposal/SKILL.md +90 -0
- package/skills/project-proposal/evals/evals.json +31 -0
- package/skills/project-proposal/references/proposal-examples.md +140 -0
- package/skills/project-proposal/templates/proposal.md +76 -0
- package/skills/project-review/SKILL.md +111 -0
- package/skills/project-review/evals/evals.json +42 -0
- package/skills/refactoring/SKILL.md +90 -0
- package/skills/refactoring/evals/evals.json +44 -0
- package/skills/refactoring/references/transformations.md +132 -0
- package/skills/retrospective/SKILL.md +157 -0
- package/skills/retrospective/evals/evals.json +34 -0
- package/skills/retrospective/references/facilitation-guide.md +130 -0
- package/skills/retrospective/templates/post-mortem.md +121 -0
- package/skills/rollback-strategy/SKILL.md +116 -0
- package/skills/rollback-strategy/evals/evals.json +55 -0
- package/skills/rollback-strategy/references/rollback-patterns.md +125 -0
- package/skills/rollback-strategy/templates/rollback-plan.md +69 -0
- package/skills/security-audit/SKILL.md +146 -0
- package/skills/security-audit/evals/evals.json +66 -0
- package/skills/security-audit/references/owasp-top-10.md +167 -0
- package/skills/security-audit/templates/security-report.md +79 -0
- package/skills/skill-router/SKILL.md +171 -0
- package/skills/skill-router/evals/evals.json +39 -0
- package/skills/strategic-review/SKILL.md +106 -0
- package/skills/strategic-review/evals/evals.json +42 -0
- package/skills/strategic-review/templates/full-review-prompt.md +84 -0
- package/skills/tdd-workflow/SKILL.md +147 -0
- package/skills/tdd-workflow/evals/evals.json +58 -0
- package/skills/tdd-workflow/references/test-quality.md +71 -0
- package/skills/technical-debt-review/SKILL.md +113 -0
- package/skills/technical-debt-review/evals/evals.json +41 -0
- package/skills/technical-debt-review/references/debt-taxonomy.md +124 -0
- package/skills/technical-debt-review/templates/debt-audit.md +85 -0
- package/skills/test-data-strategy/SKILL.md +129 -0
- package/skills/test-data-strategy/evals/evals.json +49 -0
- package/skills/test-data-strategy/references/data-generation-patterns.md +341 -0
- package/skills/test-suite-design/SKILL.md +137 -0
- package/skills/test-suite-design/evals/evals.json +69 -0
- package/skills/test-suite-design/references/test-infrastructure.md +175 -0
- package/skills/test-suite-design/references/testing-pyramid.md +140 -0
- package/skills/ui-ux-design/SKILL.md +117 -0
- package/skills/ui-ux-design/evals/evals.json +35 -0
- package/skills/ui-ux-design/references/interaction-patterns.md +145 -0
- package/skills/ui-ux-design/templates/screen-spec.md +97 -0
- package/skills/verification-before-completion/SKILL.md +85 -0
- package/skills/verification-before-completion/evals/evals.json +53 -0
- package/skills/writing-skills/SKILL.md +87 -0
- package/skills/writing-skills/evals/evals.json +41 -0
- package/skills/writing-skills/references/pressure-testing.md +69 -0
- package/uninstall.mjs +182 -0
package/install.mjs
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Install Claude Code skills from this repo. Runs on Linux, macOS, and Windows
|
|
3
|
+
// using only the Node that Claude Code already requires (no bash / python / sed).
|
|
4
|
+
//
|
|
5
|
+
// node install.mjs # all skills + machinery + hook -> ./.claude/
|
|
6
|
+
// node install.mjs --global # ...to the user config dir
|
|
7
|
+
// node install.mjs --role pm # just the PM subset
|
|
8
|
+
// node install.mjs --help # full usage
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
existsSync,
|
|
12
|
+
mkdirSync,
|
|
13
|
+
rmSync,
|
|
14
|
+
cpSync,
|
|
15
|
+
readdirSync,
|
|
16
|
+
readFileSync,
|
|
17
|
+
writeFileSync,
|
|
18
|
+
statSync,
|
|
19
|
+
chmodSync,
|
|
20
|
+
} from "node:fs";
|
|
21
|
+
import { dirname, join, resolve } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
import { homedir } from "node:os";
|
|
24
|
+
import {
|
|
25
|
+
loadRoles,
|
|
26
|
+
resolvedSkills,
|
|
27
|
+
applyBaseline,
|
|
28
|
+
} from "./scripts/resolve.mjs";
|
|
29
|
+
|
|
30
|
+
const REPO_ROOT = dirname(fileURLToPath(import.meta.url));
|
|
31
|
+
const SKILLS_DIR = join(REPO_ROOT, "skills");
|
|
32
|
+
const RESOLVE_SRC = join(REPO_ROOT, "scripts", "resolve.mjs");
|
|
33
|
+
|
|
34
|
+
if (!isDir(SKILLS_DIR)) {
|
|
35
|
+
fatal("must be run from the swe-workflow-skills repo root");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const USAGE = `Usage: install.mjs [options] [skill1 skill2 ...]
|
|
39
|
+
|
|
40
|
+
Install Claude Code skills from this repo. By default installs ALL skills with a
|
|
41
|
+
name-only activation baseline (only the skill-router orchestrator + safety skills
|
|
42
|
+
auto-trigger; the rest are invoked on demand). Scope to a role at runtime with the
|
|
43
|
+
/role command, or install a hard subset with --role.
|
|
44
|
+
|
|
45
|
+
Options:
|
|
46
|
+
-g, --global Install to the user config dir: $CLAUDE_CONFIG_DIR if set,
|
|
47
|
+
else ~/.claude/ (default without this flag: ./.claude/)
|
|
48
|
+
-d, --dir DIR Install to a custom Claude config directory DIR
|
|
49
|
+
(mutually exclusive with --global)
|
|
50
|
+
-r, --role ROLE Install only one role's skills (a lean, hard subset; see
|
|
51
|
+
--list for roles). Without it, all skills are installed.
|
|
52
|
+
-p, --prune After installing the selected set, remove previously-installed
|
|
53
|
+
library skills that are NOT in the new selection (never touches
|
|
54
|
+
your own custom skills). Use to narrow a prior all-skills install.
|
|
55
|
+
-k, --hook (default) Install the SessionStart hook that re-asserts the
|
|
56
|
+
name-only baseline each session + injects the router nudge
|
|
57
|
+
(prints the settings snippet; never edits settings)
|
|
58
|
+
--no-hook Skip the SessionStart hook. The name-only baseline is still
|
|
59
|
+
applied at install time (persists in settings.local.json).
|
|
60
|
+
-l, --list List available skills and roles
|
|
61
|
+
-h, --help Show this help
|
|
62
|
+
|
|
63
|
+
Arguments:
|
|
64
|
+
skill names Install specific skills only (advanced; skips the role/
|
|
65
|
+
orchestrator machinery unless skill-router is included)
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
install.mjs # all skills + machinery + hook -> ./.claude/
|
|
69
|
+
install.mjs --global # all skills + hook, to the user config dir
|
|
70
|
+
install.mjs --global --no-hook # ...baseline applied, but no hook installed
|
|
71
|
+
install.mjs --role pm # just the PM subset
|
|
72
|
+
install.mjs --role pm --prune # PM subset; drop other library skills
|
|
73
|
+
install.mjs --dir /etc/claude # all skills to /etc/claude/
|
|
74
|
+
install.mjs feature-planning # one skill, no machinery`;
|
|
75
|
+
|
|
76
|
+
function isDir(p) {
|
|
77
|
+
return existsSync(p) && statSync(p).isDirectory();
|
|
78
|
+
}
|
|
79
|
+
function fatal(msg) {
|
|
80
|
+
process.stderr.write(`Error: ${msg}\n`);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
function warn(msg) {
|
|
84
|
+
process.stderr.write(`Warning: ${msg}\n`);
|
|
85
|
+
}
|
|
86
|
+
function log(msg) {
|
|
87
|
+
process.stdout.write(msg + "\n");
|
|
88
|
+
}
|
|
89
|
+
function listSkillDirs() {
|
|
90
|
+
return readdirSync(SKILLS_DIR)
|
|
91
|
+
.filter((e) => isDir(join(SKILLS_DIR, e)))
|
|
92
|
+
.sort();
|
|
93
|
+
}
|
|
94
|
+
// Expand a leading ~ the way the bash installer did (manual, not shell-dependent).
|
|
95
|
+
function expandTilde(p) {
|
|
96
|
+
if (p === "~" || p.startsWith("~/") || p.startsWith("~\\")) return homedir() + p.slice(1);
|
|
97
|
+
return p;
|
|
98
|
+
}
|
|
99
|
+
// Forward-slash form of a path (no-op on POSIX). Node accepts "/" on Windows too.
|
|
100
|
+
function toPosix(p) {
|
|
101
|
+
return p.replaceAll("\\", "/");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ---- arg parsing -----------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
let global = false;
|
|
107
|
+
let hook = true;
|
|
108
|
+
let prune = false;
|
|
109
|
+
let configDir = "";
|
|
110
|
+
let role = "";
|
|
111
|
+
const selected = [];
|
|
112
|
+
|
|
113
|
+
const argv = process.argv.slice(2);
|
|
114
|
+
for (let i = 0; i < argv.length; i++) {
|
|
115
|
+
const a = argv[i];
|
|
116
|
+
if (a === "-g" || a === "--global") global = true;
|
|
117
|
+
else if (a === "-d" || a === "--dir") {
|
|
118
|
+
configDir = argv[++i];
|
|
119
|
+
if (configDir === undefined) fatal("--dir requires a path");
|
|
120
|
+
} else if (a.startsWith("--dir=")) configDir = a.slice("--dir=".length);
|
|
121
|
+
else if (a === "-a" || a === "--all") {
|
|
122
|
+
/* accepted for back-compat; installing all is the default */
|
|
123
|
+
} else if (a === "-r" || a === "--role") {
|
|
124
|
+
role = argv[++i];
|
|
125
|
+
if (role === undefined) fatal("--role requires a role name");
|
|
126
|
+
} else if (a.startsWith("--role=")) role = a.slice("--role=".length);
|
|
127
|
+
else if (a === "-p" || a === "--prune") prune = true;
|
|
128
|
+
else if (a === "-k" || a === "--hook") hook = true;
|
|
129
|
+
else if (a === "--no-hook") hook = false;
|
|
130
|
+
else if (a === "-l" || a === "--list") {
|
|
131
|
+
log("Available skills:");
|
|
132
|
+
for (const s of listSkillDirs()) log(" " + s);
|
|
133
|
+
log("");
|
|
134
|
+
log("Roles (--role, or /role at runtime):");
|
|
135
|
+
try {
|
|
136
|
+
const data = loadRoles(join(REPO_ROOT, "roles.json"));
|
|
137
|
+
for (const [key, r] of Object.entries(data.roles || {})) log(` ${key}\t${r.label || key}`);
|
|
138
|
+
} catch {
|
|
139
|
+
log(" (could not read roles.json)");
|
|
140
|
+
}
|
|
141
|
+
process.exit(0);
|
|
142
|
+
} else if (a === "-h" || a === "--help") {
|
|
143
|
+
log(USAGE);
|
|
144
|
+
process.exit(0);
|
|
145
|
+
} else if (a.startsWith("-")) {
|
|
146
|
+
process.stderr.write(`Unknown option: ${a}\n${USAGE}\n`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
} else selected.push(a);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Load + validate the role early (mirrors the bash `label` precheck).
|
|
152
|
+
let rolesData = null;
|
|
153
|
+
try {
|
|
154
|
+
rolesData = loadRoles(join(REPO_ROOT, "roles.json"));
|
|
155
|
+
} catch {
|
|
156
|
+
rolesData = null;
|
|
157
|
+
}
|
|
158
|
+
if (role) {
|
|
159
|
+
if (!rolesData || !(rolesData.roles && role in rolesData.roles)) {
|
|
160
|
+
fatal(`unknown role '${role}'. Run 'install.mjs --list' to see roles.`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ---- resolve destination ---------------------------------------------------
|
|
165
|
+
|
|
166
|
+
let claudeDir;
|
|
167
|
+
if (configDir) {
|
|
168
|
+
if (global) fatal("--dir and --global are mutually exclusive");
|
|
169
|
+
claudeDir = resolve(expandTilde(configDir));
|
|
170
|
+
} else if (global) {
|
|
171
|
+
claudeDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), ".claude");
|
|
172
|
+
} else {
|
|
173
|
+
claudeDir = join(process.cwd(), ".claude");
|
|
174
|
+
}
|
|
175
|
+
const dest = join(claudeDir, "skills");
|
|
176
|
+
mkdirSync(dest, { recursive: true });
|
|
177
|
+
|
|
178
|
+
// Resolve the skill set: explicit args > role subset > all (default).
|
|
179
|
+
let skillSet = selected;
|
|
180
|
+
if (skillSet.length === 0) {
|
|
181
|
+
skillSet = role ? resolvedSkills(rolesData, role) : listSkillDirs();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// ---- copy skills -----------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
let errors = 0;
|
|
187
|
+
for (const skill of skillSet) {
|
|
188
|
+
const src = join(SKILLS_DIR, skill);
|
|
189
|
+
if (!isDir(src)) {
|
|
190
|
+
process.stderr.write(`Error: unknown skill '${skill}'\n`);
|
|
191
|
+
errors++;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Clean copy: drop any prior version first so files removed upstream don't linger.
|
|
195
|
+
rmSync(join(dest, skill), { recursive: true, force: true });
|
|
196
|
+
cpSync(src, join(dest, skill), { recursive: true });
|
|
197
|
+
log(`Installed: ${skill} -> ${join(dest, skill)}`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// --prune: narrow a prior install to the current selection. Only ever removes skills
|
|
201
|
+
// that exist in our source tree (so the user's own custom skills are never touched).
|
|
202
|
+
if (prune) {
|
|
203
|
+
const keep = new Set(skillSet);
|
|
204
|
+
for (const s of listSkillDirs()) {
|
|
205
|
+
if (!keep.has(s) && isDir(join(dest, s))) {
|
|
206
|
+
rmSync(join(dest, s), { recursive: true, force: true });
|
|
207
|
+
log(`Pruned: ${s} (not in selection)`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ---- orchestrator machinery (only when skill-router is in the set) ---------
|
|
213
|
+
|
|
214
|
+
const hasRouter = skillSet.includes("skill-router");
|
|
215
|
+
let hookPath = "";
|
|
216
|
+
|
|
217
|
+
if (hasRouter) {
|
|
218
|
+
// Catalog + role map alongside the skills, for the orchestrator and resolve.mjs.
|
|
219
|
+
copyIfExists(join(REPO_ROOT, "roles.json"), join(dest, ".roles.json"));
|
|
220
|
+
copyIfExists(join(REPO_ROOT, "catalog.json"), join(dest, ".catalog.json"));
|
|
221
|
+
|
|
222
|
+
// resolve.mjs is the shared engine for the hook + /role command. Park it next to
|
|
223
|
+
// where the hook lives.
|
|
224
|
+
const toolsDir = join(claudeDir, "hooks");
|
|
225
|
+
mkdirSync(toolsDir, { recursive: true });
|
|
226
|
+
cpSync(RESOLVE_SRC, join(toolsDir, "resolve.mjs"));
|
|
227
|
+
|
|
228
|
+
if (role) {
|
|
229
|
+
writeFileSync(join(dest, ".active-role"), role + "\n");
|
|
230
|
+
log(`Wrote role marker -> ${join(dest, ".active-role")} (${role})`);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Install the /role command, substituting absolute paths. The command body runs
|
|
234
|
+
// through Claude Code's Bash tool (Git Bash on Windows), so substitute forward-slash
|
|
235
|
+
// paths: Node accepts them on every OS and they avoid backslash-escaping pitfalls in
|
|
236
|
+
// the shell's double-quoted strings.
|
|
237
|
+
const cmdSrc = join(REPO_ROOT, "commands", "role.md");
|
|
238
|
+
if (existsSync(cmdSrc)) {
|
|
239
|
+
const cmdDestDir = join(claudeDir, "commands");
|
|
240
|
+
mkdirSync(cmdDestDir, { recursive: true });
|
|
241
|
+
const filled = readFileSync(cmdSrc, "utf-8")
|
|
242
|
+
.replaceAll("@@RESOLVE@@", toPosix(join(toolsDir, "resolve.mjs")))
|
|
243
|
+
.replaceAll("@@SKILLS@@", toPosix(dest))
|
|
244
|
+
.replaceAll("@@SETTINGS@@", toPosix(join(claudeDir, "settings.local.json")))
|
|
245
|
+
.replaceAll("@@ROLES@@", toPosix(join(dest, ".roles.json")))
|
|
246
|
+
.replaceAll("@@ACTIVE_ROLE@@", toPosix(join(dest, ".active-role")));
|
|
247
|
+
writeFileSync(join(cmdDestDir, "role.md"), filled);
|
|
248
|
+
log(`Installed /role command -> ${join(cmdDestDir, "role.md")}`);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Apply the name-only baseline now, so a fresh install never overflows the skill
|
|
252
|
+
// listing (cropping). skillOverrides persists in settings.local.json, so this holds
|
|
253
|
+
// even before the hook is wired and with --no-hook; the hook just re-asserts it.
|
|
254
|
+
try {
|
|
255
|
+
const data = loadRoles(join(dest, ".roles.json"));
|
|
256
|
+
applyBaseline(data, join(claudeDir, "settings.local.json"), dest, role || null);
|
|
257
|
+
log(`Applied name-only baseline -> ${join(claudeDir, "settings.local.json")}`);
|
|
258
|
+
} catch {
|
|
259
|
+
warn("could not apply the name-only baseline (skills may crop until you run /role).");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ---- hook ------------------------------------------------------------------
|
|
264
|
+
|
|
265
|
+
if (hook) {
|
|
266
|
+
const hookSrc = join(REPO_ROOT, "hooks", "session-start.mjs");
|
|
267
|
+
if (!existsSync(hookSrc)) {
|
|
268
|
+
process.stderr.write(`Error: hook script not found at ${hookSrc}\n`);
|
|
269
|
+
errors++;
|
|
270
|
+
} else if (!hasRouter) {
|
|
271
|
+
warn("--hook needs the orchestrator; install includes no skill-router, skipping hook.");
|
|
272
|
+
} else {
|
|
273
|
+
const hookDestDir = join(claudeDir, "hooks");
|
|
274
|
+
mkdirSync(hookDestDir, { recursive: true });
|
|
275
|
+
cpSync(hookSrc, join(hookDestDir, "session-start.mjs"));
|
|
276
|
+
try {
|
|
277
|
+
chmodSync(join(hookDestDir, "session-start.mjs"), 0o755);
|
|
278
|
+
} catch {
|
|
279
|
+
/* chmod is a nicety; the hook is invoked via `node`, not executed directly */
|
|
280
|
+
}
|
|
281
|
+
hookPath = join(hookDestDir, "session-start.mjs");
|
|
282
|
+
log(`Installed hook script -> ${hookPath}`);
|
|
283
|
+
log("");
|
|
284
|
+
log("The name-only baseline is already applied. To have it re-asserted every");
|
|
285
|
+
log("session (and the router nudge injected), merge this into");
|
|
286
|
+
log(`${join(claudeDir, "settings.json")} (the installer does NOT edit settings for you):`);
|
|
287
|
+
log("");
|
|
288
|
+
log(hookSnippet(hookPath));
|
|
289
|
+
log("");
|
|
290
|
+
log("Start a new session and run /doctor to confirm the hook is registered.");
|
|
291
|
+
log("(Prefer no hook? Re-run with --no-hook; the baseline still applies.)");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (errors !== 0) process.exit(1);
|
|
296
|
+
|
|
297
|
+
function copyIfExists(src, destPath) {
|
|
298
|
+
if (existsSync(src)) cpSync(src, destPath);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// The SessionStart block to merge into settings.json. JSON.stringify keeps the path
|
|
302
|
+
// correctly escaped on every OS (Windows backslashes included).
|
|
303
|
+
function hookSnippet(path) {
|
|
304
|
+
const block = {
|
|
305
|
+
hooks: {
|
|
306
|
+
SessionStart: [
|
|
307
|
+
{
|
|
308
|
+
matcher: "startup|resume|clear|compact",
|
|
309
|
+
hooks: [{ type: "command", command: `node ${JSON.stringify(path)}` }],
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
return JSON.stringify(block, null, 2)
|
|
315
|
+
.split("\n")
|
|
316
|
+
.map((l) => " " + l)
|
|
317
|
+
.join("\n");
|
|
318
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "swe-workflow-skills",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A curated library of 44 Claude Code Agent Skills for the software lifecycle, with orchestrator-routed activation that scales past the skill-listing budget.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"swe-workflow-skills": "bin/cli.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/cli.mjs",
|
|
11
|
+
"install.mjs",
|
|
12
|
+
"uninstall.mjs",
|
|
13
|
+
"scripts/resolve.mjs",
|
|
14
|
+
"hooks/session-start.mjs",
|
|
15
|
+
"commands/role.md",
|
|
16
|
+
"skills/",
|
|
17
|
+
"roles.json",
|
|
18
|
+
"catalog.json",
|
|
19
|
+
"VERSION"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"verify": "node scripts/verify.mjs",
|
|
26
|
+
"prepublishOnly": "npm run verify"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"claude",
|
|
30
|
+
"claude-code",
|
|
31
|
+
"agent-skills",
|
|
32
|
+
"skills",
|
|
33
|
+
"sdlc",
|
|
34
|
+
"workflow",
|
|
35
|
+
"orchestrator"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"author": "SWEStash",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/SWEStash/swe-workflow-skills.git"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/SWEStash/swe-workflow-skills#readme",
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/SWEStash/swe-workflow-skills/issues"
|
|
46
|
+
}
|
|
47
|
+
}
|
package/roles.json
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"_comment": "Single source of truth for role-based, window-aware skill activation. Consumed by install.mjs (via scripts/resolve.mjs), scripts/build-plugins.mjs, and skill-router. A role's working set = its core set UNION its skills. 'pinned' skills stay auto-triggerable (skillOverrides: on) regardless of role/window when installed; everything else is gated: on with a 1m window OR when in the active role, else name-only. See docs/ROLES.md.",
|
|
4
|
+
|
|
5
|
+
"pinned": [
|
|
6
|
+
"skill-router",
|
|
7
|
+
"tdd-workflow",
|
|
8
|
+
"verification-before-completion",
|
|
9
|
+
"bug-investigating",
|
|
10
|
+
"incident-response",
|
|
11
|
+
"code-reviewing"
|
|
12
|
+
],
|
|
13
|
+
|
|
14
|
+
"core": {
|
|
15
|
+
"universal": [
|
|
16
|
+
"skill-router",
|
|
17
|
+
"feature-planning"
|
|
18
|
+
],
|
|
19
|
+
"technical": [
|
|
20
|
+
"skill-router",
|
|
21
|
+
"feature-planning",
|
|
22
|
+
"git-workflow",
|
|
23
|
+
"code-reviewing",
|
|
24
|
+
"verification-before-completion",
|
|
25
|
+
"bug-investigating",
|
|
26
|
+
"project-documentation"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
"meta_only": [
|
|
31
|
+
"writing-skills"
|
|
32
|
+
],
|
|
33
|
+
|
|
34
|
+
"roles": {
|
|
35
|
+
"backend": {
|
|
36
|
+
"label": "Backend / Full-stack Engineer",
|
|
37
|
+
"description": "Skills for service, API, and data work: design, test-first implementation, performance, and shipping.",
|
|
38
|
+
"core": "technical",
|
|
39
|
+
"skills": [
|
|
40
|
+
"api-design",
|
|
41
|
+
"data-modeling",
|
|
42
|
+
"architecture-design",
|
|
43
|
+
"tdd-workflow",
|
|
44
|
+
"test-suite-design",
|
|
45
|
+
"test-data-strategy",
|
|
46
|
+
"performance-optimization",
|
|
47
|
+
"dependency-management",
|
|
48
|
+
"configuration-strategy",
|
|
49
|
+
"security-audit",
|
|
50
|
+
"refactoring",
|
|
51
|
+
"deployment-checklist"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"frontend": {
|
|
55
|
+
"label": "Frontend Engineer",
|
|
56
|
+
"description": "Skills for UI/UX, component architecture, accessibility, and client-side performance.",
|
|
57
|
+
"core": "technical",
|
|
58
|
+
"skills": [
|
|
59
|
+
"ui-ux-design",
|
|
60
|
+
"frontend-architecture",
|
|
61
|
+
"accessibility-design",
|
|
62
|
+
"api-design",
|
|
63
|
+
"tdd-workflow",
|
|
64
|
+
"test-suite-design",
|
|
65
|
+
"performance-optimization",
|
|
66
|
+
"refactoring"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"devops": {
|
|
70
|
+
"label": "DevOps / SRE / Platform Engineer",
|
|
71
|
+
"description": "Skills for CI/CD, containers, infrastructure-as-code, delivery, observability, and incidents.",
|
|
72
|
+
"core": "technical",
|
|
73
|
+
"skills": [
|
|
74
|
+
"containerization",
|
|
75
|
+
"cicd-pipeline",
|
|
76
|
+
"infrastructure-as-code",
|
|
77
|
+
"deployment-repo",
|
|
78
|
+
"gitops-delivery",
|
|
79
|
+
"deployment-checklist",
|
|
80
|
+
"rollback-strategy",
|
|
81
|
+
"incident-response",
|
|
82
|
+
"observability-design",
|
|
83
|
+
"configuration-strategy",
|
|
84
|
+
"dependency-impact-analysis"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"ml": {
|
|
88
|
+
"label": "ML Engineer / MLOps",
|
|
89
|
+
"description": "Skills for ML pipelines, experiment tracking, model deployment, and the data/observability around them.",
|
|
90
|
+
"core": "technical",
|
|
91
|
+
"skills": [
|
|
92
|
+
"ml-pipeline-design",
|
|
93
|
+
"ml-experiment-tracking",
|
|
94
|
+
"ml-model-deployment",
|
|
95
|
+
"data-modeling",
|
|
96
|
+
"test-data-strategy",
|
|
97
|
+
"observability-design"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"security": {
|
|
101
|
+
"label": "Security Engineer",
|
|
102
|
+
"description": "Skills for security audits, dependency/CVE management, blast-radius analysis, and incident handling.",
|
|
103
|
+
"core": "technical",
|
|
104
|
+
"skills": [
|
|
105
|
+
"security-audit",
|
|
106
|
+
"dependency-management",
|
|
107
|
+
"dependency-impact-analysis",
|
|
108
|
+
"incident-response",
|
|
109
|
+
"rollback-strategy",
|
|
110
|
+
"configuration-strategy"
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
"architect": {
|
|
114
|
+
"label": "Architect / Staff Engineer",
|
|
115
|
+
"description": "Skills for structural decisions, documentation, contracts, blast radius, and technical-debt strategy.",
|
|
116
|
+
"core": "technical",
|
|
117
|
+
"skills": [
|
|
118
|
+
"architecture-design",
|
|
119
|
+
"architecture-documentation",
|
|
120
|
+
"api-design",
|
|
121
|
+
"data-modeling",
|
|
122
|
+
"dependency-impact-analysis",
|
|
123
|
+
"technical-debt-review",
|
|
124
|
+
"project-review",
|
|
125
|
+
"configuration-strategy",
|
|
126
|
+
"performance-optimization"
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
"em": {
|
|
130
|
+
"label": "Engineering Manager / Tech Lead",
|
|
131
|
+
"description": "Skills for planning, estimation, metrics, retros, proposals, reviews, and steering reviews and incidents.",
|
|
132
|
+
"core": "universal",
|
|
133
|
+
"skills": [
|
|
134
|
+
"technical-debt-review",
|
|
135
|
+
"retrospective",
|
|
136
|
+
"metrics-and-okrs",
|
|
137
|
+
"effort-estimation",
|
|
138
|
+
"project-proposal",
|
|
139
|
+
"prd-writing",
|
|
140
|
+
"project-review",
|
|
141
|
+
"strategic-review",
|
|
142
|
+
"code-reviewing",
|
|
143
|
+
"incident-response"
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
"pm": {
|
|
147
|
+
"label": "Product / Project Manager",
|
|
148
|
+
"description": "Skills for proposals, PRDs/specs, estimation, OKRs/metrics, retrospectives, and strategic reviews.",
|
|
149
|
+
"core": "universal",
|
|
150
|
+
"skills": [
|
|
151
|
+
"project-proposal",
|
|
152
|
+
"prd-writing",
|
|
153
|
+
"effort-estimation",
|
|
154
|
+
"metrics-and-okrs",
|
|
155
|
+
"retrospective",
|
|
156
|
+
"strategic-review"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"strategy": {
|
|
160
|
+
"label": "Strategy / Founder Review",
|
|
161
|
+
"description": "Skills for pre-public and strategic reviews: vision and positioning, market analysis, execution-vs-roadmap, and go/no-go synthesis.",
|
|
162
|
+
"core": "universal",
|
|
163
|
+
"skills": [
|
|
164
|
+
"strategic-review",
|
|
165
|
+
"project-review",
|
|
166
|
+
"project-proposal",
|
|
167
|
+
"metrics-and-okrs"
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"qa": {
|
|
171
|
+
"label": "QA / Test Engineer",
|
|
172
|
+
"description": "Skills for test-first development, coverage strategy, test data, review, and systematic debugging.",
|
|
173
|
+
"core": "technical",
|
|
174
|
+
"skills": [
|
|
175
|
+
"tdd-workflow",
|
|
176
|
+
"test-suite-design",
|
|
177
|
+
"test-data-strategy",
|
|
178
|
+
"code-reviewing",
|
|
179
|
+
"bug-investigating"
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
"designer": {
|
|
183
|
+
"label": "Designer / UX",
|
|
184
|
+
"description": "Skills for user flows, accessibility, product requirements, and the frontend architecture that realizes them.",
|
|
185
|
+
"core": "universal",
|
|
186
|
+
"skills": [
|
|
187
|
+
"ui-ux-design",
|
|
188
|
+
"accessibility-design",
|
|
189
|
+
"prd-writing",
|
|
190
|
+
"frontend-architecture"
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|