quiver-cli 0.6.0 → 0.8.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/LICENSE +21 -0
- package/dist/cli.js +314 -86
- package/package.json +1 -1
- package/template/.agents/skills/agent-browser/SKILL.md +4 -9
- package/template/.agents/skills/apps/skybridge/SKILL.md +1 -1
- package/template/.agents/skills/code/improve/SKILL.md +9 -5
- package/template/.agents/skills/code/improve/references/audit-playbook.md +10 -10
- package/template/.agents/skills/code/improve/references/closing-the-loop.md +4 -3
- package/template/.agents/skills/code/improve/references/plan-template.md +5 -0
- package/template/.agents/skills/design/impeccable/SKILL.md +14 -24
- package/template/.agents/skills/design/impeccable/reference/animate.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/bolder.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/brand.md +2 -2
- package/template/.agents/skills/design/impeccable/reference/colorize.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/critique.md +6 -6
- package/template/.agents/skills/design/impeccable/reference/delight.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/distill.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/document.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/extract.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/hooks.md +90 -0
- package/template/.agents/skills/design/impeccable/reference/init.md +5 -5
- package/template/.agents/skills/design/impeccable/reference/live.md +16 -16
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/polish.md +2 -2
- package/template/.agents/skills/design/impeccable/reference/quieter.md +1 -1
- package/template/.agents/skills/design/impeccable/reference/shape.md +2 -2
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +1 -1
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +724 -33
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +1 -1
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +204 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +57 -11
- package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +750 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +633 -46
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +7 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +29 -4
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +43 -10
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +29 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +27 -1
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +1 -1
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +29 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +401 -46
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +661 -0
- package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +476 -0
- package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +1632 -0
- package/template/.agents/skills/design/impeccable/scripts/hook.mjs +61 -0
- package/template/.agents/skills/design/impeccable/scripts/{design-parser.mjs → lib/design-parser.mjs} +8 -1
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +638 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/target-args.mjs +42 -0
- package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +49 -0
- package/template/.agents/skills/design/impeccable/scripts/{live-event-validation.mjs → live/event-validation.mjs} +6 -5
- package/template/.agents/skills/design/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/template/.agents/skills/design/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/template/.agents/skills/design/impeccable/scripts/{live-manual-edits-buffer.mjs → live/manual-edits-buffer.mjs} +1 -1
- package/template/.agents/skills/design/impeccable/scripts/{live-session-store.mjs → live/session-store.mjs} +1 -1
- package/template/.agents/skills/design/impeccable/scripts/{live-ui-core.mjs → live/ui-core.mjs} +2 -1
- package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +36 -0
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +3 -3
- package/template/.agents/skills/design/impeccable/scripts/live-browser-dom.js +146 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +1456 -599
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +2 -2
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +2 -2
- package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +1 -1
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +35 -9
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +2 -2
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +18 -13
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +1 -1
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +77 -1264
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +2 -2
- package/template/.agents/skills/design/impeccable/scripts/live-target.mjs +30 -0
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +4 -4
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +73 -22
- package/template/.agents/skills/writing/humanizer/SKILL.md +621 -0
- package/template/.agents/upstreams.json +17 -8
- package/template/.agents/skills/apps/skybridge/references/architecture.md +0 -175
- package/template/.agents/skills/apps/skybridge/references/copy-template.md +0 -24
- package/template/.agents/skills/apps/skybridge/references/csp.md +0 -33
- package/template/.agents/skills/apps/skybridge/references/deploy.md +0 -33
- package/template/.agents/skills/apps/skybridge/references/discover.md +0 -84
- package/template/.agents/skills/apps/skybridge/references/download-file.md +0 -77
- package/template/.agents/skills/apps/skybridge/references/fetch-and-render-data.md +0 -151
- package/template/.agents/skills/apps/skybridge/references/oauth.md +0 -115
- package/template/.agents/skills/apps/skybridge/references/open-external-links.md +0 -71
- package/template/.agents/skills/apps/skybridge/references/prompt-llm.md +0 -20
- package/template/.agents/skills/apps/skybridge/references/publish.md +0 -19
- package/template/.agents/skills/apps/skybridge/references/run-locally.md +0 -51
- package/template/.agents/skills/apps/skybridge/references/state-and-context.md +0 -151
- package/template/.agents/skills/apps/skybridge/references/ui-guidelines.md +0 -205
- package/template/.agents/skills/design/impeccable/scripts/cleanup-deprecated.mjs +0 -284
- package/template/.agents/skills/design/impeccable/scripts/impeccable-paths.mjs +0 -126
- /package/template/.agents/skills/design/impeccable/scripts/{is-generated.mjs → lib/is-generated.mjs} +0 -0
- /package/template/.agents/skills/design/impeccable/scripts/{live-completion.mjs → live/completion.mjs} +0 -0
- /package/template/.agents/skills/design/impeccable/scripts/{live-insert-ui.mjs → live/insert-ui.mjs} +0 -0
- /package/template/.agents/skills/design/impeccable/scripts/{live-svelte-component.mjs → live/svelte-component.mjs} +0 -0
- /package/template/.agents/skills/design/impeccable/scripts/{live-sveltekit-adapter.mjs → live/sveltekit-adapter.mjs} +0 -0
|
@@ -8,7 +8,7 @@ A running dev server with hot module replacement (Vite, Next.js, Bun, etc.), OR
|
|
|
8
8
|
|
|
9
9
|
Execute in order. No step skipped, no step reordered.
|
|
10
10
|
|
|
11
|
-
1. `live.mjs`: boot.
|
|
11
|
+
1. `live.mjs`: boot. If the request names or implies a file, route, or app inside a monorepo, infer the concrete path and run `node .pi/skills/impeccable/scripts/live.mjs --target <path>` instead; then run the rest of this live session from the returned `projectRoot`.
|
|
12
12
|
2. Open the app URL that serves `pageFile` (infer from `package.json`, docs, terminal output, or an open tab). Never use `serverPort`; it's the helper, not the app. **Cursor:** `browser_navigate` to that URL before polling; do not skip. **Other harnesses:** use the available browser tool; if the URL is uncertain, ask the user once.
|
|
13
13
|
3. Poll loop with the default long timeout (600000 ms). After every event or `--reply`, run `live-poll.mjs` again immediately. Never pass a short `--timeout=`.
|
|
14
14
|
|
|
@@ -30,7 +30,7 @@ Chat is overhead. No recap, no tutorial output, no pasting PRODUCT / DESIGN bodi
|
|
|
30
30
|
## Start
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
node .
|
|
33
|
+
node .pi/skills/impeccable/scripts/live.mjs
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Output JSON: `{ ok, serverPort, serverToken, pageFiles, hasProduct, product, productPath, hasDesign, design, designPath }`. `pageFiles` is the list of HTML entries the live script was injected into. Keep PRODUCT.md and DESIGN.md in mind for variant generation; **DESIGN.md wins on visual decisions; PRODUCT.md wins on strategic/voice decisions.** When DESIGN.md is missing, identity is **not** absent; extract it from CSS variables, computed styles, and sibling components on the page (see Step 4 Phase A). Identity preservation is the default; departure from existing identity requires an explicit trigger from PRODUCT.md anti-references or the user's freeform prompt.
|
|
@@ -45,7 +45,7 @@ If output is `{ ok: false, error: "config_missing" | "config_invalid", path }`,
|
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
LOOP:
|
|
48
|
-
node .
|
|
48
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs # default long timeout; no --timeout=
|
|
49
49
|
Read JSON; dispatch on "type"
|
|
50
50
|
|
|
51
51
|
"generate" → Handle Generate; reply done; LOOP
|
|
@@ -61,7 +61,7 @@ LOOP:
|
|
|
61
61
|
**Stream mode (experimental, not for Cursor):**
|
|
62
62
|
|
|
63
63
|
```
|
|
64
|
-
node .
|
|
64
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs --stream # stays running; one JSON line per event
|
|
65
65
|
Handle event; run --reply in a separate command
|
|
66
66
|
Repeat until "exit" line → Cleanup
|
|
67
67
|
```
|
|
@@ -75,9 +75,9 @@ The live helper persists an append-only journal under `.impeccable/live/sessions
|
|
|
75
75
|
Use these commands when the chat was interrupted, polling was missed, the helper restarted, or the browser reloaded:
|
|
76
76
|
|
|
77
77
|
```bash
|
|
78
|
-
node .
|
|
79
|
-
node .
|
|
80
|
-
node .
|
|
78
|
+
node .pi/skills/impeccable/scripts/live-status.mjs
|
|
79
|
+
node .pi/skills/impeccable/scripts/live-resume.mjs --id SESSION_ID
|
|
80
|
+
node .pi/skills/impeccable/scripts/live-complete.mjs --id SESSION_ID
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
- `live-status.mjs` prints connected helper state, active durable sessions, and queued pending events. It works even when the helper is down by reading the journal directly.
|
|
@@ -102,7 +102,7 @@ When `event.mode === "insert"`:
|
|
|
102
102
|
2. Run the insert helper instead of wrap:
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
|
-
node .
|
|
105
|
+
node .pi/skills/impeccable/scripts/live-insert.mjs --id EVENT_ID --count EVENT_COUNT --position after \
|
|
106
106
|
--element-id "ANCHOR_ID" --classes "class1,class2" --tag "section" --text "ANCHOR_TEXT"
|
|
107
107
|
```
|
|
108
108
|
|
|
@@ -135,7 +135,7 @@ Reading annotations precisely:
|
|
|
135
135
|
### 2. Wrap the element
|
|
136
136
|
|
|
137
137
|
```bash
|
|
138
|
-
node .
|
|
138
|
+
node .pi/skills/impeccable/scripts/live-wrap.mjs --id EVENT_ID --count EVENT_COUNT --element-id "ELEMENT_ID" --classes "class1,class2" --tag "div" --text "TEXT_SNIPPET"
|
|
139
139
|
```
|
|
140
140
|
|
|
141
141
|
Flag mapping. Keep them separate, don't collapse into `--query`:
|
|
@@ -398,7 +398,7 @@ The carbonize cleanup step (see below) reads that comment and bakes the chosen v
|
|
|
398
398
|
### 8. Signal done
|
|
399
399
|
|
|
400
400
|
```bash
|
|
401
|
-
node .
|
|
401
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs --reply EVENT_ID done --file RELATIVE_PATH
|
|
402
402
|
```
|
|
403
403
|
|
|
404
404
|
`RELATIVE_PATH` is relative to project root (`public/index.html`, `src/App.tsx`, etc.); the browser fetches source directly if the dev server lacks HMR.
|
|
@@ -410,7 +410,7 @@ Then run `live-poll.mjs` again immediately.
|
|
|
410
410
|
If wrap or generation fails after the browser has flipped to GENERATING (e.g. wrap landed on the wrong source branch and you've already reverted it, or generation hit an unrecoverable error), tell the **browser** so its bar resets to PICKING:
|
|
411
411
|
|
|
412
412
|
```bash
|
|
413
|
-
node .
|
|
413
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs --reply EVENT_ID error "Short reason"
|
|
414
414
|
```
|
|
415
415
|
|
|
416
416
|
Don't run `live-accept --discard` for this; that's a pure file mutator, the browser doesn't see it, and the bar gets stuck on the GENERATING dots forever (the user has to refresh). `--discard` is only correct when the **browser** initiated the discard (user clicked ✕ during CYCLING) and the agent is just running source-side cleanup the browser already triggered.
|
|
@@ -497,13 +497,13 @@ This is lighter than `generate`: no screenshot, no element context, no variant c
|
|
|
497
497
|
When finished:
|
|
498
498
|
|
|
499
499
|
```bash
|
|
500
|
-
node .
|
|
500
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs --reply EVENT_ID steer_done ["Optional short note for a browser toast"]
|
|
501
501
|
```
|
|
502
502
|
|
|
503
503
|
On failure:
|
|
504
504
|
|
|
505
505
|
```bash
|
|
506
|
-
node .
|
|
506
|
+
node .pi/skills/impeccable/scripts/live-poll.mjs --reply EVENT_ID error "Short reason"
|
|
507
507
|
```
|
|
508
508
|
|
|
509
509
|
Then poll again immediately. Do not send a separate "picked up" reply. The Steer bar stays locked until `steer_done` or `error` arrives over SSE.
|
|
@@ -531,7 +531,7 @@ When native subagents are available, delegate source edits to `impeccable_manual
|
|
|
531
531
|
|
|
532
532
|
If `repair` is present, the previous Apply changed source but final validation failed. Fix the current source and return the same canonical JSON result; do not roll files back yourself. The browser will ask the user before any rollback.
|
|
533
533
|
|
|
534
|
-
After source edits finish, reply exactly once with `node .
|
|
534
|
+
After source edits finish, reply exactly once with `node .pi/skills/impeccable/scripts/live-poll.mjs --reply EVENT_ID done --data '{"status":"done","appliedEntryIds":["8hexid"],"failed":[],"files":["src/page.html"],"notes":[]}'`. Use `status:"partial"` or `status:"error"` with `failed[]` when not every entry applied. Then poll again. Never reply without the event id; `--reply done --file ...` is invalid for manual Apply.
|
|
535
535
|
|
|
536
536
|
## Exit
|
|
537
537
|
|
|
@@ -545,7 +545,7 @@ When the poll returns `exit`, proceed to cleanup. If the poll is still running a
|
|
|
545
545
|
## Cleanup
|
|
546
546
|
|
|
547
547
|
```bash
|
|
548
|
-
node .
|
|
548
|
+
node .pi/skills/impeccable/scripts/live-server.mjs stop
|
|
549
549
|
```
|
|
550
550
|
|
|
551
551
|
Stops the HTTP server and runs `live-inject.mjs --remove` to strip `localhost:…/live.js` from the HTML entry. To stop the server but keep the inject tag (for a quick restart), use `stop --keep-inject`. `.impeccable/live/config.json` persists as project config for future sessions.
|
|
@@ -631,7 +631,7 @@ If `config.cspChecked === true`, skip this entire section. You already asked thi
|
|
|
631
631
|
Otherwise, run the detection helper:
|
|
632
632
|
|
|
633
633
|
```bash
|
|
634
|
-
node .
|
|
634
|
+
node .pi/skills/impeccable/scripts/detect-csp.mjs
|
|
635
635
|
```
|
|
636
636
|
|
|
637
637
|
Output: `{ shape, signals }` where `shape` is one of `append-arrays`, `append-string`, `middleware`, `meta-tag`, or `null`. The shape is named by *patch mechanism*, so one template covers many frameworks.
|
|
@@ -14,7 +14,7 @@ Push an interface past conventional limits. This isn't just about visual effects
|
|
|
14
14
|
This command has the highest potential to misfire. Do NOT jump straight into implementation. You MUST:
|
|
15
15
|
|
|
16
16
|
1. **Think through 2-3 different directions**: consider different techniques, levels of ambition, and aesthetic approaches. For each direction, briefly describe what the result would look and feel like.
|
|
17
|
-
2. **
|
|
17
|
+
2. **ask the user directly to clarify what you cannot infer.** to present these directions and get the user's pick before writing any code. Explain trade-offs (browser support, performance cost, complexity).
|
|
18
18
|
3. Only proceed with the direction the user confirms.
|
|
19
19
|
|
|
20
20
|
Skipping this step risks building something embarrassing that needs to be thrown away.
|
|
@@ -37,8 +37,8 @@ Understand the current state and goals before touching anything:
|
|
|
37
37
|
|
|
38
38
|
4. **Pull in any prior critique** (optional signal): If `/impeccable critique` has been run on the same target, its priority issues are a useful prior for what to address first. Resolve the target to a file path or URL, then:
|
|
39
39
|
```bash
|
|
40
|
-
slug=$(node .
|
|
41
|
-
node .
|
|
40
|
+
slug=$(node .pi/skills/impeccable/scripts/critique-storage.mjs slug "<resolved>")
|
|
41
|
+
node .pi/skills/impeccable/scripts/critique-storage.mjs latest "$slug"
|
|
42
42
|
```
|
|
43
43
|
Exit 0 with body = found; fold the P0/P1 items into your polish list and mention the snapshot path so the user sees what you read. Exit 2 = no snapshot, continue without it. The critique is one input among many. Do your own pass either way.
|
|
44
44
|
|
|
@@ -28,7 +28,7 @@ Analyze what makes the design feel too intense:
|
|
|
28
28
|
- What's working? (Don't throw away good ideas)
|
|
29
29
|
- What's the core message? (Preserve what matters)
|
|
30
30
|
|
|
31
|
-
If any of these are unclear from the codebase,
|
|
31
|
+
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
|
32
32
|
|
|
33
33
|
**CRITICAL**: "Quieter" doesn't mean boring or generic. It means refined and easier on the eyes. Think luxury, not laziness.
|
|
34
34
|
|
|
@@ -12,7 +12,7 @@ Most AI-generated UIs fail not because of bad code, but because of skipped think
|
|
|
12
12
|
|
|
13
13
|
**Do NOT write any code or make any design decisions during this phase.** Your only job is to understand the feature deeply enough to make excellent design decisions later.
|
|
14
14
|
|
|
15
|
-
This is a required interaction, not optional guidance. Ask these questions in conversation, adapting based on answers. Don't dump them all at once; have a natural dialogue.
|
|
15
|
+
This is a required interaction, not optional guidance. Ask these questions in conversation, adapting based on answers. Don't dump them all at once; have a natural dialogue. ask the user directly to clarify what you cannot infer.
|
|
16
16
|
|
|
17
17
|
### Interview cadence
|
|
18
18
|
|
|
@@ -158,7 +158,7 @@ Anything genuinely unresolved. Don't list "open questions" you've already recomm
|
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
ask the user directly to clarify what you cannot infer. Ask for explicit confirmation of the brief before finishing.
|
|
162
162
|
|
|
163
163
|
If the user disagrees with any part, revisit the relevant discovery questions. A shape run is incomplete until the user confirms direction.
|
|
164
164
|
|
|
@@ -22,7 +22,7 @@ import path from 'node:path';
|
|
|
22
22
|
import { fileURLToPath } from 'node:url';
|
|
23
23
|
import { execFileSync } from 'node:child_process';
|
|
24
24
|
import { loadContext, extractRegister } from './context.mjs';
|
|
25
|
-
import { getCritiqueDir } from './impeccable-paths.mjs';
|
|
25
|
+
import { getCritiqueDir } from './lib/impeccable-paths.mjs';
|
|
26
26
|
|
|
27
27
|
/** Is there code here at all, or just context files / an empty repo? */
|
|
28
28
|
function hasCode(cwd) {
|