tracerkit 1.10.2 → 1.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.
- package/README.md +26 -15
- package/dist/bin.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{uninstall-Bgs58wa2.js → uninstall-BhTMOfMb.js} +27 -20
- package/package.json +3 -2
- package/{templates/.claude/skills/tk:brief → skills/brief}/SKILL.md +4 -4
- package/{templates/.claude/skills/tk:check → skills/check}/SKILL.md +16 -16
- package/{templates/.claude/skills/tk:plan → skills/plan}/SKILL.md +9 -9
- package/{templates/.claude/skills/tk:prd → skills/prd}/SKILL.md +6 -6
package/README.md
CHANGED
|
@@ -28,12 +28,36 @@ The workflow is three skills: **define** (`/tk:prd`), **plan** (`/tk:plan`), **v
|
|
|
28
28
|
### Install
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
npm install -g tracerkit
|
|
32
|
+
tracerkit init
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
Skills are installed to `~/.claude/skills/`, available in every project. Safe to re-run — adds missing skills without overwriting ones you've modified.
|
|
36
36
|
|
|
37
|
+
<details>
|
|
38
|
+
<summary>Per-project install (team members get skills via git)</summary>
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
tracerkit init . # install to .claude/skills/ in current dir
|
|
42
|
+
tracerkit update . # update project-scoped skills
|
|
43
|
+
tracerkit uninstall . # remove project-scoped skills
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
</details>
|
|
47
|
+
|
|
48
|
+
<details>
|
|
49
|
+
<summary>Claude Code plugin (alternative)</summary>
|
|
50
|
+
|
|
51
|
+
Inside Claude Code, run:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
/plugin install tk@claude-plugins-official
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Run `/reload-plugins` if needed. Skills are available immediately — no build step, no config.
|
|
58
|
+
|
|
59
|
+
</details>
|
|
60
|
+
|
|
37
61
|
### Workflow
|
|
38
62
|
|
|
39
63
|
```
|
|
@@ -67,19 +91,6 @@ AI: | Feature | Status | Age | Progress | Next
|
|
|
67
91
|
|
|
68
92
|
See [Examples](docs/examples.md) for full walkthroughs.
|
|
69
93
|
|
|
70
|
-
<details>
|
|
71
|
-
<summary>Per-project usage</summary>
|
|
72
|
-
|
|
73
|
-
To scope skills to a single project (team members get them via git):
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
$ tracerkit init . # install to .claude/skills/ in current dir
|
|
77
|
-
$ tracerkit update . # update project-scoped skills
|
|
78
|
-
$ tracerkit uninstall . # remove project-scoped skills
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
</details>
|
|
82
|
-
|
|
83
94
|
## Skills
|
|
84
95
|
|
|
85
96
|
TracerKit ships skills that take a feature from idea to verified archive.
|
package/dist/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as e, i as t, n, r, s as i, t as a } from "./uninstall-
|
|
2
|
+
import { a as e, i as t, n, r, s as i, t as a } from "./uninstall-BhTMOfMb.js";
|
|
3
3
|
import { readFileSync as o } from "node:fs";
|
|
4
4
|
import { dirname as s, resolve as c } from "node:path";
|
|
5
5
|
import { fileURLToPath as l } from "node:url";
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { c as e, i as t, n, o as r, r as i, t as a } from "./uninstall-
|
|
1
|
+
import { c as e, i as t, n, o as r, r as i, t as a } from "./uninstall-BhTMOfMb.js";
|
|
2
2
|
export { t as COMMANDS, r as DEPRECATED_SKILLS, e as SKILL_NAMES, n as init, a as uninstall, i as update };
|
|
@@ -53,7 +53,7 @@ var f = [
|
|
|
53
53
|
args: "[path]",
|
|
54
54
|
desc: "Remove TracerKit skill directories, keep .tracerkit/ artifacts"
|
|
55
55
|
}
|
|
56
|
-
], _ = s(o(l(import.meta.url)), "..", "
|
|
56
|
+
], _ = s(o(l(import.meta.url)), "..", "skills");
|
|
57
57
|
function v(e, t = "") {
|
|
58
58
|
let n = r(e, { withFileTypes: !0 }), i = [];
|
|
59
59
|
for (let r of n) {
|
|
@@ -62,28 +62,35 @@ function v(e, t = "") {
|
|
|
62
62
|
}
|
|
63
63
|
return i.sort();
|
|
64
64
|
}
|
|
65
|
-
function y(e
|
|
66
|
-
return e
|
|
65
|
+
function y(e) {
|
|
66
|
+
return `.claude/skills/tk:${e}`;
|
|
67
67
|
}
|
|
68
|
-
function b(e
|
|
69
|
-
|
|
68
|
+
function b(e) {
|
|
69
|
+
return e.slice(18);
|
|
70
|
+
}
|
|
71
|
+
function x(e, t) {
|
|
72
|
+
let n = e;
|
|
73
|
+
return t.paths.prds !== u.prds && (n = n.replaceAll(u.prds, t.paths.prds)), t.paths.plans !== u.plans && (n = n.replaceAll(u.plans, t.paths.plans)), t.paths.archives !== u.archives && (n = n.replaceAll(u.archives, t.paths.archives)), n;
|
|
74
|
+
}
|
|
75
|
+
function S(e, r, i) {
|
|
76
|
+
let c = i ?? v(_).map(y);
|
|
70
77
|
for (let i of c) {
|
|
71
|
-
let c = s(_, i), l = s(e, i);
|
|
72
|
-
t(o(l), { recursive: !0 }), a(l,
|
|
78
|
+
let c = s(_, b(i)), l = s(e, i);
|
|
79
|
+
t(o(l), { recursive: !0 }), a(l, x(n(c, "utf8"), r));
|
|
73
80
|
}
|
|
74
81
|
return { copied: c };
|
|
75
82
|
}
|
|
76
|
-
function
|
|
83
|
+
function C(e) {
|
|
77
84
|
return c("sha256").update(e).digest("hex");
|
|
78
85
|
}
|
|
79
|
-
function
|
|
80
|
-
let i = v(_), a = [], o = [], c = [];
|
|
86
|
+
function w(t, r) {
|
|
87
|
+
let i = v(_).map(y), a = [], o = [], c = [];
|
|
81
88
|
for (let l of i) {
|
|
82
89
|
let i = s(t, l);
|
|
83
90
|
if (!e(i)) c.push(l);
|
|
84
91
|
else {
|
|
85
|
-
let e =
|
|
86
|
-
|
|
92
|
+
let e = x(n(s(_, b(l)), "utf8"), r);
|
|
93
|
+
C(Buffer.from(e)) === C(n(i)) ? a.push(l) : o.push(l);
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
96
|
return {
|
|
@@ -94,9 +101,9 @@ function S(t, r) {
|
|
|
94
101
|
}
|
|
95
102
|
//#endregion
|
|
96
103
|
//#region src/commands/update.ts
|
|
97
|
-
function
|
|
104
|
+
function T(t, n) {
|
|
98
105
|
if (!f.some((n) => e(s(t, ".claude", "skills", n)))) throw Error("TracerKit not initialized — run `tracerkit init` first");
|
|
99
|
-
let r = d(t), { unchanged: a, modified: o, missing: c } =
|
|
106
|
+
let r = d(t), { unchanged: a, modified: o, missing: c } = w(t, r), l = [];
|
|
100
107
|
for (let n of p) {
|
|
101
108
|
let r = s(t, ".claude", "skills", n);
|
|
102
109
|
e(r) && (i(r, {
|
|
@@ -110,7 +117,7 @@ function C(t, n) {
|
|
|
110
117
|
...u ? o : []
|
|
111
118
|
];
|
|
112
119
|
if (m.length > 0) {
|
|
113
|
-
|
|
120
|
+
S(t, r, m);
|
|
114
121
|
for (let e of a) l.push(`✓ ${e}`);
|
|
115
122
|
for (let e of c) l.push(`✓ ${e} (added)`);
|
|
116
123
|
if (u) for (let e of o) l.push(`✓ ${e} (replaced)`);
|
|
@@ -123,14 +130,14 @@ function C(t, n) {
|
|
|
123
130
|
}
|
|
124
131
|
//#endregion
|
|
125
132
|
//#region src/commands/init.ts
|
|
126
|
-
function
|
|
127
|
-
if (f.some((n) => e(s(t, ".claude", "skills", n)))) return
|
|
128
|
-
let { copied: n } =
|
|
133
|
+
function E(t) {
|
|
134
|
+
if (f.some((n) => e(s(t, ".claude", "skills", n)))) return T(t);
|
|
135
|
+
let { copied: n } = S(t, d(t));
|
|
129
136
|
return n.map((e) => `✓ ${e}`);
|
|
130
137
|
}
|
|
131
138
|
//#endregion
|
|
132
139
|
//#region src/commands/uninstall.ts
|
|
133
|
-
function
|
|
140
|
+
function D(t) {
|
|
134
141
|
if (!f.some((n) => e(s(t, ".claude", "skills", n)))) throw Error("TracerKit not initialized — nothing to uninstall");
|
|
135
142
|
let n = [];
|
|
136
143
|
for (let r of f) {
|
|
@@ -143,4 +150,4 @@ function T(t) {
|
|
|
143
150
|
return n;
|
|
144
151
|
}
|
|
145
152
|
//#endregion
|
|
146
|
-
export { h as a, f as c, g as i,
|
|
153
|
+
export { h as a, f as c, g as i, E as n, p as o, T as r, m as s, D as t };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tracerkit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Spec-driven workflow for Claude Code: replace ad-hoc prompts with PRD → plan → verify.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
],
|
|
34
34
|
"files": [
|
|
35
35
|
"dist",
|
|
36
|
-
"
|
|
36
|
+
"skills"
|
|
37
37
|
],
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=22.0.0",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"format": "prettier --write .",
|
|
51
51
|
"format:check": "prettier --check .",
|
|
52
52
|
"typecheck": "tsc --noEmit",
|
|
53
|
+
"version": "node -e \"const f='.claude-plugin/plugin.json';const p=JSON.parse(require('fs').readFileSync(f,'utf8'));p.version=require('./package.json').version;require('fs').writeFileSync(f,JSON.stringify(p,null,2)+'\\n')\"",
|
|
53
54
|
"prepare": "husky || true && npm run build",
|
|
54
55
|
"release": "semantic-release"
|
|
55
56
|
},
|
|
@@ -8,7 +8,7 @@ Get a quick overview of all active features, their progress, and what to focus o
|
|
|
8
8
|
|
|
9
9
|
## Pre-loaded context
|
|
10
10
|
|
|
11
|
-
- Available PRDs: !`ls
|
|
11
|
+
- Available PRDs: !`ls .tracerkit/prds/ 2>&1`
|
|
12
12
|
|
|
13
13
|
## Algorithm
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ Follow these steps exactly to build the briefing table:
|
|
|
16
16
|
|
|
17
17
|
### 1. Discover features
|
|
18
18
|
|
|
19
|
-
For each `.md` file in
|
|
19
|
+
For each `.md` file in `.tracerkit/prds/`:
|
|
20
20
|
|
|
21
21
|
1. Read the file
|
|
22
22
|
2. Parse YAML frontmatter (the block between `---` fences at the top)
|
|
@@ -26,7 +26,7 @@ For each `.md` file in `{{paths.prds}}/`:
|
|
|
26
26
|
|
|
27
27
|
### 2. Count progress from plans
|
|
28
28
|
|
|
29
|
-
For each slug, check if
|
|
29
|
+
For each slug, check if `.tracerkit/plans/<slug>.md` exists. If it does:
|
|
30
30
|
|
|
31
31
|
1. Read the plan file
|
|
32
32
|
2. Find every `## Phase N` heading (regex: `^## Phase \d+`)
|
|
@@ -74,6 +74,6 @@ Append below the table:
|
|
|
74
74
|
|
|
75
75
|
Ask the user what they'd like to do:
|
|
76
76
|
|
|
77
|
-
- Continue the focused feature (read its plan at
|
|
77
|
+
- Continue the focused feature (read its plan at `.tracerkit/plans/<slug>.md`)
|
|
78
78
|
- Start a new feature with `/tk:prd`
|
|
79
79
|
- Check progress on a feature with `/tk:check <slug>`
|
|
@@ -9,7 +9,7 @@ Check implementation against a plan. Update checks, stamp findings, transition s
|
|
|
9
9
|
|
|
10
10
|
## Pre-loaded context
|
|
11
11
|
|
|
12
|
-
- Available plans: !`ls
|
|
12
|
+
- Available plans: !`ls .tracerkit/plans/ 2>&1`
|
|
13
13
|
|
|
14
14
|
## Input
|
|
15
15
|
|
|
@@ -25,11 +25,11 @@ If no argument is provided, build a summary table before asking which one to che
|
|
|
25
25
|
| <slug> | ... | 3/7 |
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
For each `.md` file in
|
|
28
|
+
For each `.md` file in `.tracerkit/prds/`:
|
|
29
29
|
|
|
30
30
|
1. Read the file, parse YAML frontmatter (block between `---` fences)
|
|
31
31
|
2. Extract `status` — use `unknown` if missing
|
|
32
|
-
3. If
|
|
32
|
+
3. If `.tracerkit/plans/<slug>.md` exists, count progress (see Progress Algorithm below). Show `—` if no plan.
|
|
33
33
|
|
|
34
34
|
After the table, ask which feature to verify.
|
|
35
35
|
|
|
@@ -48,7 +48,7 @@ To count progress for a plan file:
|
|
|
48
48
|
|
|
49
49
|
### 1. Load the plan
|
|
50
50
|
|
|
51
|
-
Read
|
|
51
|
+
Read `.tracerkit/plans/<slug>.md`. If it does not exist, list available plans and ask.
|
|
52
52
|
|
|
53
53
|
### 2. Load the PRD
|
|
54
54
|
|
|
@@ -76,7 +76,7 @@ Collect findings into two categories:
|
|
|
76
76
|
|
|
77
77
|
### 3c. Update checkboxes
|
|
78
78
|
|
|
79
|
-
Using the subagent's report, update each checkbox in
|
|
79
|
+
Using the subagent's report, update each checkbox in `.tracerkit/plans/<slug>.md` to `[x]` or `[ ]`.
|
|
80
80
|
|
|
81
81
|
### 4. Determine outcome
|
|
82
82
|
|
|
@@ -112,7 +112,7 @@ Total: checked/total
|
|
|
112
112
|
|
|
113
113
|
### 6. Stamp the plan
|
|
114
114
|
|
|
115
|
-
Append a verdict block at the bottom of
|
|
115
|
+
Append a verdict block at the bottom of `.tracerkit/plans/<slug>.md`:
|
|
116
116
|
|
|
117
117
|
```markdown
|
|
118
118
|
---
|
|
@@ -131,19 +131,19 @@ If a previous verdict block exists, replace it with the new one.
|
|
|
131
131
|
|
|
132
132
|
If all checks pass and zero BLOCKERS, perform these steps in order:
|
|
133
133
|
|
|
134
|
-
1. Create directory
|
|
135
|
-
2. If
|
|
134
|
+
1. Create directory `.tracerkit/archives/<slug>/`
|
|
135
|
+
2. If `.tracerkit/prds/<slug>.md` exists:
|
|
136
136
|
- Read the PRD file
|
|
137
137
|
- In the YAML frontmatter (between `---` fences), find the `status:` line and replace its value with `done`. If no `status:` line exists, add `status: done` as a new line inside the frontmatter block.
|
|
138
138
|
- Add a `completed: <current UTC ISO 8601 timestamp>` line inside the frontmatter block (e.g. `completed: 2025-06-15T14:30:00Z`)
|
|
139
|
-
- Write the updated content to
|
|
140
|
-
3. Read
|
|
139
|
+
- Write the updated content to `.tracerkit/archives/<slug>/prd.md`
|
|
140
|
+
3. Read `.tracerkit/plans/<slug>.md`
|
|
141
141
|
- Append to the end: `\n## Archived\n\nArchived on YYYY-MM-DD.\n`
|
|
142
|
-
- Write the result to
|
|
143
|
-
4. Delete
|
|
144
|
-
5. Delete
|
|
142
|
+
- Write the result to `.tracerkit/archives/<slug>/plan.md`
|
|
143
|
+
4. Delete `.tracerkit/prds/<slug>.md` (if it exists)
|
|
144
|
+
5. Delete `.tracerkit/plans/<slug>.md`
|
|
145
145
|
|
|
146
|
-
Tell the user: archived to
|
|
146
|
+
Tell the user: archived to `.tracerkit/archives/<slug>/`, one-line summary of the feature.
|
|
147
147
|
|
|
148
148
|
### 8. On `in_progress` (no blockers)
|
|
149
149
|
|
|
@@ -164,5 +164,5 @@ List the blockers to fix, then re-run `/tk:check <slug>`.
|
|
|
164
164
|
|
|
165
165
|
- Plan not found — list available plans and ask
|
|
166
166
|
- PRD referenced in plan not found — warn and continue with plan checks only
|
|
167
|
-
-
|
|
168
|
-
-
|
|
167
|
+
- `.tracerkit/plans/` missing — tell user to run `/tk:plan` first
|
|
168
|
+
- `.tracerkit/archives/<slug>/` already exists — warn and ask whether to remove it first
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Turn a PRD into a multi-phase implementation plan using tracer-bullet vertical slices, saved to
|
|
2
|
+
description: Turn a PRD into a multi-phase implementation plan using tracer-bullet vertical slices, saved to .tracerkit/plans/. Use after /tk:prd.
|
|
3
3
|
argument-hint: '[slug]'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# PRD to Plan
|
|
7
7
|
|
|
8
|
-
Break a PRD into phased vertical slices (tracer bullets). Output:
|
|
8
|
+
Break a PRD into phased vertical slices (tracer bullets). Output: `.tracerkit/plans/<slug>.md`.
|
|
9
9
|
|
|
10
10
|
## Pre-loaded context
|
|
11
11
|
|
|
12
|
-
- Available PRDs: !`ls
|
|
12
|
+
- Available PRDs: !`ls .tracerkit/prds/ 2>&1`
|
|
13
13
|
|
|
14
14
|
## Input
|
|
15
15
|
|
|
@@ -21,13 +21,13 @@ Use the argument as `<slug>` if given. If no argument is provided, list availabl
|
|
|
21
21
|
|
|
22
22
|
### 1. Read the PRD
|
|
23
23
|
|
|
24
|
-
Read
|
|
24
|
+
Read `.tracerkit/prds/<slug>.md`. If it does not exist, list available PRDs and ask.
|
|
25
25
|
|
|
26
|
-
If
|
|
26
|
+
If `.tracerkit/plans/<slug>.md` already exists, tell the user and ask whether to overwrite or pick a new name.
|
|
27
27
|
|
|
28
28
|
### 1b. Update PRD status
|
|
29
29
|
|
|
30
|
-
Update the YAML frontmatter in
|
|
30
|
+
Update the YAML frontmatter in `.tracerkit/prds/<slug>.md` to `status: in_progress`. Change only the `status` field — do not touch any other frontmatter fields or the markdown content below the closing `---`.
|
|
31
31
|
|
|
32
32
|
If the PRD has no frontmatter, skip this step silently.
|
|
33
33
|
|
|
@@ -97,12 +97,12 @@ Ask: Does the granularity feel right? Should any phases merge or split? Iterate
|
|
|
97
97
|
|
|
98
98
|
### 6. Save plan
|
|
99
99
|
|
|
100
|
-
Save to
|
|
100
|
+
Save to `.tracerkit/plans/<slug>.md` (create `.tracerkit/plans/` if missing).
|
|
101
101
|
|
|
102
102
|
```markdown
|
|
103
103
|
# Plan: <Feature Name>
|
|
104
104
|
|
|
105
|
-
> Source PRD:
|
|
105
|
+
> Source PRD: `.tracerkit/prds/<slug>.md`
|
|
106
106
|
|
|
107
107
|
## Architectural Decisions
|
|
108
108
|
|
|
@@ -153,4 +153,4 @@ Print saved path and one line per phase: `Phase N — <title> (<condition summar
|
|
|
153
153
|
|
|
154
154
|
- PRD not found — list available PRDs and ask
|
|
155
155
|
- PRD missing sections — note gaps inline and continue
|
|
156
|
-
-
|
|
156
|
+
- `.tracerkit/plans/` missing — create it
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Create a PRD through user interview, codebase exploration, and module design, saved to
|
|
2
|
+
description: Create a PRD through user interview, codebase exploration, and module design, saved to .tracerkit/prds/. Use when starting a new feature or change.
|
|
3
3
|
argument-hint: <idea>
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ Skip steps already satisfied. If user provided a description via arguments, skip
|
|
|
9
9
|
|
|
10
10
|
## Pre-loaded context
|
|
11
11
|
|
|
12
|
-
- Existing PRDs: !`ls
|
|
12
|
+
- Existing PRDs: !`ls .tracerkit/prds/ 2>&1`
|
|
13
13
|
|
|
14
14
|
## Input
|
|
15
15
|
|
|
@@ -25,9 +25,9 @@ If the argument is provided, derive a slug using this exact algorithm:
|
|
|
25
25
|
4. Take the first 4 remaining words (or fewer if less exist)
|
|
26
26
|
5. Join with hyphens → `<slug>`
|
|
27
27
|
|
|
28
|
-
The output file is
|
|
28
|
+
The output file is `.tracerkit/prds/<slug>.md`.
|
|
29
29
|
|
|
30
|
-
If
|
|
30
|
+
If `.tracerkit/prds/<slug>.md` already exists, tell the user and ask whether to overwrite or pick a new name.
|
|
31
31
|
|
|
32
32
|
## Workflow
|
|
33
33
|
|
|
@@ -84,7 +84,7 @@ Present modules to user. Confirm which need tests.
|
|
|
84
84
|
|
|
85
85
|
### 5. Write PRD
|
|
86
86
|
|
|
87
|
-
Save to
|
|
87
|
+
Save to `.tracerkit/prds/<slug>.md` (create `.tracerkit/prds/` if missing).
|
|
88
88
|
|
|
89
89
|
```markdown
|
|
90
90
|
---
|
|
@@ -161,5 +161,5 @@ Tell the user: file created, one-line summary. Then ask: "Run `/tk:plan <slug>`
|
|
|
161
161
|
|
|
162
162
|
## Error Handling
|
|
163
163
|
|
|
164
|
-
-
|
|
164
|
+
- `.tracerkit/prds/` missing — create it
|
|
165
165
|
- Scope larger than expected — surface and re-scope with user before continuing
|