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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli.js +314 -86
  3. package/package.json +1 -1
  4. package/template/.agents/skills/agent-browser/SKILL.md +4 -9
  5. package/template/.agents/skills/apps/skybridge/SKILL.md +1 -1
  6. package/template/.agents/skills/code/improve/SKILL.md +9 -5
  7. package/template/.agents/skills/code/improve/references/audit-playbook.md +10 -10
  8. package/template/.agents/skills/code/improve/references/closing-the-loop.md +4 -3
  9. package/template/.agents/skills/code/improve/references/plan-template.md +5 -0
  10. package/template/.agents/skills/design/impeccable/SKILL.md +14 -24
  11. package/template/.agents/skills/design/impeccable/reference/animate.md +1 -1
  12. package/template/.agents/skills/design/impeccable/reference/bolder.md +1 -1
  13. package/template/.agents/skills/design/impeccable/reference/brand.md +2 -2
  14. package/template/.agents/skills/design/impeccable/reference/colorize.md +1 -1
  15. package/template/.agents/skills/design/impeccable/reference/critique.md +6 -6
  16. package/template/.agents/skills/design/impeccable/reference/delight.md +1 -1
  17. package/template/.agents/skills/design/impeccable/reference/distill.md +1 -1
  18. package/template/.agents/skills/design/impeccable/reference/document.md +1 -1
  19. package/template/.agents/skills/design/impeccable/reference/extract.md +1 -1
  20. package/template/.agents/skills/design/impeccable/reference/hooks.md +90 -0
  21. package/template/.agents/skills/design/impeccable/reference/init.md +5 -5
  22. package/template/.agents/skills/design/impeccable/reference/live.md +16 -16
  23. package/template/.agents/skills/design/impeccable/reference/overdrive.md +1 -1
  24. package/template/.agents/skills/design/impeccable/reference/polish.md +2 -2
  25. package/template/.agents/skills/design/impeccable/reference/quieter.md +1 -1
  26. package/template/.agents/skills/design/impeccable/reference/shape.md +2 -2
  27. package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +1 -1
  28. package/template/.agents/skills/design/impeccable/scripts/context.mjs +724 -33
  29. package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +1 -1
  30. package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +204 -0
  31. package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +57 -11
  32. package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +750 -0
  33. package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +633 -46
  34. package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +7 -0
  35. package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +29 -4
  36. package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +43 -10
  37. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +29 -0
  38. package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +27 -1
  39. package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +1 -1
  40. package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +29 -0
  41. package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +401 -46
  42. package/template/.agents/skills/design/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
  43. package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +661 -0
  44. package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +476 -0
  45. package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +1632 -0
  46. package/template/.agents/skills/design/impeccable/scripts/hook.mjs +61 -0
  47. package/template/.agents/skills/design/impeccable/scripts/{design-parser.mjs → lib/design-parser.mjs} +8 -1
  48. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +638 -0
  49. package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
  50. package/template/.agents/skills/design/impeccable/scripts/lib/target-args.mjs +42 -0
  51. package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +49 -0
  52. package/template/.agents/skills/design/impeccable/scripts/{live-event-validation.mjs → live/event-validation.mjs} +6 -5
  53. package/template/.agents/skills/design/impeccable/scripts/live/manual-apply.mjs +939 -0
  54. package/template/.agents/skills/design/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
  55. package/template/.agents/skills/design/impeccable/scripts/{live-manual-edits-buffer.mjs → live/manual-edits-buffer.mjs} +1 -1
  56. package/template/.agents/skills/design/impeccable/scripts/{live-session-store.mjs → live/session-store.mjs} +1 -1
  57. package/template/.agents/skills/design/impeccable/scripts/{live-ui-core.mjs → live/ui-core.mjs} +2 -1
  58. package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +36 -0
  59. package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +3 -3
  60. package/template/.agents/skills/design/impeccable/scripts/live-browser-dom.js +146 -0
  61. package/template/.agents/skills/design/impeccable/scripts/live-browser.js +1456 -599
  62. package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +2 -2
  63. package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +2 -2
  64. package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +1 -1
  65. package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +35 -9
  66. package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +2 -2
  67. package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
  68. package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +18 -13
  69. package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +1 -1
  70. package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +77 -1264
  71. package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +2 -2
  72. package/template/.agents/skills/design/impeccable/scripts/live-target.mjs +30 -0
  73. package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +4 -4
  74. package/template/.agents/skills/design/impeccable/scripts/live.mjs +73 -22
  75. package/template/.agents/skills/writing/humanizer/SKILL.md +621 -0
  76. package/template/.agents/upstreams.json +17 -8
  77. package/template/.agents/skills/apps/skybridge/references/architecture.md +0 -175
  78. package/template/.agents/skills/apps/skybridge/references/copy-template.md +0 -24
  79. package/template/.agents/skills/apps/skybridge/references/csp.md +0 -33
  80. package/template/.agents/skills/apps/skybridge/references/deploy.md +0 -33
  81. package/template/.agents/skills/apps/skybridge/references/discover.md +0 -84
  82. package/template/.agents/skills/apps/skybridge/references/download-file.md +0 -77
  83. package/template/.agents/skills/apps/skybridge/references/fetch-and-render-data.md +0 -151
  84. package/template/.agents/skills/apps/skybridge/references/oauth.md +0 -115
  85. package/template/.agents/skills/apps/skybridge/references/open-external-links.md +0 -71
  86. package/template/.agents/skills/apps/skybridge/references/prompt-llm.md +0 -20
  87. package/template/.agents/skills/apps/skybridge/references/publish.md +0 -19
  88. package/template/.agents/skills/apps/skybridge/references/run-locally.md +0 -51
  89. package/template/.agents/skills/apps/skybridge/references/state-and-context.md +0 -151
  90. package/template/.agents/skills/apps/skybridge/references/ui-guidelines.md +0 -205
  91. package/template/.agents/skills/design/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  92. package/template/.agents/skills/design/impeccable/scripts/impeccable-paths.mjs +0 -126
  93. /package/template/.agents/skills/design/impeccable/scripts/{is-generated.mjs → lib/is-generated.mjs} +0 -0
  94. /package/template/.agents/skills/design/impeccable/scripts/{live-completion.mjs → live/completion.mjs} +0 -0
  95. /package/template/.agents/skills/design/impeccable/scripts/{live-insert-ui.mjs → live/insert-ui.mjs} +0 -0
  96. /package/template/.agents/skills/design/impeccable/scripts/{live-svelte-component.mjs → live/svelte-component.mjs} +0 -0
  97. /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 .agents/skills/design/impeccable/scripts/live.mjs
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 .agents/skills/design/impeccable/scripts/live-poll.mjs # default long timeout; no --timeout=
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 .agents/skills/design/impeccable/scripts/live-poll.mjs --stream # stays running; one JSON line per event
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 .agents/skills/design/impeccable/scripts/live-status.mjs
79
- node .agents/skills/design/impeccable/scripts/live-resume.mjs --id SESSION_ID
80
- node .agents/skills/design/impeccable/scripts/live-complete.mjs --id SESSION_ID
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 .agents/skills/design/impeccable/scripts/live-insert.mjs --id EVENT_ID --count EVENT_COUNT --position after \
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 .agents/skills/design/impeccable/scripts/live-wrap.mjs --id EVENT_ID --count EVENT_COUNT --element-id "ELEMENT_ID" --classes "class1,class2" --tag "div" --text "TEXT_SNIPPET"
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 .agents/skills/design/impeccable/scripts/live-poll.mjs --reply EVENT_ID done --file RELATIVE_PATH
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 .agents/skills/design/impeccable/scripts/live-poll.mjs --reply EVENT_ID error "Short reason"
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 .agents/skills/design/impeccable/scripts/live-poll.mjs --reply EVENT_ID steer_done ["Optional short note for a browser toast"]
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 .agents/skills/design/impeccable/scripts/live-poll.mjs --reply EVENT_ID error "Short reason"
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 .agents/skills/design/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.
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 .agents/skills/design/impeccable/scripts/live-server.mjs stop
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 .agents/skills/design/impeccable/scripts/detect-csp.mjs
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. **STOP and call the `question` tool to clarify.** to present these directions and get the user's pick before writing any code. Explain trade-offs (browser support, performance cost, complexity).
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 .agents/skills/design/impeccable/scripts/critique-storage.mjs slug "<resolved>")
41
- node .agents/skills/design/impeccable/scripts/critique-storage.mjs latest "$slug"
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, STOP and call the `question` tool to clarify.
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. STOP and call the `question` tool to clarify.
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
- STOP and call the `question` tool to clarify. Ask for explicit confirmation of the brief before finishing.
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) {