@fapost/jig-ui 0.3.1-next.60 → 0.3.1-next.62
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/dist/http/app.js +23 -1
- package/dist/jig/client.js +36 -0
- package/dist/source/local.js +153 -2
- package/dist/web/assets/{CanvasView-D8xQ0Vn9.js → CanvasView-o8TvMBB4.js} +1 -1
- package/dist/web/assets/index-U-0MJGK-.js +6 -0
- package/dist/web/assets/index-cmSLwh0E.css +2 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-ByAkzj4v.css +0 -2
- package/dist/web/assets/index-CIxsumFv.js +0 -6
package/dist/http/app.js
CHANGED
|
@@ -82,7 +82,29 @@ function upgradeRefused(c, code) {
|
|
|
82
82
|
function apiRoutes(source, version) {
|
|
83
83
|
return (new Hono()
|
|
84
84
|
.get('/api/instance', (c) => c.json({ version }, 200))
|
|
85
|
-
.get('/api/workspace', async (c) => c.json({ projects: await source.workspace() }, 200))
|
|
85
|
+
.get('/api/workspace', async (c) => c.json({ projects: await source.workspace(), machine: source.machine() }, 200))
|
|
86
|
+
// Moves this machine's Jig to its newest release and answers once it has: a git fetch, not minutes.
|
|
87
|
+
.post('/api/self-update', async (c) => {
|
|
88
|
+
const run = await source.selfUpdate();
|
|
89
|
+
if (run.state === 'done')
|
|
90
|
+
return c.json({ said: run.said }, 200);
|
|
91
|
+
if (run.state === 'failed')
|
|
92
|
+
return c.json({ error: { code: 'failed', message: 'Jig could not update itself on this machine.', reasons: run.reasons } }, 422);
|
|
93
|
+
if (run.code === 'running')
|
|
94
|
+
return refuse(c, 409, run.code, 'An upgrade is under way; try again once it ends.');
|
|
95
|
+
return refuse(c, 404, run.code, 'No connected project has a Jig to run jig self-update through.');
|
|
96
|
+
})
|
|
97
|
+
// Answered at once: the projects are upgraded one at a time in the server, and the workspace shows each.
|
|
98
|
+
.post('/api/upgrade-all', async (c) => {
|
|
99
|
+
const started = await source.upgradeAll();
|
|
100
|
+
if (started.state === 'started')
|
|
101
|
+
return c.json({ started: true }, 202);
|
|
102
|
+
return refuse(c, 409, started.code, 'An upgrade is under way; try again once it ends.');
|
|
103
|
+
})
|
|
104
|
+
.delete('/api/upgrade-all', (c) => {
|
|
105
|
+
source.dismissUpgradeAll();
|
|
106
|
+
return c.body(null, 204);
|
|
107
|
+
})
|
|
86
108
|
.get('/api/projects/:id/board', async (c) => {
|
|
87
109
|
const id = c.req.param('id');
|
|
88
110
|
const read = await source.tasks(id);
|
package/dist/jig/client.js
CHANGED
|
@@ -57,6 +57,8 @@ async function jig(root, args, platform, timeout = TIMEOUT_MS) {
|
|
|
57
57
|
: await run(await bash(platform), argv, { cwd: root, timeout });
|
|
58
58
|
return stdout;
|
|
59
59
|
}
|
|
60
|
+
/** The checkout has a Jig of its own to run. */
|
|
61
|
+
export const hasJig = (root) => existsSync(join(root, SCRIPT));
|
|
60
62
|
/**
|
|
61
63
|
* The project's Jig version, `undefined` when the checkout has no Jig. Throws when Jig is there but
|
|
62
64
|
* does not answer with a version.
|
|
@@ -174,6 +176,16 @@ const Attention = z
|
|
|
174
176
|
.transform((v) => v ?? null),
|
|
175
177
|
})
|
|
176
178
|
.refine((a) => a.kind !== 'upgrade-available' || a.versions !== null);
|
|
179
|
+
/**
|
|
180
|
+
* The release Jig's `release-available` item names, as `0.38.0`; none for another item. Jig gives it only in the title
|
|
181
|
+
* (`jig v0.38.0 is out`), and knows of it per project — from that project's last `jig housekeeping` — so one project
|
|
182
|
+
* may name a release another has not heard of yet.
|
|
183
|
+
*/
|
|
184
|
+
export function releaseNamed(item) {
|
|
185
|
+
if (item.kind !== 'release-available')
|
|
186
|
+
return undefined;
|
|
187
|
+
return /\bv(\d+\.\d+\.\d+)\b/.exec(item.title)?.[1];
|
|
188
|
+
}
|
|
177
189
|
const Status = z.object({
|
|
178
190
|
attention: z.array(Attention),
|
|
179
191
|
housekeeping: z.object({ stale: z.boolean() }).nullable(),
|
|
@@ -436,3 +448,27 @@ export async function planUpgrade(root, platform = process.platform) {
|
|
|
436
448
|
export async function runUpgrade(root, platform = process.platform) {
|
|
437
449
|
return parsed(Upgrade, (await readJson(root, ['upgrade'], platform, UPGRADE_TIMEOUT_MS)).data);
|
|
438
450
|
}
|
|
451
|
+
/** `jig self-update` pulls the framework source's git remote: a network round trip, never a prompt (Jig sets it so). */
|
|
452
|
+
const SELF_UPDATE_TIMEOUT_MS = 2 * 60_000;
|
|
453
|
+
/**
|
|
454
|
+
* Moves this machine's Jig — the framework checkout every project upgrades from — to its newest release (`jig self-update`),
|
|
455
|
+
* run through a project's Jig, which hands it to the machine's. It touches no project. It prints no JSON:
|
|
456
|
+
* what it did is its last line, as `self-update: updated 0.37.0 -> 0.38.0 (abc1234)`. A failure throws JigRefusal
|
|
457
|
+
* `failed` with Jig's error lines, as `jig: error: self-update: <why>`, without a path.
|
|
458
|
+
*/
|
|
459
|
+
export async function selfUpdate(root, platform = process.platform) {
|
|
460
|
+
let stdout;
|
|
461
|
+
try {
|
|
462
|
+
stdout = await jig(root, ['self-update'], platform, SELF_UPDATE_TIMEOUT_MS);
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
const stderr = error.stderr ?? '';
|
|
466
|
+
const reasons = stderr.split('\n').flatMap((line) => {
|
|
467
|
+
const m = /^jig: error: (?:self-update: )?(.+)$/.exec(line.trim());
|
|
468
|
+
return m?.[1] ? [withoutPaths(m[1])] : [];
|
|
469
|
+
});
|
|
470
|
+
throw new JigRefusal('failed', reasons);
|
|
471
|
+
}
|
|
472
|
+
const lines = stdout.trim().split('\n');
|
|
473
|
+
return withoutPaths(lines.at(-1)?.trim() ?? '');
|
|
474
|
+
}
|
package/dist/source/local.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import { cancelPause, fileTask, JigRefusal, JigShapeError, jigVersion, MIN_JIG_VERSION, moveInQueue, planUpgrade, readQueue, readSpecs, readStatus, readTasks, requestPause, RESUME_JIG_VERSION, resumeTask, runUpgrade, setPriority, supports, watchDir, writtenByReads, } from '../jig/client.js';
|
|
2
|
+
import { cancelPause, fileTask, hasJig, JigRefusal, JigShapeError, jigVersion, MIN_JIG_VERSION, moveInQueue, planUpgrade, readQueue, readSpecs, readStatus, readTasks, releaseNamed, requestPause, RESUME_JIG_VERSION, resumeTask, runUpgrade, selfUpdate as runSelfUpdate, setPriority, supports, watchDir, writtenByReads, } from '../jig/client.js';
|
|
3
3
|
import { addProject, readProjects, removeProject } from '../registry/projects.js';
|
|
4
4
|
import { watchTree } from '../watch/watch.js';
|
|
5
5
|
import { mainCheckout } from './checkout.js';
|
|
@@ -149,6 +149,8 @@ function ordered(specs, epics) {
|
|
|
149
149
|
}
|
|
150
150
|
/** The version Jig's `upgrade-available` item in a read names for this machine; none without the item. */
|
|
151
151
|
const upgradeTo = (read) => read.view.state === 'ready' ? (read.view.attention.find((a) => a.kind === 'upgrade-available')?.versions?.to ?? undefined) : undefined;
|
|
152
|
+
/** Jig says a newer release than this machine's is out: `jig self-update` comes before the project's upgrade. */
|
|
153
|
+
const releaseOut = (read) => read.view.state === 'ready' && read.view.attention.some((a) => a.kind === 'release-available');
|
|
152
154
|
/** A read that may have caught Jig mid-write: worth one more try before it is believed. */
|
|
153
155
|
const torn = (read) => read.view.state === 'unreadable' || read.view.state === 'incompatible';
|
|
154
156
|
/**
|
|
@@ -165,6 +167,24 @@ export function localSource(configDir, { rescanMs = 60_000, quietMs, maxWaitMs }
|
|
|
165
167
|
changing = done.catch(() => undefined);
|
|
166
168
|
return done;
|
|
167
169
|
}
|
|
170
|
+
/** The runs that change this machine's Jig or every project, kept until dismissed or the next one starts. */
|
|
171
|
+
const machine = { selfUpdate: null, upgradeAll: null };
|
|
172
|
+
/** The newest release any connected project's last read names. */
|
|
173
|
+
function newestRelease() {
|
|
174
|
+
let newest = null;
|
|
175
|
+
for (const entry of entries.values()) {
|
|
176
|
+
const read = entry.shown;
|
|
177
|
+
if (read?.view.state !== 'ready')
|
|
178
|
+
continue;
|
|
179
|
+
for (const item of read.view.attention) {
|
|
180
|
+
const named = releaseNamed(item);
|
|
181
|
+
// `supports(a, b)` is a ≥ b.
|
|
182
|
+
if (named && (newest === null || !supports(newest, named)))
|
|
183
|
+
newest = named;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return newest;
|
|
187
|
+
}
|
|
168
188
|
const listeners = new Set();
|
|
169
189
|
let rescan;
|
|
170
190
|
/** Counts the times following started; a read that finishes after a stop belongs to none. */
|
|
@@ -231,6 +251,100 @@ export function localSource(configDir, { rescanMs = 60_000, quietMs, maxWaitMs }
|
|
|
231
251
|
if (following() && entries.get(entry.project.id) === entry)
|
|
232
252
|
signal({ id: entry.project.id, revision: entry.shown?.revision ?? null });
|
|
233
253
|
}
|
|
254
|
+
/** A self-update, an Upgrade all or a project's upgrade is under way: the next one waits for it to end. */
|
|
255
|
+
const anyRunning = () => machine.selfUpdate?.state === 'running' ||
|
|
256
|
+
machine.upgradeAll?.state === 'running' ||
|
|
257
|
+
[...entries.values()].some((e) => e.upgrade?.state === 'running');
|
|
258
|
+
/** Tells the listeners that the machine's runs changed: through every project followed, the page reads the workspace. */
|
|
259
|
+
function signalMachine() {
|
|
260
|
+
if (!following())
|
|
261
|
+
return;
|
|
262
|
+
for (const [id, entry] of entries)
|
|
263
|
+
signal({ id, revision: entry.shown?.revision ?? null });
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* The main checkout whose Jig hands `jig self-update` to the machine's: one whose last read says a release is out —
|
|
267
|
+
* a Jig that knows the command — else the first connected project with a Jig.
|
|
268
|
+
*/
|
|
269
|
+
async function selfUpdateRoot() {
|
|
270
|
+
const projects = (await readProjects(configDir).catch(() => [])).filter((p) => hasJig(p.path));
|
|
271
|
+
const saysRelease = (id) => {
|
|
272
|
+
const read = entries.get(id)?.shown;
|
|
273
|
+
return read !== undefined && releaseOut(read);
|
|
274
|
+
};
|
|
275
|
+
return (projects.find((p) => saysRelease(p.id)) ?? projects[0])?.path;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Updates this machine's Jig through the project in `root`, then reads every connected project again: each now shows
|
|
279
|
+
* the upgrade the new Jig makes. The run is marked at once, before the first await.
|
|
280
|
+
*/
|
|
281
|
+
async function updatingMachine(root) {
|
|
282
|
+
machine.selfUpdate = { state: 'running', since: new Date().toISOString() };
|
|
283
|
+
signalMachine();
|
|
284
|
+
let run;
|
|
285
|
+
try {
|
|
286
|
+
run = { state: 'done', at: '', said: await runSelfUpdate(root) };
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
run = { state: 'failed', at: '', reasons: error instanceof JigRefusal ? error.reasons : [] };
|
|
290
|
+
}
|
|
291
|
+
run = { ...run, at: new Date().toISOString() };
|
|
292
|
+
machine.selfUpdate = run;
|
|
293
|
+
const projects = await readProjects(configDir).catch(() => []);
|
|
294
|
+
await Promise.allSettled(projects.map((p) => refresh(entryOf(p))));
|
|
295
|
+
signalMachine();
|
|
296
|
+
return run;
|
|
297
|
+
}
|
|
298
|
+
/** Upgrades every connected project that shows an upgrade, one at a time, after this machine's Jig when a release is out. */
|
|
299
|
+
async function upgradingAll() {
|
|
300
|
+
const upgraded = [];
|
|
301
|
+
const skipped = [];
|
|
302
|
+
let failed = null;
|
|
303
|
+
const since = machine.upgradeAll?.state === 'running' ? machine.upgradeAll.since : new Date().toISOString();
|
|
304
|
+
const progress = (current) => {
|
|
305
|
+
machine.upgradeAll = { state: 'running', since, current, upgraded: [...upgraded] };
|
|
306
|
+
signalMachine();
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
const projects = await readProjects(configDir).catch(() => []);
|
|
310
|
+
if ((await Promise.all(projects.map(shown))).some(releaseOut)) {
|
|
311
|
+
const root = await selfUpdateRoot();
|
|
312
|
+
const run = root ? await updatingMachine(root) : undefined;
|
|
313
|
+
if (!run)
|
|
314
|
+
failed = ['No connected project has a Jig to run jig self-update through.'];
|
|
315
|
+
else if (run.state === 'failed')
|
|
316
|
+
failed = run.reasons.length ? run.reasons : ['jig self-update failed.'];
|
|
317
|
+
}
|
|
318
|
+
if (!failed) {
|
|
319
|
+
for (const project of projects) {
|
|
320
|
+
// Picked in turn with disconnects, as a single upgrade starts: one disconnected meanwhile is never upgraded,
|
|
321
|
+
// and one marked running cannot be disconnected.
|
|
322
|
+
const entry = await oneAtATime(async () => {
|
|
323
|
+
if (!(await readProjects(configDir).catch(() => [])).some((p) => p.id === project.id))
|
|
324
|
+
return undefined;
|
|
325
|
+
const picked = entryOf(project);
|
|
326
|
+
const to = upgradeTo(await shown(project));
|
|
327
|
+
if (to === undefined || picked.upgrade?.state === 'running') {
|
|
328
|
+
skipped.push(project.id);
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
progress(project.id);
|
|
332
|
+
picked.upgrade = { state: 'running', since: new Date().toISOString(), to };
|
|
333
|
+
signalUpgrade(picked);
|
|
334
|
+
return picked;
|
|
335
|
+
});
|
|
336
|
+
if (!entry)
|
|
337
|
+
continue;
|
|
338
|
+
await upgrading(entry);
|
|
339
|
+
upgraded.push(project.id);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
finally {
|
|
344
|
+
machine.upgradeAll = { state: 'done', at: new Date().toISOString(), upgraded, skipped, failed };
|
|
345
|
+
signalMachine();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
234
348
|
/** The project's last read when an upgrade may start from it: ready and naming a version to upgrade to. */
|
|
235
349
|
async function upgradable(id) {
|
|
236
350
|
const project = (await readProjects(configDir)).find((p) => p.id === id);
|
|
@@ -240,8 +354,10 @@ export function localSource(configDir, { rescanMs = 60_000, quietMs, maxWaitMs }
|
|
|
240
354
|
if (read.view.state !== 'ready')
|
|
241
355
|
return read.view;
|
|
242
356
|
const entry = entryOf(project);
|
|
243
|
-
|
|
357
|
+
// One upgrade at a time on this machine: a self-update or an Upgrade all under way holds every project's.
|
|
358
|
+
if (entry.upgrade?.state === 'running' || machine.selfUpdate?.state === 'running' || machine.upgradeAll?.state === 'running') {
|
|
244
359
|
return { state: 'refused', code: 'running' };
|
|
360
|
+
}
|
|
245
361
|
const to = upgradeTo(read);
|
|
246
362
|
return to === undefined ? { state: 'refused', code: 'not-found' } : { entry, to };
|
|
247
363
|
}
|
|
@@ -457,6 +573,41 @@ export function localSource(configDir, { rescanMs = 60_000, quietMs, maxWaitMs }
|
|
|
457
573
|
}
|
|
458
574
|
return true;
|
|
459
575
|
},
|
|
576
|
+
machine() {
|
|
577
|
+
return { ...machine, release: newestRelease() };
|
|
578
|
+
},
|
|
579
|
+
async selfUpdate() {
|
|
580
|
+
// Started in turn with upgrade starts and disconnects, and awaited after it: a call meanwhile is refused, not queued.
|
|
581
|
+
const started = await oneAtATime(async () => {
|
|
582
|
+
if (anyRunning())
|
|
583
|
+
return { state: 'refused', code: 'running' };
|
|
584
|
+
const root = await selfUpdateRoot();
|
|
585
|
+
if (!root)
|
|
586
|
+
return { state: 'refused', code: 'not-found' };
|
|
587
|
+
return { run: updatingMachine(root) }; // marked running before its first await
|
|
588
|
+
});
|
|
589
|
+
if ('state' in started)
|
|
590
|
+
return started;
|
|
591
|
+
const run = await started.run;
|
|
592
|
+
return run.state === 'done' ? { state: 'done', said: run.said } : { state: 'failed', reasons: run.reasons };
|
|
593
|
+
},
|
|
594
|
+
upgradeAll() {
|
|
595
|
+
return oneAtATime(async () => {
|
|
596
|
+
if (anyRunning())
|
|
597
|
+
return { state: 'refused', code: 'running' };
|
|
598
|
+
machine.upgradeAll = { state: 'running', since: new Date().toISOString(), current: null, upgraded: [] };
|
|
599
|
+
signalMachine();
|
|
600
|
+
void upgradingAll().catch(() => undefined); // its `finally` has kept what it came to
|
|
601
|
+
return { state: 'started' };
|
|
602
|
+
});
|
|
603
|
+
},
|
|
604
|
+
dismissUpgradeAll() {
|
|
605
|
+
if (machine.upgradeAll?.state === 'running' || machine.selfUpdate?.state === 'running')
|
|
606
|
+
return;
|
|
607
|
+
machine.upgradeAll = null;
|
|
608
|
+
machine.selfUpdate = null;
|
|
609
|
+
signalMachine();
|
|
610
|
+
},
|
|
460
611
|
disconnect(id) {
|
|
461
612
|
return oneAtATime(async () => {
|
|
462
613
|
// The run is the entry's: without it a project connected again would be read, and upgraded, meanwhile.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as ee,J as l,K as te,L as u,M as d,N as f,O as ne,P as re,Q as p,R as ie,S as m,T as h,U as g,V as _,W as v,X as y,Y as b,Z as x,_ as S,a as C,at as w,b as ae,c as oe,d as T,et as E,f as se,g as D,h as O,i as ce,it as le,j as ue,k as de,l as fe,m as pe,n as me,nt as k,o as he,p as A,q as j,r as M,rt as N,s as P,t as ge,tt as F,u as _e,v as ve,w as ye,x as I,y as be,z as xe}from"./index-CIxsumFv.js";var Se=b({__name:`BaseSeparator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e,n=[`horizontal`,`vertical`];function r(e){return n.includes(e)}let i=_(()=>r(t.orientation)?t.orientation:`horizontal`),a=_(()=>i.value===`vertical`?t.orientation:void 0),o=_(()=>t.decorative?{role:`none`}:{"aria-orientation":a.value,role:`separator`});return(t,n)=>(p(),g(k(re),x({as:e.as,"as-child":e.asChild,"data-orientation":i.value},o.value),{default:F(()=>[E(t.$slots,`default`)]),_:3},16,[`as`,`as-child`,`data-orientation`]))}}),Ce=b({__name:`Separator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return(e,n)=>(p(),g(Se,le(y(t)),{default:F(()=>[E(e.$slots,`default`)]),_:3},16))}}),we=b({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-content`,class:N(k(o)(`px-4 group-data-[size=sm]/card:px-3`,t.class))},[E(e.$slots,`default`)],2))}}),Te=b({__name:`CardDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-description`,class:N(k(o)(`text-xs/relaxed text-muted-foreground`,t.class))},[E(e.$slots,`default`)],2))}}),Ee=b({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-header`,class:N(k(o)(`group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-none px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3`,t.class))},[E(e.$slots,`default`)],2))}}),De=b({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-title`,class:N(k(o)(`cn-font-heading text-sm font-medium group-data-[size=sm]/card:text-sm`,t.class))},[E(e.$slots,`default`)],2))}}),L=b({__name:`Separator`,props:{orientation:{default:`horizontal`},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e,r=t(n,`class`);return(e,t)=>(p(),g(k(Ce),x({"data-slot":`separator`},k(r),{class:k(o)(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch`,n.class)}),null,16,[`class`]))}}),Oe=[`aria-label`],ke={class:`flex items-baseline gap-3 border-b bg-muted/50 px-4 py-2`},Ae={class:`font-semibold tracking-wider uppercase`},je={key:0,class:`text-muted-foreground`},Me={class:`grid grid-cols-1 divide-y lg:grid-cols-2 lg:divide-x lg:divide-y-0`},R=b({__name:`CanvasSection`,props:{title:{},note:{}},setup(t){return(r,i)=>(p(),s(`section`,{"aria-label":t.title,class:`border-b`},[c(`h2`,ke,[c(`span`,Ae,w(t.title),1),t.note?(p(),s(`span`,je,w(t.note),1)):v(``,!0)]),c(`div`,Me,[(p(),s(n,null,e([`light`,`dark`],e=>c(`div`,{key:e,class:N([e,`flex flex-col gap-4 bg-background p-4 text-foreground`])},[E(r.$slots,`default`)],2)),64))])],8,Oe))}}),z=(e,t)=>({id:e,class:`T2`,status:`active`,goal:null,paused:!1,pauseRequest:null,pauseRequestable:!0,resumable:!1,resumesTo:null,started:!0,gate:null,autopilot:null,pullRequest:null,priority:null,queue:null,...t}),B=(e,t)=>({url:`https://github.com/fapost-lab/jig-ui/pull/18`,state:e,ci:t,fetchedAt:`2026-10-18T09:40:00Z`}),V=[z(`design-system`,{class:`T3`,gate:`waiting`,priority:0,queue:{level:null,position:100},goal:`shadcn-vue on Tailwind v4 with light and dark themes; #/canvas with every component in every variant; the three screens rebuilt on it.`}),z(`registry-schema`,{gate:`changed`,priority:3,queue:{level:null,position:200},goal:`Version the registry file so a newer Jig UI can read an older one.`}),z(`pause-request`,{class:`T3`,autopilot:`stopped`,goal:`A drop on the paused column writes a sticky request through Jig; the card shows it with its age and a cancel.`}),z(`specs-and-epics`,{autopilot:`on`,queue:{level:null,position:300},goal:`Show each spec with its phases, progress and epic branch beside the board, from Jig's spec list.`}),z(`task-details`,{status:`ready`,pullRequest:B(`open`,`green`),goal:`Open a task's details from its card.`}),z(`refusal-fixture`,{class:`T0`,status:`ready`,pullRequest:B(`open`,`red`),goal:`Replace the refusal text in task-list-states.json with one Jig prints.`}),z(`docs-board`,{class:`T1`,status:`ready`,pullRequest:B(`open`,`pending`),goal:`Describe the five columns on the projects page of the docs.`}),z(`live-updates`,{status:`ready`,pullRequest:B(`merged`,`none`),goal:`Follow connected projects without a reload.`}),z(`no-pr-yet`,{class:`T1`,status:`ready`,goal:`Ready, nothing pushed.`}),z(`jig-init-hook`,{class:`T3`,paused:!0,pauseRequestable:!1,goal:`Register a project in an installed Jig UI from jig init.`}),z(`file-backlog-task`,{class:null,started:!1,goal:`File a minimal backlog task from the page through jig task new.`}),z(`a-task-with-a-rather-long-identifier-that-wraps`,{goal:null}),z(`conflict-display`,{pauseRequest:{requestedAt:`2026-10-22T09:00:00Z`},pauseRequestable:!1,goal:`Show what changed when a write was based on a stale read.`}),z(`resume-from-page`,{class:`T3`,paused:!0,pauseRequestable:!1,resumable:!0,resumesTo:`in-progress`,goal:`A drop out of Paused, or the card menu, resumes the task through jig task resume.`})],H=[{id:`needs-you`,title:`Needs you`,cards:V.slice(0,3)},{id:`in-progress`,title:`In progress`,cards:[V[3],V[12],V[11]]},{id:`ready`,title:`Ready`,cards:V.slice(4,9)},{id:`backlog`,title:`Backlog`,cards:[V[10]]},{id:`paused`,title:`Paused`,cards:[V[9],V[13]]}],U=H.map(e=>({...e,cards:[]})),Ne=[{id:`file-backlog-task`,status:`consolidated`,goal:`File a minimal backlog task from the page.`,updatedAt:`2026-10-25`,pullRequest:{url:`https://github.com/fapost-lab/jig-ui/pull/40`,state:`merged`}},{id:`pr-template`,status:`abandoned`,goal:`A pull request template.`,updatedAt:`2026-10-17`,pullRequest:null},{id:`old-spike`,status:`abandoned`,goal:null,updatedAt:`2026-10-12`,pullRequest:null}],Pe=[{id:`needs-you`,title:`Needs you`,count:3},{id:`in-progress`,title:`In progress`,count:1},{id:`ready`,title:`Ready`,count:5},{id:`backlog`,title:`Backlog`,count:1},{id:`paused`,title:`Paused`,count:1},{id:`unknown`,title:`A column this page does not know`,count:0}],W=[{kind:`gate`,subject:{type:`task`,id:`design-system`},tasks:[`design-system`],title:`Design waits at its gate`,detail:null,todo:`Review the design and approve it: jig task gate design-system approved`,url:null,versions:null},{kind:`pull-request-ci-failed`,subject:{type:`task`,id:`refusal-fixture`},tasks:[`refusal-fixture`],title:`CI failed`,detail:`pull request #19`,todo:`Look at the failing check.`,url:`https://github.com/fapost-lab/jig-ui/pull/19`,versions:null},{kind:`housekeeping`,subject:{type:`project`,id:null},tasks:[],title:`Housekeeping never ran`,detail:null,todo:`Run jig housekeeping.`,url:`https://example.com/docs`,versions:null}],Fe=[{id:`approve-gate`,command:`jig task gate design-system approved`},{id:`answer-stop`,command:`jig task autopilot pause-request resume --answer <text>`},{id:`pause`,command:`jig task pause design-system`},{id:`request-pause`,command:`jig queue request task:design-system pause`},{id:`something-new`,command:`jig task something-new design-system`}],Ie={state:`ready`,issue:null,baseBranch:`main`,createdAt:`2026-10-17`,updatedAt:`2026-10-18`,knowledgeConsolidated:!1,worktree:null,gateBy:null,run:null,housekeepingFlags:[],attention:[]},G=[{...Ie,...V[2],gate:`approved`,gateBy:`human`,branch:`task/pause-request`,worktree:{uncommitted:4},issue:`#42`,pullRequest:B(`open`,`red`),run:{mode:`attended`,stage:`implement`,stageAt:`2026-10-18T09:00:00Z`,stopReason:`Which column takes a paused task that already has an open pull request?`,stopAt:`2026-10-18T09:12:00Z`,phase:null},housekeepingFlags:[`needs-consolidation`],attention:[W[0]],actions:Fe,column:{id:`needs-you`,title:`Needs you`}},{...Ie,...V[10],branch:null,actions:[{id:`start`,command:`jig task start file-backlog-task`}],column:{id:`backlog`,title:`Backlog`}}],K=(e,t={})=>({id:e,state:`ready`,jigVersion:`0.29.0`,counts:{active:11,paused:1,ready:3},attention:[],housekeepingStale:!1,upgrade:null,...t}),q=[K(`jig-ui`,{attention:W,housekeepingStale:!0}),K(`nextjs-store`,{counts:{active:0,paused:0,ready:0}}),K(`legacy-shop`,{jigVersion:`0.34.0`,counts:{active:2,paused:0,ready:0},attention:[{kind:`upgrade-available`,subject:{type:`project`,id:null},tasks:[],title:`Jig in this project is older than on this machine`,detail:`this project runs 0.34.0; this machine has 0.35.0`,todo:`jig upgrade`,url:null,versions:{from:`0.34.0`,to:`0.35.0`}}]}),{id:`old-jig`,state:`unsupported`,jigVersion:`0.26.0`,minimum:`0.29.0`,upgrade:null},{id:`new-jig`,state:`incompatible`,jigVersion:`1.0.0`,upgrade:null},{id:`busy`,state:`unreadable`,code:`locked`,upgrade:null},{id:`moved`,state:`unavailable`,reason:`missing`,upgrade:null}],J={mode:`copy`,from:`0.34.0`,to:`0.35.0`,outcome:`planned`,git:null,manualSteps:[],wouldStop:[]},Le=[{state:`reading`},{state:`planned`,plan:J},{state:`planned`,plan:{...J,manualSteps:[`Restart your agent sessions: the skills changed.`]}},{state:`planned`,plan:{...J,wouldStop:["the working tree has uncommitted changes; commit them, stash them (`git stash`), or finish the task they belong to, then run `jig upgrade` again"]}},{state:`refused`,message:`Jig refused the upgrade.`}],Y={level:`pr`,branch:`jig/upgrade-0.35.0`,commit:`279390b`,pushed:!0,pullRequest:`https://github.com/fapost-lab/jig-ui/pull/49`,merged:!1},X=e=>({state:`done`,at:`2026-10-27T08:00:00Z`,upgrade:{...J,outcome:`upgraded`,git:Y,...e}}),Re=[{state:`running`,since:new Date(Date.now()-12e4).toISOString(),to:`0.35.0`},X({git:{...Y,merged:!0}}),X({manualSteps:[`Restart your agent sessions: the skills changed.`]}),X({outcome:`staged`,git:{...Y,level:`none`,commit:null,pushed:!1,pullRequest:null}}),X({outcome:`nothing-to-do`,git:null}),{state:`refused`,at:`2026-10-27T08:00:00Z`,code:`upgrade-blocked`,reasons:[`task up-x is started and its branch task/up-x is checked out here (record .ai/runtime/working/up-x); the upgrade would take this checkout off it`]},{state:`refused`,at:`2026-10-27T08:00:00Z`,code:`failed`,reasons:[]}],Z=[{text:"`design-system` — design system and canvas",checked:!0,task:`design-system`,fog:!1},{text:"`specs-and-epics` — specs and epics (after: project board — `jig spec list`)",checked:!1,task:`specs-and-epics`,fog:!1},{text:"`old-task` — a task no longer live",checked:!1,task:`old-task`,fog:!1},{text:`invoices from orders, no task filed yet`,checked:!1,task:null,fog:!1},{text:"fog: registration by `jig init`",checked:!1,task:null,fog:!0}],Q=[{id:`jig-ui`,title:`Jig UI — a local control center for Jig projects`,missingFiles:[],release:null,epic:null,progress:{done:2,total:6,filed:2,fog:1},phases:[{phase:0,title:`Package and release`,done:1,total:1,filed:0,fog:0,items:[{...Z[0],text:`package and release`,task:null}]},{phase:1,title:`Read-only UI`,done:1,total:5,filed:2,fog:1,items:Z}],queue:null},{id:`billing`,title:`Billing in one place`,missingFiles:[],release:`minor`,epic:{branch:`epic/billing`,state:`open`,checkedOut:!1,missing:!1,fetched:!0},progress:{done:0,total:1,filed:0,fog:0},phases:[{phase:null,title:null,done:0,total:1,filed:0,fog:0,items:[Z[3]]}],queue:{position:100,priority:1}},{id:`lost-epic`,title:`An epic whose branch is gone`,missingFiles:[],release:`major`,epic:{branch:`epic/lost`,state:`open`,checkedOut:!0,missing:!0,fetched:!1},progress:null,phases:[],queue:null},{id:`half-written`,title:null,missingFiles:[`spec.md`,`roadmap.md`],release:null,epic:null,progress:null,phases:[],queue:null}],$=[Q[1],{...Q[1],id:`refunds`,title:`Refunds`,queue:{position:200,priority:null}},{...Q[1],id:`exports`,title:`Exports`,queue:{position:300,priority:4}},{...Q[1],id:`payouts`,title:`Payouts`,queue:null}],ze={class:`flex gap-4`},Be={class:`w-24 text-muted-foreground`},Ve={class:`flex items-center gap-2`},He={class:`flex flex-wrap gap-2`},Ue={class:`flex max-w-sm flex-col gap-2`},We={class:`flex h-5 items-center gap-2`},Ge={class:`flex gap-2`},Ke={class:`flex flex-wrap items-center gap-6`},qe={class:`flex items-center gap-1`},Je={class:`flex flex-wrap items-center gap-6`},Ye={class:`flex items-center gap-1`},Xe={class:`grid grid-cols-2 gap-2 xl:grid-cols-3`},Ze={class:`flex h-[28rem] flex-col`},Qe={class:`flex h-40 flex-col`},$e={class:`flex h-[28rem] flex-col`},et={class:`flex h-64 flex-col`},tt={class:`flex h-64 flex-col`},nt=b({__name:`CanvasView`,setup(t){let o=[`default`,`secondary`,`outline`,`ghost`,`destructive`,`link`],re=[`xs`,`sm`,`default`,`lg`],_=[`icon-xs`,`icon-sm`,`icon`,`icon-lg`],v=[`default`,`secondary`,`outline`,`ghost`,`destructive`,`link`],y=[`attention`,`good`,`bad`,`quiet`];return(t,b)=>(p(),s(`div`,null,[b[14]||=c(`div`,{class:`border-b px-4 py-3`},[c(`h1`,{class:`font-semibold tracking-wider uppercase`},`Canvas`),c(`p`,{class:`text-muted-foreground`},`Every component of the page in every variant and state; the left panel light, the right dark.`)],-1),l(R,{title:`Tones`,note:`lib/tones.ts — the only colours with a meaning`},{default:F(()=>[(p(),s(n,null,e(y,e=>c(`p`,{key:e,class:N(k(ie)[e])},w(e)+` as a rule`,3)),64)),c(`p`,ze,[(p(),s(n,null,e(y,e=>c(`span`,{key:e,class:N(k(xe)[e])},w(e),3)),64))])]),_:1}),b[15]||=c(`h2`,{class:`border-b px-4 py-2 font-bold tracking-widest uppercase`},`components/ui`,-1),l(R,{title:`Button`,note:`variant × size; icon sizes; disabled`},{default:F(()=>[(p(),s(n,null,e(o,t=>c(`div`,{key:t,class:`flex flex-wrap items-center gap-2`},[c(`span`,Be,w(t),1),(p(),s(n,null,e(re,e=>l(k(f),{key:e,variant:t,size:e},{default:F(()=>[j(w(e),1)]),_:2},1032,[`variant`,`size`])),64)),l(k(f),{variant:t,disabled:``},{default:F(()=>[...b[0]||=[j(`disabled`,-1)]]),_:1},8,[`variant`])])),64)),c(`div`,Ve,[b[2]||=c(`span`,{class:`w-24 text-muted-foreground`},`icon`,-1),(p(),s(n,null,e(_,e=>l(k(f),{key:e,variant:`outline`,size:e,"aria-label":e},{default:F(()=>[l(k(ee))]),_:1},8,[`size`,`aria-label`])),64)),l(k(f),{variant:`outline`,size:`sm`},{default:F(()=>[l(k(ee),{"data-icon":`inline-start`}),b[1]||=j(`with icon`,-1)]),_:1})])]),_:1}),l(R,{title:`Badge`},{default:F(()=>[c(`div`,He,[(p(),s(n,null,e(v,e=>l(k(de),{key:e,variant:e},{default:F(()=>[j(w(e),1)]),_:2},1032,[`variant`])),64))])]),_:1}),l(R,{title:`Card`},{default:F(()=>[l(k(ne),{class:`max-w-sm`},{default:F(()=>[l(k(Ee),null,{default:F(()=>[l(k(De),null,{default:F(()=>[...b[3]||=[j(`Card title`,-1)]]),_:1}),l(k(Te),null,{default:F(()=>[...b[4]||=[j(`Card description, muted.`,-1)]]),_:1})]),_:1}),l(k(we),null,{default:F(()=>[...b[5]||=[j(`Card content.`,-1)]]),_:1})]),_:1})]),_:1}),l(R,{title:`Input and Label`,note:`empty, filled, invalid, disabled`},{default:F(()=>[c(`div`,Ue,[l(k(se),null,{default:F(()=>[...b[6]||=[j(`Project path`,-1)]]),_:1}),l(k(A),{placeholder:`/path/to/project`}),l(k(A),{"model-value":`/Users/me/project`}),l(k(A),{"model-value":`/not/a/project`,"aria-invalid":`true`}),l(k(A),{"model-value":`disabled`,disabled:``})])]),_:1}),l(R,{title:`Separator`},{default:F(()=>[l(k(L)),c(`div`,We,[b[7]||=j(`left`,-1),l(k(L),{orientation:`vertical`}),b[8]||=j(`right`,-1)])]),_:1}),l(R,{title:`ToggleGroup`,note:`the Board / List switch`},{default:F(()=>[l(k(he),{type:`single`,variant:`outline`,size:`sm`,"model-value":`board`,"aria-label":`View`},{default:F(()=>[l(k(C),{value:`board`},{default:F(()=>[...b[9]||=[j(`Board`,-1)]]),_:1}),l(k(C),{value:`list`},{default:F(()=>[...b[10]||=[j(`List`,-1)]]),_:1})]),_:1})]),_:1}),l(R,{title:`Toggle`,note:`the board's finished tasks: off, on`},{default:F(()=>[c(`div`,Ge,[l(k(P),{variant:`outline`,size:`sm`,"model-value":!1},{default:F(()=>[...b[11]||=[j(`3 finished tasks`,-1)]]),_:1}),l(k(P),{variant:`outline`,size:`sm`,"model-value":!0},{default:F(()=>[...b[12]||=[j(`3 finished tasks`,-1)]]),_:1})])]),_:1}),l(R,{title:`Collapsible`,note:`open and folded`},{default:F(()=>[(p(),s(n,null,e([!0,!1],e=>l(k(ae),{key:String(e),"default-open":e},{default:F(()=>[l(k(ve),{class:`w-full border-b bg-muted/50 px-3 py-1.5 text-left`},{default:F(()=>[j(`Trigger (`+w(e?`open`:`folded`)+`)`,1)]),_:2},1024),l(k(be),{class:`px-3 py-2`},{default:F(()=>[...b[13]||=[j(`Content`,-1)]]),_:1})]),_:2},1032,[`default-open`])),64))]),_:1}),b[16]||=c(`h2`,{class:`border-b px-4 py-2 font-bold tracking-widest uppercase`},`components`,-1),l(R,{title:`ProjectTabs`,note:`on the workspace; on a project; empty`},{default:F(()=>[l(u,{projects:k(q),version:`0.1.0`},{default:F(()=>[l(d)]),_:1},8,[`projects`]),l(u,{projects:k(q),current:`jig-ui`,version:`0.1.0`},null,8,[`projects`]),l(u,{projects:[]})]),_:1}),l(R,{title:`ThemeToggle`,note:`switches the whole page; the icon is the theme it switches to`},{default:F(()=>[c(`div`,null,[l(d)])]),_:1}),l(R,{title:`ProjectCard`,note:`ready with attention and stale housekeeping; nothing needs you; its Jig older than the machine's, Upgrade… offered; each state it cannot be read in`},{default:F(()=>[(p(!0),s(n,null,e(k(q),e=>(p(),g(ge,{key:e.id,project:e},null,8,[`project`]))),128))]),_:1}),l(R,{title:`UpgradePanel`,note:`on a card: reading the dry run; the plan, with steps by hand; a stop; a refusal; under way; merged, with steps by hand, staged, nothing to do; not started; failed`},{default:F(()=>[(p(!0),s(n,null,e(k(Le),(e,t)=>(p(),g(me,{key:`plan-${t}`,project:`legacy-shop`,run:null,plan:e},null,8,[`plan`]))),128)),(p(!0),s(n,null,e(k(Re),(e,t)=>(p(),g(me,{key:`run-${t}`,project:`legacy-shop`,run:e,plan:void 0},null,8,[`run`]))),128))]),_:1}),l(R,{title:`NewTaskForm`,note:`empty, on its way, the id taken`},{default:F(()=>[l(T,{busy:!1}),l(T,{busy:!0,task:`fix-login`,goal:`Log in with the token after a restart.`}),l(T,{busy:!1,task:`queue-reorder`,goal:`Order the work.`,refusal:`The project has a task called queue-reorder already, maybe a finished one. Choose another id.`,taken:``})]),_:1}),l(R,{title:`ConnectForm`,note:`idle, busy, refused`},{default:F(()=>[l(M,{busy:!1}),l(M,{busy:!0,"model-value":`/Users/me/project`}),l(M,{busy:!1,"model-value":`/Users/me/project/.claude/worktrees/x`,refusal:`That is a worktree. Connect the main checkout instead.`})]),_:1}),l(R,{title:`AttentionItem`,note:`no link; a pull request; another link`},{default:F(()=>[(p(!0),s(n,null,e(k(W),(e,t)=>(p(),g(ce,{key:t,item:e},null,8,[`item`]))),128))]),_:1}),l(R,{title:`ColumnHeader`,note:`each column, and one this page does not know`},{default:F(()=>[(p(!0),s(n,null,e(k(Pe),e=>(p(),g(ue,{id:e.id,key:e.id,title:e.title,count:e.count},null,8,[`id`,`title`,`count`]))),128))]),_:1}),l(R,{title:`QueueMenu`,note:`press to open: To top, Up, Down, To bottom, Priority, the pause — first queued, in the middle, not queued, last, paused under a Jig that cannot resume it (no pause to ask, Resume off), paused and resumable, a pause asked, while its change is on its way`},{default:F(()=>[c(`div`,Ke,[(p(!0),s(n,null,e([k(V)[0],k(V)[1],k(V)[3],k(V)[11],k(V)[9],k(V)[13],k(V)[12]],e=>(p(),s(`span`,{key:e.id,class:`flex items-center gap-1`},[j(w(e.id),1),l(i,{task:e,cards:k(V)},null,8,[`task`,`cards`])]))),128)),c(`span`,qe,[j(w(k(V)[1].id),1),l(i,{task:k(V)[1],cards:k(V),disabled:``},null,8,[`task`,`cards`])])])]),_:1}),l(R,{title:`EpicMenu`,note:`press to open: To top, Up, Down, To bottom, Priority — first queued (no Up), in the middle (Up and Down), last queued (no Down: the next one is not queued), not queued (Up joins the queued ones), while its change is on its way`},{default:F(()=>[c(`div`,Je,[(p(!0),s(n,null,e(k($),e=>(p(),s(`span`,{key:e.id,class:`flex items-center gap-1`},[j(w(e.id),1),l(O,{spec:e,specs:k($)},null,8,[`spec`,`specs`])]))),128)),c(`span`,Ye,[j(w(k($)[1].id),1),l(O,{spec:k($)[1],specs:k($),disabled:``},null,8,[`spec`,`specs`])])])]),_:1}),l(R,{title:`TaskCard`,note:`every note a card carries, a priority among them; with its queue menu; while its change is on its way; changed since a refused change; open with details, while reading, unreadable`},{default:F(()=>[c(`div`,Xe,[(p(!0),s(n,null,e(k(V),e=>(p(),g(m,{key:e.id,project:`jig-ui`,task:e,open:!1},null,8,[`task`]))),128)),l(m,{project:`jig-ui`,task:k(V)[1],open:!1,cards:k(V)},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[0],open:!1,cards:k(V),busy:``},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[3],open:!1,cards:k(V),changed:``},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[2],open:!0,details:k(G)[0]},null,8,[`task`,`details`]),l(m,{project:`jig-ui`,task:k(V)[0],open:!0},null,8,[`task`]),l(m,{project:`jig-ui`,task:k(V)[1],open:!0,details:`unavailable`},null,8,[`task`])])]),_:1}),l(R,{title:`TaskRow`,note:`each note and priority; selected; with its queue menu; while its change is on its way; changed since a refused change`},{default:F(()=>[c(`div`,null,[(p(!0),s(n,null,e(k(V),(e,t)=>(p(),g(S,{key:e.id,task:e,selected:t===2},null,8,[`task`,`selected`]))),128)),l(S,{task:k(V)[1],selected:!1,cards:k(V)},null,8,[`task`,`cards`]),l(S,{task:k(V)[0],selected:!1,cards:k(V),busy:``},null,8,[`task`,`cards`]),l(S,{task:k(V)[3],selected:!1,cards:k(V),changed:``},null,8,[`task`,`cards`])])]),_:1}),l(R,{title:`BoardColumns`,note:`cards in every column, one open with its details, two changed since a refused change; no live task`},{default:F(()=>[c(`div`,Ze,[l(I,{project:`jig-ui`,columns:k(H),selected:k(V)[2].id,details:k(G)[0],pending:k(V)[0].id,changed:[k(V)[1].id,k(V)[3].id]},null,8,[`columns`,`selected`,`details`,`pending`,`changed`])]),c(`div`,Qe,[l(I,{project:`jig-ui`,columns:k(U)},null,8,[`columns`])])]),_:1}),l(R,{title:`BoardList`,note:`a row picked with its details; nothing picked; no live task`},{default:F(()=>[c(`div`,$e,[l(D,{project:`jig-ui`,columns:k(H),selected:k(V)[2].id,details:k(G)[0]},null,8,[`columns`,`selected`,`details`])]),c(`div`,et,[l(D,{project:`jig-ui`,columns:k(H)},null,8,[`columns`])]),c(`div`,tt,[l(D,{project:`jig-ui`,columns:k(U)},null,8,[`columns`])])]),_:1}),l(R,{title:`FinishedList`,note:`closed with its pull request merged; abandoned; one without a goal`},{default:F(()=>[l(pe,{tasks:k(Ne),class:`border`},null,8,[`tasks`])]),_:1}),l(R,{title:`TaskFacts`,note:`everything a task can carry; a task not started`},{default:F(()=>[(p(!0),s(n,null,e(k(G),e=>(p(),g(ye,{key:e.id,details:e,class:`border-b pb-3`},null,8,[`details`]))),128))]),_:1}),l(R,{title:`TaskBrief`,note:`facts, actions and the link to the full page`},{default:F(()=>[l(r,{project:`jig-ui`,task:k(G)[1].id,details:k(G)[1]},null,8,[`task`,`details`])]),_:1}),l(R,{title:`ActionList`,note:`Jig's offers, one unknown id; none`},{default:F(()=>[l(h,{actions:k(Fe)},null,8,[`actions`]),l(h,{actions:[]})]),_:1}),l(R,{title:`CopyCommand`,note:`short; long enough to be cut`},{default:F(()=>[l(a,{command:`jig task pause design-system`}),l(a,{command:`jig task autopilot a-task-with-a-rather-long-identifier-that-wraps resume --answer 'a long answer to the question'`,class:`max-w-xs`})]),_:1}),l(R,{title:`ProgressBar`,note:`none, part, all, an empty roadmap`},{default:F(()=>[(p(),s(n,null,e([[0,4],[3,9],[5,5],[0,0]],([e,t])=>l(_e,{key:`${e}/${t}`,done:e,total:t},null,8,[`done`,`total`])),64))]),_:1}),l(R,{title:`SpecItemRow`,note:`done with a live task; open with dependencies; a task no longer live; no task; fog`},{default:F(()=>[c(`ul`,null,[(p(!0),s(n,null,e(k(Z),(e,t)=>(p(),g(fe,{key:t,item:e,project:`jig-ui`,live:t<2},null,8,[`item`,`live`]))),128))])]),_:1}),l(R,{title:`SpecCard`,note:`no epic, a finished phase folded; an open epic in the queue at P1, with its queue menu; a lost epic branch, not queued, with its change on its way; missing files`},{default:F(()=>[(p(!0),s(n,null,e(k(Q),e=>(p(),g(oe,{key:e.id,spec:e,project:`jig-ui`,live:[`design-system`,`specs-and-epics`],busy:e.id===`lost-epic`},te({_:2},[e.epic?.state===`open`?{name:`menu`,fn:F(()=>[l(O,{spec:e,specs:k(Q),disabled:e.id===`lost-epic`},null,8,[`spec`,`specs`,`disabled`])]),key:`0`}:void 0]),1032,[`spec`,`busy`]))),128))]),_:1})]))}});export{nt as default};
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as ee,J as l,K as te,L as u,M as d,N as f,O as ne,P as re,Q as p,R as ie,S as m,T as h,U as g,V as _,W as v,X as y,Y as b,Z as x,_ as S,a as C,at as w,b as ae,c as oe,d as T,et as E,f as se,g as D,h as O,i as ce,it as le,j as ue,k as de,l as fe,m as pe,n as me,nt as k,o as he,p as A,q as j,r as M,rt as N,s as P,t as ge,tt as F,u as _e,v as ve,w as ye,x as I,y as be,z as xe}from"./index-U-0MJGK-.js";var Se=b({__name:`BaseSeparator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e,n=[`horizontal`,`vertical`];function r(e){return n.includes(e)}let i=_(()=>r(t.orientation)?t.orientation:`horizontal`),a=_(()=>i.value===`vertical`?t.orientation:void 0),o=_(()=>t.decorative?{role:`none`}:{"aria-orientation":a.value,role:`separator`});return(t,n)=>(p(),g(k(re),x({as:e.as,"as-child":e.asChild,"data-orientation":i.value},o.value),{default:F(()=>[E(t.$slots,`default`)]),_:3},16,[`as`,`as-child`,`data-orientation`]))}}),Ce=b({__name:`Separator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return(e,n)=>(p(),g(Se,le(y(t)),{default:F(()=>[E(e.$slots,`default`)]),_:3},16))}}),we=b({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-content`,class:N(k(o)(`px-4 group-data-[size=sm]/card:px-3`,t.class))},[E(e.$slots,`default`)],2))}}),Te=b({__name:`CardDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-description`,class:N(k(o)(`text-xs/relaxed text-muted-foreground`,t.class))},[E(e.$slots,`default`)],2))}}),Ee=b({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-header`,class:N(k(o)(`group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-none px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3`,t.class))},[E(e.$slots,`default`)],2))}}),De=b({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(p(),s(`div`,{"data-slot":`card-title`,class:N(k(o)(`cn-font-heading text-sm font-medium group-data-[size=sm]/card:text-sm`,t.class))},[E(e.$slots,`default`)],2))}}),L=b({__name:`Separator`,props:{orientation:{default:`horizontal`},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e,r=t(n,`class`);return(e,t)=>(p(),g(k(Ce),x({"data-slot":`separator`},k(r),{class:k(o)(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch`,n.class)}),null,16,[`class`]))}}),Oe=[`aria-label`],ke={class:`flex items-baseline gap-3 border-b bg-muted/50 px-4 py-2`},Ae={class:`font-semibold tracking-wider uppercase`},je={key:0,class:`text-muted-foreground`},Me={class:`grid grid-cols-1 divide-y lg:grid-cols-2 lg:divide-x lg:divide-y-0`},R=b({__name:`CanvasSection`,props:{title:{},note:{}},setup(t){return(r,i)=>(p(),s(`section`,{"aria-label":t.title,class:`border-b`},[c(`h2`,ke,[c(`span`,Ae,w(t.title),1),t.note?(p(),s(`span`,je,w(t.note),1)):v(``,!0)]),c(`div`,Me,[(p(),s(n,null,e([`light`,`dark`],e=>c(`div`,{key:e,class:N([e,`flex flex-col gap-4 bg-background p-4 text-foreground`])},[E(r.$slots,`default`)],2)),64))])],8,Oe))}}),z=(e,t)=>({id:e,class:`T2`,status:`active`,goal:null,paused:!1,pauseRequest:null,pauseRequestable:!0,resumable:!1,resumesTo:null,started:!0,gate:null,autopilot:null,pullRequest:null,priority:null,queue:null,...t}),B=(e,t)=>({url:`https://github.com/fapost-lab/jig-ui/pull/18`,state:e,ci:t,fetchedAt:`2026-10-18T09:40:00Z`}),V=[z(`design-system`,{class:`T3`,gate:`waiting`,priority:0,queue:{level:null,position:100},goal:`shadcn-vue on Tailwind v4 with light and dark themes; #/canvas with every component in every variant; the three screens rebuilt on it.`}),z(`registry-schema`,{gate:`changed`,priority:3,queue:{level:null,position:200},goal:`Version the registry file so a newer Jig UI can read an older one.`}),z(`pause-request`,{class:`T3`,autopilot:`stopped`,goal:`A drop on the paused column writes a sticky request through Jig; the card shows it with its age and a cancel.`}),z(`specs-and-epics`,{autopilot:`on`,queue:{level:null,position:300},goal:`Show each spec with its phases, progress and epic branch beside the board, from Jig's spec list.`}),z(`task-details`,{status:`ready`,pullRequest:B(`open`,`green`),goal:`Open a task's details from its card.`}),z(`refusal-fixture`,{class:`T0`,status:`ready`,pullRequest:B(`open`,`red`),goal:`Replace the refusal text in task-list-states.json with one Jig prints.`}),z(`docs-board`,{class:`T1`,status:`ready`,pullRequest:B(`open`,`pending`),goal:`Describe the five columns on the projects page of the docs.`}),z(`live-updates`,{status:`ready`,pullRequest:B(`merged`,`none`),goal:`Follow connected projects without a reload.`}),z(`no-pr-yet`,{class:`T1`,status:`ready`,goal:`Ready, nothing pushed.`}),z(`jig-init-hook`,{class:`T3`,paused:!0,pauseRequestable:!1,goal:`Register a project in an installed Jig UI from jig init.`}),z(`file-backlog-task`,{class:null,started:!1,goal:`File a minimal backlog task from the page through jig task new.`}),z(`a-task-with-a-rather-long-identifier-that-wraps`,{goal:null}),z(`conflict-display`,{pauseRequest:{requestedAt:`2026-10-22T09:00:00Z`},pauseRequestable:!1,goal:`Show what changed when a write was based on a stale read.`}),z(`resume-from-page`,{class:`T3`,paused:!0,pauseRequestable:!1,resumable:!0,resumesTo:`in-progress`,goal:`A drop out of Paused, or the card menu, resumes the task through jig task resume.`})],H=[{id:`needs-you`,title:`Needs you`,cards:V.slice(0,3)},{id:`in-progress`,title:`In progress`,cards:[V[3],V[12],V[11]]},{id:`ready`,title:`Ready`,cards:V.slice(4,9)},{id:`backlog`,title:`Backlog`,cards:[V[10]]},{id:`paused`,title:`Paused`,cards:[V[9],V[13]]}],U=H.map(e=>({...e,cards:[]})),Ne=[{id:`file-backlog-task`,status:`consolidated`,goal:`File a minimal backlog task from the page.`,updatedAt:`2026-10-25`,pullRequest:{url:`https://github.com/fapost-lab/jig-ui/pull/40`,state:`merged`}},{id:`pr-template`,status:`abandoned`,goal:`A pull request template.`,updatedAt:`2026-10-17`,pullRequest:null},{id:`old-spike`,status:`abandoned`,goal:null,updatedAt:`2026-10-12`,pullRequest:null}],Pe=[{id:`needs-you`,title:`Needs you`,count:3},{id:`in-progress`,title:`In progress`,count:1},{id:`ready`,title:`Ready`,count:5},{id:`backlog`,title:`Backlog`,count:1},{id:`paused`,title:`Paused`,count:1},{id:`unknown`,title:`A column this page does not know`,count:0}],W=[{kind:`gate`,subject:{type:`task`,id:`design-system`},tasks:[`design-system`],title:`Design waits at its gate`,detail:null,todo:`Review the design and approve it: jig task gate design-system approved`,url:null,versions:null},{kind:`pull-request-ci-failed`,subject:{type:`task`,id:`refusal-fixture`},tasks:[`refusal-fixture`],title:`CI failed`,detail:`pull request #19`,todo:`Look at the failing check.`,url:`https://github.com/fapost-lab/jig-ui/pull/19`,versions:null},{kind:`housekeeping`,subject:{type:`project`,id:null},tasks:[],title:`Housekeeping never ran`,detail:null,todo:`Run jig housekeeping.`,url:`https://example.com/docs`,versions:null}],Fe=[{id:`approve-gate`,command:`jig task gate design-system approved`},{id:`answer-stop`,command:`jig task autopilot pause-request resume --answer <text>`},{id:`pause`,command:`jig task pause design-system`},{id:`request-pause`,command:`jig queue request task:design-system pause`},{id:`something-new`,command:`jig task something-new design-system`}],Ie={state:`ready`,issue:null,baseBranch:`main`,createdAt:`2026-10-17`,updatedAt:`2026-10-18`,knowledgeConsolidated:!1,worktree:null,gateBy:null,run:null,housekeepingFlags:[],attention:[]},G=[{...Ie,...V[2],gate:`approved`,gateBy:`human`,branch:`task/pause-request`,worktree:{uncommitted:4},issue:`#42`,pullRequest:B(`open`,`red`),run:{mode:`attended`,stage:`implement`,stageAt:`2026-10-18T09:00:00Z`,stopReason:`Which column takes a paused task that already has an open pull request?`,stopAt:`2026-10-18T09:12:00Z`,phase:null},housekeepingFlags:[`needs-consolidation`],attention:[W[0]],actions:Fe,column:{id:`needs-you`,title:`Needs you`}},{...Ie,...V[10],branch:null,actions:[{id:`start`,command:`jig task start file-backlog-task`}],column:{id:`backlog`,title:`Backlog`}}],K=(e,t={})=>({id:e,state:`ready`,jigVersion:`0.29.0`,counts:{active:11,paused:1,ready:3},attention:[],housekeepingStale:!1,upgrade:null,...t}),q=[K(`jig-ui`,{attention:W,housekeepingStale:!0}),K(`nextjs-store`,{counts:{active:0,paused:0,ready:0}}),K(`legacy-shop`,{jigVersion:`0.34.0`,counts:{active:2,paused:0,ready:0},attention:[{kind:`upgrade-available`,subject:{type:`project`,id:null},tasks:[],title:`Jig in this project is older than on this machine`,detail:`this project runs 0.34.0; this machine has 0.35.0`,todo:`jig upgrade`,url:null,versions:{from:`0.34.0`,to:`0.35.0`}}]}),{id:`old-jig`,state:`unsupported`,jigVersion:`0.26.0`,minimum:`0.29.0`,upgrade:null},{id:`new-jig`,state:`incompatible`,jigVersion:`1.0.0`,upgrade:null},{id:`busy`,state:`unreadable`,code:`locked`,upgrade:null},{id:`moved`,state:`unavailable`,reason:`missing`,upgrade:null}],J={mode:`copy`,from:`0.34.0`,to:`0.35.0`,outcome:`planned`,git:null,manualSteps:[],wouldStop:[]},Le=[{state:`reading`},{state:`planned`,plan:J},{state:`planned`,plan:{...J,manualSteps:[`Restart your agent sessions: the skills changed.`]}},{state:`planned`,plan:{...J,wouldStop:["the working tree has uncommitted changes; commit them, stash them (`git stash`), or finish the task they belong to, then run `jig upgrade` again"]}},{state:`refused`,message:`Jig refused the upgrade.`}],Y={level:`pr`,branch:`jig/upgrade-0.35.0`,commit:`279390b`,pushed:!0,pullRequest:`https://github.com/fapost-lab/jig-ui/pull/49`,merged:!1},X=e=>({state:`done`,at:`2026-10-27T08:00:00Z`,upgrade:{...J,outcome:`upgraded`,git:Y,...e}}),Re=[{state:`running`,since:new Date(Date.now()-12e4).toISOString(),to:`0.35.0`},X({git:{...Y,merged:!0}}),X({manualSteps:[`Restart your agent sessions: the skills changed.`]}),X({outcome:`staged`,git:{...Y,level:`none`,commit:null,pushed:!1,pullRequest:null}}),X({outcome:`nothing-to-do`,git:null}),{state:`refused`,at:`2026-10-27T08:00:00Z`,code:`upgrade-blocked`,reasons:[`task up-x is started and its branch task/up-x is checked out here (record .ai/runtime/working/up-x); the upgrade would take this checkout off it`]},{state:`refused`,at:`2026-10-27T08:00:00Z`,code:`failed`,reasons:[]}],Z=[{text:"`design-system` — design system and canvas",checked:!0,task:`design-system`,fog:!1},{text:"`specs-and-epics` — specs and epics (after: project board — `jig spec list`)",checked:!1,task:`specs-and-epics`,fog:!1},{text:"`old-task` — a task no longer live",checked:!1,task:`old-task`,fog:!1},{text:`invoices from orders, no task filed yet`,checked:!1,task:null,fog:!1},{text:"fog: registration by `jig init`",checked:!1,task:null,fog:!0}],Q=[{id:`jig-ui`,title:`Jig UI — a local control center for Jig projects`,missingFiles:[],release:null,epic:null,progress:{done:2,total:6,filed:2,fog:1},phases:[{phase:0,title:`Package and release`,done:1,total:1,filed:0,fog:0,items:[{...Z[0],text:`package and release`,task:null}]},{phase:1,title:`Read-only UI`,done:1,total:5,filed:2,fog:1,items:Z}],queue:null},{id:`billing`,title:`Billing in one place`,missingFiles:[],release:`minor`,epic:{branch:`epic/billing`,state:`open`,checkedOut:!1,missing:!1,fetched:!0},progress:{done:0,total:1,filed:0,fog:0},phases:[{phase:null,title:null,done:0,total:1,filed:0,fog:0,items:[Z[3]]}],queue:{position:100,priority:1}},{id:`lost-epic`,title:`An epic whose branch is gone`,missingFiles:[],release:`major`,epic:{branch:`epic/lost`,state:`open`,checkedOut:!0,missing:!0,fetched:!1},progress:null,phases:[],queue:null},{id:`half-written`,title:null,missingFiles:[`spec.md`,`roadmap.md`],release:null,epic:null,progress:null,phases:[],queue:null}],$=[Q[1],{...Q[1],id:`refunds`,title:`Refunds`,queue:{position:200,priority:null}},{...Q[1],id:`exports`,title:`Exports`,queue:{position:300,priority:4}},{...Q[1],id:`payouts`,title:`Payouts`,queue:null}],ze={class:`flex gap-4`},Be={class:`w-24 text-muted-foreground`},Ve={class:`flex items-center gap-2`},He={class:`flex flex-wrap gap-2`},Ue={class:`flex max-w-sm flex-col gap-2`},We={class:`flex h-5 items-center gap-2`},Ge={class:`flex gap-2`},Ke={class:`flex flex-wrap items-center gap-6`},qe={class:`flex items-center gap-1`},Je={class:`flex flex-wrap items-center gap-6`},Ye={class:`flex items-center gap-1`},Xe={class:`grid grid-cols-2 gap-2 xl:grid-cols-3`},Ze={class:`flex h-[28rem] flex-col`},Qe={class:`flex h-40 flex-col`},$e={class:`flex h-[28rem] flex-col`},et={class:`flex h-64 flex-col`},tt={class:`flex h-64 flex-col`},nt=b({__name:`CanvasView`,setup(t){let o=[`default`,`secondary`,`outline`,`ghost`,`destructive`,`link`],re=[`xs`,`sm`,`default`,`lg`],_=[`icon-xs`,`icon-sm`,`icon`,`icon-lg`],v=[`default`,`secondary`,`outline`,`ghost`,`destructive`,`link`],y=[`attention`,`good`,`bad`,`quiet`];return(t,b)=>(p(),s(`div`,null,[b[14]||=c(`div`,{class:`border-b px-4 py-3`},[c(`h1`,{class:`font-semibold tracking-wider uppercase`},`Canvas`),c(`p`,{class:`text-muted-foreground`},`Every component of the page in every variant and state; the left panel light, the right dark.`)],-1),l(R,{title:`Tones`,note:`lib/tones.ts — the only colours with a meaning`},{default:F(()=>[(p(),s(n,null,e(y,e=>c(`p`,{key:e,class:N(k(ie)[e])},w(e)+` as a rule`,3)),64)),c(`p`,ze,[(p(),s(n,null,e(y,e=>c(`span`,{key:e,class:N(k(xe)[e])},w(e),3)),64))])]),_:1}),b[15]||=c(`h2`,{class:`border-b px-4 py-2 font-bold tracking-widest uppercase`},`components/ui`,-1),l(R,{title:`Button`,note:`variant × size; icon sizes; disabled`},{default:F(()=>[(p(),s(n,null,e(o,t=>c(`div`,{key:t,class:`flex flex-wrap items-center gap-2`},[c(`span`,Be,w(t),1),(p(),s(n,null,e(re,e=>l(k(f),{key:e,variant:t,size:e},{default:F(()=>[j(w(e),1)]),_:2},1032,[`variant`,`size`])),64)),l(k(f),{variant:t,disabled:``},{default:F(()=>[...b[0]||=[j(`disabled`,-1)]]),_:1},8,[`variant`])])),64)),c(`div`,Ve,[b[2]||=c(`span`,{class:`w-24 text-muted-foreground`},`icon`,-1),(p(),s(n,null,e(_,e=>l(k(f),{key:e,variant:`outline`,size:e,"aria-label":e},{default:F(()=>[l(k(ee))]),_:1},8,[`size`,`aria-label`])),64)),l(k(f),{variant:`outline`,size:`sm`},{default:F(()=>[l(k(ee),{"data-icon":`inline-start`}),b[1]||=j(`with icon`,-1)]),_:1})])]),_:1}),l(R,{title:`Badge`},{default:F(()=>[c(`div`,He,[(p(),s(n,null,e(v,e=>l(k(de),{key:e,variant:e},{default:F(()=>[j(w(e),1)]),_:2},1032,[`variant`])),64))])]),_:1}),l(R,{title:`Card`},{default:F(()=>[l(k(ne),{class:`max-w-sm`},{default:F(()=>[l(k(Ee),null,{default:F(()=>[l(k(De),null,{default:F(()=>[...b[3]||=[j(`Card title`,-1)]]),_:1}),l(k(Te),null,{default:F(()=>[...b[4]||=[j(`Card description, muted.`,-1)]]),_:1})]),_:1}),l(k(we),null,{default:F(()=>[...b[5]||=[j(`Card content.`,-1)]]),_:1})]),_:1})]),_:1}),l(R,{title:`Input and Label`,note:`empty, filled, invalid, disabled`},{default:F(()=>[c(`div`,Ue,[l(k(se),null,{default:F(()=>[...b[6]||=[j(`Project path`,-1)]]),_:1}),l(k(A),{placeholder:`/path/to/project`}),l(k(A),{"model-value":`/Users/me/project`}),l(k(A),{"model-value":`/not/a/project`,"aria-invalid":`true`}),l(k(A),{"model-value":`disabled`,disabled:``})])]),_:1}),l(R,{title:`Separator`},{default:F(()=>[l(k(L)),c(`div`,We,[b[7]||=j(`left`,-1),l(k(L),{orientation:`vertical`}),b[8]||=j(`right`,-1)])]),_:1}),l(R,{title:`ToggleGroup`,note:`the Board / List switch`},{default:F(()=>[l(k(he),{type:`single`,variant:`outline`,size:`sm`,"model-value":`board`,"aria-label":`View`},{default:F(()=>[l(k(C),{value:`board`},{default:F(()=>[...b[9]||=[j(`Board`,-1)]]),_:1}),l(k(C),{value:`list`},{default:F(()=>[...b[10]||=[j(`List`,-1)]]),_:1})]),_:1})]),_:1}),l(R,{title:`Toggle`,note:`the board's finished tasks: off, on`},{default:F(()=>[c(`div`,Ge,[l(k(P),{variant:`outline`,size:`sm`,"model-value":!1},{default:F(()=>[...b[11]||=[j(`3 finished tasks`,-1)]]),_:1}),l(k(P),{variant:`outline`,size:`sm`,"model-value":!0},{default:F(()=>[...b[12]||=[j(`3 finished tasks`,-1)]]),_:1})])]),_:1}),l(R,{title:`Collapsible`,note:`open and folded`},{default:F(()=>[(p(),s(n,null,e([!0,!1],e=>l(k(ae),{key:String(e),"default-open":e},{default:F(()=>[l(k(ve),{class:`w-full border-b bg-muted/50 px-3 py-1.5 text-left`},{default:F(()=>[j(`Trigger (`+w(e?`open`:`folded`)+`)`,1)]),_:2},1024),l(k(be),{class:`px-3 py-2`},{default:F(()=>[...b[13]||=[j(`Content`,-1)]]),_:1})]),_:2},1032,[`default-open`])),64))]),_:1}),b[16]||=c(`h2`,{class:`border-b px-4 py-2 font-bold tracking-widest uppercase`},`components`,-1),l(R,{title:`ProjectTabs`,note:`on the workspace; on a project; empty`},{default:F(()=>[l(u,{projects:k(q),version:`0.1.0`},{default:F(()=>[l(d)]),_:1},8,[`projects`]),l(u,{projects:k(q),current:`jig-ui`,version:`0.1.0`},null,8,[`projects`]),l(u,{projects:[]})]),_:1}),l(R,{title:`ThemeToggle`,note:`switches the whole page; the icon is the theme it switches to`},{default:F(()=>[c(`div`,null,[l(d)])]),_:1}),l(R,{title:`ProjectCard`,note:`ready with attention and stale housekeeping; nothing needs you; its Jig older than the machine's, Upgrade… offered; each state it cannot be read in`},{default:F(()=>[(p(!0),s(n,null,e(k(q),e=>(p(),g(ge,{key:e.id,project:e},null,8,[`project`]))),128))]),_:1}),l(R,{title:`UpgradePanel`,note:`on a card: reading the dry run; the plan, with steps by hand; a stop; a refusal; under way; merged, with steps by hand, staged, nothing to do; not started; failed`},{default:F(()=>[(p(!0),s(n,null,e(k(Le),(e,t)=>(p(),g(me,{key:`plan-${t}`,project:`legacy-shop`,run:null,plan:e},null,8,[`plan`]))),128)),(p(!0),s(n,null,e(k(Re),(e,t)=>(p(),g(me,{key:`run-${t}`,project:`legacy-shop`,run:e,plan:void 0},null,8,[`run`]))),128))]),_:1}),l(R,{title:`NewTaskForm`,note:`empty, on its way, the id taken`},{default:F(()=>[l(T,{busy:!1}),l(T,{busy:!0,task:`fix-login`,goal:`Log in with the token after a restart.`}),l(T,{busy:!1,task:`queue-reorder`,goal:`Order the work.`,refusal:`The project has a task called queue-reorder already, maybe a finished one. Choose another id.`,taken:``})]),_:1}),l(R,{title:`ConnectForm`,note:`idle, busy, refused`},{default:F(()=>[l(M,{busy:!1}),l(M,{busy:!0,"model-value":`/Users/me/project`}),l(M,{busy:!1,"model-value":`/Users/me/project/.claude/worktrees/x`,refusal:`That is a worktree. Connect the main checkout instead.`})]),_:1}),l(R,{title:`AttentionItem`,note:`no link; a pull request; another link`},{default:F(()=>[(p(!0),s(n,null,e(k(W),(e,t)=>(p(),g(ce,{key:t,item:e},null,8,[`item`]))),128))]),_:1}),l(R,{title:`ColumnHeader`,note:`each column, and one this page does not know`},{default:F(()=>[(p(!0),s(n,null,e(k(Pe),e=>(p(),g(ue,{id:e.id,key:e.id,title:e.title,count:e.count},null,8,[`id`,`title`,`count`]))),128))]),_:1}),l(R,{title:`QueueMenu`,note:`press to open: To top, Up, Down, To bottom, Priority, the pause — first queued, in the middle, not queued, last, paused under a Jig that cannot resume it (no pause to ask, Resume off), paused and resumable, a pause asked, while its change is on its way`},{default:F(()=>[c(`div`,Ke,[(p(!0),s(n,null,e([k(V)[0],k(V)[1],k(V)[3],k(V)[11],k(V)[9],k(V)[13],k(V)[12]],e=>(p(),s(`span`,{key:e.id,class:`flex items-center gap-1`},[j(w(e.id),1),l(i,{task:e,cards:k(V)},null,8,[`task`,`cards`])]))),128)),c(`span`,qe,[j(w(k(V)[1].id),1),l(i,{task:k(V)[1],cards:k(V),disabled:``},null,8,[`task`,`cards`])])])]),_:1}),l(R,{title:`EpicMenu`,note:`press to open: To top, Up, Down, To bottom, Priority — first queued (no Up), in the middle (Up and Down), last queued (no Down: the next one is not queued), not queued (Up joins the queued ones), while its change is on its way`},{default:F(()=>[c(`div`,Je,[(p(!0),s(n,null,e(k($),e=>(p(),s(`span`,{key:e.id,class:`flex items-center gap-1`},[j(w(e.id),1),l(O,{spec:e,specs:k($)},null,8,[`spec`,`specs`])]))),128)),c(`span`,Ye,[j(w(k($)[1].id),1),l(O,{spec:k($)[1],specs:k($),disabled:``},null,8,[`spec`,`specs`])])])]),_:1}),l(R,{title:`TaskCard`,note:`every note a card carries, a priority among them; with its queue menu; while its change is on its way; changed since a refused change; open with details, while reading, unreadable`},{default:F(()=>[c(`div`,Xe,[(p(!0),s(n,null,e(k(V),e=>(p(),g(m,{key:e.id,project:`jig-ui`,task:e,open:!1},null,8,[`task`]))),128)),l(m,{project:`jig-ui`,task:k(V)[1],open:!1,cards:k(V)},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[0],open:!1,cards:k(V),busy:``},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[3],open:!1,cards:k(V),changed:``},null,8,[`task`,`cards`]),l(m,{project:`jig-ui`,task:k(V)[2],open:!0,details:k(G)[0]},null,8,[`task`,`details`]),l(m,{project:`jig-ui`,task:k(V)[0],open:!0},null,8,[`task`]),l(m,{project:`jig-ui`,task:k(V)[1],open:!0,details:`unavailable`},null,8,[`task`])])]),_:1}),l(R,{title:`TaskRow`,note:`each note and priority; selected; with its queue menu; while its change is on its way; changed since a refused change`},{default:F(()=>[c(`div`,null,[(p(!0),s(n,null,e(k(V),(e,t)=>(p(),g(S,{key:e.id,task:e,selected:t===2},null,8,[`task`,`selected`]))),128)),l(S,{task:k(V)[1],selected:!1,cards:k(V)},null,8,[`task`,`cards`]),l(S,{task:k(V)[0],selected:!1,cards:k(V),busy:``},null,8,[`task`,`cards`]),l(S,{task:k(V)[3],selected:!1,cards:k(V),changed:``},null,8,[`task`,`cards`])])]),_:1}),l(R,{title:`BoardColumns`,note:`cards in every column, one open with its details, two changed since a refused change; no live task`},{default:F(()=>[c(`div`,Ze,[l(I,{project:`jig-ui`,columns:k(H),selected:k(V)[2].id,details:k(G)[0],pending:k(V)[0].id,changed:[k(V)[1].id,k(V)[3].id]},null,8,[`columns`,`selected`,`details`,`pending`,`changed`])]),c(`div`,Qe,[l(I,{project:`jig-ui`,columns:k(U)},null,8,[`columns`])])]),_:1}),l(R,{title:`BoardList`,note:`a row picked with its details; nothing picked; no live task`},{default:F(()=>[c(`div`,$e,[l(D,{project:`jig-ui`,columns:k(H),selected:k(V)[2].id,details:k(G)[0]},null,8,[`columns`,`selected`,`details`])]),c(`div`,et,[l(D,{project:`jig-ui`,columns:k(H)},null,8,[`columns`])]),c(`div`,tt,[l(D,{project:`jig-ui`,columns:k(U)},null,8,[`columns`])])]),_:1}),l(R,{title:`FinishedList`,note:`closed with its pull request merged; abandoned; one without a goal`},{default:F(()=>[l(pe,{tasks:k(Ne),class:`border`},null,8,[`tasks`])]),_:1}),l(R,{title:`TaskFacts`,note:`everything a task can carry; a task not started`},{default:F(()=>[(p(!0),s(n,null,e(k(G),e=>(p(),g(ye,{key:e.id,details:e,class:`border-b pb-3`},null,8,[`details`]))),128))]),_:1}),l(R,{title:`TaskBrief`,note:`facts, actions and the link to the full page`},{default:F(()=>[l(r,{project:`jig-ui`,task:k(G)[1].id,details:k(G)[1]},null,8,[`task`,`details`])]),_:1}),l(R,{title:`ActionList`,note:`Jig's offers, one unknown id; none`},{default:F(()=>[l(h,{actions:k(Fe)},null,8,[`actions`]),l(h,{actions:[]})]),_:1}),l(R,{title:`CopyCommand`,note:`short; long enough to be cut`},{default:F(()=>[l(a,{command:`jig task pause design-system`}),l(a,{command:`jig task autopilot a-task-with-a-rather-long-identifier-that-wraps resume --answer 'a long answer to the question'`,class:`max-w-xs`})]),_:1}),l(R,{title:`ProgressBar`,note:`none, part, all, an empty roadmap`},{default:F(()=>[(p(),s(n,null,e([[0,4],[3,9],[5,5],[0,0]],([e,t])=>l(_e,{key:`${e}/${t}`,done:e,total:t},null,8,[`done`,`total`])),64))]),_:1}),l(R,{title:`SpecItemRow`,note:`done with a live task; open with dependencies; a task no longer live; no task; fog`},{default:F(()=>[c(`ul`,null,[(p(!0),s(n,null,e(k(Z),(e,t)=>(p(),g(fe,{key:t,item:e,project:`jig-ui`,live:t<2},null,8,[`item`,`live`]))),128))])]),_:1}),l(R,{title:`SpecCard`,note:`no epic, a finished phase folded; an open epic in the queue at P1, with its queue menu; a lost epic branch, not queued, with its change on its way; missing files`},{default:F(()=>[(p(!0),s(n,null,e(k(Q),e=>(p(),g(oe,{key:e.id,spec:e,project:`jig-ui`,live:[`design-system`,`specs-and-epics`],busy:e.id===`lost-epic`},te({_:2},[e.epic?.state===`open`?{name:`menu`,fn:F(()=>[l(O,{spec:e,specs:k(Q),disabled:e.id===`lost-epic`},null,8,[`spec`,`specs`,`disabled`])]),key:`0`}:void 0]),1032,[`spec`,`busy`]))),128))]),_:1})]))}});export{nt as default};
|