liteagents 2.9.0 → 2.11.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/CHANGELOG.md +43 -0
  2. package/README.md +27 -33
  3. package/installer/cli.js +6 -2
  4. package/package.json +3 -3
  5. package/packages/ampcode/AGENT.md +11 -16
  6. package/packages/ampcode/agents/code-developer.md +11 -12
  7. package/packages/ampcode/agents/quality-assurance.md +1 -1
  8. package/packages/{droid/commands/systematic-debugging.md → ampcode/commands/debug-method.md} +9 -9
  9. package/packages/ampcode/commands/diff-review.md +78 -0
  10. package/packages/ampcode/commands/friction/friction.js +28 -6
  11. package/packages/ampcode/commands/optimize.md +45 -4
  12. package/packages/ampcode/commands/refactor.md +33 -1
  13. package/packages/ampcode/commands/release.md +88 -0
  14. package/packages/ampcode/commands/remember.md +34 -3
  15. package/packages/ampcode/commands/security.md +28 -1
  16. package/packages/ampcode/commands/stash.md +7 -0
  17. package/packages/{droid/commands/test-driven-development.md → ampcode/commands/tdd-flow.md} +2 -2
  18. package/packages/ampcode/commands/test-generate.md +64 -15
  19. package/packages/{opencode/command/testing-anti-patterns.md → ampcode/commands/test-traps.md} +77 -3
  20. package/packages/{droid/commands/root-cause-tracing.md → ampcode/commands/trace-back.md} +3 -3
  21. package/packages/ampcode/commands/{verification-before-completion.md → verify-done.md} +3 -3
  22. package/packages/claude/CLAUDE.md +10 -15
  23. package/packages/claude/agents/code-developer.md +11 -12
  24. package/packages/claude/agents/quality-assurance.md +1 -1
  25. package/packages/claude/commands/diff-review.md +78 -0
  26. package/packages/claude/commands/friction/friction.js +28 -6
  27. package/packages/claude/commands/optimize.md +45 -4
  28. package/packages/claude/commands/refactor.md +33 -1
  29. package/packages/claude/commands/release.md +88 -0
  30. package/packages/claude/commands/remember.md +34 -3
  31. package/packages/claude/commands/security.md +28 -1
  32. package/packages/claude/commands/stash.md +7 -0
  33. package/packages/claude/commands/test-generate.md +64 -15
  34. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/package-lock.json +3 -3
  35. package/packages/claude/skills/{systematic-debugging → debug-method}/CREATION-LOG.md +1 -1
  36. package/packages/claude/skills/{systematic-debugging → debug-method}/SKILL.md +9 -9
  37. package/packages/claude/skills/{systematic-debugging → debug-method}/test-academic.md +1 -1
  38. package/packages/claude/skills/{systematic-debugging → debug-method}/test-pressure-1.md +1 -1
  39. package/packages/claude/skills/{systematic-debugging → debug-method}/test-pressure-2.md +1 -1
  40. package/packages/claude/skills/{systematic-debugging → debug-method}/test-pressure-3.md +1 -1
  41. package/packages/claude/skills/{test-driven-development → tdd-flow}/SKILL.md +3 -3
  42. package/packages/claude/skills/{testing-anti-patterns → test-traps}/SKILL.md +77 -3
  43. package/packages/claude/skills/{root-cause-tracing → trace-back}/SKILL.md +3 -3
  44. package/packages/claude/skills/{verification-before-completion → verify-done}/SKILL.md +3 -3
  45. package/packages/droid/AGENTS.md +9 -14
  46. package/packages/{opencode/command/systematic-debugging.md → droid/commands/debug-method.md} +9 -9
  47. package/packages/droid/commands/diff-review.md +78 -0
  48. package/packages/droid/commands/friction/friction.js +28 -6
  49. package/packages/droid/commands/optimize.md +45 -4
  50. package/packages/droid/commands/refactor.md +33 -1
  51. package/packages/droid/commands/release.md +88 -0
  52. package/packages/droid/commands/remember.md +34 -3
  53. package/packages/droid/commands/security.md +28 -1
  54. package/packages/droid/commands/stash.md +7 -0
  55. package/packages/{opencode/command/test-driven-development.md → droid/commands/tdd-flow.md} +2 -2
  56. package/packages/droid/commands/test-generate.md +64 -15
  57. package/packages/droid/commands/{testing-anti-patterns.md → test-traps.md} +77 -3
  58. package/packages/{opencode/command/root-cause-tracing.md → droid/commands/trace-back.md} +3 -3
  59. package/packages/droid/commands/{verification-before-completion.md → verify-done.md} +3 -3
  60. package/packages/droid/droids/code-developer.md +11 -12
  61. package/packages/droid/droids/quality-assurance.md +1 -1
  62. package/packages/opencode/AGENTS.md +9 -14
  63. package/packages/opencode/agent/code-developer.md +11 -12
  64. package/packages/opencode/agent/quality-assurance.md +1 -1
  65. package/packages/{ampcode/commands/systematic-debugging.md → opencode/command/debug-method.md} +9 -9
  66. package/packages/opencode/command/diff-review.md +78 -0
  67. package/packages/opencode/command/friction/friction.js +28 -6
  68. package/packages/opencode/command/optimize.md +45 -4
  69. package/packages/opencode/command/refactor.md +33 -1
  70. package/packages/opencode/command/release.md +88 -0
  71. package/packages/opencode/command/remember.md +34 -3
  72. package/packages/opencode/command/security.md +28 -1
  73. package/packages/opencode/command/stash.md +7 -0
  74. package/packages/{ampcode/commands/test-driven-development.md → opencode/command/tdd-flow.md} +2 -2
  75. package/packages/opencode/command/test-generate.md +64 -15
  76. package/packages/{ampcode/commands/testing-anti-patterns.md → opencode/command/test-traps.md} +77 -3
  77. package/packages/{ampcode/commands/root-cause-tracing.md → opencode/command/trace-back.md} +3 -3
  78. package/packages/opencode/command/{verification-before-completion.md → verify-done.md} +3 -3
  79. package/packages/opencode/opencode.jsonc +16 -36
  80. package/packages/subagentic-manual.md +56 -51
  81. package/packages/ampcode/commands/code-review.md +0 -107
  82. package/packages/ampcode/commands/condition-based-waiting.md +0 -122
  83. package/packages/ampcode/commands/debug.md +0 -20
  84. package/packages/ampcode/commands/explain.md +0 -18
  85. package/packages/ampcode/commands/friction.md +0 -139
  86. package/packages/ampcode/commands/git-commit.md +0 -14
  87. package/packages/ampcode/commands/review.md +0 -18
  88. package/packages/claude/commands/debug.md +0 -20
  89. package/packages/claude/commands/explain.md +0 -18
  90. package/packages/claude/commands/friction.md +0 -139
  91. package/packages/claude/commands/git-commit.md +0 -14
  92. package/packages/claude/commands/review.md +0 -18
  93. package/packages/claude/skills/code-review/SKILL.md +0 -107
  94. package/packages/claude/skills/code-review/code-reviewer.md +0 -146
  95. package/packages/claude/skills/condition-based-waiting/SKILL.md +0 -122
  96. package/packages/droid/commands/code-review.md +0 -107
  97. package/packages/droid/commands/condition-based-waiting.md +0 -122
  98. package/packages/droid/commands/debug.md +0 -20
  99. package/packages/droid/commands/explain.md +0 -18
  100. package/packages/droid/commands/friction.md +0 -139
  101. package/packages/droid/commands/git-commit.md +0 -14
  102. package/packages/droid/commands/review.md +0 -18
  103. package/packages/opencode/command/code-review.md +0 -107
  104. package/packages/opencode/command/condition-based-waiting.md +0 -122
  105. package/packages/opencode/command/debug.md +0 -20
  106. package/packages/opencode/command/explain.md +0 -18
  107. package/packages/opencode/command/friction.md +0 -139
  108. package/packages/opencode/command/git-commit.md +0 -14
  109. package/packages/opencode/command/review.md +0 -18
  110. /package/packages/ampcode/commands/{condition-based-waiting → test-traps}/example.ts +0 -0
  111. /package/packages/ampcode/commands/{root-cause-tracing → trace-back}/find-polluter.sh +0 -0
  112. /package/packages/claude/skills/{condition-based-waiting → test-traps}/example.ts +0 -0
  113. /package/packages/claude/skills/{root-cause-tracing → trace-back}/find-polluter.sh +0 -0
  114. /package/packages/droid/commands/{condition-based-waiting → test-traps}/example.ts +0 -0
  115. /package/packages/droid/commands/{root-cause-tracing → trace-back}/find-polluter.sh +0 -0
  116. /package/packages/opencode/command/{condition-based-waiting → test-traps}/example.ts +0 -0
  117. /package/packages/opencode/command/{root-cause-tracing → trace-back}/find-polluter.sh +0 -0
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: diff-review
3
+ description: Review diff [file, branch, or range]
4
+ usage: /diff-review
5
+ argument-hint: [file, branch (e.g. main), range (main..HEAD), or empty]
6
+ allowed-tools: Read, Edit, Grep, Glob, Bash(git diff:*), Bash(git log:*), Bash(git show:*), Bash(git status:*), Bash(git grep:*), Bash(git rev-parse:*), Bash(git merge-base:*), Bash(rg:*)
7
+ ---
8
+ Review $ARGUMENTS. Interpret in this order:
9
+ 1. **Empty** → staged diff (`git diff --staged`); if empty, working-tree diff
10
+ (`git diff`).
11
+ 2. **A range** like `main..HEAD` or `origin/main...HEAD` → `git diff <range>`.
12
+ 3. **A single ref** (branch / tag / SHA — confirm with `git rev-parse
13
+ --verify`) → diff that ref's merge-base against `HEAD` (i.e. everything on
14
+ the current branch since it diverged: `git diff $(git merge-base <ref>
15
+ HEAD)..HEAD`). This is the common "review my branch before merging" path.
16
+ 4. **A file or directory path** → that target.
17
+ 5. Otherwise → ask.
18
+
19
+ The diff is the subject; widen to surrounding code only as needed to judge a
20
+ hunk. For multi-commit ranges, also skim `git log <range>` to understand
21
+ intent before judging.
22
+
23
+ ## Check For
24
+ - **Bugs needing a fix.** Logic errors, off-by-one, null/undefined paths,
25
+ races, wrong defaults, broken edge cases. Concrete failure modes only — not
26
+ vibes.
27
+ - **Dead code.** Unreferenced functions / vars / imports / params, unreachable
28
+ branches, commented-out blocks, legacy paths the diff just obsoleted.
29
+ `git grep` the symbol before flagging — easy to be wrong.
30
+ - **Loose ends.** TODO / FIXME / XXX added by this diff, half-finished
31
+ branches, silently swallowed errors, stub bodies, mocked-out paths,
32
+ "temporary" names, abandoned feature flags.
33
+ - **Correctness.** Edge cases, error handling, type / contract violations,
34
+ broken invariants.
35
+ - **Security.** OWASP Top 10, auth, data exposure. (`/security` for depth.)
36
+ - **Performance.** N+1, blocking calls in hot paths, unbounded loops, indexes
37
+ the diff actually touches.
38
+ - **Maintainability.** Complexity, naming, duplication — only when material.
39
+
40
+ ## Output Format
41
+ ### 🚨 Critical (blocks merge)
42
+ ### ⚠️ Warnings (should fix)
43
+ ### 💡 Suggestions (nice to have)
44
+
45
+ Each finding: **Location** (`file:line`), **What's wrong**, **Why it matters**,
46
+ **Concrete fix** — not "consider improving".
47
+
48
+ ## After the review — verify, then fix
49
+
50
+ Findings are claims, not facts. Validate before acting; validate again after.
51
+
52
+ **Verify each claim.** Re-read the cited `file:line` in context. For
53
+ dead-code or unused-symbol claims, `git grep` the name across the repo before
54
+ trusting it. Mark each **confirmed**, **false positive** (with reason), or
55
+ **uncertain**.
56
+
57
+ **Fix what's confirmed and unambiguous** — minimal shape, one obvious way, no
58
+ change to a public API / response / caller contract. Apply directly. After
59
+ each edit, re-read the changed region and confirm it does what you intended
60
+ without breaking nearby logic. A fix isn't done until you've grounded it the
61
+ same way you grounded the claim.
62
+
63
+ **Stop and ask** when any of these hold (HITL gates — not all the time, only
64
+ here):
65
+ - the finding is **uncertain** after grounding,
66
+ - the fix has **multiple reasonable shapes** (e.g. delete-vs-keep-behind-flag,
67
+ extract-vs-inline, patch-vs-rewrite) — present options with tradeoffs, not a
68
+ chosen path,
69
+ - it **affects downstream** (signatures, response shape, schema, any caller
70
+ contract) or removes a public/exported symbol, or
71
+ - the "dead code" looks intentionally kept (stub for upcoming work, framework
72
+ hook, documented extension point) — confirm before deleting.
73
+
74
+ Final report: **confirmed-and-fixed** · **confirmed-but-asking** (why +
75
+ options) · **false-positive** (why) · **uncertain** (what's needed to decide).
76
+
77
+ End with a one-line verdict: **Ready to merge? Yes / No / With fixes** — and
78
+ the reason in a sentence.
@@ -81,6 +81,24 @@ function loadConfig() {
81
81
  return CONFIG;
82
82
  }
83
83
 
84
+ /**
85
+ * Parse newline-delimited JSON, skipping (and warning about) malformed lines
86
+ * instead of crashing the whole run on one bad record.
87
+ */
88
+ function parseJsonl(raw, source) {
89
+ const records = [];
90
+ const lines = raw.split('\n');
91
+ for (let i = 0; i < lines.length; i++) {
92
+ if (!lines[i].trim()) continue;
93
+ try {
94
+ records.push(JSON.parse(lines[i]));
95
+ } catch (e) {
96
+ console.error(`Warning: skipping malformed JSONL line ${i + 1}${source ? ` in ${source}` : ''}: ${e.message}`);
97
+ }
98
+ }
99
+ return records;
100
+ }
101
+
84
102
  function parseISODate(s) {
85
103
  if (!s) return null;
86
104
  try {
@@ -235,9 +253,7 @@ function extractSignals(sessionFile) {
235
253
  const metadata = {};
236
254
 
237
255
  const raw = fs.readFileSync(sessionFile, 'utf-8');
238
- const events = raw.split('\n')
239
- .filter(line => line.trim())
240
- .map(line => JSON.parse(line));
256
+ const events = parseJsonl(raw, sessionFile);
241
257
 
242
258
  let turnCount = 0;
243
259
  const userMessages = [];
@@ -1695,7 +1711,7 @@ function extractContextWindow(sessionFile, anchorTs, windowSize) {
1695
1711
  windowSize = windowSize || 5;
1696
1712
 
1697
1713
  const raw = fs.readFileSync(sessionFile, 'utf-8');
1698
- const events = raw.split('\n').filter(l => l.trim()).map(l => JSON.parse(l));
1714
+ const events = parseJsonl(raw, sessionFile);
1699
1715
 
1700
1716
  const turns = [];
1701
1717
  for (const event of events) {
@@ -2180,14 +2196,20 @@ function extractMain(sessionsDir) {
2180
2196
  return 1;
2181
2197
  }
2182
2198
 
2183
- const analyses = JSON.parse(fs.readFileSync(analysisFile, 'utf-8'));
2199
+ let analyses;
2200
+ try {
2201
+ analyses = JSON.parse(fs.readFileSync(analysisFile, 'utf-8'));
2202
+ } catch (e) {
2203
+ console.log(`Error: ${analysisFile} is not valid JSON (${e.message}). Re-run friction analysis.`);
2204
+ return 1;
2205
+ }
2184
2206
 
2185
2207
  // Load raw signals
2186
2208
  const rawFile = '.claude/friction/friction_raw.jsonl';
2187
2209
  let signals = [];
2188
2210
  if (fs.existsSync(rawFile)) {
2189
2211
  const rawContent = fs.readFileSync(rawFile, 'utf-8');
2190
- signals = rawContent.split('\n').filter(l => l.trim()).map(l => JSON.parse(l));
2212
+ signals = parseJsonl(rawContent, rawFile);
2191
2213
  }
2192
2214
 
2193
2215
  // NEW: no per-session BAD verdict. Seed from ALL sessions; the observed-only
@@ -3,6 +3,7 @@ name: optimize
3
3
  description: Optimize performance [target]
4
4
  usage: /optimize <target-area>
5
5
  argument-hint: [file-or-function]
6
+ allowed-tools: Read, Edit, Grep, Glob, Bash(git diff:*), Bash(git log:*), Bash(git grep:*), Bash(rg:*)
6
7
  ---
7
8
  Analyze $ARGUMENTS for performance.
8
9
 
@@ -14,7 +15,47 @@ Analyze $ARGUMENTS for performance.
14
15
  - Unnecessary allocations
15
16
 
16
17
  ## Output
17
- - Current bottlenecks
18
- - Specific optimizations
19
- - Expected improvement
20
- - Trade-offs involved
18
+ Per bottleneck:
19
+ - **Location** (`file:line`)
20
+ - **Cost** — what's slow and by how much. Concrete ("N+1 over ~1k rows on
21
+ every page load"), not vague ("could be faster").
22
+ - **Optimization** — specific change.
23
+ - **Expected improvement** — order-of-magnitude estimate.
24
+ - **Trade-offs** — readability / memory / consistency cost.
25
+
26
+ ## After the analysis — verify, then fix
27
+
28
+ Performance claims are easy to invent. Validate before acting.
29
+
30
+ **Verify each bottleneck.** Re-read the cited `file:line` in context.
31
+ Confirm the path is **actually hot** — look for at least one of:
32
+ - a profile / benchmark / log line showing call frequency or duration,
33
+ - the path sits on an obvious hot loop / per-request handler with real
34
+ volume,
35
+ - the user provided evidence in the request.
36
+
37
+ Without one of those, the claim is **uncertain — don't optimize on
38
+ speculation.** Mark each finding **confirmed**, **false positive** (with
39
+ reason), or **uncertain (needs profiling data)**.
40
+
41
+ **Fix what's confirmed and unambiguous** — minimal change, one obvious
42
+ shape, **no behavior change**, no API change. Apply directly. After
43
+ each edit, re-read the changed region and confirm it still computes the
44
+ same answer (perf optimizations that quietly change semantics are the
45
+ worst kind).
46
+
47
+ **Stop and ask** when (HITL gates — not all the time, only here):
48
+ - the bottleneck is **uncertain** after grounding (no profile / log and
49
+ not obviously hot),
50
+ - the fix has **multiple reasonable shapes** (cache vs precompute vs
51
+ batch vs paginate vs index) — present options with tradeoffs, not a
52
+ chosen path,
53
+ - it changes **public API / response shape / DB schema / caller contract**,
54
+ - it trades **correctness for speed** (lossy approximation, weaker
55
+ consistency, eventual-vs-strict) — even when "obviously" faster, or
56
+ - it touches **concurrency primitives** (locks, atomics, ordering) —
57
+ easy to introduce races.
58
+
59
+ Final report: **confirmed-and-fixed** · **confirmed-but-asking** (why +
60
+ options) · **false-positive** (why) · **uncertain** (what profiling /
61
+ data is needed to decide).
@@ -3,6 +3,7 @@ name: refactor
3
3
  description: Refactor [code]
4
4
  usage: /refactor <code-section>
5
5
  argument-hint: [file-or-function]
6
+ allowed-tools: Read, Edit, Grep, Glob, Bash(npm test:*), Bash(npx jest:*), Bash(npx vitest:*), Bash(pnpm test:*), Bash(yarn test:*), Bash(pytest:*), Bash(python:*), Bash(go test:*), Bash(cargo test:*), Bash(make test:*), Bash(git diff:*)
6
7
  ---
7
8
  Refactor $ARGUMENTS.
8
9
 
@@ -14,8 +15,39 @@ Refactor $ARGUMENTS.
14
15
  - Smaller functions (single responsibility)
15
16
 
16
17
  ## Constraints
17
- - NO behavior changes
18
+ - **NO behavior changes**
18
19
  - Keep public API intact
19
20
  - Existing tests must pass
20
21
 
21
22
  Explain each change.
23
+
24
+ ## After the refactor — verify it didn't break anything
25
+
26
+ "Existing tests must pass" is the load-bearing constraint, and the only
27
+ honest way to know is to run them.
28
+
29
+ 1. **Detect the project's test command** (look for `package.json`
30
+ scripts, `pytest.ini` / `pyproject.toml`, `go.mod`, `Cargo.toml`,
31
+ `Makefile`). If none is found, **stop and ask** before claiming the
32
+ refactor is done — silent green isn't acceptable.
33
+ 2. **Run the tests.** Scope to the affected area when possible (`-t`,
34
+ `--testPathPattern`, `pytest path/`, `go test ./pkg`); otherwise run
35
+ the suite.
36
+ 3. **Report** pass / fail counts and any failure's name + `file:line`.
37
+
38
+ **Stop and ask** when (HITL gates — not all the time, only here):
39
+ - a test **fails** after the refactor. Don't auto-revert (destroys
40
+ work-in-progress) and don't push forward (the no-behavior-change
41
+ constraint is broken). Present the failure and the options:
42
+ **revert**, **patch the refactor**, or **update the test** (with
43
+ reasoning).
44
+ - the refactor crossed a **public API boundary** that callers depend
45
+ on — even if tests pass, downstream consumers may break.
46
+ - the change is **bigger than the user asked for** (scope creep —
47
+ unrelated cleanups, formatting, comment edits). Confirm before
48
+ applying.
49
+
50
+ Final report:
51
+ - **refactor done, tests N pass / 0 fail** — ready, OR
52
+ - **refactor done, but K tests fail** — awaiting direction (revert /
53
+ patch / update test).
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: release
3
+ description: Deliver a feature end-to-end — verify, docs, merge, tag (publish stays manual)
4
+ usage: /release [branch]
5
+ argument-hint: [branch — new or existing; else current]
6
+ allowed-tools: Read, Grep, Glob, Edit, Write, Bash(git:*), Bash(gh:*), Bash(npm:*), Bash(pnpm:*), Bash(yarn:*), Bash(pytest:*), Bash(python:*), Bash(go:*), Bash(cargo:*), Bash(make:*)
7
+ ---
8
+ End-to-end feature-delivery **orchestrator**. It does **not** re-implement
9
+ checks — it runs your existing gates (`/ship`, `/security`, `/diff-review`)
10
+ under `/verify-done` discipline, then performs the release actions. Two halves
11
+ split by a hard gate: everything **before** the gate is safe and read-only;
12
+ everything **after** rewrites history and is confirmed step by step.
13
+
14
+ **A feature branch is required — `main` is only the merge target.** `$ARGUMENTS`
15
+ names the branch to release. Omit it only if you are already on a feature
16
+ branch. If you are on `main` with nothing named, a branch is created for you —
17
+ but you should be releasing a deliberately-named feature branch.
18
+
19
+ ## Phase 0 — Preflight (resolve a feature branch — never `main`)
20
+ - **Resolve the release branch** — whatever gets merged into `main`:
21
+ - `$ARGUMENTS` given → `git switch` to it (create it if it does not exist).
22
+ - else not on `main` → release the **current** branch.
23
+ - else on `main` with no arg → **create** `feat/<slug>` (named for the
24
+ change) and carry your working changes onto it. **Never release `main`.**
25
+ - **Land the feature on the branch** — if the working tree still has
26
+ uncommitted feature changes, commit them now; the gates must review a real
27
+ diff, not a dirty tree.
28
+ - `git fetch origin`; the release diff is `origin/main...HEAD` (now guaranteed
29
+ to be the resolved branch). If it is empty, **stop** — nothing to release.
30
+ - Print a one-line plan: branch · commit count · files changed.
31
+
32
+ ## Phase 1 — VERIFY (delegate; no hand-waving)
33
+ **First, load the real checklists.** Locate and **read** the sibling command
34
+ definitions so you apply their exact checks, not an approximation — glob your
35
+ installed commands/skills for `ship.md`, `security.md`, `diff-review.md`, and
36
+ `verify-done` (a skill or command). If one cannot be found, run that check from
37
+ its name and **flag that its full checklist was unavailable** — never pretend
38
+ it passed.
39
+
40
+ Then run each gate and capture **fresh evidence** — the exact command, its exit
41
+ code, and the result. Per `/verify-done`: a check you did **not** actually run
42
+ is a **FAIL**, never an assumed pass.
43
+ - **`/ship`** — pre-deploy gate (tests, lint, build, secrets, authz, rate
44
+ limit, data scope, migrations, docs-sync).
45
+ - **`/security`** — on the changed files.
46
+ - **`/diff-review`** — on `origin/main...HEAD`.
47
+
48
+ Emit a coverage table, one row per gate: `ran? ✓/✗` · evidence · verdict. If
49
+ any row is ✗ (could not run), the run is **Blocked 🛑** — do not continue.
50
+
51
+ ## 🚦 Gate
52
+ - **Any Critical** (failing tests/build, a Critical security or diff-review
53
+ finding) → **stop**, report, ask how to proceed. Touch no history.
54
+ - **Warnings, or anything you cannot confidently decide** → **stop**,
55
+ summarize, ask.
56
+ - **All clean** → continue to Phase 2.
57
+
58
+ ## Phase 2 — DOCS (only what the feature changed)
59
+ Update as needed, matching each file's existing format; touch nothing
60
+ unrelated. If a doc needs no change, **say so** rather than editing for its
61
+ own sake.
62
+ - **CHANGELOG.md** — new entry.
63
+ - **PRD** — the feature's PRD entry / status.
64
+ - **context / guide** — the project's context or guide doc.
65
+ - **README.md** — only if user-facing usage changed.
66
+
67
+ ## Phase 3 — RELEASE (irreversible — confirm each step)
68
+ 1. **Version bump** — pick the semver level from the change (patch / minor /
69
+ major; ask if ambiguous) and update `package.json`.
70
+ 2. **Commit** — `release: vX.Y.Z — <summary>`, including the docs + bump.
71
+ 3. **Push** the branch.
72
+ 4. **Open PR** — `gh pr create` into `main` (main is PR-protected: 1 approving
73
+ review).
74
+ 5. **Merge** — `gh pr merge --delete-branch`. If the review requirement blocks
75
+ it, **stop** and ask the user to approve — never force or bypass protection.
76
+ 6. **Tag** — after the merge, `git tag vX.Y.Z` on `main` and push it. Keep
77
+ cut→tag tight — one frozen step.
78
+
79
+ ## Stop here — publish is your call
80
+ Do **not** publish. `publish.yml` is manual `workflow_dispatch` **by design**.
81
+ Print the handoff:
82
+ > Merged, branch deleted, tagged **vX.Y.Z**. To publish, run it yourself:
83
+ > `gh workflow run publish.yml`
84
+ > Then confirm the version is actually live (`npm view <pkg> versions`) and
85
+ > validate the **installed** artifact, not the working tree.
86
+
87
+ Final report: **Delivered ✅ (vX.Y.Z — publish pending)** or **Blocked 🛑**
88
+ with the specific reason.
@@ -4,7 +4,7 @@ description: Consolidate stashes + friction into project memory
4
4
  usage: /remember
5
5
  ---
6
6
 
7
- Consolidate session stashes and friction analysis into a single project-local MEMORY.md, then inject into CLAUDE.md.
7
+ Run friction analysis, then consolidate session stashes + friction antigens into a single project-local MEMORY.md, and inject into CLAUDE.md. Friction runs automatically (best-effort) — there is no separate `/friction` command.
8
8
 
9
9
  **Guardrails**
10
10
  - Favor straightforward, minimal implementations first and add complexity only when requested or clearly required.
@@ -17,12 +17,43 @@ Reads all raw material (`.claude/stash/*.md` + `.claude/friction/antigen_cluster
17
17
 
18
18
  **Steps**
19
19
 
20
+ 0. **Run friction first** (best-effort — friction analyzes ALL your usage, not just this repo)
21
+
22
+ Friction's signal is *global*: recurring corrections and frustrations across every
23
+ project are behavioral lessons worth keeping everywhere. So point it at the tool's
24
+ **global sessions root** (all projects), not a per-project directory.
25
+
26
+ - **Locate `friction.js`** — it is bundled next to this command at `friction/friction.js`
27
+ (the same directory as `remember.md`, whether installed or run from the package). If it
28
+ exists nowhere, skip to step 1 (stash-only) and tell the user friction.js is missing.
29
+ - **Resolve the global sessions root** — probe this list top-to-bottom, use the first that
30
+ exists and contains `.jsonl` files (recursively). **Never prompt the user.**
31
+ ```
32
+ # ── Add your own global sessions root at the TOP so it is checked first ──
33
+ ~/.claude/projects/ # Claude Code
34
+ ~/.factory/projects/ # Droid / Factory
35
+ ~/.config/amp/projects/ # Amp
36
+ ~/.config/opencode/projects/ # opencode
37
+ ~/.codex/sessions/ # Codex CLI (use $CODEX_HOME/sessions/ if set)
38
+ ~/.gemini/antigravity-cli/brain/ # Antigravity
39
+ ```
40
+ > Note: `friction.js` parses Claude Code's session schema. The Codex/Antigravity roots
41
+ > will resolve but yield no signals until friction learns their formats — open an issue
42
+ > to request one: https://github.com/hamr0/liteagents/issues
43
+ - **Run** `node <friction.js> "<resolved-root>"`. friction writes its output to
44
+ `.claude/friction/` in the current project.
45
+ - **On any miss — loud, never silent.** If no root resolves, or friction errors, or it
46
+ finds no usable sessions, print this and continue with stash-only consolidation:
47
+ > ⚠️ Friction didn't run — no sessions found. To enable it, open this command file
48
+ > (`remember.md`) and add your tool's **global** sessions root to the TOP of the probe
49
+ > list in step 0, then re-run `/remember`. Consolidating stashes only this time.
50
+
20
51
  1. **Gather sources**
21
52
  - Read all `.claude/stash/*.md` files in the current project
22
- - Check for friction output at `.claude/friction/antigen_clusters.json` (preferred) or `.claude/friction/antigen_review.md` (fallback)
53
+ - Read friction output written in step 0: `.claude/friction/antigen_clusters.json` (preferred) or `.claude/friction/antigen_review.md` (fallback)
23
54
  - Read existing `.claude/memory/MEMORY.md` if it exists — create dir if missing
24
55
  - Read processed manifest at `.claude/memory/.processed` — skip already-processed stashes
25
- - If no unprocessed stashes AND no friction output, report "nothing to consolidate" and stop
56
+ - If no unprocessed stashes AND friction produced no new antigens, report "nothing to consolidate" and stop
26
57
 
27
58
  2. **Extract from unprocessed stashes** (use Task tool with sonnet model for each)
28
59
  - For each unprocessed stash, call sonnet to extract:
@@ -3,7 +3,7 @@ name: security
3
3
  description: Scan security [target]
4
4
  usage: /security
5
5
  argument-hint: [file, directory, or leave empty for full scan]
6
- allowed-tools: Read, Grep, Glob, Bash(git log:*), Bash(git grep:*), Bash(rg:*)
6
+ allowed-tools: Read, Edit, Grep, Glob, Bash(git log:*), Bash(git grep:*), Bash(rg:*)
7
7
  ---
8
8
  Audit $ARGUMENTS for security vulnerabilities. Adapt scope to what the target
9
9
  actually is — a library, CLI, web app, and service won't all have every
@@ -57,3 +57,30 @@ Severity-ranked findings (Critical → High → Medium → Low), each with:
57
57
  End with: which of the six classes were checked and found **clean**, and any
58
58
  marked **N/A** for this target — so the scan's coverage is auditable, not just
59
59
  its hits.
60
+
61
+ ## After the scan — verify, then fix
62
+
63
+ Findings are claims, not facts. Validate before acting; validate again after.
64
+
65
+ **Verify each claim.** Re-read the cited `file:line` in context. Confirm the
66
+ risk actually holds here — not in the abstract. Mark each **confirmed**, **false
67
+ positive** (with reason), or **uncertain**.
68
+
69
+ **Fix what's confirmed and unambiguous** — minimal shape, one obvious way, no
70
+ change to a public API / response / caller contract. Apply directly. After
71
+ each edit, re-read the changed region and confirm it closes the gap without
72
+ breaking nearby logic. A fix isn't done until you've grounded it the same way
73
+ you grounded the claim.
74
+
75
+ **Stop and ask** when any of these hold (HITL gates — not all the time, only
76
+ here):
77
+ - the finding is **uncertain** after grounding (you'd need info you don't have),
78
+ - the fix has **multiple reasonable shapes** (e.g. reject-vs-sanitize,
79
+ index-vs-paginate) — present options with tradeoffs, not a chosen path,
80
+ - it **affects downstream** (function signatures, response shape, DB schema,
81
+ any caller contract), or
82
+ - it touches **auth / crypto / session / token** primitives — even an "obvious"
83
+ fix here warrants confirmation.
84
+
85
+ Final report: **confirmed-and-fixed** · **confirmed-but-asking** (why + options)
86
+ · **false-positive** (why) · **uncertain** (what's needed to decide).
@@ -17,6 +17,13 @@ Save session context for compaction recovery or handoffs.
17
17
  3. Stores important findings and insights
18
18
  4. Creates stash file in `.claude/stash/`
19
19
  5. Enables context restoration after compaction
20
+ 6. **Consolidation nudge** — after saving, count the unprocessed backlog:
21
+ `unprocessed = (files in .claude/stash/*.md) − (entries in .claude/memory/.processed)`
22
+ (a missing `.processed` manifest means 0 processed). If `unprocessed >= 5`, end with one line:
23
+ > 📝 N stashes since last consolidation — run `/remember` to fold them into memory.
24
+
25
+ No counter is stored — the count is derived each time, and running `/remember` updates
26
+ `.processed`, so the backlog drops on its own. Just emit the nudge; never run `/remember` automatically.
20
27
 
21
28
  **When to use**
22
29
  - Before long-running tasks that may trigger compaction
@@ -1,18 +1,67 @@
1
1
  ---
2
2
  name: test-generate
3
- description: Generate tests [file]
4
- usage: /test-generate <code-section>
5
- argument-hint: [file-to-test]
3
+ description: Generate and run tests [file]
4
+ usage: /test-generate <file>
5
+ argument-hint: [file or symbol to test]
6
+ allowed-tools: Read, Edit, Write, Grep, Glob, Bash(npm test:*), Bash(npx jest:*), Bash(npx vitest:*), Bash(pnpm test:*), Bash(yarn test:*), Bash(pytest:*), Bash(python:*), Bash(go test:*), Bash(cargo test:*), Bash(make test:*)
6
7
  ---
7
- Generate tests for $ARGUMENTS.
8
-
9
- ## Include
10
- - Happy path (expected usage)
11
- - Edge cases (empty, null, boundaries)
12
- - Error scenarios (invalid input, failures)
13
- - Integration points (mocks for external deps)
14
-
15
- ## Requirements
16
- - Match existing test patterns in this project
17
- - Use the testing framework already in use
18
- - Clear test names: "should [expected] when [condition]"
8
+ Generate tests for $ARGUMENTS, then run them. This is a generate → run →
9
+ verify loop, not just file generation.
10
+
11
+ ## 1. Discover
12
+ - Detect the test framework already in use (look for `jest.config*`,
13
+ `vitest.config*`, `pytest.ini` / `pyproject.toml [tool.pytest]`, Go's
14
+ `_test.go` convention, `Cargo.toml [dev-dependencies]`, etc.). **Never
15
+ add a new framework or runner.**
16
+ - Skim 1–2 existing test files near the target to mirror style, fixtures,
17
+ setup/teardown, assertion style, and naming convention.
18
+
19
+ ## 2. Generate
20
+ Cover:
21
+ - **Happy path** (expected usage)
22
+ - **Edges** (empty / null / boundary / malformed)
23
+ - **Errors** (invalid input, IO / network / DB failures)
24
+
25
+ Match existing patterns:
26
+ - Same framework, same fixture style, same naming convention.
27
+ - Reuse existing setup/teardown helpers; do **not** add new mock libraries
28
+ or new test-runner config.
29
+ - Do **not** add test-only public methods or exports to production code to
30
+ make a test possible — if the test wants a hook the prod code doesn't
31
+ expose, stop and ask (`test-traps` territory).
32
+
33
+ ## 3. Run
34
+ Execute the project's real test command, scoped to just the new tests
35
+ (`-t <name>`, `--testPathPattern`, `pytest path/to/test.py`, `go test
36
+ ./pkg`, etc.). Report:
37
+ - Pass / fail counts.
38
+ - Any failure with the assertion message and `file:line`.
39
+
40
+ ## 4. Verify the tests BITE
41
+ A test that passes is not the same as a test that **exercises** the code.
42
+ For each new test, confirm:
43
+ - It would fail if the function under test returned the wrong value.
44
+ Mentally swap a broken impl — does the assertion actually catch it?
45
+ - It isn't `expect(true).toBe(true)`, `expect(fn).toBeDefined()`, or a
46
+ mock asserting itself.
47
+ - It isn't passing only because the setup masked the real call.
48
+
49
+ Mark each new test **biting** or **superficial** (with reason).
50
+ Superficial tests count as a failure to ship — either fix or delete.
51
+
52
+ ## 5. Report
53
+ - Files added / modified.
54
+ - Pass / fail.
55
+ - Biting vs superficial breakdown.
56
+ - What was deliberately **not** tested, and why (third-party shims,
57
+ trivial getters/setters, generated code). Documented gaps beat fake
58
+ coverage.
59
+
60
+ **Stop and ask** when:
61
+ - A meaningful test would require a non-obvious design change to
62
+ production code (don't pollute prod to make tests pass — present the
63
+ options instead).
64
+ - The existing test setup has multiple reasonable patterns and it's
65
+ unclear which to mirror.
66
+ - An existing dependency would need to be mocked in a way the project
67
+ doesn't currently do (introducing a new mock style is a design choice).
@@ -572,9 +572,9 @@
572
572
  }
573
573
  },
574
574
  "node_modules/hono": {
575
- "version": "4.12.18",
576
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz",
577
- "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==",
575
+ "version": "4.12.25",
576
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.25.tgz",
577
+ "integrity": "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==",
578
578
  "license": "MIT",
579
579
  "engines": {
580
580
  "node": ">=16.9.0"
@@ -104,7 +104,7 @@ Bulletproof skill that:
104
104
  ## Usage Example
105
105
 
106
106
  When encountering a bug:
107
- 1. Load skill: skills/debugging/systematic-debugging
107
+ 1. Load skill: skills/debug-method
108
108
  2. Read overview (10 sec) - reminded of mandate
109
109
  3. Follow Phase 1 checklist - forced investigation
110
110
  4. If tempted to skip - see anti-pattern, stop
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: systematic-debugging
2
+ name: debug-method
3
3
  description: Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes - four-phase framework (root cause investigation, pattern analysis, hypothesis testing, implementation) that ensures understanding before attempting solutions
4
- usage: /systematic-debugging <bug-or-error-description>
4
+ usage: /debug-method <bug-or-error-description>
5
5
  auto_trigger: false
6
6
  ---
7
7
 
8
- # Systematic Debugging
8
+ # Debug Method
9
9
 
10
10
  ## Overview
11
11
 
@@ -113,7 +113,7 @@ You MUST complete each phase before proceeding to the next.
113
113
 
114
114
  **WHEN error is deep in call stack:**
115
115
 
116
- **REQUIRED SUB-SKILL:** Use root-cause-tracing for backward tracing technique
116
+ **REQUIRED SUB-SKILL:** Use trace-back for backward tracing technique
117
117
 
118
118
  **Quick version:**
119
119
  - Where does bad value originate?
@@ -178,7 +178,7 @@ You MUST complete each phase before proceeding to the next.
178
178
  - Automated test if possible
179
179
  - One-off test script if no framework
180
180
  - MUST have before fixing
181
- - **REQUIRED SUB-SKILL:** Use test-driven-development for writing proper failing tests
181
+ - **REQUIRED SUB-SKILL:** Use tdd-flow for writing proper failing tests
182
182
 
183
183
  2. **Implement Single Fix**
184
184
  - Address the root cause identified
@@ -280,12 +280,12 @@ If systematic investigation reveals issue is truly environmental, timing-depende
280
280
  ## Integration with Other Skills
281
281
 
282
282
  **This skill requires using:**
283
- - **root-cause-tracing** - REQUIRED when error is deep in call stack (see Phase 1, Step 5)
284
- - **test-driven-development** - REQUIRED for creating failing test case (see Phase 4, Step 1)
283
+ - **trace-back** - REQUIRED when error is deep in call stack (see Phase 1, Step 5)
284
+ - **tdd-flow** - REQUIRED for creating failing test case (see Phase 4, Step 1)
285
285
 
286
286
  **Complementary skills:**
287
- - **condition-based-waiting** - Replace arbitrary timeouts identified in Phase 2
288
- - **verification-before-completion** - Verify fix worked before claiming success
287
+ - **test-traps** (Anti-Pattern 6) - Replace arbitrary timeouts identified in Phase 2
288
+ - **verify-done** - Verify fix worked before claiming success
289
289
 
290
290
  ## Real-World Impact
291
291
 
@@ -1,6 +1,6 @@
1
1
  # Academic Test: Systematic Debugging Skill
2
2
 
3
- You have access to the systematic debugging skill at skills/debugging/systematic-debugging
3
+ You have access to the systematic debugging skill at skills/debug-method
4
4
 
5
5
  Read the skill and answer these questions based SOLELY on what the skill says:
6
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **IMPORTANT: This is a real scenario. You must choose and act. Don't ask hypothetical questions - make the actual decision.**
4
4
 
5
- You have access to: skills/debugging/systematic-debugging
5
+ You have access to: skills/debug-method
6
6
 
7
7
  ## Scenario
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **IMPORTANT: This is a real scenario. You must choose and act. Don't ask hypothetical questions - make the actual decision.**
4
4
 
5
- You have access to: skills/debugging/systematic-debugging
5
+ You have access to: skills/debug-method
6
6
 
7
7
  ## Scenario
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **IMPORTANT: This is a real scenario. You must choose and act. Don't ask hypothetical questions - make the actual decision.**
4
4
 
5
- You have access to: skills/debugging/systematic-debugging
5
+ You have access to: skills/debug-method
6
6
 
7
7
  ## Scenario
8
8