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 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
- $ npm install -g tracerkit
32
- $ tracerkit init
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-Bgs58wa2.js";
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-Bgs58wa2.js";
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)), "..", "templates");
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, t) {
66
- return e.replaceAll("{{paths.prds}}", t.paths.prds).replaceAll("{{paths.plans}}", t.paths.plans).replaceAll("{{paths.archives}}", t.paths.archives);
65
+ function y(e) {
66
+ return `.claude/skills/tk:${e}`;
67
67
  }
68
- function b(e, r, i) {
69
- let c = i ?? v(_);
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, y(n(c, "utf8"), r));
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 x(e) {
83
+ function C(e) {
77
84
  return c("sha256").update(e).digest("hex");
78
85
  }
79
- function S(t, r) {
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 = y(n(s(_, l), "utf8"), r);
86
- x(Buffer.from(e)) === x(n(i)) ? a.push(l) : o.push(l);
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 C(t, n) {
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 } = S(t, r), l = [];
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
- b(t, r, m);
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 w(t) {
127
- if (f.some((n) => e(s(t, ".claude", "skills", n)))) return C(t);
128
- let { copied: n } = b(t, d(t));
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 T(t) {
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, w as n, p as o, C as r, m as s, T as t };
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.10.2",
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
- "templates"
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 {{paths.prds}}/ 2>&1`
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 `{{paths.prds}}/`:
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 `{{paths.plans}}/<slug>.md` exists. If it does:
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 `{{paths.plans}}/<slug>.md`)
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 {{paths.plans}}/ 2>&1`
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 `{{paths.prds}}/`:
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 `{{paths.plans}}/<slug>.md` exists, count progress (see Progress Algorithm below). Show `—` if no plan.
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 `{{paths.plans}}/<slug>.md`. If it does not exist, list available plans and ask.
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 `{{paths.plans}}/<slug>.md` to `[x]` or `[ ]`.
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 `{{paths.plans}}/<slug>.md`:
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 `{{paths.archives}}/<slug>/`
135
- 2. If `{{paths.prds}}/<slug>.md` exists:
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 `{{paths.archives}}/<slug>/prd.md`
140
- 3. Read `{{paths.plans}}/<slug>.md`
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 `{{paths.archives}}/<slug>/plan.md`
143
- 4. Delete `{{paths.prds}}/<slug>.md` (if it exists)
144
- 5. Delete `{{paths.plans}}/<slug>.md`
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 `{{paths.archives}}/<slug>/`, one-line summary of the feature.
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
- - `{{paths.plans}}/` missing — tell user to run `/tk:plan` first
168
- - `{{paths.archives}}/<slug>/` already exists — warn and ask whether to remove it first
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 {{paths.plans}}/. Use after /tk:prd.
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: `{{paths.plans}}/<slug>.md`.
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 {{paths.prds}}/ 2>&1`
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 `{{paths.prds}}/<slug>.md`. If it does not exist, list available PRDs and ask.
24
+ Read `.tracerkit/prds/<slug>.md`. If it does not exist, list available PRDs and ask.
25
25
 
26
- If `{{paths.plans}}/<slug>.md` already exists, tell the user and ask whether to overwrite or pick a new name.
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 `{{paths.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 `---`.
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 `{{paths.plans}}/<slug>.md` (create `{{paths.plans}}/` if missing).
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: `{{paths.prds}}/<slug>.md`
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
- - `{{paths.plans}}/` missing — create it
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 {{paths.prds}}/. Use when starting a new feature or change.
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 {{paths.prds}}/ 2>&1`
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 `{{paths.prds}}/<slug>.md`.
28
+ The output file is `.tracerkit/prds/<slug>.md`.
29
29
 
30
- If `{{paths.prds}}/<slug>.md` already exists, tell the user and ask whether to overwrite or pick a new name.
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 `{{paths.prds}}/<slug>.md` (create `{{paths.prds}}/` if missing).
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
- - `{{paths.prds}}/` missing — create it
164
+ - `.tracerkit/prds/` missing — create it
165
165
  - Scope larger than expected — surface and re-scope with user before continuing