@imix-js/taproot 0.2.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.
Files changed (3) hide show
  1. package/README.md +12 -22
  2. package/docs/demo.svg +51 -50
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -4,46 +4,36 @@
4
4
  <img src="docs/demo.svg" alt="Taproot demo — npx taproot init, /tr-ineed, taproot dod" width="700"/>
5
5
  </p>
6
6
 
7
- **Your AI coding agent finally knows why.**
7
+ **AI-driven specs, enforced at commit time. Code without traceability doesn't merge.**
8
8
 
9
9
  AI coding agents generate code fast — but six months later, nobody knows *why* a module exists, who asked for it, or whether it's still needed. The requirement lived in a chat window. The chat window is gone.
10
10
 
11
- Taproot keeps requirements as first-class files in your repo git-versioned, agent-readable, and validated on every commit.
11
+ Taproot keeps requirements as first-class files in your repo. The agent writes the spec, writes the code, and git refuses to accept one without the other.
12
12
 
13
13
  ## Quick Start
14
14
 
15
15
  ```bash
16
- npm install -g @imix-js/taproot
17
- taproot init
16
+ npx @imix-js/taproot init # installs agent adapter + pre-commit hook
18
17
  ```
19
18
 
20
- Taproot will ask which agent adapter to install and whether to set up the pre-commit hook. Then open your agent and run:
19
+ Then in your agent:
21
20
 
22
21
  ```
23
- /tr-guide
22
+ /tr-ineed user authentication # describe a requirement → spec written + placed
23
+ /tr-implement taproot/auth/ # implement it: code + tests + traceability, committed
24
24
  ```
25
25
 
26
- That's it. The guide walks you through the rest.
26
+ That's the loop. Spec first, code second, git enforces both.
27
27
 
28
- ## The workflow
29
-
30
- Once taproot is set up, your AI agent has the full workflow available as slash commands:
28
+ ---
31
29
 
32
30
  ```
33
- /tr-ineed user authentication route any requirement into the hierarchy
34
- (discovery, spec writing, placement)
35
-
36
- /tr-implement taproot/auth/login/ ← implement a behaviour: code + tests +
37
- traceability record, committed atomically
38
-
39
- /tr-status ← health dashboard: coverage, orphans,
40
- stale specs, parked items
41
-
42
- /tr-discover ← reverse-engineer an existing codebase
43
- into a taproot hierarchy
31
+ /tr-guide onboarding walkthrough
32
+ /tr-status ← health dashboard: coverage, orphans, stale specs
33
+ /tr-discover ← reverse-engineer an existing codebase into taproot
44
34
  ```
45
35
 
46
- The full list is in [docs/workflows.md](docs/workflows.md).
36
+ Full workflow guide: [docs/workflows.md](docs/workflows.md)
47
37
 
48
38
  ## Why it matters
49
39
 
package/docs/demo.svg CHANGED
@@ -1,40 +1,37 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 420" width="700" height="420">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 460" width="700" height="460">
2
2
  <defs>
3
3
  <style>
4
4
  .terminal { font-family: 'Menlo', 'Monaco', 'Consolas', 'Courier New', monospace; font-size: 13px; }
5
5
 
6
- /* cursor blink */
7
6
  @keyframes blink { 0%,49%{opacity:1} 50%,100%{opacity:0} }
8
7
  .cursor { fill: #e8e8e8; animation: blink 1s step-start infinite; }
9
8
 
10
- /* fade in blocks */
11
9
  @keyframes fadeIn { from{opacity:0} to{opacity:1} }
12
10
 
13
11
  .clip1 { animation: fadeIn 0.01s 0.5s both; opacity:0; }
14
- .clip2 { animation: fadeIn 0.01s 2.2s both; opacity:0; }
15
- .clip3 { animation: fadeIn 0.01s 3.0s both; opacity:0; }
16
- .clip4 { animation: fadeIn 0.01s 3.6s both; opacity:0; }
17
- .clip5 { animation: fadeIn 0.01s 5.0s both; opacity:0; }
18
- .clip6 { animation: fadeIn 0.01s 5.8s both; opacity:0; }
19
- .clip7 { animation: fadeIn 0.01s 6.4s both; opacity:0; }
20
- .clip8 { animation: fadeIn 0.01s 7.2s both; opacity:0; }
21
- .clip9 { animation: fadeIn 0.01s 8.0s both; opacity:0; }
22
- .clip10 { animation: fadeIn 0.01s 8.6s both; opacity:0; }
23
- .clip11 { animation: fadeIn 0.01s 9.2s both; opacity:0; }
24
- .clip12 { animation: fadeIn 0.01s 9.8s both; opacity:0; }
25
- .clip13 { animation: fadeIn 0.01s 10.4s both; opacity:0; }
26
- .clip14 { animation: fadeIn 0.01s 11.0s both; opacity:0; }
27
- .clip15 { animation: fadeIn 0.01s 11.6s both; opacity:0; }
28
- .clip16 { animation: fadeIn 0.01s 12.2s both; opacity:0; }
12
+ .clip2 { animation: fadeIn 0.01s 1.8s both; opacity:0; }
13
+ .clip3 { animation: fadeIn 0.01s 2.8s both; opacity:0; }
14
+ .clip4 { animation: fadeIn 0.01s 3.8s both; opacity:0; }
15
+ .clip5 { animation: fadeIn 0.01s 4.6s both; opacity:0; }
16
+ .clip6 { animation: fadeIn 0.01s 5.4s both; opacity:0; }
17
+ .clip7 { animation: fadeIn 0.01s 6.2s both; opacity:0; }
18
+ .clip8 { animation: fadeIn 0.01s 7.0s both; opacity:0; }
19
+ .clip9 { animation: fadeIn 0.01s 7.8s both; opacity:0; }
20
+ .clip10 { animation: fadeIn 0.01s 8.8s both; opacity:0; }
21
+ .clip11 { animation: fadeIn 0.01s 9.8s both; opacity:0; }
22
+ .clip12 { animation: fadeIn 0.01s 10.6s both; opacity:0; }
23
+ .clip13 { animation: fadeIn 0.01s 11.4s both; opacity:0; }
24
+ .clip14 { animation: fadeIn 0.01s 12.2s both; opacity:0; }
25
+ .clip15 { animation: fadeIn 0.01s 13.0s both; opacity:0; }
26
+ .clip16 { animation: fadeIn 0.01s 13.8s both; opacity:0; }
29
27
 
30
- /* full reset loop */
31
28
  @keyframes loopReset { 0%{opacity:1} 97%{opacity:1} 99%{opacity:0} 100%{opacity:0} }
32
- .looping { animation: loopReset 14s linear infinite; }
29
+ .looping { animation: loopReset 16s linear infinite; }
33
30
  </style>
34
31
  </defs>
35
32
 
36
33
  <!-- window chrome -->
37
- <rect width="700" height="420" rx="10" fill="#1e1e1e"/>
34
+ <rect width="700" height="460" rx="10" fill="#1e1e1e"/>
38
35
  <rect width="700" height="34" rx="10" fill="#2d2d2d"/>
39
36
  <rect y="24" width="700" height="10" fill="#2d2d2d"/>
40
37
  <circle cx="20" cy="17" r="6" fill="#ff5f57"/>
@@ -45,63 +42,67 @@
45
42
  <g class="looping">
46
43
  <g class="terminal" transform="translate(24, 60)">
47
44
 
48
- <!-- npx taproot init -->
45
+ <!-- 1. npx init -->
49
46
  <g class="clip1">
50
- <text><tspan fill="#7eca5c">~/myproject</tspan><tspan fill="#666"> $ </tspan><tspan fill="#e8e8e8">npx taproot init --agent claude --with-hooks</tspan></text>
47
+ <text><tspan fill="#7eca5c">~/myproject</tspan><tspan fill="#666"> $ </tspan><tspan fill="#e8e8e8">npx @imix-js/taproot init</tspan></text>
51
48
  </g>
52
- <g class="clip2" transform="translate(0,22)">
53
- <text><tspan fill="#7eca5c">created </tspan><tspan fill="#888"> .taproot/skills/ (18 skills)</tspan></text>
49
+ <g class="clip2" transform="translate(0,20)">
50
+ <text><tspan fill="#7eca5c">created </tspan><tspan fill="#888"> .taproot/ (18 skills, settings)</tspan></text>
54
51
  </g>
55
- <g class="clip3" transform="translate(0,40)">
56
- <text><tspan fill="#7eca5c">created </tspan><tspan fill="#888"> .taproot/settings.yaml</tspan></text>
57
- </g>
58
- <g class="clip4" transform="translate(0,58)">
59
- <text><tspan fill="#7eca5c">installed</tspan><tspan fill="#888"> .claude/commands/ (Claude adapter)</tspan></text>
60
- </g>
61
- <g class="clip5" transform="translate(0,76)">
62
- <text><tspan fill="#7eca5c">installed</tspan><tspan fill="#888"> .git/hooks/pre-commit</tspan></text>
52
+ <g class="clip3" transform="translate(0,38)">
53
+ <text><tspan fill="#7eca5c">installed</tspan><tspan fill="#888"> .claude/commands/ + .git/hooks/pre-commit</tspan></text>
63
54
  </g>
64
55
 
65
56
  <!-- divider -->
66
- <g class="clip6" transform="translate(0,104)">
57
+ <g class="clip4" transform="translate(0,62)">
67
58
  <text fill="#444">──────────────────────────────────────────────</text>
68
59
  </g>
69
60
 
70
- <!-- /tr-ineed -->
71
- <g class="clip7" transform="translate(0,126)">
61
+ <!-- 2. /tr-ineed -->
62
+ <g class="clip5" transform="translate(0,82)">
72
63
  <text><tspan fill="#7eca5c">claude</tspan><tspan fill="#666"> › </tspan><tspan fill="#e8e8e8">/tr-ineed user authentication</tspan></text>
73
64
  </g>
74
- <g class="clip8" transform="translate(0,148)">
65
+ <g class="clip6" transform="translate(0,102)">
75
66
  <text><tspan fill="#569cd6">Actor: </tspan><tspan fill="#e8e8e8">Developer signing in for the first time</tspan></text>
76
67
  </g>
77
- <g class="clip9" transform="translate(0,166)">
78
- <text><tspan fill="#569cd6">Need: </tspan><tspan fill="#e8e8e8">Verify identity before accessing the app</tspan></text>
68
+ <g class="clip7" transform="translate(0,120)">
69
+ <text><tspan fill="#7eca5c">written </tspan><tspan fill="#888"> taproot/auth/login/usecase.md</tspan></text>
70
+ </g>
71
+
72
+ <!-- divider -->
73
+ <g class="clip8" transform="translate(0,144)">
74
+ <text fill="#444">──────────────────────────────────────────────</text>
75
+ </g>
76
+
77
+ <!-- 3. /tr-implement -->
78
+ <g class="clip9" transform="translate(0,164)">
79
+ <text><tspan fill="#7eca5c">claude</tspan><tspan fill="#666"> › </tspan><tspan fill="#e8e8e8">/tr-implement taproot/auth/login/</tspan></text>
79
80
  </g>
80
81
  <g class="clip10" transform="translate(0,184)">
81
- <text><tspan fill="#7eca5c">written </tspan><tspan fill="#888"> taproot/auth/login/usecase.md</tspan></text>
82
+ <text><tspan fill="#7eca5c">written </tspan><tspan fill="#888"> src/auth/login.ts + test/auth/login.test.ts</tspan></text>
83
+ </g>
84
+ <g class="clip11" transform="translate(0,202)">
85
+ <text><tspan fill="#7eca5c">committed</tspan><tspan fill="#888"> taproot(auth/login): implement login flow</tspan></text>
82
86
  </g>
83
87
 
84
88
  <!-- divider -->
85
- <g class="clip11" transform="translate(0,210)">
89
+ <g class="clip12" transform="translate(0,226)">
86
90
  <text fill="#444">──────────────────────────────────────────────</text>
87
91
  </g>
88
92
 
89
- <!-- taproot dod -->
90
- <g class="clip12" transform="translate(0,232)">
93
+ <!-- 4. taproot dod -->
94
+ <g class="clip13" transform="translate(0,246)">
91
95
  <text><tspan fill="#7eca5c">~/myproject</tspan><tspan fill="#666"> $ </tspan><tspan fill="#e8e8e8">taproot dod taproot/auth/login/impl.md</tspan></text>
92
96
  </g>
93
- <g class="clip13" transform="translate(0,254)">
97
+ <g class="clip14" transform="translate(0,266)">
94
98
  <text><tspan fill="#7eca5c"> ✓ </tspan><tspan fill="#888">baseline-validate-format</tspan></text>
95
99
  </g>
96
- <g class="clip14" transform="translate(0,272)">
97
- <text><tspan fill="#7eca5c"> ✓ </tspan><tspan fill="#888">tests-passing</tspan></text>
98
- </g>
99
- <g class="clip15" transform="translate(0,290)">
100
+ <g class="clip15" transform="translate(0,284)">
100
101
  <text><tspan fill="#7eca5c"> ✓ All checks passed. Marked </tspan><tspan fill="#4ec9b0">impl.md</tspan><tspan fill="#7eca5c"> complete.</tspan></text>
101
102
  </g>
102
103
 
103
- <!-- cursor prompt — appears after last line -->
104
- <g class="clip16" transform="translate(0,315)">
104
+ <!-- cursor -->
105
+ <g class="clip16" transform="translate(0,310)">
105
106
  <text><tspan fill="#7eca5c">~/myproject</tspan><tspan fill="#666"> $ </tspan></text>
106
107
  <rect class="cursor" x="124" y="-13" width="8" height="15"/>
107
108
  </g>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@imix-js/taproot",
3
- "version": "0.2.0",
4
- "description": "Folder-based requirement hierarchy with CLI validation and AI skills",
3
+ "version": "0.2.1",
4
+ "description": "AI-driven specs, enforced at commit time. Code without traceability doesn't merge.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "taproot": "./dist/cli.js"