@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.
- package/README.md +12 -22
- package/docs/demo.svg +51 -50
- 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
|
-
**
|
|
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
|
|
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
|
-
|
|
17
|
-
taproot init
|
|
16
|
+
npx @imix-js/taproot init # installs agent adapter + pre-commit hook
|
|
18
17
|
```
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
Then in your agent:
|
|
21
20
|
|
|
22
21
|
```
|
|
23
|
-
/tr-
|
|
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
|
|
26
|
+
That's the loop. Spec first, code second, git enforces both.
|
|
27
27
|
|
|
28
|
-
|
|
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-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
15
|
-
.clip3 { animation: fadeIn 0.01s
|
|
16
|
-
.clip4 { animation: fadeIn 0.01s 3.
|
|
17
|
-
.clip5 { animation: fadeIn 0.01s
|
|
18
|
-
.clip6 { animation: fadeIn 0.01s 5.
|
|
19
|
-
.clip7 { animation: fadeIn 0.01s 6.
|
|
20
|
-
.clip8 { animation: fadeIn 0.01s 7.
|
|
21
|
-
.clip9 { animation: fadeIn 0.01s
|
|
22
|
-
.clip10 { animation: fadeIn 0.01s 8.
|
|
23
|
-
.clip11 { animation: fadeIn 0.01s 9.
|
|
24
|
-
.clip12 { animation: fadeIn 0.01s
|
|
25
|
-
.clip13 { animation: fadeIn 0.01s
|
|
26
|
-
.clip14 { animation: fadeIn 0.01s
|
|
27
|
-
.clip15 { animation: fadeIn 0.01s
|
|
28
|
-
.clip16 { animation: fadeIn 0.01s
|
|
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
|
|
29
|
+
.looping { animation: loopReset 16s linear infinite; }
|
|
33
30
|
</style>
|
|
34
31
|
</defs>
|
|
35
32
|
|
|
36
33
|
<!-- window chrome -->
|
|
37
|
-
<rect width="700" height="
|
|
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
|
|
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
|
|
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,
|
|
53
|
-
<text><tspan fill="#7eca5c">created </tspan><tspan fill="#888"> .taproot/
|
|
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,
|
|
56
|
-
<text><tspan fill="#7eca5c">
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
78
|
-
<text><tspan fill="#
|
|
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">
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
104
|
-
<g class="clip16" transform="translate(0,
|
|
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.
|
|
4
|
-
"description": "
|
|
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"
|