agentscamp 0.1.0 → 0.2.1
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 +3 -3
- package/content/commands/create-skill.md +84 -0
- package/content/commands/create-slash-command.md +80 -0
- package/content/commands/create-subagent.md +101 -0
- package/content/commands/estimate-effort.md +96 -0
- package/content/commands/find-n-plus-one.md +67 -0
- package/content/commands/flaky-test-hunt.md +112 -0
- package/content/commands/git-bisect.md +126 -0
- package/content/commands/rename-symbol.md +131 -0
- package/content/commands/resolve-conflict.md +127 -0
- package/content/commands/scaffold-rag-pipeline.md +76 -0
- package/content/commands/trace-data-flow.md +102 -0
- package/content/manifest.json +320 -3
- package/content/skills/agent-memory-designer.md +42 -0
- package/content/skills/auth-flow-reviewer.md +73 -0
- package/content/skills/extract-module.md +50 -0
- package/content/skills/migration-writer.md +41 -0
- package/content/skills/prompt-regression-tester.md +89 -0
- package/content/skills/rate-limiter-designer.md +56 -0
- package/content/skills/react-render-profiler.md +37 -0
- package/content/skills/semver-advisor.md +81 -0
- package/content/skills/type-coverage-improver.md +81 -0
- package/content/skills/version-bumper.md +91 -0
- package/content/skills/webhook-handler-scaffolder.md +37 -0
- package/package.json +1 -1
package/content/manifest.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-18T01:30:36.928Z",
|
|
4
4
|
"counts": {
|
|
5
5
|
"agents": 49,
|
|
6
|
-
"skills":
|
|
7
|
-
"commands":
|
|
6
|
+
"skills": 49,
|
|
7
|
+
"commands": 40
|
|
8
8
|
},
|
|
9
9
|
"items": [
|
|
10
10
|
{
|
|
@@ -866,6 +866,49 @@
|
|
|
866
866
|
"installAs": "commands/create-pr.md",
|
|
867
867
|
"url": "https://agentscamp.com/commands/git/create-pr"
|
|
868
868
|
},
|
|
869
|
+
{
|
|
870
|
+
"id": "commands/create-skill",
|
|
871
|
+
"type": "command",
|
|
872
|
+
"slug": "create-skill",
|
|
873
|
+
"category": "workflow",
|
|
874
|
+
"title": "Create Skill",
|
|
875
|
+
"description": "Scaffold a new Claude Code skill into .claude/skills/<name>/SKILL.md — a model-invoked capability with a trigger-rich description, scoped tools, and a lean body that pushes detail into resource files.",
|
|
876
|
+
"topics": [
|
|
877
|
+
"workflow-prompting"
|
|
878
|
+
],
|
|
879
|
+
"file": "commands/create-skill.md",
|
|
880
|
+
"installAs": "commands/create-skill.md",
|
|
881
|
+
"url": "https://agentscamp.com/commands/workflow/create-skill"
|
|
882
|
+
},
|
|
883
|
+
{
|
|
884
|
+
"id": "commands/create-slash-command",
|
|
885
|
+
"type": "command",
|
|
886
|
+
"slug": "create-slash-command",
|
|
887
|
+
"category": "workflow",
|
|
888
|
+
"title": "Create Slash Command",
|
|
889
|
+
"description": "Scaffold a new Claude Code slash command into .claude/commands/ — a valid Markdown file with frontmatter, a least-privilege allowed-tools allowlist, and a $ARGUMENTS-driven body of numbered steps ending in a Report.",
|
|
890
|
+
"topics": [
|
|
891
|
+
"workflow-prompting"
|
|
892
|
+
],
|
|
893
|
+
"file": "commands/create-slash-command.md",
|
|
894
|
+
"installAs": "commands/create-slash-command.md",
|
|
895
|
+
"url": "https://agentscamp.com/commands/workflow/create-slash-command"
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"id": "commands/create-subagent",
|
|
899
|
+
"type": "command",
|
|
900
|
+
"slug": "create-subagent",
|
|
901
|
+
"category": "workflow",
|
|
902
|
+
"title": "Create Subagent",
|
|
903
|
+
"description": "Scaffold a new Claude Code subagent definition file into .claude/agents/ with a routing-ready description, scoped tools, and a system prompt.",
|
|
904
|
+
"topics": [
|
|
905
|
+
"workflow-prompting",
|
|
906
|
+
"ai-agents-systems"
|
|
907
|
+
],
|
|
908
|
+
"file": "commands/create-subagent.md",
|
|
909
|
+
"installAs": "commands/create-subagent.md",
|
|
910
|
+
"url": "https://agentscamp.com/commands/workflow/create-subagent"
|
|
911
|
+
},
|
|
869
912
|
{
|
|
870
913
|
"id": "commands/db-migrate",
|
|
871
914
|
"type": "command",
|
|
@@ -881,6 +924,21 @@
|
|
|
881
924
|
"installAs": "commands/db-migrate.md",
|
|
882
925
|
"url": "https://agentscamp.com/commands/db/db-migrate"
|
|
883
926
|
},
|
|
927
|
+
{
|
|
928
|
+
"id": "commands/estimate-effort",
|
|
929
|
+
"type": "command",
|
|
930
|
+
"slug": "estimate-effort",
|
|
931
|
+
"category": "plan",
|
|
932
|
+
"title": "Estimate Effort",
|
|
933
|
+
"description": "Produce a grounded effort and complexity estimate for a task by exploring the codebase read-only.",
|
|
934
|
+
"topics": [
|
|
935
|
+
"workflow-prompting",
|
|
936
|
+
"architecture"
|
|
937
|
+
],
|
|
938
|
+
"file": "commands/estimate-effort.md",
|
|
939
|
+
"installAs": "commands/estimate-effort.md",
|
|
940
|
+
"url": "https://agentscamp.com/commands/plan/estimate-effort"
|
|
941
|
+
},
|
|
884
942
|
{
|
|
885
943
|
"id": "commands/explain-code",
|
|
886
944
|
"type": "command",
|
|
@@ -937,6 +995,20 @@
|
|
|
937
995
|
"installAs": "commands/find-bug.md",
|
|
938
996
|
"url": "https://agentscamp.com/commands/review/find-bug"
|
|
939
997
|
},
|
|
998
|
+
{
|
|
999
|
+
"id": "commands/find-n-plus-one",
|
|
1000
|
+
"type": "command",
|
|
1001
|
+
"slug": "find-n-plus-one",
|
|
1002
|
+
"category": "perf",
|
|
1003
|
+
"title": "Find N+1 Queries",
|
|
1004
|
+
"description": "Scan code read-only for N+1 query patterns — loops that query per iteration and handlers that fan out per-row — and report each with a location, why it is N+1, and the concrete eager-load/batch/set-based fix.",
|
|
1005
|
+
"topics": [
|
|
1006
|
+
"review-qa"
|
|
1007
|
+
],
|
|
1008
|
+
"file": "commands/find-n-plus-one.md",
|
|
1009
|
+
"installAs": "commands/find-n-plus-one.md",
|
|
1010
|
+
"url": "https://agentscamp.com/commands/perf/find-n-plus-one"
|
|
1011
|
+
},
|
|
940
1012
|
{
|
|
941
1013
|
"id": "commands/fix-failing-test",
|
|
942
1014
|
"type": "command",
|
|
@@ -951,6 +1023,34 @@
|
|
|
951
1023
|
"installAs": "commands/fix-failing-test.md",
|
|
952
1024
|
"url": "https://agentscamp.com/commands/testing/fix-failing-test"
|
|
953
1025
|
},
|
|
1026
|
+
{
|
|
1027
|
+
"id": "commands/flaky-test-hunt",
|
|
1028
|
+
"type": "command",
|
|
1029
|
+
"slug": "flaky-test-hunt",
|
|
1030
|
+
"category": "testing",
|
|
1031
|
+
"title": "Hunt Flaky Tests",
|
|
1032
|
+
"description": "Reproduce a flaky test, find the real source of nondeterminism, and fix the cause.",
|
|
1033
|
+
"topics": [
|
|
1034
|
+
"review-qa"
|
|
1035
|
+
],
|
|
1036
|
+
"file": "commands/flaky-test-hunt.md",
|
|
1037
|
+
"installAs": "commands/flaky-test-hunt.md",
|
|
1038
|
+
"url": "https://agentscamp.com/commands/testing/flaky-test-hunt"
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"id": "commands/git-bisect",
|
|
1042
|
+
"type": "command",
|
|
1043
|
+
"slug": "git-bisect",
|
|
1044
|
+
"category": "git",
|
|
1045
|
+
"title": "Git Bisect",
|
|
1046
|
+
"description": "Drive git bisect to find the exact commit that introduced a regression.",
|
|
1047
|
+
"topics": [
|
|
1048
|
+
"review-qa"
|
|
1049
|
+
],
|
|
1050
|
+
"file": "commands/git-bisect.md",
|
|
1051
|
+
"installAs": "commands/git-bisect.md",
|
|
1052
|
+
"url": "https://agentscamp.com/commands/git/git-bisect"
|
|
1053
|
+
},
|
|
954
1054
|
{
|
|
955
1055
|
"id": "commands/new-component",
|
|
956
1056
|
"type": "command",
|
|
@@ -1024,6 +1124,34 @@
|
|
|
1024
1124
|
"installAs": "commands/refactor.md",
|
|
1025
1125
|
"url": "https://agentscamp.com/commands/refactor/refactor"
|
|
1026
1126
|
},
|
|
1127
|
+
{
|
|
1128
|
+
"id": "commands/rename-symbol",
|
|
1129
|
+
"type": "command",
|
|
1130
|
+
"slug": "rename-symbol",
|
|
1131
|
+
"category": "refactor",
|
|
1132
|
+
"title": "Rename Symbol",
|
|
1133
|
+
"description": "Safely rename a symbol project-wide, distinguishing the real symbol from coincidental substring matches.",
|
|
1134
|
+
"topics": [
|
|
1135
|
+
"coding-languages"
|
|
1136
|
+
],
|
|
1137
|
+
"file": "commands/rename-symbol.md",
|
|
1138
|
+
"installAs": "commands/rename-symbol.md",
|
|
1139
|
+
"url": "https://agentscamp.com/commands/refactor/rename-symbol"
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
"id": "commands/resolve-conflict",
|
|
1143
|
+
"type": "command",
|
|
1144
|
+
"slug": "resolve-conflict",
|
|
1145
|
+
"category": "git",
|
|
1146
|
+
"title": "Resolve Merge Conflicts",
|
|
1147
|
+
"description": "Walk through resolving the in-progress merge, rebase, or cherry-pick conflict in the current repo by understanding both sides, then verify before continuing.",
|
|
1148
|
+
"topics": [
|
|
1149
|
+
"review-qa"
|
|
1150
|
+
],
|
|
1151
|
+
"file": "commands/resolve-conflict.md",
|
|
1152
|
+
"installAs": "commands/resolve-conflict.md",
|
|
1153
|
+
"url": "https://agentscamp.com/commands/git/resolve-conflict"
|
|
1154
|
+
},
|
|
1027
1155
|
{
|
|
1028
1156
|
"id": "commands/review-pr",
|
|
1029
1157
|
"type": "command",
|
|
@@ -1069,6 +1197,21 @@
|
|
|
1069
1197
|
"installAs": "commands/scaffold-pgvector-schema.md",
|
|
1070
1198
|
"url": "https://agentscamp.com/commands/db/scaffold-pgvector-schema"
|
|
1071
1199
|
},
|
|
1200
|
+
{
|
|
1201
|
+
"id": "commands/scaffold-rag-pipeline",
|
|
1202
|
+
"type": "command",
|
|
1203
|
+
"slug": "scaffold-rag-pipeline",
|
|
1204
|
+
"category": "scaffold",
|
|
1205
|
+
"title": "Scaffold RAG Pipeline",
|
|
1206
|
+
"description": "Scaffold a Retrieval-Augmented Generation pipeline — ingestion (load, chunk, embed, upsert) and retrieval (search, rerank, grounded prompt with citations) — fitted to the project's stack.",
|
|
1207
|
+
"topics": [
|
|
1208
|
+
"rag-retrieval",
|
|
1209
|
+
"llm-app-dev"
|
|
1210
|
+
],
|
|
1211
|
+
"file": "commands/scaffold-rag-pipeline.md",
|
|
1212
|
+
"installAs": "commands/scaffold-rag-pipeline.md",
|
|
1213
|
+
"url": "https://agentscamp.com/commands/scaffold/scaffold-rag-pipeline"
|
|
1214
|
+
},
|
|
1072
1215
|
{
|
|
1073
1216
|
"id": "commands/scaffold-vllm-config",
|
|
1074
1217
|
"type": "command",
|
|
@@ -1142,6 +1285,21 @@
|
|
|
1142
1285
|
"installAs": "commands/sync-branch.md",
|
|
1143
1286
|
"url": "https://agentscamp.com/commands/git/sync-branch"
|
|
1144
1287
|
},
|
|
1288
|
+
{
|
|
1289
|
+
"id": "commands/trace-data-flow",
|
|
1290
|
+
"type": "command",
|
|
1291
|
+
"slug": "trace-data-flow",
|
|
1292
|
+
"category": "analyze",
|
|
1293
|
+
"title": "Trace Data Flow",
|
|
1294
|
+
"description": "Trace how a value, field, or variable flows through the codebase from source to sink.",
|
|
1295
|
+
"topics": [
|
|
1296
|
+
"coding-languages",
|
|
1297
|
+
"architecture"
|
|
1298
|
+
],
|
|
1299
|
+
"file": "commands/trace-data-flow.md",
|
|
1300
|
+
"installAs": "commands/trace-data-flow.md",
|
|
1301
|
+
"url": "https://agentscamp.com/commands/analyze/trace-data-flow"
|
|
1302
|
+
},
|
|
1145
1303
|
{
|
|
1146
1304
|
"id": "commands/update-readme",
|
|
1147
1305
|
"type": "command",
|
|
@@ -1184,6 +1342,35 @@
|
|
|
1184
1342
|
"installAs": "skills/adr-writer/SKILL.md",
|
|
1185
1343
|
"url": "https://agentscamp.com/skills/docs/adr-writer"
|
|
1186
1344
|
},
|
|
1345
|
+
{
|
|
1346
|
+
"id": "skills/agent-memory-designer",
|
|
1347
|
+
"type": "skill",
|
|
1348
|
+
"slug": "agent-memory-designer",
|
|
1349
|
+
"category": "workflow",
|
|
1350
|
+
"title": "Agent Memory Designer",
|
|
1351
|
+
"description": "Design a project's CLAUDE.md and memory hierarchy by exploring the repo to learn its real build/test/lint commands, architecture, and non-obvious gotchas, then writing a concise, skimmable memory that keeps only what belongs in context. Use when onboarding a repo to Claude Code with no CLAUDE.md, or when an existing one is bloated, stale, or being ignored.",
|
|
1352
|
+
"topics": [
|
|
1353
|
+
"workflow-prompting",
|
|
1354
|
+
"ai-agents-systems"
|
|
1355
|
+
],
|
|
1356
|
+
"file": "skills/agent-memory-designer.md",
|
|
1357
|
+
"installAs": "skills/agent-memory-designer/SKILL.md",
|
|
1358
|
+
"url": "https://agentscamp.com/skills/workflow/agent-memory-designer"
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
"id": "skills/auth-flow-reviewer",
|
|
1362
|
+
"type": "skill",
|
|
1363
|
+
"slug": "auth-flow-reviewer",
|
|
1364
|
+
"category": "security",
|
|
1365
|
+
"title": "Auth Flow Reviewer",
|
|
1366
|
+
"description": "Read-only review of authentication AND authorization flows — session/token model, cookie flags, CSRF, token rotation, password-reset/email-verification, OAuth redirect/state, and per-route object-level access checks — for exploitable gaps. Use before shipping login/session/token code, when adding a protected route or sharing-by-URL feature, or during a security pass. Reports findings by severity with location, impact, and the concrete fix; never edits code.",
|
|
1367
|
+
"topics": [
|
|
1368
|
+
"review-qa"
|
|
1369
|
+
],
|
|
1370
|
+
"file": "skills/auth-flow-reviewer.md",
|
|
1371
|
+
"installAs": "skills/auth-flow-reviewer/SKILL.md",
|
|
1372
|
+
"url": "https://agentscamp.com/skills/security/auth-flow-reviewer"
|
|
1373
|
+
},
|
|
1187
1374
|
{
|
|
1188
1375
|
"id": "skills/branch-rebaser",
|
|
1189
1376
|
"type": "skill",
|
|
@@ -1339,6 +1526,21 @@
|
|
|
1339
1526
|
"installAs": "skills/embedding-set-inspector/SKILL.md",
|
|
1340
1527
|
"url": "https://agentscamp.com/skills/data/embedding-set-inspector"
|
|
1341
1528
|
},
|
|
1529
|
+
{
|
|
1530
|
+
"id": "skills/extract-module",
|
|
1531
|
+
"type": "skill",
|
|
1532
|
+
"slug": "extract-module",
|
|
1533
|
+
"category": "refactor",
|
|
1534
|
+
"title": "Extract Module",
|
|
1535
|
+
"description": "Split an overgrown file into cohesive, well-bounded modules — find the natural seams, design each new module's public interface before moving a line, then relocate one unit at a time keeping tests green. Use when a file has grown too large, mixes unrelated responsibilities, or every change to it forces unrelated diffs and merge conflicts.",
|
|
1536
|
+
"topics": [
|
|
1537
|
+
"coding-languages",
|
|
1538
|
+
"architecture"
|
|
1539
|
+
],
|
|
1540
|
+
"file": "skills/extract-module.md",
|
|
1541
|
+
"installAs": "skills/extract-module/SKILL.md",
|
|
1542
|
+
"url": "https://agentscamp.com/skills/refactor/extract-module"
|
|
1543
|
+
},
|
|
1342
1544
|
{
|
|
1343
1545
|
"id": "skills/finetune-dataset-builder",
|
|
1344
1546
|
"type": "skill",
|
|
@@ -1466,6 +1668,20 @@
|
|
|
1466
1668
|
"installAs": "skills/mcp-server-scaffolder/SKILL.md",
|
|
1467
1669
|
"url": "https://agentscamp.com/skills/api/mcp-server-scaffolder"
|
|
1468
1670
|
},
|
|
1671
|
+
{
|
|
1672
|
+
"id": "skills/migration-writer",
|
|
1673
|
+
"type": "skill",
|
|
1674
|
+
"slug": "migration-writer",
|
|
1675
|
+
"category": "database",
|
|
1676
|
+
"title": "Migration Writer",
|
|
1677
|
+
"description": "Write a safe, reversible, zero-downtime database migration using expand-contract — add the new shape, backfill in batches, switch reads/writes, then drop the old — so every deploy stays compatible with the running app version. Use when adding or changing schema on a live system, renaming/dropping a column, adding NOT NULL or a foreign key on a large table, or when a migration risks locks, table rewrites, or an unrevertable step.",
|
|
1678
|
+
"topics": [
|
|
1679
|
+
"devops-infra"
|
|
1680
|
+
],
|
|
1681
|
+
"file": "skills/migration-writer.md",
|
|
1682
|
+
"installAs": "skills/migration-writer/SKILL.md",
|
|
1683
|
+
"url": "https://agentscamp.com/skills/database/migration-writer"
|
|
1684
|
+
},
|
|
1469
1685
|
{
|
|
1470
1686
|
"id": "skills/mock-data-factory",
|
|
1471
1687
|
"type": "skill",
|
|
@@ -1593,6 +1809,21 @@
|
|
|
1593
1809
|
"installAs": "skills/prompt-pii-redactor/SKILL.md",
|
|
1594
1810
|
"url": "https://agentscamp.com/skills/security/prompt-pii-redactor"
|
|
1595
1811
|
},
|
|
1812
|
+
{
|
|
1813
|
+
"id": "skills/prompt-regression-tester",
|
|
1814
|
+
"type": "skill",
|
|
1815
|
+
"slug": "prompt-regression-tester",
|
|
1816
|
+
"category": "data",
|
|
1817
|
+
"title": "Prompt Regression Tester",
|
|
1818
|
+
"description": "Build a regression test harness for an LLM prompt so a prompt edit or model upgrade can't silently degrade quality — a fixed eval set, checkable assertions, and a diff against a committed baseline. Use when changing a production prompt, migrating model versions, or any time 'I tweaked the prompt' needs to be backed by evidence instead of eyeballing two outputs.",
|
|
1819
|
+
"topics": [
|
|
1820
|
+
"llm-evals",
|
|
1821
|
+
"workflow-prompting"
|
|
1822
|
+
],
|
|
1823
|
+
"file": "skills/prompt-regression-tester.md",
|
|
1824
|
+
"installAs": "skills/prompt-regression-tester/SKILL.md",
|
|
1825
|
+
"url": "https://agentscamp.com/skills/data/prompt-regression-tester"
|
|
1826
|
+
},
|
|
1596
1827
|
{
|
|
1597
1828
|
"id": "skills/provider-fallback-wrapper",
|
|
1598
1829
|
"type": "skill",
|
|
@@ -1621,6 +1852,36 @@
|
|
|
1621
1852
|
"installAs": "skills/qlora-finetune-runner/SKILL.md",
|
|
1622
1853
|
"url": "https://agentscamp.com/skills/data/qlora-finetune-runner"
|
|
1623
1854
|
},
|
|
1855
|
+
{
|
|
1856
|
+
"id": "skills/rate-limiter-designer",
|
|
1857
|
+
"type": "skill",
|
|
1858
|
+
"slug": "rate-limiter-designer",
|
|
1859
|
+
"category": "api",
|
|
1860
|
+
"title": "Rate Limiter Designer",
|
|
1861
|
+
"description": "Design and implement API rate limiting that actually holds under load — pick the algorithm (token bucket vs sliding-window-counter vs fixed window) and justify it, choose the limiting key and per-tier limits, use cross-instance atomic storage, and return standard 429 signals. Use when protecting an API from abuse or scrapers, enforcing per-tier quotas, or replacing an in-memory limiter that breaks behind multiple replicas.",
|
|
1862
|
+
"topics": [
|
|
1863
|
+
"architecture",
|
|
1864
|
+
"devops-infra"
|
|
1865
|
+
],
|
|
1866
|
+
"file": "skills/rate-limiter-designer.md",
|
|
1867
|
+
"installAs": "skills/rate-limiter-designer/SKILL.md",
|
|
1868
|
+
"url": "https://agentscamp.com/skills/api/rate-limiter-designer"
|
|
1869
|
+
},
|
|
1870
|
+
{
|
|
1871
|
+
"id": "skills/react-render-profiler",
|
|
1872
|
+
"type": "skill",
|
|
1873
|
+
"slug": "react-render-profiler",
|
|
1874
|
+
"category": "performance",
|
|
1875
|
+
"title": "React Render Profiler",
|
|
1876
|
+
"description": "Find and fix wasteful React re-renders by classifying the cause — unstable prop/callback/object identities, context value churn, state lifted too high, expensive work in render, or unvirtualized lists — confirming it with a measurement, then applying the one targeted fix and re-measuring. Use when a React UI is janky, slow to type in, or re-renders far more than the data actually changed.",
|
|
1877
|
+
"topics": [
|
|
1878
|
+
"coding-languages",
|
|
1879
|
+
"review-qa"
|
|
1880
|
+
],
|
|
1881
|
+
"file": "skills/react-render-profiler.md",
|
|
1882
|
+
"installAs": "skills/react-render-profiler/SKILL.md",
|
|
1883
|
+
"url": "https://agentscamp.com/skills/performance/react-render-profiler"
|
|
1884
|
+
},
|
|
1624
1885
|
{
|
|
1625
1886
|
"id": "skills/readme-generator",
|
|
1626
1887
|
"type": "skill",
|
|
@@ -1649,6 +1910,20 @@
|
|
|
1649
1910
|
"installAs": "skills/secret-scanner/SKILL.md",
|
|
1650
1911
|
"url": "https://agentscamp.com/skills/security/secret-scanner"
|
|
1651
1912
|
},
|
|
1913
|
+
{
|
|
1914
|
+
"id": "skills/semver-advisor",
|
|
1915
|
+
"type": "skill",
|
|
1916
|
+
"slug": "semver-advisor",
|
|
1917
|
+
"category": "release",
|
|
1918
|
+
"title": "SemVer Advisor",
|
|
1919
|
+
"description": "Decide the correct semantic-version bump — major, minor, or patch — by diffing a release range, mapping the changes onto the public API surface, and classifying each as breaking, additive, or a fix. Use before cutting a release when you are unsure whether changes are breaking, when a teammate proposes a bump you want to sanity-check, or when a behavior change has no signature change and you need to know if it is still breaking.",
|
|
1920
|
+
"topics": [
|
|
1921
|
+
"devops-infra"
|
|
1922
|
+
],
|
|
1923
|
+
"file": "skills/semver-advisor.md",
|
|
1924
|
+
"installAs": "skills/semver-advisor/SKILL.md",
|
|
1925
|
+
"url": "https://agentscamp.com/skills/release/semver-advisor"
|
|
1926
|
+
},
|
|
1652
1927
|
{
|
|
1653
1928
|
"id": "skills/sql-optimizer",
|
|
1654
1929
|
"type": "skill",
|
|
@@ -1691,6 +1966,34 @@
|
|
|
1691
1966
|
"installAs": "skills/tool-definition-generator/SKILL.md",
|
|
1692
1967
|
"url": "https://agentscamp.com/skills/api/tool-definition-generator"
|
|
1693
1968
|
},
|
|
1969
|
+
{
|
|
1970
|
+
"id": "skills/type-coverage-improver",
|
|
1971
|
+
"type": "skill",
|
|
1972
|
+
"slug": "type-coverage-improver",
|
|
1973
|
+
"category": "refactor",
|
|
1974
|
+
"title": "Type Coverage Improver",
|
|
1975
|
+
"description": "Raise TypeScript type strictness incrementally — measure the any/implicit-any baseline, enable one strict sub-flag at a time, and fix the fallout per flag instead of all at once, keeping the typecheck green at every step. Use when a codebase is loosely typed, when you want strict mode on without a big-bang break, or when `any` keeps hiding bugs that surface in production.",
|
|
1976
|
+
"topics": [
|
|
1977
|
+
"coding-languages"
|
|
1978
|
+
],
|
|
1979
|
+
"file": "skills/type-coverage-improver.md",
|
|
1980
|
+
"installAs": "skills/type-coverage-improver/SKILL.md",
|
|
1981
|
+
"url": "https://agentscamp.com/skills/refactor/type-coverage-improver"
|
|
1982
|
+
},
|
|
1983
|
+
{
|
|
1984
|
+
"id": "skills/version-bumper",
|
|
1985
|
+
"type": "skill",
|
|
1986
|
+
"slug": "version-bumper",
|
|
1987
|
+
"category": "release",
|
|
1988
|
+
"title": "Version Bumper",
|
|
1989
|
+
"description": "Bump the project version everywhere it lives in one consistent pass — package.json, lockfile, nested/CLI package manifests, version constants, README badges, docs — then roll the changelog's Unreleased section under the new version and stage an annotated git tag. Use when you've already decided the new version (X.Y.Z or a pre-release like -rc.1) and need every artifact updated to the same value without drift, or before cutting a release.",
|
|
1990
|
+
"topics": [
|
|
1991
|
+
"devops-infra"
|
|
1992
|
+
],
|
|
1993
|
+
"file": "skills/version-bumper.md",
|
|
1994
|
+
"installAs": "skills/version-bumper/SKILL.md",
|
|
1995
|
+
"url": "https://agentscamp.com/skills/release/version-bumper"
|
|
1996
|
+
},
|
|
1694
1997
|
{
|
|
1695
1998
|
"id": "skills/web-research-pipeline",
|
|
1696
1999
|
"type": "skill",
|
|
@@ -1704,6 +2007,20 @@
|
|
|
1704
2007
|
"file": "skills/web-research-pipeline.md",
|
|
1705
2008
|
"installAs": "skills/web-research-pipeline/SKILL.md",
|
|
1706
2009
|
"url": "https://agentscamp.com/skills/data/web-research-pipeline"
|
|
2010
|
+
},
|
|
2011
|
+
{
|
|
2012
|
+
"id": "skills/webhook-handler-scaffolder",
|
|
2013
|
+
"type": "skill",
|
|
2014
|
+
"slug": "webhook-handler-scaffolder",
|
|
2015
|
+
"category": "api",
|
|
2016
|
+
"title": "Webhook Handler Scaffolder",
|
|
2017
|
+
"description": "Scaffold a robust inbound webhook handler that verifies the signature on the raw body first, dedupes on the provider's event id, acknowledges fast, and processes asynchronously — the four things naive handlers get wrong. Use when wiring up events from a third party (Stripe, GitHub, Shopify, Slack, Twilio), when a provider keeps retrying because your endpoint times out or 500s, or when duplicate events are double-charging or double-creating records.",
|
|
2018
|
+
"topics": [
|
|
2019
|
+
"architecture"
|
|
2020
|
+
],
|
|
2021
|
+
"file": "skills/webhook-handler-scaffolder.md",
|
|
2022
|
+
"installAs": "skills/webhook-handler-scaffolder/SKILL.md",
|
|
2023
|
+
"url": "https://agentscamp.com/skills/api/webhook-handler-scaffolder"
|
|
1707
2024
|
}
|
|
1708
2025
|
]
|
|
1709
2026
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "agent-memory-designer"
|
|
3
|
+
description: "Design a project's CLAUDE.md and memory hierarchy by exploring the repo to learn its real build/test/lint commands, architecture, and non-obvious gotchas, then writing a concise, skimmable memory that keeps only what belongs in context. Use when onboarding a repo to Claude Code with no CLAUDE.md, or when an existing one is bloated, stale, or being ignored."
|
|
4
|
+
allowed-tools: "Read, Grep, Glob, Write"
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
CLAUDE.md is loaded into every prompt for the whole session, so it is the highest-leverage and most easily-abused file in the repo: a sharp 40-line memory steers every turn, while a 400-line dump of prose gets skimmed, diluted, and quietly ignored. This skill explores the actual project, decides what earns a permanent slot in context, and writes a memory the model will actually follow.
|
|
9
|
+
|
|
10
|
+
## When to use this skill
|
|
11
|
+
|
|
12
|
+
- You're onboarding an existing repo to Claude Code and there is no CLAUDE.md (or `/init` produced a generic one that restates the obvious).
|
|
13
|
+
- The current CLAUDE.md is long, stale, or contradicts the code, and Claude keeps running the wrong test command or ignoring a stated rule.
|
|
14
|
+
- You want to split repo facts (project CLAUDE.md) from personal cross-project preferences (user `~/.claude/CLAUDE.md`) and aren't sure what goes where.
|
|
15
|
+
|
|
16
|
+
## When NOT to use this skill
|
|
17
|
+
|
|
18
|
+
- You want an automatically enforced rule (format on save, block edits to a path) — that's a hook, not memory; memory is advisory and the model can deviate from it.
|
|
19
|
+
- You want a reusable procedure with its own tool scope, invoked on demand — that's a skill, not a fact that must sit in context every turn.
|
|
20
|
+
|
|
21
|
+
## Instructions
|
|
22
|
+
|
|
23
|
+
1. **Read the repo before writing a word.** Glob for the build manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Makefile`) and read its scripts/targets to get the *real* commands — never invent `npm test` if the script is `npm run test:unit`. Grep configs (`tsconfig`, `.eslintrc`, `ruff.toml`, CI workflow YAML) for the lint/typecheck/test invocations CI actually runs; those are the commands that must pass.
|
|
24
|
+
2. **Map the architecture in five lines or fewer.** Identify the entry points, the 3–6 directories that matter, and the one data-flow or layering rule that, if violated, breaks the build (e.g. "client components must not import `lib/db`"). Write the *map and the rule*, not a tour of every folder — the model can read the tree itself.
|
|
25
|
+
3. **Mine the non-obvious gotchas.** These are the highest-value lines: footguns you can't infer from a glance — a generated file that must be regenerated after content changes, a port that isn't the default, a test that needs a service running, a "looks unused but isn't" module. Surface them from READMEs, CI steps, and conspicuous comments.
|
|
26
|
+
4. **Sort every candidate fact into KEEP or CUT.** KEEP: stable conventions, exact commands, the architecture map, hard rules ("never commit to main"), and recurring pitfalls. CUT: transient task state, secrets/tokens, anything derivable by reading the code (function signatures, the full dependency list), and long explanatory prose. If a line only helps once, it doesn't belong in always-on context.
|
|
27
|
+
5. **Write it imperative and skimmable.** Short headings, bullet lists, one rule per line in the imperative ("Stage by explicit path", not "It is generally preferable that..."). Put the hardest rules first. Aim for a memory a person can read in under a minute; if it's over ~50 lines, you kept things that should have been cut.
|
|
28
|
+
6. **Place facts in the right tier.** Repo-specific facts → project `./CLAUDE.md` (committed, team-shared). Personal habits that apply across all your repos (preferred commit style, "explain before large refactors") → user `~/.claude/CLAUDE.md`. Machine-local, uncommitted notes → `./CLAUDE.local.md`. Never put a personal preference in the shared project file, or a repo command in user memory.
|
|
29
|
+
7. **State the freshness contract.** End the draft with a one-line note on what makes it go stale (commands renamed, directories moved) and the expectation that it's updated in the same PR that changes those facts — a wrong command in memory is worse than no command.
|
|
30
|
+
|
|
31
|
+
> [!WARNING]
|
|
32
|
+
> Do not paste the codebase into CLAUDE.md. Memory that duplicates code (full module lists, copied function signatures, exhaustive API surfaces) goes stale silently and burns context on every turn — and stale memory actively misleads, because the model trusts it over the file it didn't read. Keep facts that are stable and expensive to rediscover; let the model read everything else.
|
|
33
|
+
|
|
34
|
+
> [!CAUTION]
|
|
35
|
+
> Never write secrets, API keys, tokens, or internal URLs into CLAUDE.md — it is committed and shipped. If a command needs a secret, reference the env var name, not the value.
|
|
36
|
+
|
|
37
|
+
> [!TIP]
|
|
38
|
+
> Brevity is a feature, not a limitation. When two lines say the same thing, cut one. A memory the model reads fully every time beats a thorough one it learns to skim.
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
A ready-to-write `CLAUDE.md` draft tailored to this repo — Project Overview (2–3 lines), exact build/test/lint commands verified against the manifest, a five-line architecture map, hard rules, and known gotchas — plus a short rationale listing what was KEPT vs CUT and why, and a note on which facts (if any) belong in user memory instead. The skill proposes the file via Write; it does not run commands or alter code.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "auth-flow-reviewer"
|
|
3
|
+
description: "Read-only review of authentication AND authorization flows — session/token model, cookie flags, CSRF, token rotation, password-reset/email-verification, OAuth redirect/state, and per-route object-level access checks — for exploitable gaps. Use before shipping login/session/token code, when adding a protected route or sharing-by-URL feature, or during a security pass. Reports findings by severity with location, impact, and the concrete fix; never edits code."
|
|
4
|
+
allowed-tools: "Read, Grep, Glob"
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Review authentication and authorization code for exploitable gaps without touching a line of it. The skill walks the session/token model, cookie flags, CSRF defenses, token lifecycle, password-reset and email-verification flows, and OAuth parameter validation — then spends most of its effort on the part teams routinely skip: confirming that **every protected route enforces an object-level access check**. A login form that works tells you nothing about whether user A can read user B's invoice by editing an ID. Output is a findings list grouped by severity, each with a location, the concrete impact, and the fix.
|
|
9
|
+
|
|
10
|
+
## When to use this skill
|
|
11
|
+
|
|
12
|
+
- Before shipping login, signup, session, JWT, or refresh-token code.
|
|
13
|
+
- When adding a new protected route, an admin action, or a "share by link / by ID" feature — anywhere a request carries an object identifier.
|
|
14
|
+
- Reviewing a password-reset, email-verification, or OAuth/SSO integration.
|
|
15
|
+
- During a scheduled security pass, or after a pentest/bug report mentioning broken access control.
|
|
16
|
+
|
|
17
|
+
> [!WARNING]
|
|
18
|
+
> Authentication ≠ authorization. The most common, highest-impact real bug is a fully logged-in, legitimate user accessing another user's object (IDOR) — `GET /api/orders/123` returning order 123 to whoever asks, regardless of owner. If you only verify that login works, you will miss it. Audit the per-object check on every route, not just the session.
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
1. **Map the surface first.** Glob for routers, middleware, controllers, and guards (`**/routes/**`, `**/middleware/**`, `**/*controller*`, `**/*guard*`, `**/auth/**`). Build a list of every endpoint and tag each as public, authenticated-only, or authorized (requires ownership/role). You cannot review what you have not enumerated — an unlisted route is the one that ships unprotected.
|
|
23
|
+
2. **Classify the session model.** Determine whether the app uses server-side sessions (cookie holds an opaque session id) or stateless tokens (cookie/header holds a JWT). The two have different failure modes: sessions need a server store and explicit invalidation on logout; JWTs cannot be revoked before expiry without a denylist. Flag any hybrid where a JWT is treated as revocable but no denylist exists.
|
|
24
|
+
3. **Audit cookie flags on every auth cookie.** Confirm `HttpOnly` (blocks JS/XSS theft), `Secure` (HTTPS-only), and an explicit `SameSite` (`Lax` minimum; `Strict` for the session cookie when feasible; `None` requires `Secure` and a CSRF defense). Grep for cookie-setting calls (`set-cookie`, `res.cookie`, `Set-Cookie`, framework session config) and report any auth cookie missing a flag, with the exact line.
|
|
25
|
+
4. **Verify CSRF protection on state-changing requests.** Any cookie-authenticated `POST`/`PUT`/`PATCH`/`DELETE` needs a CSRF defense: a per-session synchronizer token, double-submit cookie, or strict `SameSite` plus origin checking. Token/`Authorization: Bearer` flows in headers are not CSRF-prone, but cookie flows are. Flag every mutating, cookie-authed endpoint with no token check or origin/referer validation.
|
|
26
|
+
5. **Trace the token lifecycle.** For JWTs/access tokens, check: signing algorithm is pinned (reject `alg: none` and confirm the verifier does not accept attacker-chosen algorithms), expiry is short (minutes, not days), the secret/key is not hardcoded, and the payload carries no secrets. For refresh tokens, require server-side storage, **rotation on use** (old token invalidated when a new one is issued), and reuse-detection that revokes the family on replay. Flag tokens stored in `localStorage` (XSS-readable) where a cookie would be safer.
|
|
27
|
+
6. **Review password reset and email verification as untrusted token flows.** For each, confirm: the token is high-entropy (CSPRNG, not a sequential id, timestamp, or weak hash), **single-use** (consumed/invalidated after first use), short-lived (minutes to an hour), and bound to the target user. Critically, confirm the flow does **not enumerate users** — the "reset email sent" and "verify" responses must be identical for existing and non-existing accounts (same body, same status, same timing). Flag any reset that returns "no such user".
|
|
28
|
+
7. **Validate OAuth/SSO parameters.** Confirm `redirect_uri` is checked against an exact-match allowlist (not a prefix/substring/regex that an attacker can satisfy with `evil.com?x=trusted.com`), and that the `state` parameter is generated, stored, and verified on callback to stop CSRF/login-fixation. For authorization-code flows, confirm PKCE is used for public clients and the code is exchanged server-side.
|
|
29
|
+
8. **Enforce object-level authorization on every protected route — the core check.** For each endpoint that accepts an object id (path param, query, or body), confirm the handler verifies the current principal is allowed to act on *that specific object* (e.g. `WHERE owner_id = session.user.id`, or an explicit policy/ability check), not merely that someone is logged in. Look for the anti-pattern: authentication middleware present, but the query fetches by id alone. Also check privilege escalation: role/permission read from the request body or a client-supplied field instead of the server-trusted session; missing `isAdmin` gates on admin endpoints; mass-assignment that lets a user set their own `role`.
|
|
30
|
+
9. **Report; do not modify.** Produce the severity-grouped findings (see Output). The skill is read-only — propose the fix, leave the change to the author.
|
|
31
|
+
|
|
32
|
+
> [!NOTE]
|
|
33
|
+
> Test the negative path in your reasoning, not just the happy path: for every "user can see their data" check, ask "what stops them from seeing someone else's?" and "what happens if I delete the auth header / swap the id / replay the token?". Findings come from the requests the code forgot to reject.
|
|
34
|
+
|
|
35
|
+
## Output
|
|
36
|
+
|
|
37
|
+
A findings report grouped by severity, with a one-line scope header (what was reviewed) and, for each finding, a `file:line` location, the impact in attacker terms, and the concrete fix. Nothing is edited.
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Auth flow review — scope: src/routes/**, src/middleware/auth.ts, src/auth/oauth.ts
|
|
41
|
+
12 endpoints enumerated (3 public, 5 authenticated, 4 authorized)
|
|
42
|
+
|
|
43
|
+
CRITICAL
|
|
44
|
+
- IDOR on invoice fetch — src/routes/invoices.ts:41
|
|
45
|
+
Impact: any logged-in user reads any invoice; `findById(req.params.id)` has no
|
|
46
|
+
owner check. GET /api/invoices/123 returns 123 to anyone.
|
|
47
|
+
Fix: scope the query — findOne({ id, ownerId: req.session.userId }); 404 on miss.
|
|
48
|
+
|
|
49
|
+
- Privilege escalation via body — src/routes/users.ts:88
|
|
50
|
+
Impact: PATCH /api/users/me accepts { role } from the request body (mass assignment);
|
|
51
|
+
a user can set role: "admin".
|
|
52
|
+
Fix: whitelist updatable fields; derive role only from server state, never the body.
|
|
53
|
+
|
|
54
|
+
HIGH
|
|
55
|
+
- Refresh token not rotated — src/auth/tokens.ts:53
|
|
56
|
+
Impact: a stolen refresh token works until expiry and is never invalidated on reuse.
|
|
57
|
+
Fix: rotate on each use, persist the new token, and revoke the family on replay.
|
|
58
|
+
|
|
59
|
+
- User enumeration on password reset — src/routes/auth.ts:120
|
|
60
|
+
Impact: reset endpoint returns 404 "no such user", letting attackers harvest valid emails.
|
|
61
|
+
Fix: return an identical 200 "if an account exists, an email was sent" in all cases.
|
|
62
|
+
|
|
63
|
+
MEDIUM
|
|
64
|
+
- Session cookie missing SameSite — src/middleware/session.ts:17
|
|
65
|
+
Impact: cookie sent on cross-site requests; widens CSRF exposure.
|
|
66
|
+
Fix: add SameSite=Lax (or Strict) alongside HttpOnly and Secure.
|
|
67
|
+
|
|
68
|
+
- OAuth redirect_uri prefix match — src/auth/oauth.ts:34
|
|
69
|
+
Impact: startsWith() allows https://trusted.com.evil.com — open redirect / token theft.
|
|
70
|
+
Fix: exact-match redirect_uri against a registered allowlist.
|
|
71
|
+
|
|
72
|
+
Summary: 2 critical, 2 high, 2 medium. No code modified.
|
|
73
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "extract-module"
|
|
3
|
+
description: "Split an overgrown file into cohesive, well-bounded modules — find the natural seams, design each new module's public interface before moving a line, then relocate one unit at a time keeping tests green. Use when a file has grown too large, mixes unrelated responsibilities, or every change to it forces unrelated diffs and merge conflicts."
|
|
4
|
+
allowed-tools: "Read, Grep, Glob, Edit"
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Carve a bloated, multi-responsibility file into a handful of focused modules without breaking a thing. The skill first maps what the file actually does and where the seams are — clusters of functions that share state, types, or a single reason to change — then designs each new module's public surface before touching code, and moves the clusters out one at a time so every intermediate state still compiles and passes tests.
|
|
9
|
+
|
|
10
|
+
## When to use this skill
|
|
11
|
+
|
|
12
|
+
- A single file has grown past what one person holds in their head, and unrelated edits keep colliding in it.
|
|
13
|
+
- One file mixes responsibilities — HTTP handling, business rules, and persistence; or parsing, validation, and formatting — that change for different reasons.
|
|
14
|
+
- The file is a chronic merge-conflict hotspot because every feature touches it.
|
|
15
|
+
- You need a *safe, incremental* split with a green build at each step, not a big-bang rewrite.
|
|
16
|
+
|
|
17
|
+
> [!WARNING]
|
|
18
|
+
> Do not split by line count. "This file is 1,200 lines, cut it in half" produces two arbitrarily-severed files that still share state and import each other constantly — worse than one. Split by **cohesion**: a module is a set of functions and types with one reason to change and a small interface to everything else. If a proposed boundary would expose more than a handful of symbols, the seam is in the wrong place.
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
1. **Map responsibilities before touching code.** Read the whole file and list every top-level function/class with its one-line purpose and what state it reads or mutates (module-level variables, shared config, a connection, a cache). Group symbols that touch the same state or serve the same purpose — those clusters are your candidate modules. A symbol that several clusters call but that owns no state is a shared utility; a type used across clusters is shared data.
|
|
23
|
+
2. **Find the natural seams.** A good boundary is where the call graph is *narrow*: cluster A calls cluster B through one or two functions, not fifteen. Use `Grep`/`Glob` to count cross-cluster references. Prefer seams that separate by reason-to-change (e.g. transport vs. domain logic) over seams that separate by noun. If two clusters are mutually entangled (each calls deep into the other), they are one module — do not force them apart.
|
|
24
|
+
3. **Design the public interface of each new module first — on paper, before moving anything.** For each module, write down: its name/path, the exact symbols it will export, and what it imports. Keep exports minimal — everything not in the list becomes module-private. This is the contract; if it looks awkward now, the seam is wrong and re-cutting a sketch is free.
|
|
25
|
+
4. **Extract shared types and pure utilities to a leaf module first.** Before moving any cluster, pull the types and zero-dependency helpers that multiple clusters share into a dependency-free leaf module (e.g. `types.ts`, `shared.ts`). Every other new module imports *from* it and it imports from none of them. This single move is what prevents the cycles that splitting otherwise creates.
|
|
26
|
+
5. **Move one cohesive unit at a time.** Cut one cluster into its new file, add the planned exports, and update every importer with `Edit`. Re-point the original file to re-export or import from the new module so external callers keep working. Then run the build and test suite. Never move two clusters before verifying — a failure must point at exactly one move.
|
|
27
|
+
6. **Check the dependency direction after each move.** After relocating a cluster, confirm the new module does not import (directly or transitively) anything that imports it back. If a cycle appears, the cause is almost always a symbol living in the wrong module — move that symbol to the leaf module from step 4, or invert the dependency by passing the value in as an argument instead of importing it.
|
|
28
|
+
7. **Collapse the husk last.** Once every cluster is out, the original file is either an empty re-export barrel or gone. Decide deliberately: keep it as a thin barrel if external callers depend on its path, or delete it and update the remaining importers. Verify the full suite one final time.
|
|
29
|
+
|
|
30
|
+
> [!NOTE]
|
|
31
|
+
> Keep the original file as a temporary re-export barrel (`export * from './new-module'`) during the move. External callers stay green while you extract internally, and you can delete the barrel in a final, isolated commit once nothing imports the old path — turning a scary refactor into a sequence of trivially-revertable steps.
|
|
32
|
+
|
|
33
|
+
## Output
|
|
34
|
+
|
|
35
|
+
1. **A module boundary map** — a table of each proposed module with its path, the symbols it owns (private), the symbols it exports (its interface), and what it imports. Shared types/utilities are listed as the leaf module everything depends on.
|
|
36
|
+
|
|
37
|
+
| Module | Exports (public) | Imports | Owns (private) |
|
|
38
|
+
| --- | --- | --- | --- |
|
|
39
|
+
| `parser/types.ts` | `Token`, `AstNode`, `ParseError` | — (leaf) | — |
|
|
40
|
+
| `parser/lex.ts` | `tokenize` | `types` | `scanIdent`, `scanNumber` |
|
|
41
|
+
| `parser/parse.ts` | `parse` | `types`, `lex` | `parseExpr`, `parsePrimary` |
|
|
42
|
+
| `parser/index.ts` | `parse`, `tokenize` (barrel) | `lex`, `parse` | — |
|
|
43
|
+
|
|
44
|
+
2. **An incremental move plan** — an ordered list of steps, each independently verifiable, e.g.:
|
|
45
|
+
- Step 1: extract `parser/types.ts` (leaf), update in-file references → build + tests green.
|
|
46
|
+
- Step 2: move lexer cluster to `parser/lex.ts`, re-export from original → green.
|
|
47
|
+
- Step 3: move parser cluster to `parser/parse.ts` → green.
|
|
48
|
+
- Step 4: replace original file with `parser/index.ts` barrel, delete dead path → green.
|
|
49
|
+
|
|
50
|
+
Each step is one commit with the verifying command output, so any regression reverts to exactly one change.
|