@dansyuqri/spark-joy 0.2.1 → 0.3.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 +4 -4
- package/dist/app/assets/index-CDcwMAja.js +8 -0
- package/dist/app/assets/index-pgxDJMuQ.css +1 -0
- package/dist/app/index.html +2 -2
- package/dist/cli.js +111 -40
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/plugin/skills/spark-joy/SKILL.md +25 -9
- package/dist/app/assets/index-ChCdW9F8.css +0 -1
- package/dist/app/assets/index-_XxERk0m.js +0 -8
package/package.json
CHANGED
|
@@ -28,7 +28,25 @@ spark-joy show h001..h015 | show h007 h012 | show --file src/api.ts
|
|
|
28
28
|
|
|
29
29
|
Read in batches, never the whole diff at once. Open surrounding source files when you need context.
|
|
30
30
|
|
|
31
|
-
## 3.
|
|
31
|
+
## 3. Agree risk with the user
|
|
32
|
+
|
|
33
|
+
Risk is subjective, so agree what counts as risky before labelling anything.
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
spark-joy rubric
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- If it prints a rubric that covers what this PR touches, use it.
|
|
40
|
+
- Otherwise propose one: at most 2 lines per level, naming areas this repo and PR actually touch. Show it to the user and **wait for them to confirm or edit it**; never assume. Then write `.spark-joy.md` at the repo root and tell the user to commit it, so their team shares it:
|
|
41
|
+
|
|
42
|
+
```md
|
|
43
|
+
# spark-joy
|
|
44
|
+
## Risk
|
|
45
|
+
- high: auth and permissions, payments, DB migrations
|
|
46
|
+
- med: shared utilities, checkout flow
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 4. Write `.spark-joy/<run>/plan.json`
|
|
32
50
|
|
|
33
51
|
```json
|
|
34
52
|
{
|
|
@@ -37,7 +55,7 @@ Read in batches, never the whole diff at once. Open surrounding source files whe
|
|
|
37
55
|
"strategies": [
|
|
38
56
|
{ "id": "layers", "chunks": [
|
|
39
57
|
{ "id": "schema", "title": "Invitations table", "intent": "Pending invites; everything reads this.",
|
|
40
|
-
"hunks": ["h004", "h005"], "risk": "med",
|
|
58
|
+
"hunks": ["h004", "h005"], "risk": "med", "riskReason": "New table on hot query path",
|
|
41
59
|
"reviewFocus": ["Unique (team_id, email) blocks re-invites?"] }
|
|
42
60
|
]},
|
|
43
61
|
{ "id": "features", "chunks": [] }
|
|
@@ -57,6 +75,7 @@ Read in batches, never the whole diff at once. Open surrounding source files whe
|
|
|
57
75
|
| reviewFocus | 2 items × 8 |
|
|
58
76
|
| feature title / description | 4 / 8 |
|
|
59
77
|
| link label | 3 |
|
|
78
|
+
| riskReason | 8 |
|
|
60
79
|
|
|
61
80
|
**Style:** every word costs the reviewer. Write like a commit subject; fragments are fine.
|
|
62
81
|
- Say what it does or what to watch. Never restate the code.
|
|
@@ -77,10 +96,7 @@ Read in batches, never the whole diff at once. Open surrounding source files whe
|
|
|
77
96
|
- A hunk goes with the code it belongs to; pieces of a split hunk may go to different chunks.
|
|
78
97
|
- Tests go with the code they cover, unless they're large.
|
|
79
98
|
- `dependsOn` may only name earlier chunks.
|
|
80
|
-
- `risk`:
|
|
81
|
-
- `high`: auth, security, money, migrations/deletion, concurrency, public API;
|
|
82
|
-
- `med`: behaviour change in shared code;
|
|
83
|
-
- `low`: everything else, and the default.
|
|
99
|
+
- `risk`: `high` or `med` only when a rubric item applies; `low` (the default) otherwise. Every `high` or `med` chunk needs a `riskReason` naming what it touches and the rubric item, e.g. "Changes session token refresh (auth)".
|
|
84
100
|
- `kind`: `core` (the default), `test` or `mechanical`.
|
|
85
101
|
|
|
86
102
|
**skim** is only for mechanical churn: moves, formatting, import order, version bumps. **Never logic.**
|
|
@@ -103,7 +119,7 @@ Add `"links"` to the plan only for the arrows a reviewer must understand, labell
|
|
|
103
119
|
|
|
104
120
|
`from` uses `to`. Unlabelled links still show. Add a link the CLI missed only when it's real.
|
|
105
121
|
|
|
106
|
-
##
|
|
122
|
+
## 5. Validate
|
|
107
123
|
|
|
108
124
|
```
|
|
109
125
|
spark-joy validate
|
|
@@ -111,7 +127,7 @@ spark-joy validate
|
|
|
111
127
|
|
|
112
128
|
Fix every error and re-run until it says `plan ok`. Fix the warnings too.
|
|
113
129
|
|
|
114
|
-
##
|
|
130
|
+
## 6. Serve
|
|
115
131
|
|
|
116
132
|
Run `spark-joy serve` in the background. Reply with the URL and one line: what the PR does and the chunk count. Nothing more.
|
|
117
133
|
|
|
@@ -125,7 +141,7 @@ spark-joy extract --uncommitted # staged + unstaged
|
|
|
125
141
|
spark-joy extract [base] # the whole branch
|
|
126
142
|
```
|
|
127
143
|
|
|
128
|
-
Read the hunks as in step 2, then write the plan with `"mode": "split"` and one strategy, `split`:
|
|
144
|
+
Read the hunks as in step 2 and agree risk as in step 3, then write the plan with `"mode": "split"` and one strategy, `split`:
|
|
129
145
|
|
|
130
146
|
```json
|
|
131
147
|
{
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--bg:#fbfaf8;--panel:#fff;--ink:#1d1d1f;--muted:#6b6b72;--line:#e4e2dd;--accent:#c2410c;--accent-ink:#fff;--add-bg:#e9f8ec;--add-ink:#116329;--del-bg:#fdeceb;--del-ink:#a40e26;--hunk-bg:#f1f0fb;--note-bg:#fff8e5;--done:#15803d;--partial:#b45309;--todo:#9ca3af;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#151518;--panel:#1c1c20;--ink:#ececef;--muted:#9a9aa3;--line:#2e2e34;--accent:#fb923c;--accent-ink:#1a1a1a;--add-bg:#12301c;--add-ink:#7ee2a0;--del-bg:#3a1619;--del-ink:#ff9aa5;--hunk-bg:#23233a;--note-bg:#2f2a18;--done:#4ade80;--partial:#fbbf24;--todo:#6b7280}}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);margin:0;font:14px/1.5 system-ui,-apple-system,Segoe UI,sans-serif}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}code,kbd{font-family:var(--mono);font-size:.92em}kbd{border:1px solid var(--line);border-radius:4px;padding:0 4px}button{font:inherit;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer;border-radius:6px;padding:6px 12px}button:hover:not(:disabled){border-color:var(--muted)}button:disabled{opacity:.4;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);font-weight:600}textarea{font:inherit;border:1px solid var(--line);background:var(--panel);width:100%;min-height:70px;color:var(--ink);resize:vertical;border-radius:6px;padding:8px}.muted{color:var(--muted)}.small{font-size:12px}.warn{color:var(--partial)}.pre{white-space:pre-wrap}.empty{max-width:640px;margin:80px auto;padding:0 16px}.topbar{z-index:10;background:var(--panel);border-bottom:1px solid var(--line);align-items:center;gap:20px;padding:10px 20px;display:flex;position:sticky;top:0}.brand{white-space:nowrap;font-weight:700}.spark{color:var(--accent)}.run{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.tabs{gap:4px;display:flex}.tabs a{color:var(--muted);border-radius:6px;padding:4px 10px}.tabs a.on{background:var(--hunk-bg);color:var(--ink);font-weight:600}.progress{font-variant-numeric:tabular-nums;align-items:center;gap:8px;display:flex}.progress .bar{background:var(--line);border-radius:3px;width:120px;height:6px;overflow:hidden}.progress .bar div{background:var(--done);height:100%;transition:width .2s}.saving{width:70px;color:var(--muted);font-size:12px}.saving.error{color:var(--del-ink)}.status{vertical-align:-2px;justify-content:center;align-self:center;width:1.2em;display:inline-flex}.status.done{color:var(--done)}.status.partial{color:var(--partial)}.status.todo{color:var(--todo)}.badge{border:1px solid var(--line);color:var(--muted);white-space:nowrap;border-radius:10px;margin-left:6px;padding:0 6px;font-size:11px;display:inline-block}.risk{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-left:8px;display:inline-block}.risk-high{background:var(--del-ink)}.risk-med{background:var(--partial)}.issues{border:1px solid var(--line);background:var(--panel);border-radius:8px;margin:12px 0;padding:8px 12px}.issues.has-errors{border-color:var(--del-ink)}.issues li.error{color:var(--del-ink)}.issues li.warning{color:var(--partial)}.page{max-width:1200px;padding:24px 32px 80px}.overview{max-width:800px;font-size:15px}.strategies{grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;display:grid}.strategy{background:var(--panel);border:1px solid var(--line);border-radius:10px;flex-direction:column;padding:16px;display:flex}.strategy.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.strategy h3{margin:0 0 4px}.strategy .stats{color:var(--muted);font-size:12px}.chunk-list{flex:1;padding-left:0;list-style:none}.chunk-list .n{min-width:1.6em;color:var(--muted);font-variant-numeric:tabular-nums}.chunk-list li{align-items:center;gap:4px;padding:3px 0;display:flex}.chunk-list li .title{flex:1}.chunk-list .branch{color:var(--muted);font-size:11px;display:block}.strategy .hint{color:var(--muted);margin:10px 0 0;font-size:12px}.size{font-variant-numeric:tabular-nums;color:var(--muted);margin-left:6px;font-size:12px}.features li{margin-bottom:6px}.review{grid-template-columns:300px 1fr;align-items:start;display:grid}.sidebar{border-right:1px solid var(--line);max-height:calc(100vh - 53px);padding:16px 8px 16px 16px;position:sticky;top:53px;overflow:auto}.sidebar ol{margin:8px 0;padding:0;list-style:none}.sidebar li a{color:var(--ink);border-radius:6px;align-items:baseline;gap:6px;padding:5px 8px;display:flex}.sidebar li a:hover{background:var(--hunk-bg);text-decoration:none}.sidebar li.on a{background:var(--hunk-bg);font-weight:600}.sidebar li.skim{border-top:1px dashed var(--line);margin-top:8px;padding-top:8px}.sidebar .n{color:var(--muted);font-variant-numeric:tabular-nums;min-width:1.4em}.sidebar .title{flex:1}.chunk-head h1{margin:0 0 2px;font-size:20px}.chunk-head .intent{max-width:820px;margin:6px 0 0;font-size:15px}.focus{max-width:820px;color:var(--muted);margin:6px 0 0;padding-left:18px}.diff{margin-top:16px}.file{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:14px;overflow:hidden}.file>summary{cursor:pointer;border-bottom:1px solid var(--line);align-items:center;gap:4px;padding:8px 12px;display:flex}.file:not([open])>summary{border-bottom:none}.file .path{font-family:var(--mono);font-weight:600}.file .counts{font-family:var(--mono);margin-left:auto;font-size:12px}.add{color:var(--add-ink)}.del{color:var(--del-ink)}.file table{border-collapse:collapse;width:100%;font-family:var(--mono);table-layout:fixed;font-size:12.5px}.file col.no-col{width:52px}.file td.no{text-align:right;color:var(--muted);-webkit-user-select:none;user-select:none;cursor:pointer;vertical-align:top;padding:0 8px}.file td.no:hover{color:var(--accent)}.file td.code{white-space:pre-wrap;word-break:break-all;padding:0 8px}.sign{width:1.2em;color:var(--muted);-webkit-user-select:none;user-select:none;display:inline-block}tr.add td{background:var(--add-bg)}tr.del td{background:var(--del-bg)}tr.meta td{color:var(--muted);font-style:italic}tr.hunk-header td{background:var(--hunk-bg);color:var(--muted);padding:3px 8px}.hid{color:var(--ink);font-weight:700}tr.placeholder td{color:var(--muted);padding:8px;font-family:system-ui,sans-serif}tr.note-row td{background:var(--bg);padding:6px 12px 6px 112px}.line-note{background:var(--note-bg);border:1px solid var(--line);border-radius:6px;padding:8px 10px;font-family:system-ui,sans-serif;font-size:13px}.line-note .text{white-space:pre-wrap;cursor:text}.line-note .actions{gap:6px;margin-top:6px;display:flex}.line-note .actions button{padding:2px 8px;font-size:12px}.chunk-foot{background:var(--bg);border-top:1px solid var(--line);align-items:flex-end;gap:8px;padding:10px 0;display:flex;position:sticky;bottom:0}.chunk-foot textarea{flex:1;height:34px;min-height:34px;padding:6px 8px;transition:height .1s}.chunk-foot textarea:focus,.chunk-foot textarea:not(:placeholder-shown){height:80px}.totals{margin:0 0 8px;font-size:18px}.chunk-refs a{font-variant-numeric:tabular-nums;margin-left:8px;font-size:12px}.features{padding:0;list-style:none}.note-group{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:10px;padding:10px 16px}.note-group p{margin:6px 0}.export textarea{min-height:300px;font-family:var(--mono);font-size:12px}@media (width<=900px){.review{grid-template-columns:1fr}.sidebar{border-right:none;border-bottom:1px solid var(--line);max-height:none;position:static}.page{padding:16px}.run{display:none}}.file{scroll-margin-top:64px}.map-page{flex-direction:column;height:calc(100vh - 53px);display:flex}.crumbs{color:var(--muted);padding:10px 20px;font-size:13px}.map-canvas{cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;flex:1;position:relative;overflow:hidden}.map-canvas:active{cursor:grabbing}.empty-map{padding:20px}.zoom-in{transform-box:fill-box;animation:.22s ease-out zoom-in}@keyframes zoom-in{0%{opacity:0}}.node{cursor:pointer}.node rect{fill:var(--panel);stroke:var(--line);stroke-width:1.2px}.node:hover rect{stroke:var(--accent)}.node.neighbour rect{fill:var(--bg);stroke-dasharray:4 3}.node.neighbour text{opacity:.7}.node text{fill:var(--ink);font-size:13px}.node .title{font-weight:600}.node.file .title{font-family:var(--mono);font-size:12.5px}.node .n{fill:var(--muted);font-weight:400}.node .meta{fill:var(--muted);font-size:11px}.node .status.done{color:var(--done)}.node .status.partial{color:var(--partial)}.node .status.todo{color:var(--todo)}.node .risk-high{fill:var(--del-ink)}.node .risk-med{fill:var(--partial)}.edge path{fill:none;stroke:var(--muted);opacity:.7;transition:opacity .15s}.edge.link path{stroke-dasharray:5 4}.edge.faded{opacity:.15}.arrowhead{fill:var(--muted)}.edge-label rect{fill:var(--bg);stroke:var(--line)}.edge-label text{fill:var(--ink);font-size:11px}
|