@augurworks/augur 0.15.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 (190) hide show
  1. package/CANVAS.md +858 -0
  2. package/INSTALL.md +603 -0
  3. package/LICENSE +27 -0
  4. package/README.md +150 -0
  5. package/TRADEMARKS.md +72 -0
  6. package/agents/README.md +65 -0
  7. package/agents/canon-extract.md +117 -0
  8. package/agents/canon.md +151 -0
  9. package/agents/canvas.md +88 -0
  10. package/agents/currency.md +74 -0
  11. package/agents/drafts.md +92 -0
  12. package/agents/identity.md +148 -0
  13. package/agents/prototype-contract.md +69 -0
  14. package/agents/publishing.md +324 -0
  15. package/agents/review-feedback.md +76 -0
  16. package/agents/space-json.md +132 -0
  17. package/agents/ui-skill.md +101 -0
  18. package/agents/working-marks.md +86 -0
  19. package/brand/augur-eye.svg +3 -0
  20. package/brand/augur-icon.svg +41 -0
  21. package/brand/augur-mark.svg +5 -0
  22. package/brand/lentianova-bulky.otf +0 -0
  23. package/brand/lentianova-median.otf +0 -0
  24. package/brand/lentianova.woff2 +0 -0
  25. package/build.js +8409 -0
  26. package/changelog.md +133 -0
  27. package/fonts/inter-latin-wght-normal.woff2 +0 -0
  28. package/package.json +57 -0
  29. package/pitis/PETS.md +121 -0
  30. package/pitis/README.md +117 -0
  31. package/pitis/index.html +266 -0
  32. package/pitis/piti.build.js +81 -0
  33. package/pitis/piti.js +929 -0
  34. package/pitis/roast-agent.md +185 -0
  35. package/realtime/src/index.js +119 -0
  36. package/realtime/wrangler.example.toml +44 -0
  37. package/scripts/adopt.mjs +106 -0
  38. package/scripts/board-snapshot.mjs +197 -0
  39. package/scripts/build-seed-pack.mjs +33 -0
  40. package/scripts/bundle-rekey.mjs +112 -0
  41. package/scripts/bundle-tenancy-rehearsal.mjs +781 -0
  42. package/scripts/canon-extract.mjs +578 -0
  43. package/scripts/canon.mjs +599 -0
  44. package/scripts/canvas-screen.mjs +333 -0
  45. package/scripts/check-local.mjs +136 -0
  46. package/scripts/clawd-art.mjs +75 -0
  47. package/scripts/clawd-canvas.mjs +741 -0
  48. package/scripts/cli.mjs +100 -0
  49. package/scripts/clone.mjs +422 -0
  50. package/scripts/close.mjs +30 -0
  51. package/scripts/connect.mjs +103 -0
  52. package/scripts/deploy.mjs +157 -0
  53. package/scripts/dev.mjs +54 -0
  54. package/scripts/doc-lint.mjs +143 -0
  55. package/scripts/export.mjs +300 -0
  56. package/scripts/fork.mjs +64 -0
  57. package/scripts/freeze.mjs +74 -0
  58. package/scripts/frontdoor-parity.mjs +180 -0
  59. package/scripts/hook.mjs +67 -0
  60. package/scripts/identity-rekey.mjs +112 -0
  61. package/scripts/init.mjs +122 -0
  62. package/scripts/land.mjs +40 -0
  63. package/scripts/lib/adapters.mjs +156 -0
  64. package/scripts/lib/board-snapshot.mjs +511 -0
  65. package/scripts/lib/draft.mjs +385 -0
  66. package/scripts/lib/graduate.mjs +276 -0
  67. package/scripts/lib/instance.mjs +74 -0
  68. package/scripts/lib/marks.mjs +107 -0
  69. package/scripts/lib/materialize.mjs +138 -0
  70. package/scripts/lib/merge3.mjs +124 -0
  71. package/scripts/lib/offline-posture.mjs +120 -0
  72. package/scripts/lib/offline-respawn.mjs +18 -0
  73. package/scripts/lib/offline-wrangler.mjs +78 -0
  74. package/scripts/lib/publish-compose.mjs +12 -0
  75. package/scripts/lib/publish-conflict.mjs +78 -0
  76. package/scripts/lib/publish-evidence.mjs +144 -0
  77. package/scripts/lib/refine-compare.mjs +140 -0
  78. package/scripts/lib/refine-ledger.mjs +150 -0
  79. package/scripts/lib/refine-png.mjs +149 -0
  80. package/scripts/lib/seed-pack-build.mjs +141 -0
  81. package/scripts/lib/state-compare.mjs +68 -0
  82. package/scripts/lib/store.mjs +122 -0
  83. package/scripts/login.mjs +84 -0
  84. package/scripts/mark.mjs +112 -0
  85. package/scripts/migrate-board-keys.mjs +164 -0
  86. package/scripts/migrate.mjs +265 -0
  87. package/scripts/no-foreign-vocabulary.mjs +216 -0
  88. package/scripts/no-product-names.mjs +157 -0
  89. package/scripts/no-tenant-globals.mjs +1134 -0
  90. package/scripts/offline.mjs +247 -0
  91. package/scripts/og.mjs +170 -0
  92. package/scripts/one-tenant-resolver.mjs +146 -0
  93. package/scripts/open.mjs +63 -0
  94. package/scripts/publish.mjs +1041 -0
  95. package/scripts/read.mjs +31 -0
  96. package/scripts/refine.mjs +455 -0
  97. package/scripts/release-drift.mjs +138 -0
  98. package/scripts/restore.mjs +322 -0
  99. package/scripts/review.mjs +125 -0
  100. package/scripts/save.mjs +21 -0
  101. package/scripts/shell-lint.mjs +189 -0
  102. package/scripts/ship.mjs +460 -0
  103. package/scripts/shoot.mjs +264 -0
  104. package/scripts/smoke-invite.mjs +113 -0
  105. package/scripts/state-inventory.mjs +223 -0
  106. package/scripts/status.mjs +177 -0
  107. package/scripts/sync.mjs +27 -0
  108. package/scripts/tenant-do-rehearsal.mjs +1314 -0
  109. package/scripts/ui-copy-lint.mjs +202 -0
  110. package/scripts/watch.mjs +32 -0
  111. package/scripts/wrangler-preflight.mjs +246 -0
  112. package/seed/CANON.md +43 -0
  113. package/seed/README.md +119 -0
  114. package/seed/prototype-status.json +9 -0
  115. package/seed/registry.json +88 -0
  116. package/seed/skills/starter-ui/SKILL.md +52 -0
  117. package/seed/skills/starter-ui/skill.json +11 -0
  118. package/seed/skills/starter-ui/starter-tokens.css +73 -0
  119. package/seed/skills/starter-ui/starter-ui.css +318 -0
  120. package/seed/skills/starter-ui/starter-ui.js +50 -0
  121. package/seed/space.json +5 -0
  122. package/seed/start-here/prototypes/connect-your-terminal/index.html +428 -0
  123. package/seed/start-here/prototypes/connect-your-terminal/preview.webp +0 -0
  124. package/seed/start-here/prototypes/sample-with-comments/index.html +172 -0
  125. package/seed/start-here/prototypes/sample-with-comments/preview.webp +0 -0
  126. package/seed/start-here/prototypes/set-up-your-design-system/index.html +353 -0
  127. package/seed/start-here/prototypes/set-up-your-design-system/preview.webp +0 -0
  128. package/seed/threads.json +52 -0
  129. package/seed/worked-examples/prototypes/field-readings/index.html +273 -0
  130. package/seed/worked-examples/prototypes/field-readings/preview.webp +0 -0
  131. package/seed/worked-examples/prototypes/slide-deck/index.html +214 -0
  132. package/seed/worked-examples/prototypes/slide-deck/preview.webp +0 -0
  133. package/seed/worked-examples/prototypes/specimen-viewer/index.html +203 -0
  134. package/seed/worked-examples/prototypes/specimen-viewer/preview.webp +0 -0
  135. package/src/_worker.js +12668 -0
  136. package/src/board-key.mjs +57 -0
  137. package/src/board-room.mjs +881 -0
  138. package/src/bundle-keys.mjs +138 -0
  139. package/src/canon/collect-in-browser.js +215 -0
  140. package/src/canon/emit.mjs +232 -0
  141. package/src/canon/observe.mjs +260 -0
  142. package/src/canon/schema.mjs +451 -0
  143. package/src/canvas/DSEG-LICENSE.txt +95 -0
  144. package/src/canvas/DSEG7Classic-Bold.woff2 +0 -0
  145. package/src/canvas/canvas.css +885 -0
  146. package/src/canvas/canvas.js +5780 -0
  147. package/src/canvas/capture.js +485 -0
  148. package/src/chrome/appchrome.mjs +568 -0
  149. package/src/currency.mjs +203 -0
  150. package/src/delete-confirmation.mjs +254 -0
  151. package/src/drafts/drafts.js +326 -0
  152. package/src/entry.js +58 -0
  153. package/src/galleries.mjs +400 -0
  154. package/src/health-cron.mjs +173 -0
  155. package/src/identity.json +1 -0
  156. package/src/kv-codec.mjs +135 -0
  157. package/src/kv-identity.mjs +259 -0
  158. package/src/mail.mjs +599 -0
  159. package/src/provenance.mjs +74 -0
  160. package/src/publish-compose.mjs +363 -0
  161. package/src/publish-fork.mjs +221 -0
  162. package/src/publish-units.mjs +44 -0
  163. package/src/purge.mjs +81 -0
  164. package/src/review/COMMENTING-UX.md +306 -0
  165. package/src/review/cat.png +0 -0
  166. package/src/review/comment-cursor.svg +7 -0
  167. package/src/review/comments.js +1738 -0
  168. package/src/room-ticket.mjs +96 -0
  169. package/src/roster-chip.mjs +32 -0
  170. package/src/seed-pack.mjs +261 -0
  171. package/src/state-inventory.mjs +249 -0
  172. package/src/sw-logic.mjs +48 -0
  173. package/src/tenant-cache.mjs +141 -0
  174. package/src/tenant-context.mjs +386 -0
  175. package/src/tenant-do.js +2940 -0
  176. package/src/tenant-host.mjs +144 -0
  177. package/src/tenant-quotas.mjs +140 -0
  178. package/src/unit-core.mjs +103 -0
  179. package/src/unit-object.mjs +338 -0
  180. package/templates/README.md +67 -0
  181. package/templates/shell/deploy.yml +145 -0
  182. package/templates/shell/engine-bump.yml +142 -0
  183. package/templates/shell/health.yml +233 -0
  184. package/templates/shell/kv-backup.yml +201 -0
  185. package/templates/shell/roster-update.yml +110 -0
  186. package/templates/shell/space-preflight.yml +35 -0
  187. package/templates/shell/space-rebake.yml +79 -0
  188. package/templates/shell/store-backup.yml +152 -0
  189. package/templates/shell/wrangler.example.toml +266 -0
  190. package/templates/space/publish.yml +91 -0
@@ -0,0 +1,428 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Connect your terminal</title>
7
+ <meta name="description" content="Two ways to point a coding agent at this workspace: one line if you already have an agent, or fifteen numbered minutes if you have never opened a terminal.">
8
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-tokens.css">
9
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-ui.css">
10
+ <style>
11
+ /* Page-local layout. Everything with a colour in it comes from the tokens. */
12
+ .fork { display: grid; grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); gap: var(--starter-s4); }
13
+ .fork__card {
14
+ display: flex; flex-direction: column; align-items: flex-start; gap: var(--starter-s3);
15
+ padding: var(--starter-s5); text-align: left;
16
+ background: var(--starter-sheet); border: var(--starter-hair); border-radius: var(--starter-radius-2);
17
+ cursor: pointer; font: inherit; color: inherit;
18
+ transition: border-color var(--starter-fast), transform var(--starter-fast), box-shadow var(--starter-fast);
19
+ }
20
+ .fork__card:hover { border-color: var(--starter-mark); transform: translateY(-2px); box-shadow: var(--starter-lift); }
21
+ .fork__card p { margin: 0; color: var(--starter-ink-2); font-size: var(--starter-text-sm); }
22
+ .fork__go { margin-top: auto; color: var(--starter-mark-ink); font: 600 var(--starter-text-sm)/1 var(--starter-font-display); }
23
+
24
+ .path { display: none; }
25
+ body[data-gv-screen="have-agent"] .path--have,
26
+ body[data-gv-screen="no-agent"] .path--none { display: block; }
27
+ body[data-gv-screen="have-agent"] .path--fork,
28
+ body[data-gv-screen="no-agent"] .path--fork { display: none; }
29
+
30
+ .osbar { display: flex; flex-wrap: wrap; gap: var(--starter-s2); align-items: center; }
31
+ .osbar__label { font: 600 var(--starter-text-xs)/1 var(--starter-font-display); letter-spacing: .12em; text-transform: uppercase; color: var(--starter-ink-2); margin-right: var(--starter-s2); }
32
+ .os { display: none; }
33
+ body[data-os="mac"] .os--mac, body[data-os="win"] .os--win, body[data-os="linux"] .os--linux { display: block; }
34
+
35
+ .check { display: flex; gap: var(--starter-s2); align-items: baseline; font-size: var(--starter-text-sm); color: var(--starter-ink-2); }
36
+ .check::before { content: "→"; color: var(--starter-mark-ink); font-family: var(--starter-font-display); }
37
+
38
+ details.ask { border-top: var(--starter-hair); padding-top: var(--starter-s3); }
39
+ details.ask > div { margin-top: var(--starter-s3); }
40
+ .ask__why { margin: 0 0 var(--starter-s2); font-size: var(--starter-text-sm); color: var(--starter-ink-2); }
41
+
42
+ .backlink { margin-bottom: var(--starter-s5); }
43
+ .timeline { display: flex; align-items: baseline; gap: var(--starter-s3); flex-wrap: wrap; }
44
+ </style>
45
+ </head>
46
+ <body class="s-page" data-gv-screen="fork" data-os="mac">
47
+
48
+ <main class="s-sheet">
49
+
50
+ <header class="s-block">
51
+ <div class="s-block__rail">01 / 03</div>
52
+ <div>
53
+ <p class="s-eyebrow">Start here</p>
54
+ <h1 class="s-title s-title--hero">Connect your terminal</h1>
55
+ <p class="s-lede">This workspace is built by briefing a coding agent on your own machine.
56
+ Nothing to install here, nothing to configure. One connection and everything the agent
57
+ writes shows up on this site.</p>
58
+ </div>
59
+ </header>
60
+
61
+ <!-- ─────────────────────────────────────────── the fork -->
62
+ <section class="s-block path--fork">
63
+ <div class="s-block__rail">Pick one</div>
64
+ <div>
65
+ <div class="fork">
66
+ <button type="button" class="fork__card" data-go="have-agent">
67
+ <span class="s-chip s-chip--mark">1 minute</span>
68
+ <h2 class="s-h3">I already have a coding agent</h2>
69
+ <p>An agent CLI runs in your terminal today — you have briefed it before.</p>
70
+ <span class="fork__go">Get the command →</span>
71
+ </button>
72
+ <button type="button" class="fork__card" data-go="no-agent">
73
+ <span class="s-chip">15 minutes</span>
74
+ <h2 class="s-h3">Not yet — set one up</h2>
75
+ <p>You have never opened a terminal, or you have and would rather not guess.
76
+ Five steps, each with a way out if it goes sideways.</p>
77
+ <span class="fork__go">Start the walkthrough →</span>
78
+ </button>
79
+ </div>
80
+ <p class="s-caption" style="margin-top: var(--starter-s4)">Unsure? Take the walkthrough. It skips
81
+ anything you already have.</p>
82
+ </div>
83
+ </section>
84
+
85
+ <!-- ─────────────────────────────────────────── path A: has an agent -->
86
+ <div class="path path--have">
87
+ <section class="s-block">
88
+ <div class="s-block__rail">Path A</div>
89
+ <div>
90
+ <p class="backlink"><button type="button" class="s-btn s-btn--quiet" data-go="fork">← Both paths</button></p>
91
+ <h2 class="s-h2">Run this where your agent runs</h2>
92
+ <p class="s-prose">In the folder you want this workspace to live in, run:</p>
93
+ <div class="s-cmd">
94
+ <code class="s-cmd__text" id="cmd-connect">npx augur connect your-workspace</code>
95
+ <button type="button" class="s-cmd__btn" data-s-copy="#cmd-connect">Copy</button>
96
+ </div>
97
+ <p class="s-prose" style="margin-top: var(--starter-s4)">A browser tab opens and asks you to
98
+ approve the connection. Approve it and the terminal has a key of its own — your password
99
+ never goes near the agent. The workspace lands in that folder, ready to edit.</p>
100
+ <div class="check">The terminal prints the workspace it is connected to, and the folder now
101
+ holds this site's screens as plain HTML files.</div>
102
+
103
+ <details class="ask s-disclosure" style="margin-top: var(--starter-s5)">
104
+ <summary>Rather have the agent do it?</summary>
105
+ <div>
106
+ <p class="ask__why">Paste this into your agent instead of running the command yourself.</p>
107
+ <div class="s-cmd s-cmd--paste">
108
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-agent">Run `npx augur connect your-workspace` in this folder. It will open a browser tab for me to approve — tell me when it is waiting, and tell me exactly what it prints when it finishes.</code>
109
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-agent">Copy</button>
110
+ </div>
111
+ </div>
112
+ </details>
113
+ </div>
114
+ </section>
115
+
116
+ <section class="s-block">
117
+ <div class="s-block__rail">Then</div>
118
+ <div>
119
+ <h2 class="s-h2">Brief it like a designer</h2>
120
+ <p class="s-prose">There is no editor here. You describe a screen, the agent builds it as a
121
+ page in this workspace, and publishing puts it on this site. Your first brief can be this one:</p>
122
+ <div class="s-cmd s-cmd--paste">
123
+ <code class="s-cmd__text s-cmd__text--plain" id="first-brief">Read skills/starter-ui/SKILL.md and the prototypes under start-here/prototypes/, then build a new one at sketches/prototypes/first-screen/index.html. It is [one or two sentences describing the screen you want]. Use the starter design system rather than inventing new styles, give it a one-line meta description, and publish it when it works.</code>
124
+ <button type="button" class="s-cmd__btn" data-s-copy="#first-brief">Copy</button>
125
+ </div>
126
+ <p class="s-caption" style="margin-top: var(--starter-s3)">Fill in the bracket with a real
127
+ screen you need. Vague briefs make vague screens.</p>
128
+ </div>
129
+ </section>
130
+ </div>
131
+
132
+ <!-- ─────────────────────────────────────────── path B: no agent yet -->
133
+ <div class="path path--none">
134
+ <section class="s-block">
135
+ <div class="s-block__rail">Path B</div>
136
+ <div>
137
+ <p class="backlink"><button type="button" class="s-btn s-btn--quiet" data-go="fork">← Both paths</button></p>
138
+ <div class="timeline">
139
+ <h2 class="s-h2" style="margin-bottom:0">Fifteen minutes, five steps</h2>
140
+ <span class="s-chip">2 + 5 + 3 + 2 + 3 min</span>
141
+ </div>
142
+ <p class="s-prose" style="margin-top: var(--starter-s3)">Do them in order. Every step says what
143
+ you should see when it worked — if you see something else, open the way out underneath it and
144
+ paste the question to any assistant you can chat with. Each one is written to be answered cold,
145
+ with no other context.</p>
146
+ <div class="osbar" role="group" aria-label="Your computer">
147
+ <span class="osbar__label">Your computer</span>
148
+ <button type="button" class="s-btn" data-os-pick="mac" aria-pressed="true">macOS</button>
149
+ <button type="button" class="s-btn" data-os-pick="win" aria-pressed="false">Windows</button>
150
+ <button type="button" class="s-btn" data-os-pick="linux" aria-pressed="false">Linux</button>
151
+ </div>
152
+ </div>
153
+ </section>
154
+
155
+ <section class="s-block">
156
+ <div class="s-block__rail">Steps</div>
157
+ <div>
158
+ <ol class="s-steps">
159
+
160
+ <!-- 1 -->
161
+ <li class="s-step">
162
+ <div class="s-step__no">1</div>
163
+ <div class="s-step__body">
164
+ <div class="s-step__head">
165
+ <h3 class="s-step__title">Open a terminal</h3>
166
+ <span class="s-chip">2 min</span>
167
+ </div>
168
+ <div class="os os--mac">
169
+ <p class="s-prose">Press <strong>⌘ + Space</strong>, type <strong>Terminal</strong>,
170
+ press Enter. It ships with the Mac; nothing to install.</p>
171
+ </div>
172
+ <div class="os os--win">
173
+ <p class="s-prose">Press the <strong>Windows key</strong>, type
174
+ <strong>PowerShell</strong>, press Enter. It ships with Windows; nothing to install.</p>
175
+ </div>
176
+ <div class="os os--linux">
177
+ <p class="s-prose">Press <strong>Ctrl + Alt + T</strong>, or find
178
+ <strong>Terminal</strong> in your applications menu.</p>
179
+ </div>
180
+ <div class="check">A window with a blinking cursor, your username at the start of the
181
+ line. Text only — that is correct.</div>
182
+ <details class="ask s-disclosure">
183
+ <summary>Stuck on this step?</summary>
184
+ <div>
185
+ <p class="ask__why">Paste this to any assistant you can chat with — a browser
186
+ chatbot is fine.</p>
187
+ <div class="s-cmd s-cmd--paste">
188
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-1">I'm on <span class="os-name">macOS</span> and I have never used a terminal. I need to open the built-in terminal app and I can't find it. Tell me exactly where to click, one step at a time, and what the window should look like when it's open.</code>
189
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-1">Copy</button>
190
+ </div>
191
+ </div>
192
+ </details>
193
+ </div>
194
+ </li>
195
+
196
+ <!-- 2 -->
197
+ <li class="s-step">
198
+ <div class="s-step__no">2</div>
199
+ <div class="s-step__body">
200
+ <div class="s-step__head">
201
+ <h3 class="s-step__title">Install Node.js</h3>
202
+ <span class="s-chip">5 min</span>
203
+ </div>
204
+ <p class="s-prose">Node is the runtime the agent's command line needs. Check whether you
205
+ already have it — type this and press Enter:</p>
206
+ <div class="s-cmd">
207
+ <code class="s-cmd__text" id="cmd-node">node -v</code>
208
+ <button type="button" class="s-cmd__btn" data-s-copy="#cmd-node">Copy</button>
209
+ </div>
210
+ <p class="s-prose">A version number of <strong>v20</strong> or higher means you are done
211
+ with this step. Anything else — <em>command not found</em>, or a lower number — install
212
+ the current LTS release.</p>
213
+ <div class="os os--mac">
214
+ <p class="s-prose">Download the macOS installer from <strong>nodejs.org</strong>, open
215
+ it, click through. Then close the terminal window and open a new one.</p>
216
+ </div>
217
+ <div class="os os--win">
218
+ <p class="s-prose">Download the Windows installer (.msi) from <strong>nodejs.org</strong>,
219
+ run it, keep the defaults. Then close PowerShell and open it again.</p>
220
+ </div>
221
+ <div class="os os--linux">
222
+ <p class="s-prose">Your package manager's version is often too old. Take the current LTS
223
+ from <strong>nodejs.org</strong> or use nvm, then open a new terminal.</p>
224
+ </div>
225
+ <div class="check"><code>node -v</code> prints something like <strong>v22.11.0</strong>.</div>
226
+ <details class="ask s-disclosure">
227
+ <summary>Stuck on this step?</summary>
228
+ <div>
229
+ <p class="ask__why">Paste this, and add whatever the terminal actually said.</p>
230
+ <div class="s-cmd s-cmd--paste">
231
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-2">I'm on <span class="os-name">macOS</span>. I ran `node -v` in the terminal and it did not print a version number of v20 or higher. I need to install the current LTS release of Node.js and confirm it worked. Walk me through it one step at a time, assume I have never used a terminal, and tell me how to check it afterwards. Here is exactly what the terminal printed: </code>
232
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-2">Copy</button>
233
+ </div>
234
+ </div>
235
+ </details>
236
+ </div>
237
+ </li>
238
+
239
+ <!-- 3 -->
240
+ <li class="s-step">
241
+ <div class="s-step__no">3</div>
242
+ <div class="s-step__body">
243
+ <div class="s-step__head">
244
+ <h3 class="s-step__title">Install a coding agent</h3>
245
+ <span class="s-chip">3 min</span>
246
+ </div>
247
+ <p class="s-prose">Any agent that runs in a terminal and can read and write files works
248
+ here. If you have no preference, install this one:</p>
249
+ <div class="s-cmd">
250
+ <code class="s-cmd__text" id="cmd-agent">npm install -g @anthropic-ai/claude-code</code>
251
+ <button type="button" class="s-cmd__btn" data-s-copy="#cmd-agent">Copy</button>
252
+ </div>
253
+ <p class="s-caption">Others exist and are equally fine — pick whichever you already pay
254
+ for. The rest of this walkthrough assumes the one above; swap the command names if you
255
+ chose differently.</p>
256
+ <div class="check">The terminal ends with something like <strong>added 1 package</strong>
257
+ and gives you your prompt back.</div>
258
+ <details class="ask s-disclosure">
259
+ <summary>Stuck on this step?</summary>
260
+ <div>
261
+ <p class="ask__why">Permission errors on this step are common and harmless to fix.</p>
262
+ <div class="s-cmd s-cmd--paste">
263
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-3">I'm on <span class="os-name">macOS</span>. I ran `npm install -g @anthropic-ai/claude-code` and it failed instead of finishing. Explain what went wrong in plain language and give me the safest fix, one step at a time — I have never used a terminal, and I would rather not run anything with sudo unless you explain why it is needed. Here is exactly what it printed: </code>
264
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-3">Copy</button>
265
+ </div>
266
+ </div>
267
+ </details>
268
+ </div>
269
+ </li>
270
+
271
+ <!-- 4 -->
272
+ <li class="s-step">
273
+ <div class="s-step__no">4</div>
274
+ <div class="s-step__body">
275
+ <div class="s-step__head">
276
+ <h3 class="s-step__title">Sign in to the agent</h3>
277
+ <span class="s-chip">2 min</span>
278
+ </div>
279
+ <p class="s-prose">Start it. The first run walks you through signing in — a browser tab
280
+ opens, you approve, you come back to the terminal.</p>
281
+ <div class="s-cmd">
282
+ <code class="s-cmd__text" id="cmd-start">claude</code>
283
+ <button type="button" class="s-cmd__btn" data-s-copy="#cmd-start">Copy</button>
284
+ </div>
285
+ <p class="s-prose">Once it is running, type a sentence and press Enter. It answers in the
286
+ terminal. That is the whole interface — you are talking to it, not programming it.</p>
287
+ <div class="check">You type <em>hello</em>, it replies. Leave it running; the next step
288
+ happens right here.</div>
289
+ <details class="ask s-disclosure">
290
+ <summary>Stuck on this step?</summary>
291
+ <div>
292
+ <p class="ask__why">Sign-in problems are the agent's, not this workspace's — ask about
293
+ the agent.</p>
294
+ <div class="s-cmd s-cmd--paste">
295
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-4">I'm on <span class="os-name">macOS</span>. I installed the Claude Code CLI and typed `claude` in the terminal, but I could not get signed in. Explain what the sign-in flow is supposed to do, what to check, and how to start it again from scratch. Assume I am not technical. Here is what the terminal shows: </code>
296
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-4">Copy</button>
297
+ </div>
298
+ </div>
299
+ </details>
300
+ </div>
301
+ </li>
302
+
303
+ <!-- 5 -->
304
+ <li class="s-step">
305
+ <div class="s-step__no">5</div>
306
+ <div class="s-step__body">
307
+ <div class="s-step__head">
308
+ <h3 class="s-step__title">Connect this workspace</h3>
309
+ <span class="s-chip">3 min</span>
310
+ </div>
311
+ <p class="s-prose">Last one. Ask the agent to connect, in plain language — it runs the
312
+ command for you:</p>
313
+ <div class="s-cmd s-cmd--paste">
314
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-5-do">Run `npx augur connect your-workspace` in this folder. It will open a browser tab for me to approve — tell me when it is waiting, and tell me exactly what it prints when it finishes.</code>
315
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-5-do">Copy</button>
316
+ </div>
317
+ <p class="s-prose">Approve the tab that opens. The terminal now has a key of its own, so
318
+ your password never goes near the agent, and this workspace's screens are files in that
319
+ folder.</p>
320
+ <div class="check">The terminal prints the workspace it is connected to. You are done —
321
+ everything from here is briefing, not setup.</div>
322
+ <details class="ask s-disclosure">
323
+ <summary>Stuck on this step?</summary>
324
+ <div>
325
+ <p class="ask__why">Paste this to the agent itself; it can read its own error.</p>
326
+ <div class="s-cmd s-cmd--paste">
327
+ <code class="s-cmd__text s-cmd__text--plain" id="ask-5">The connect command failed. Read the error carefully and tell me in plain language what it means, whether it is a problem on my machine or on the server, and what to try next. Do not run anything destructive. If it is a permissions or network problem, say so plainly.</code>
328
+ <button type="button" class="s-cmd__btn" data-s-copy="#ask-5">Copy</button>
329
+ </div>
330
+ </div>
331
+ </details>
332
+ </div>
333
+ </li>
334
+ </ol>
335
+
336
+ <div class="s-card s-card--mark" style="margin-top: var(--starter-s6)">
337
+ <h3 class="s-h3">Connected. Now brief it.</h3>
338
+ <p class="s-prose">There is no editor in this product. You describe a screen, the agent builds
339
+ it here, and publishing puts it on this site for everyone. Start with this:</p>
340
+ <div class="s-cmd s-cmd--paste">
341
+ <code class="s-cmd__text s-cmd__text--plain" id="first-brief-2">Read skills/starter-ui/SKILL.md and the prototypes under start-here/prototypes/, then build a new one at sketches/prototypes/first-screen/index.html. It is [one or two sentences describing the screen you want]. Use the starter design system rather than inventing new styles, give it a one-line meta description, and publish it when it works.</code>
342
+ <button type="button" class="s-cmd__btn" data-s-copy="#first-brief-2">Copy</button>
343
+ </div>
344
+ </div>
345
+ </div>
346
+ </section>
347
+ </div>
348
+
349
+ <p class="s-note"><strong>This page is a prototype.</strong> It is one HTML file in this workspace,
350
+ at <code>start-here/prototypes/connect-your-terminal/index.html</code>, wearing the same design
351
+ system as everything else. Once you are connected you can rewrite it — including this sentence.</p>
352
+
353
+ </main>
354
+
355
+ <script src="../../../skills/starter-ui/starter-ui.js" defer></script>
356
+ <script>
357
+ (function () {
358
+ "use strict";
359
+
360
+ /* ── The connect command ──────────────────────────────────────────────────
361
+ One string, used in three places on this page. Provisioning rewrites the
362
+ line below when it copies this workspace into a new account. Left empty,
363
+ the page reads the workspace name off the URL it is being served from, and
364
+ falls back to a placeholder when the file is opened straight from disk. */
365
+ var CONNECT_COMMAND = "";
366
+
367
+ function connectCommand() {
368
+ if (CONNECT_COMMAND) return CONNECT_COMMAND;
369
+ var host = location.hostname || "";
370
+ var label = host.split(".")[0];
371
+ var named = host.indexOf(".") > 0 && label && label !== "localhost" && !/^\d+$/.test(label);
372
+ return named ? "npx augur connect --origin https://" + host : "npx augur connect your-workspace";
373
+ }
374
+
375
+ var cmd = connectCommand();
376
+ var cmdEl = document.getElementById("cmd-connect");
377
+ if (cmdEl) cmdEl.textContent = cmd;
378
+ ["ask-agent", "ask-5-do"].forEach(function (id) {
379
+ var el = document.getElementById(id);
380
+ if (el) el.textContent = el.textContent.replace(/npx augur connect [\w-]+/, cmd);
381
+ });
382
+
383
+ /* ── Which path you are on ────────────────────────────────────────────────
384
+ The screen changes without the URL changing, so publish it on
385
+ <body data-gv-screen> — that is what scopes a pinned comment to the screen
386
+ it was left on. */
387
+ function go(screen) {
388
+ document.body.setAttribute("data-gv-screen", screen);
389
+ window.scrollTo({ top: 0, behavior: "smooth" });
390
+ }
391
+ document.addEventListener("click", function (e) {
392
+ var el = e.target.closest("[data-go]");
393
+ if (el) go(el.getAttribute("data-go"));
394
+ });
395
+
396
+ /* ── Which computer you are on ────────────────────────────────────────── */
397
+ var OS_NAMES = { mac: "macOS", win: "Windows", linux: "Linux" };
398
+
399
+ function detectOs() {
400
+ var p = (navigator.userAgentData && navigator.userAgentData.platform) ||
401
+ navigator.platform || navigator.userAgent || "";
402
+ p = p.toLowerCase();
403
+ if (p.indexOf("win") === 0 || p.indexOf("windows") > -1) return "win";
404
+ if (p.indexOf("linux") > -1 || p.indexOf("x11") > -1) return "linux";
405
+ return "mac";
406
+ }
407
+
408
+ function setOs(os) {
409
+ document.body.setAttribute("data-os", os);
410
+ var name = OS_NAMES[os] || OS_NAMES.mac;
411
+ Array.prototype.forEach.call(document.querySelectorAll(".os-name"), function (el) {
412
+ el.textContent = name;
413
+ });
414
+ Array.prototype.forEach.call(document.querySelectorAll("[data-os-pick]"), function (b) {
415
+ b.setAttribute("aria-pressed", String(b.getAttribute("data-os-pick") === os));
416
+ });
417
+ }
418
+
419
+ document.addEventListener("click", function (e) {
420
+ var b = e.target.closest("[data-os-pick]");
421
+ if (b) setOs(b.getAttribute("data-os-pick"));
422
+ });
423
+
424
+ setOs(detectOs());
425
+ })();
426
+ </script>
427
+ </body>
428
+ </html>
@@ -0,0 +1,172 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Sample screen with comments</title>
7
+ <meta name="description" content="A working booking screen with two comments already pinned to it, so the review loop is something you reply to on day one rather than read about.">
8
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-tokens.css">
9
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-ui.css">
10
+ <style>
11
+ .stack { max-width: 34rem; margin: var(--starter-s7) auto var(--starter-s6); padding: 0 var(--starter-s4); }
12
+
13
+ /* The product screen. It wears the same tokens as everything else in the
14
+ workspace — that is the point — but it is a screen, not a sheet. */
15
+ .app {
16
+ background: var(--starter-sheet);
17
+ border: var(--starter-hair);
18
+ border-radius: 14px;
19
+ box-shadow: var(--starter-lift);
20
+ overflow: hidden;
21
+ }
22
+ .app__head { padding: var(--starter-s5) var(--starter-s5) var(--starter-s4); border-bottom: var(--starter-hair); }
23
+ .app__kicker { margin: 0 0 var(--starter-s1); font: 600 var(--starter-text-xs)/1.6 var(--starter-font-display); letter-spacing: .14em; text-transform: uppercase; color: var(--starter-ink-3); }
24
+ .app__title { margin: 0 0 var(--starter-s2); font: 600 var(--starter-text-xl)/1.2 var(--starter-font-display); letter-spacing: -.02em; }
25
+ .app__now { margin: 0; font-size: var(--starter-text-sm); color: var(--starter-ink-2); }
26
+ .app__body { padding: var(--starter-s5); display: grid; gap: var(--starter-s5); }
27
+
28
+ .pick__label { display: block; margin-bottom: var(--starter-s3); font: 600 var(--starter-text-xs)/1 var(--starter-font-display); letter-spacing: .12em; text-transform: uppercase; color: var(--starter-ink-2); }
29
+ .days { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--starter-s2); }
30
+ .day {
31
+ display: grid; gap: 2px; padding: var(--starter-s3) var(--starter-s2);
32
+ background: var(--starter-sheet); border: 1px solid var(--starter-rule); border-radius: var(--starter-radius-2);
33
+ cursor: pointer; text-align: center; font: inherit; color: inherit;
34
+ }
35
+ .day__dow { font: var(--starter-text-xs)/1.4 var(--starter-font-display); letter-spacing: .1em; text-transform: uppercase; color: var(--starter-ink-2); }
36
+ .day__num { font: 600 var(--starter-text-lg)/1.1 var(--starter-font-display); }
37
+ .day[aria-pressed="true"] { background: var(--starter-ink); border-color: var(--starter-ink); color: var(--starter-sheet); }
38
+ .day[aria-pressed="true"] .day__dow { color: rgba(251, 250, 246, .7); }
39
+
40
+ .times { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--starter-s2); }
41
+ .time {
42
+ padding: var(--starter-s3) var(--starter-s2);
43
+ font: var(--starter-text-sm)/1 var(--starter-font-display);
44
+ background: var(--starter-sheet); border: 1px solid var(--starter-rule); border-radius: var(--starter-radius-2);
45
+ cursor: pointer; color: inherit;
46
+ }
47
+ .time:hover:not(:disabled) { border-color: var(--starter-ink-3); }
48
+ .time[aria-pressed="true"] { background: var(--starter-wash); border-color: var(--starter-mark); color: var(--starter-mark-ink); font-weight: 600; }
49
+ .time:disabled { color: var(--starter-ink-3); background: var(--starter-inset); cursor: not-allowed; text-decoration: line-through; }
50
+
51
+ .fee { margin: 0; padding: var(--starter-s3) var(--starter-s4); background: var(--starter-inset); border-radius: var(--starter-radius-2); font-size: var(--starter-text-sm); color: var(--starter-ink-2); }
52
+ .actions { display: flex; flex-wrap: wrap; gap: var(--starter-s3); align-items: center; }
53
+ .summary { margin: 0; font-size: var(--starter-text-sm); color: var(--starter-ink-2); min-height: 1.4em; }
54
+ .summary strong { color: var(--starter-ink); }
55
+ </style>
56
+ </head>
57
+ <body class="s-page">
58
+
59
+ <div class="stack">
60
+
61
+ <!-- ─────────────────────────────────────── the screen under review -->
62
+ <main class="app" id="reschedule">
63
+ <header class="app__head">
64
+ <p class="app__kicker">Booking 4471</p>
65
+ <h1 class="app__title">Reschedule your visit</h1>
66
+ <p class="app__now">Currently <strong>Tuesday 14 May, 09:30</strong> · Full service · 2 hours</p>
67
+ </header>
68
+
69
+ <div class="app__body">
70
+ <div>
71
+ <span class="pick__label" id="day-label">Pick a day</span>
72
+ <div class="days" role="group" aria-labelledby="day-label" id="days">
73
+ <button type="button" class="day" data-day="Mon 13 May" aria-pressed="false">
74
+ <span class="day__dow">Mon</span><span class="day__num">13</span>
75
+ </button>
76
+ <button type="button" class="day" data-day="Tue 14 May" aria-pressed="true">
77
+ <span class="day__dow">Tue</span><span class="day__num">14</span>
78
+ </button>
79
+ <button type="button" class="day" data-day="Wed 15 May" aria-pressed="false">
80
+ <span class="day__dow">Wed</span><span class="day__num">15</span>
81
+ </button>
82
+ <button type="button" class="day" data-day="Thu 16 May" aria-pressed="false">
83
+ <span class="day__dow">Thu</span><span class="day__num">16</span>
84
+ </button>
85
+ </div>
86
+ </div>
87
+
88
+ <div>
89
+ <span class="pick__label" id="time-label">Pick a time</span>
90
+ <div class="times" role="group" aria-labelledby="time-label" id="times">
91
+ <button type="button" class="time" data-time="08:00" aria-pressed="false">08:00</button>
92
+ <button type="button" class="time" data-time="09:30" aria-pressed="false" disabled>09:30</button>
93
+ <button type="button" class="time" data-time="11:15" aria-pressed="false">11:15</button>
94
+ <button type="button" class="time" data-time="13:00" aria-pressed="false">13:00</button>
95
+ <button type="button" class="time" data-time="15:30" aria-pressed="false" disabled>15:30</button>
96
+ <button type="button" class="time" data-time="16:45" aria-pressed="false">16:45</button>
97
+ </div>
98
+ </div>
99
+
100
+ <p class="fee" id="fee-note">Moving a booking less than 24 hours ahead adds a <strong>&euro;12</strong>
101
+ rebooking fee, charged when you arrive.</p>
102
+
103
+ <p class="summary" id="summary">Nothing changed yet — pick a day and a time.</p>
104
+
105
+ <div class="actions" id="actions">
106
+ <button type="button" class="s-btn s-btn--mark s-btn--lg" id="confirm" disabled>Confirm new time</button>
107
+ <button type="button" class="s-btn s-btn--quiet" id="cancel">Cancel appointment</button>
108
+ </div>
109
+ </div>
110
+ </main>
111
+
112
+ <p class="s-note"><strong>Two comments are already pinned on this screen.</strong> On the site, press
113
+ <strong>Shift + C</strong> to see them, click a pin to read the thread, and reply — that is the whole
114
+ review loop. Pins stick to the element they were dropped on, so they survive the screen changing
115
+ underneath them. This page is a prototype like any other, at
116
+ <code>start-here/prototypes/sample-with-comments/index.html</code>.</p>
117
+ </div>
118
+
119
+ <script src="../../../skills/starter-ui/starter-ui.js" defer></script>
120
+ <script>
121
+ (function () {
122
+ "use strict";
123
+
124
+ var chosen = { day: "Tue 14 May", time: null };
125
+ var summary = document.getElementById("summary");
126
+ var confirm = document.getElementById("confirm");
127
+
128
+ function press(group, el) {
129
+ Array.prototype.forEach.call(group.children, function (b) { b.setAttribute("aria-pressed", "false"); });
130
+ el.setAttribute("aria-pressed", "true");
131
+ }
132
+
133
+ function render() {
134
+ if (!chosen.time) {
135
+ summary.textContent = "Nothing changed yet — pick a day and a time.";
136
+ confirm.disabled = true;
137
+ return;
138
+ }
139
+ summary.innerHTML = "New time: <strong>" + chosen.day + ", " + chosen.time +
140
+ "</strong>. Your old slot is released as soon as you confirm.";
141
+ confirm.disabled = false;
142
+ }
143
+
144
+ document.getElementById("days").addEventListener("click", function (e) {
145
+ var b = e.target.closest(".day");
146
+ if (!b) return;
147
+ press(this, b);
148
+ chosen.day = b.getAttribute("data-day");
149
+ render();
150
+ });
151
+
152
+ document.getElementById("times").addEventListener("click", function (e) {
153
+ var b = e.target.closest(".time");
154
+ if (!b || b.disabled) return;
155
+ press(this, b);
156
+ chosen.time = b.getAttribute("data-time");
157
+ render();
158
+ });
159
+
160
+ confirm.addEventListener("click", function () {
161
+ summary.innerHTML = "Moved to <strong>" + chosen.day + ", " + chosen.time +
162
+ "</strong>. A confirmation is on its way to you.";
163
+ confirm.disabled = true;
164
+ });
165
+
166
+ document.getElementById("cancel").addEventListener("click", function () {
167
+ summary.textContent = "Nothing is cancelled — this is a prototype, and it has no server behind it.";
168
+ });
169
+ })();
170
+ </script>
171
+ </body>
172
+ </html>