@dendelion/paper-camp 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/assets/index-B6eOrr41.js +4 -0
- package/dist/app/assets/index-B6eOrr41.js.map +1 -0
- package/dist/app/assets/index-BajRXbXg.js +2 -0
- package/dist/app/assets/index-BajRXbXg.js.map +1 -0
- package/dist/app/assets/index-DAexv1XS.js +3 -0
- package/dist/app/assets/index-DAexv1XS.js.map +1 -0
- package/dist/app/assets/index-DFJlDY3W.js +2 -0
- package/dist/app/assets/index-DFJlDY3W.js.map +1 -0
- package/dist/app/assets/main-Bno8vU-0.js +288 -0
- package/dist/app/assets/main-Bno8vU-0.js.map +1 -0
- package/dist/app/assets/{main-BJGNGUiz.css → main-RP3LpwgH.css} +1 -1
- package/dist/app/assets/{sidebar-section-Ch50IaLb.js → sidebar-section-BrJbBK_b.js} +2 -2
- package/dist/app/assets/{sidebar-section-Ch50IaLb.js.map → sidebar-section-BrJbBK_b.js.map} +1 -1
- package/dist/app/index.html +2 -2
- package/dist/chunks/{roadmap.C0AQ6pUX.js → scaffold.B_3sY6Rg.js} +1935 -1588
- package/dist/chunks/scaffold.B_3sY6Rg.js.map +1 -0
- package/dist/cli/index.js +8604 -7494
- package/dist/cli/index.js.map +1 -1
- package/dist/core/git-pr/pr.d.ts +12 -1
- package/dist/core/git-pr/pr.d.ts.map +1 -1
- package/dist/core/git-pr/scopes.d.ts +3 -0
- package/dist/core/git-pr/scopes.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +94 -80
- package/dist/core/parse/parser.d.ts +2 -3
- package/dist/core/parse/parser.d.ts.map +1 -1
- package/dist/core/parse/schemas.d.ts +1 -0
- package/dist/core/parse/schemas.d.ts.map +1 -1
- package/dist/core/readers.d.ts.map +1 -1
- package/dist/core/roadmap.d.ts +7 -1
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/run-order-file.d.ts +8 -0
- package/dist/core/run-order-file.d.ts.map +1 -0
- package/dist/core/run-order-file.test.d.ts +2 -0
- package/dist/core/run-order-file.test.d.ts.map +1 -0
- package/dist/core/run-order.d.ts +28 -9
- package/dist/core/run-order.d.ts.map +1 -1
- package/dist/core/scaffold/scaffold.d.ts.map +1 -1
- package/dist/core/scaffold/templates.d.ts +1 -1
- package/dist/core/scaffold/templates.d.ts.map +1 -1
- package/dist/core/sections.d.ts +3 -1
- package/dist/core/sections.d.ts.map +1 -1
- package/dist/core/serialize/serializer.d.ts +7 -3
- package/dist/core/serialize/serializer.d.ts.map +1 -1
- package/dist/core/trail.d.ts +7 -0
- package/dist/core/trail.d.ts.map +1 -0
- package/dist/core/trail.test.d.ts +2 -0
- package/dist/core/trail.test.d.ts.map +1 -0
- package/dist/types/index.d.ts +174 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/app/assets/index-BnXxehKU.js +0 -2
- package/dist/app/assets/index-BnXxehKU.js.map +0 -1
- package/dist/app/assets/index-C2kYil0S.js +0 -3
- package/dist/app/assets/index-C2kYil0S.js.map +0 -1
- package/dist/app/assets/index-CRRHTP77.js +0 -2
- package/dist/app/assets/index-CRRHTP77.js.map +0 -1
- package/dist/app/assets/index-DrNAzLuW.js +0 -2
- package/dist/app/assets/index-DrNAzLuW.js.map +0 -1
- package/dist/app/assets/main-CyxblUnu.js +0 -233
- package/dist/app/assets/main-CyxblUnu.js.map +0 -1
- package/dist/chunks/roadmap.C0AQ6pUX.js.map +0 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -17,6 +17,20 @@ export interface PhaseItem {
|
|
|
17
17
|
description?: string;
|
|
18
18
|
source?: 'review';
|
|
19
19
|
}
|
|
20
|
+
/** A body section anchor is `body` for now — the whole prose block is the only
|
|
21
|
+
* body section a plan/entity has until later phases break it into sub-sections. */
|
|
22
|
+
export type MarginNoteAnchor = {
|
|
23
|
+
kind: 'phase';
|
|
24
|
+
index: number;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'body';
|
|
27
|
+
};
|
|
28
|
+
export type MarginNoteState = 'open' | 'resolved';
|
|
29
|
+
export interface MarginNote {
|
|
30
|
+
anchor: MarginNoteAnchor;
|
|
31
|
+
prose: string;
|
|
32
|
+
state: MarginNoteState;
|
|
33
|
+
}
|
|
20
34
|
export interface RawEntry {
|
|
21
35
|
title: string;
|
|
22
36
|
fields: Record<string, string>;
|
|
@@ -24,6 +38,8 @@ export interface RawEntry {
|
|
|
24
38
|
phases: PhaseItem[];
|
|
25
39
|
log?: LogEntry[];
|
|
26
40
|
clarifications?: LogEntry[];
|
|
41
|
+
notes?: MarginNote[];
|
|
42
|
+
review?: LogEntry[];
|
|
27
43
|
}
|
|
28
44
|
export interface ParseWarning {
|
|
29
45
|
title: string;
|
|
@@ -57,6 +73,30 @@ export interface FixReviewResult {
|
|
|
57
73
|
why: string;
|
|
58
74
|
}[];
|
|
59
75
|
}
|
|
76
|
+
export interface ReviewSplitPhase {
|
|
77
|
+
text: string;
|
|
78
|
+
description?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface ReviewSplitFollowUp {
|
|
81
|
+
title: string;
|
|
82
|
+
body: string;
|
|
83
|
+
}
|
|
84
|
+
/** One review point's proposed classification — rework still inside this plan's
|
|
85
|
+
* existing scope, or a follow-up idea for work that would grow beyond it. */
|
|
86
|
+
export interface ReviewSplitItem {
|
|
87
|
+
point: string;
|
|
88
|
+
kind: 'rework' | 'idea';
|
|
89
|
+
phases?: ReviewSplitPhase[];
|
|
90
|
+
followUp?: ReviewSplitFollowUp;
|
|
91
|
+
}
|
|
92
|
+
export interface ReviewSplitResult {
|
|
93
|
+
items: ReviewSplitItem[];
|
|
94
|
+
}
|
|
95
|
+
/** What an approved split actually applied — shown as a confirmation so approving is never silent. */
|
|
96
|
+
export interface ReviewSplitOutcome {
|
|
97
|
+
phasesAdded: number;
|
|
98
|
+
ideaTitles: string[];
|
|
99
|
+
}
|
|
60
100
|
/** Live-resolved PR info for an entity's branch — see `core/pr.ts`. */
|
|
61
101
|
export interface PrInfo {
|
|
62
102
|
number: number;
|
|
@@ -89,6 +129,10 @@ export interface PlanEntry {
|
|
|
89
129
|
phases: PhaseItem[];
|
|
90
130
|
log?: LogEntry[];
|
|
91
131
|
clarifications?: LogEntry[];
|
|
132
|
+
notes?: MarginNote[];
|
|
133
|
+
/** Prose written against the whole finished plan, distinct from the flat `log` — an
|
|
134
|
+
* agent later splits each entry into rework phases or a follow-up idea. */
|
|
135
|
+
review?: LogEntry[];
|
|
92
136
|
pr?: PrInfo;
|
|
93
137
|
}
|
|
94
138
|
export interface ArchivableIdea {
|
|
@@ -101,6 +145,7 @@ export interface DecisionEntry {
|
|
|
101
145
|
date: string;
|
|
102
146
|
status: DecisionStatus;
|
|
103
147
|
supersededBy?: string;
|
|
148
|
+
tags?: string[];
|
|
104
149
|
body: string;
|
|
105
150
|
}
|
|
106
151
|
export interface OpenQuestionEntry {
|
|
@@ -111,10 +156,10 @@ export interface OpenQuestionEntry {
|
|
|
111
156
|
blocks?: string;
|
|
112
157
|
body: string;
|
|
113
158
|
}
|
|
114
|
-
export type ConsistencyIssueKind = 'dangling-resolved-by' | 'dangling-superseded-by' | 'blocked-plan-active';
|
|
159
|
+
export type ConsistencyIssueKind = 'dangling-resolved-by' | 'dangling-superseded-by' | 'blocked-plan-active' | 'orphan-subject';
|
|
115
160
|
export interface ConsistencyIssue {
|
|
116
161
|
kind: ConsistencyIssueKind;
|
|
117
|
-
section: 'decisions' | 'open-questions';
|
|
162
|
+
section: 'decisions' | 'open-questions' | 'plans';
|
|
118
163
|
title: string;
|
|
119
164
|
message: string;
|
|
120
165
|
planId?: string;
|
|
@@ -162,13 +207,11 @@ export interface EntityEntry {
|
|
|
162
207
|
phases: PhaseItem[];
|
|
163
208
|
log?: LogEntry[];
|
|
164
209
|
clarifications?: LogEntry[];
|
|
210
|
+
notes?: MarginNote[];
|
|
211
|
+
review?: LogEntry[];
|
|
165
212
|
/** Set by readEntities from which of the two scanned dirs the file came from, not the frontmatter. */
|
|
166
213
|
archived?: boolean;
|
|
167
214
|
}
|
|
168
|
-
export interface ProgressEntry {
|
|
169
|
-
date: string;
|
|
170
|
-
items: string[];
|
|
171
|
-
}
|
|
172
215
|
export interface SuggestionEntry {
|
|
173
216
|
date: string;
|
|
174
217
|
title: string;
|
|
@@ -178,6 +221,7 @@ export interface RoadmapItem {
|
|
|
178
221
|
name: string;
|
|
179
222
|
description: string;
|
|
180
223
|
candidates: string[];
|
|
224
|
+
linked: string[];
|
|
181
225
|
}
|
|
182
226
|
export interface RoadmapHorizon {
|
|
183
227
|
title: string;
|
|
@@ -186,6 +230,41 @@ export interface RoadmapHorizon {
|
|
|
186
230
|
export interface Roadmap {
|
|
187
231
|
goal: string;
|
|
188
232
|
horizons: RoadmapHorizon[];
|
|
233
|
+
standingConcerns: RoadmapItem[];
|
|
234
|
+
}
|
|
235
|
+
export interface RoadmapLink {
|
|
236
|
+
id: string;
|
|
237
|
+
status: PlanStatus;
|
|
238
|
+
taskRuns: number;
|
|
239
|
+
pr?: PrInfo;
|
|
240
|
+
released: boolean;
|
|
241
|
+
}
|
|
242
|
+
export interface RoadmapRollup {
|
|
243
|
+
total: number;
|
|
244
|
+
done: number;
|
|
245
|
+
}
|
|
246
|
+
export interface ResolvedRoadmapItem extends RoadmapItem {
|
|
247
|
+
links: RoadmapLink[];
|
|
248
|
+
rollup: RoadmapRollup;
|
|
249
|
+
}
|
|
250
|
+
export interface ResolvedRoadmapHorizon {
|
|
251
|
+
title: string;
|
|
252
|
+
items: ResolvedRoadmapItem[];
|
|
253
|
+
rollup: RoadmapRollup;
|
|
254
|
+
}
|
|
255
|
+
export interface ResolvedRoadmap {
|
|
256
|
+
goal: string;
|
|
257
|
+
horizons: ResolvedRoadmapHorizon[];
|
|
258
|
+
events: RoadmapEvent[];
|
|
259
|
+
}
|
|
260
|
+
export type RoadmapEventKind = 'created' | 'task-run';
|
|
261
|
+
export interface RoadmapEvent {
|
|
262
|
+
date: string;
|
|
263
|
+
kind: RoadmapEventKind;
|
|
264
|
+
entityId: string;
|
|
265
|
+
horizonTitle: string;
|
|
266
|
+
itemName: string;
|
|
267
|
+
label: string;
|
|
189
268
|
}
|
|
190
269
|
export interface EnvEntry {
|
|
191
270
|
key: string;
|
|
@@ -224,9 +303,8 @@ export interface PaperCampConfig {
|
|
|
224
303
|
};
|
|
225
304
|
port?: number;
|
|
226
305
|
defaultAgents?: DefaultAgentsMap;
|
|
227
|
-
/**
|
|
228
|
-
|
|
229
|
-
/** The managed subject list; an idea's `subject` not present here renders as "No subject". */
|
|
306
|
+
/** Derived from `ROADMAP.md` on every read (IDEA-95), never written to disk; an idea's
|
|
307
|
+
* `subject` not present here renders as "No subject". */
|
|
230
308
|
subjects?: string[];
|
|
231
309
|
/** Opts out of the first-run redirect to Settings > Setup while capabilities are incomplete. */
|
|
232
310
|
setupDismissed?: boolean;
|
|
@@ -244,6 +322,51 @@ export interface CapabilityResult {
|
|
|
244
322
|
status: CapabilityStatus;
|
|
245
323
|
detail: string;
|
|
246
324
|
}
|
|
325
|
+
export interface AgentAuthStatus {
|
|
326
|
+
loggedIn: boolean | null;
|
|
327
|
+
authMethod: string | null;
|
|
328
|
+
apiProvider: string | null;
|
|
329
|
+
}
|
|
330
|
+
export type ServiceId = 'git' | 'gh' | `agent:${AgentId}`;
|
|
331
|
+
/** What a Connections row offers once its service isn't `ok` — copy a command, follow a link, or read plain instructions. */
|
|
332
|
+
export type ConnectAction =
|
|
333
|
+
/** `runnable` marks a command with no placeholders and no interactive prompts — safe for the server to execute directly instead of just displaying it. */
|
|
334
|
+
{
|
|
335
|
+
kind: 'command';
|
|
336
|
+
command: string;
|
|
337
|
+
runnable?: boolean;
|
|
338
|
+
} | {
|
|
339
|
+
kind: 'link';
|
|
340
|
+
url: string;
|
|
341
|
+
label: string;
|
|
342
|
+
} | {
|
|
343
|
+
kind: 'text';
|
|
344
|
+
message: string;
|
|
345
|
+
};
|
|
346
|
+
export interface ConnectionResult {
|
|
347
|
+
id: ServiceId;
|
|
348
|
+
label: string;
|
|
349
|
+
unlocks: string;
|
|
350
|
+
status: CapabilityStatus;
|
|
351
|
+
detail: string;
|
|
352
|
+
authenticated: boolean | null;
|
|
353
|
+
connect: ConnectAction | null;
|
|
354
|
+
}
|
|
355
|
+
export interface MergePolicy {
|
|
356
|
+
allowSquashMerge: boolean;
|
|
357
|
+
allowMergeCommit: boolean;
|
|
358
|
+
allowRebaseMerge: boolean;
|
|
359
|
+
squashMergeCommitTitle: string;
|
|
360
|
+
squashMergeCommitMessage: string;
|
|
361
|
+
}
|
|
362
|
+
export type MergePolicyResult = {
|
|
363
|
+
status: 'ok';
|
|
364
|
+
repo: string;
|
|
365
|
+
policy: MergePolicy;
|
|
366
|
+
} | {
|
|
367
|
+
status: 'unavailable';
|
|
368
|
+
reason: string;
|
|
369
|
+
};
|
|
247
370
|
export interface GitStatusEntry {
|
|
248
371
|
path: string;
|
|
249
372
|
status: string;
|
|
@@ -257,8 +380,24 @@ export interface GitStatusResponse {
|
|
|
257
380
|
branchHygiene: BranchHygieneStatus;
|
|
258
381
|
}
|
|
259
382
|
export type BranchHygieneStatus = 'clean-on-main' | 'stale-merged' | 'stale-no-upstream' | 'dirty' | 'fine';
|
|
383
|
+
export interface GitLiveState {
|
|
384
|
+
branch: string;
|
|
385
|
+
ahead: number;
|
|
386
|
+
behind: number;
|
|
387
|
+
dirtyCount: number;
|
|
388
|
+
}
|
|
389
|
+
export interface GitSyncFailure {
|
|
390
|
+
ok: false;
|
|
391
|
+
stage: 'reconcile' | 'stash-pop';
|
|
392
|
+
message: string;
|
|
393
|
+
stashPending: boolean;
|
|
394
|
+
recoveryPrompt: string;
|
|
395
|
+
}
|
|
396
|
+
export type GitSyncResult = {
|
|
397
|
+
ok: true;
|
|
398
|
+
} | GitSyncFailure;
|
|
260
399
|
export type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';
|
|
261
|
-
export type TaskKind = 'phase' | 'audit' | 'batch-reconcile' | 'run-all' | 'draft' | 'extend' | 'suggest' | 'commit-suggest' | 'overlap-check' | 'sync' | 'reconcile' | 'fix-review';
|
|
400
|
+
export type TaskKind = 'phase' | 'audit' | 'batch-reconcile' | 'run-all' | 'draft' | 'extend' | 'suggest' | 'commit-suggest' | 'overlap-check' | 'prioritise' | 'sync' | 'reconcile' | 'rework' | 'fix-review' | 'review-split';
|
|
262
401
|
export interface TaskLogEntry {
|
|
263
402
|
id: string;
|
|
264
403
|
taskKind: TaskKind;
|
|
@@ -269,6 +408,23 @@ export interface TaskLogEntry {
|
|
|
269
408
|
endedAt: string;
|
|
270
409
|
outcome: 'done' | 'error';
|
|
271
410
|
}
|
|
411
|
+
export interface TrailHop<T> {
|
|
412
|
+
reached: boolean;
|
|
413
|
+
data?: T;
|
|
414
|
+
}
|
|
415
|
+
export interface ProvenanceTrail {
|
|
416
|
+
id: string;
|
|
417
|
+
idea: TrailHop<{
|
|
418
|
+
title: string;
|
|
419
|
+
status?: EntityStatus;
|
|
420
|
+
type?: EntityType;
|
|
421
|
+
}>;
|
|
422
|
+
phases: TrailHop<PhaseItem[]>;
|
|
423
|
+
taskRuns: TrailHop<TaskLogEntry[]>;
|
|
424
|
+
commits: TrailHop<string[]>;
|
|
425
|
+
pr: TrailHop<PrInfo>;
|
|
426
|
+
releaseLine: TrailHop<string>;
|
|
427
|
+
}
|
|
272
428
|
export interface AgentTaskState {
|
|
273
429
|
id: string;
|
|
274
430
|
status: AgentTaskStatus;
|
|
@@ -276,6 +432,8 @@ export interface AgentTaskState {
|
|
|
276
432
|
planTitle: string;
|
|
277
433
|
planId?: string;
|
|
278
434
|
phaseIndex?: number;
|
|
435
|
+
fixAttempt?: number;
|
|
436
|
+
fixAttemptCap?: number;
|
|
279
437
|
ideaId?: string;
|
|
280
438
|
agentId: AgentId;
|
|
281
439
|
lines: string[];
|
|
@@ -283,12 +441,18 @@ export interface AgentTaskState {
|
|
|
283
441
|
title: string;
|
|
284
442
|
message: string;
|
|
285
443
|
};
|
|
444
|
+
errorKind?: 'auth';
|
|
286
445
|
}
|
|
287
446
|
export interface OverlapVerdict {
|
|
288
447
|
verdict: 'existing' | 'extend' | 'new';
|
|
289
448
|
targetId: string | null;
|
|
290
449
|
reasoning: string;
|
|
291
450
|
}
|
|
451
|
+
/** `why` carries one line per entry in `order`, same index — the reason for that id's placement. */
|
|
452
|
+
export interface PrioritiseVerdict {
|
|
453
|
+
order: string[];
|
|
454
|
+
why: string;
|
|
455
|
+
}
|
|
292
456
|
export interface ReconcileQueueItem {
|
|
293
457
|
planId: string;
|
|
294
458
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["export type PlanStatus = 'idea' | 'planned' | 'in-progress' | 'review' | 'done' | 'dropped';\n\nexport const PLAN_STATUSES: PlanStatus[] = [\n 'idea',\n 'planned',\n 'in-progress',\n 'review',\n 'done',\n 'dropped',\n];\n\nexport interface LogEntry {\n date: string;\n text: string;\n}\n\nexport type PlanKind = 'feat' | 'fix' | 'chore' | 'docs' | 'refactor';\n\nexport const PLAN_KINDS: PlanKind[] = ['feat', 'fix', 'chore', 'docs', 'refactor'];\n\nexport const AGENT_IDS = ['claude-code', 'opencode'] as const;\n\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const AGENT_LABELS: Record<AgentId, string> = {\n 'claude-code': 'Claude Code',\n opencode: 'OpenCode',\n};\n\nexport type DecisionStatus = 'decided' | 'superseded';\n\nexport type QuestionStatus = 'open' | 'resolved';\n\nexport interface PhaseItem {\n done: boolean;\n text: string;\n description?: string;\n source?: 'review';\n}\n\nexport interface RawEntry {\n title: string;\n fields: Record<string, string>;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n}\n\nexport interface ParseWarning {\n title: string;\n message: string;\n}\n\nexport interface ParseResult<T> {\n entries: T[];\n warnings: ParseWarning[];\n}\n\n/** A PR's reviewable/mergeable state, as surfaced by `gh pr list`. */\nexport type PrState = 'draft' | 'open' | 'closed' | 'merged';\n\n/** GitHub's PR review decision, as surfaced by `gh pr list --json reviewDecision`. */\nexport type ReviewDecision = 'approved' | 'changes-requested' | 'review-required';\n\n// Per-comment detail; PrInfo.unresolvedThreadCount only counts these.\nexport interface ReviewThread {\n /** GraphQL node id — what `resolveReviewThread`/`replyToReviewThread` address. */\n id: string;\n /** File path the comment is anchored to; absent for a PR-level (not diff-anchored) comment. */\n path?: string;\n line?: number;\n author?: string;\n body: string;\n}\n\n// Parsed from the JSON object a fix-review agent's prompt requires as its final line.\nexport interface FixReviewResult {\n commit: { title: string; message: string };\n addressed: string[];\n skipped: { threadId: string; why: string }[];\n}\n\n/** Live-resolved PR info for an entity's branch — see `core/pr.ts`. */\nexport interface PrInfo {\n number: number;\n url: string;\n state: PrState;\n /** Undefined when no review has been requested/decided, or when unresolved (offline, closed/merged PR). */\n reviewDecision?: ReviewDecision;\n /** Count of unresolved review threads. Only fetched for open/draft PRs; undefined when not fetched or unresolved. */\n unresolvedThreadCount?: number;\n /** Whether a comment or review landed after the PR's last commit — a proxy for \"since the last agent pass\" (a pass ends with a push). Only fetched for open/draft PRs. */\n hasNewCommentsSincePush?: boolean;\n}\n\nexport interface PlanEntry {\n title: string;\n status: PlanStatus;\n kind?: PlanKind;\n id?: string;\n idea?: string;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n /** Absent renders under the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n pr?: PrInfo;\n}\n\nexport interface ArchivableIdea {\n id: string;\n title: string;\n pr: PrInfo;\n}\n\nexport interface DecisionEntry {\n title: string;\n date: string;\n status: DecisionStatus;\n supersededBy?: string;\n body: string;\n}\n\nexport interface OpenQuestionEntry {\n title: string;\n status: QuestionStatus;\n raised: string;\n resolvedBy?: string;\n blocks?: string;\n body: string;\n}\n\nexport type ConsistencyIssueKind =\n | 'dangling-resolved-by'\n | 'dangling-superseded-by'\n | 'blocked-plan-active';\n\nexport interface ConsistencyIssue {\n kind: ConsistencyIssueKind;\n section: 'decisions' | 'open-questions';\n title: string;\n message: string;\n planId?: string;\n}\n\nexport type IdeaKind = 'idea' | 'note';\n\nexport type IdeaStatus = 'open' | 'done' | 'dropped';\n\nexport interface IdeaEntry {\n id: string | null;\n title: string;\n body: string;\n kind?: IdeaKind;\n status?: IdeaStatus;\n /** Absent renders under the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n /** Fallback sort key for unordered entries — see `order`. Absent on view-model-only IdeaEntry literals that never enter the worklist sort. */\n created?: string;\n log?: LogEntry[];\n}\n\n// Unified entity — one file per entity, plan as an optional Phases section.\n// Supersedes PlanEntry/IdeaEntry once the migration cutover lands.\n\n/** Work classification — same Conventional-Commits values as PlanKind; `kind` renamed to `type` in the unified schema. */\nexport type EntityType = PlanKind;\n\n/** Plan lifecycle plus the note-only `open`. Notes use open → done/dropped; everything else uses the PlanStatus track. */\nexport type EntityStatus = PlanStatus | 'open';\n\nexport interface EntityEntry {\n id: string;\n title: string;\n /** Absent until the entity is classified (usually when its plan is drafted). */\n type?: EntityType;\n /** \"note\" marks an entity that never grows phases. */\n kind?: 'note';\n /** Stored override, not the source of truth — see entityFrontmatterSchema. */\n status?: EntityStatus;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n /** Absent renders as the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n /** Set by readEntities from which of the two scanned dirs the file came from, not the frontmatter. */\n archived?: boolean;\n}\n\nexport interface ProgressEntry {\n date: string;\n items: string[];\n}\n\n// No `id`/`status`: it only becomes a real idea if a human promotes it.\nexport interface SuggestionEntry {\n date: string;\n title: string;\n description: string;\n}\n\nexport interface RoadmapItem {\n name: string;\n description: string;\n candidates: string[];\n}\n\nexport interface RoadmapHorizon {\n title: string;\n items: RoadmapItem[];\n}\n\nexport interface Roadmap {\n goal: string;\n horizons: RoadmapHorizon[];\n}\n\nexport interface EnvEntry {\n key: string;\n value: string;\n /** Set on GET responses when the value is withheld — secrets never reach the client. */\n isSet?: boolean;\n}\n\nexport interface AgentConfig {\n agent: AgentId;\n model?: string;\n effort?: string;\n}\n\n/** Model/effort passed to an adapter's buildArgs — the AgentConfig minus the agent id. */\nexport interface AgentRunOptions {\n model?: string;\n effort?: string;\n}\n\n/** Maps option names to a fixed value list (renders a Select) or null (free-text or hidden). */\nexport type AgentOptionsDescriptor = Record<string, string[] | null | undefined>;\n\nexport const AGENT_OPTIONS: Record<AgentId, AgentOptionsDescriptor> = {\n 'claude-code': {\n model: ['opus', 'sonnet', 'fable', 'haiku'],\n effort: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n opencode: {\n model: null,\n },\n};\n\nexport function coerceAgentConfig(v: unknown): AgentConfig {\n const toAgent = (a: unknown): AgentId =>\n AGENT_IDS.includes(a as AgentId) ? (a as AgentId) : 'claude-code';\n if (typeof v === 'string') return { agent: toAgent(v) };\n // A missing key must not throw — that would 500 the /api/config read this protects.\n const obj = (v ?? {}) as Record<string, unknown>;\n return {\n agent: toAgent(obj.agent),\n ...(typeof obj.model === 'string' && { model: obj.model }),\n ...(typeof obj.effort === 'string' && { effort: obj.effort }),\n };\n}\n\nexport interface DefaultAgentsMap {\n phase: AgentConfig;\n planDraft: AgentConfig;\n ideaExtend: AgentConfig;\n commitSuggest: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: DefaultAgentsMap = {\n phase: { agent: 'opencode' },\n planDraft: { agent: 'claude-code' },\n ideaExtend: { agent: 'claude-code' },\n commitSuggest: { agent: 'claude-code' },\n};\n\nexport interface PaperCampConfig {\n version: string;\n projectName: string;\n initializedAt: string;\n /** The unified-entity `idea` counter; the per-kind plan counters are legacy, present only in pre-migration configs. */\n nextId?: Partial<Record<PlanKind, number>> & { idea?: number };\n port?: number;\n defaultAgents?: DefaultAgentsMap;\n /** Off by default. When true, the PostToolUse hook logs new-file creations to progress.md. */\n autoLogNewFiles?: boolean;\n /** The managed subject list; an idea's `subject` not present here renders as \"No subject\". */\n subjects?: string[];\n /** Opts out of the first-run redirect to Settings > Setup while capabilities are incomplete. */\n setupDismissed?: boolean;\n}\n\nexport type CheckStatus = 'stale' | 'running' | 'pass' | 'fail';\n\nexport interface CheckResult {\n status: CheckStatus;\n lastRun: string | null;\n output: string;\n}\n\nexport type CheckName = 'lint' | 'format' | 'test' | 'consistency';\n\nexport type CapabilityStatus = 'ok' | 'warn' | 'missing';\n\nexport interface CapabilityResult {\n id: string;\n status: CapabilityStatus;\n detail: string;\n}\n\nexport interface GitStatusEntry {\n path: string;\n status: string;\n staged: boolean;\n renameSource?: string;\n}\n\nexport interface GitStatusResponse {\n branch: string;\n entries: GitStatusEntry[];\n ahead: number;\n branchHygiene: BranchHygieneStatus;\n}\n\nexport type BranchHygieneStatus =\n | 'clean-on-main'\n | 'stale-merged'\n | 'stale-no-upstream'\n | 'dirty'\n | 'fine';\n\nexport type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';\n\nexport type TaskKind =\n | 'phase'\n | 'audit'\n | 'batch-reconcile'\n | 'run-all'\n | 'draft'\n | 'extend'\n | 'suggest'\n | 'commit-suggest'\n | 'overlap-check'\n | 'sync'\n | 'reconcile'\n | 'fix-review';\n\n// Persisted to papercamp/tasks.log (JSON Lines) — survives a dev-server restart,\n// unlike the in-memory task registry.\nexport interface TaskLogEntry {\n id: string;\n taskKind: TaskKind;\n planId?: string;\n planTitle: string;\n agentId: AgentId;\n startedAt: string;\n endedAt: string;\n outcome: 'done' | 'error';\n}\n\nexport interface AgentTaskState {\n id: string;\n status: AgentTaskStatus;\n taskKind: TaskKind;\n planTitle: string;\n planId?: string;\n phaseIndex?: number;\n ideaId?: string;\n agentId: AgentId;\n lines: string[];\n // fix-review only: prefills the commit form once the agent has reported.\n suggestedCommit?: { title: string; message: string };\n}\n\nexport interface OverlapVerdict {\n verdict: 'existing' | 'extend' | 'new';\n targetId: string | null;\n reasoning: string;\n}\n\nexport interface ReconcileQueueItem {\n planId: string;\n title: string;\n before: { body: string; phases: PhaseItem[] };\n}\n"],"names":["PLAN_STATUSES","PLAN_KINDS","AGENT_IDS","AGENT_LABELS","AGENT_OPTIONS","coerceAgentConfig","v","toAgent","a","obj","DEFAULT_AGENTS"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASaC,IAAyB,CAAC,QAAQ,OAAO,SAAS,QAAQ,UAAU,GAEpEC,IAAY,CAAC,eAAe,UAAU,GAItCC,IAAwC;AAAA,EACnD,eAAe;AAAA,EACf,UAAU;AACZ,GAyOaC,IAAyD;AAAA,EACpE,eAAe;AAAA,IACb,OAAO,CAAC,QAAQ,UAAU,SAAS,OAAO;AAAA,IAC1C,QAAQ,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK;AAAA,EAAA;AAAA,EAElD,UAAU;AAAA,IACR,OAAO;AAAA,EAAA;AAEX;AAEO,SAASC,EAAkBC,GAAyB;AACzD,QAAMC,IAAU,CAACC,MACfN,EAAU,SAASM,CAAY,IAAKA,IAAgB;AACtD,MAAI,OAAOF,KAAM,SAAU,QAAO,EAAE,OAAOC,EAAQD,CAAC,EAAA;AAEpD,QAAMG,IAAOH,KAAK,CAAA;AAClB,SAAO;AAAA,IACL,OAAOC,EAAQE,EAAI,KAAK;AAAA,IACxB,GAAI,OAAOA,EAAI,SAAU,YAAY,EAAE,OAAOA,EAAI,MAAA;AAAA,IAClD,GAAI,OAAOA,EAAI,UAAW,YAAY,EAAE,QAAQA,EAAI,OAAA;AAAA,EAAO;AAE/D;AASO,MAAMC,IAAmC;AAAA,EAC9C,OAAO,EAAE,OAAO,WAAA;AAAA,EAChB,WAAW,EAAE,OAAO,cAAA;AAAA,EACpB,YAAY,EAAE,OAAO,cAAA;AAAA,EACrB,eAAe,EAAE,OAAO,cAAA;AAC1B;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["export type PlanStatus = 'idea' | 'planned' | 'in-progress' | 'review' | 'done' | 'dropped';\n\nexport const PLAN_STATUSES: PlanStatus[] = [\n 'idea',\n 'planned',\n 'in-progress',\n 'review',\n 'done',\n 'dropped',\n];\n\nexport interface LogEntry {\n date: string;\n text: string;\n}\n\nexport type PlanKind = 'feat' | 'fix' | 'chore' | 'docs' | 'refactor';\n\nexport const PLAN_KINDS: PlanKind[] = ['feat', 'fix', 'chore', 'docs', 'refactor'];\n\nexport const AGENT_IDS = ['claude-code', 'opencode'] as const;\n\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const AGENT_LABELS: Record<AgentId, string> = {\n 'claude-code': 'Claude Code',\n opencode: 'OpenCode',\n};\n\nexport type DecisionStatus = 'decided' | 'superseded';\n\nexport type QuestionStatus = 'open' | 'resolved';\n\nexport interface PhaseItem {\n done: boolean;\n text: string;\n description?: string;\n source?: 'review';\n}\n\n/** A body section anchor is `body` for now — the whole prose block is the only\n * body section a plan/entity has until later phases break it into sub-sections. */\nexport type MarginNoteAnchor = { kind: 'phase'; index: number } | { kind: 'body' };\n\nexport type MarginNoteState = 'open' | 'resolved';\n\nexport interface MarginNote {\n anchor: MarginNoteAnchor;\n prose: string;\n state: MarginNoteState;\n}\n\nexport interface RawEntry {\n title: string;\n fields: Record<string, string>;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n notes?: MarginNote[];\n review?: LogEntry[];\n}\n\nexport interface ParseWarning {\n title: string;\n message: string;\n}\n\nexport interface ParseResult<T> {\n entries: T[];\n warnings: ParseWarning[];\n}\n\n/** A PR's reviewable/mergeable state, as surfaced by `gh pr list`. */\nexport type PrState = 'draft' | 'open' | 'closed' | 'merged';\n\n/** GitHub's PR review decision, as surfaced by `gh pr list --json reviewDecision`. */\nexport type ReviewDecision = 'approved' | 'changes-requested' | 'review-required';\n\n// Per-comment detail; PrInfo.unresolvedThreadCount only counts these.\nexport interface ReviewThread {\n /** GraphQL node id — what `resolveReviewThread`/`replyToReviewThread` address. */\n id: string;\n /** File path the comment is anchored to; absent for a PR-level (not diff-anchored) comment. */\n path?: string;\n line?: number;\n author?: string;\n body: string;\n}\n\n// Parsed from the JSON object a fix-review agent's prompt requires as its final line.\nexport interface FixReviewResult {\n commit: { title: string; message: string };\n addressed: string[];\n skipped: { threadId: string; why: string }[];\n}\n\nexport interface ReviewSplitPhase {\n text: string;\n description?: string;\n}\n\nexport interface ReviewSplitFollowUp {\n title: string;\n body: string;\n}\n\n/** One review point's proposed classification — rework still inside this plan's\n * existing scope, or a follow-up idea for work that would grow beyond it. */\nexport interface ReviewSplitItem {\n point: string;\n kind: 'rework' | 'idea';\n phases?: ReviewSplitPhase[];\n followUp?: ReviewSplitFollowUp;\n}\n\n// Parsed from the JSON object a review-split agent's prompt requires as its final line.\nexport interface ReviewSplitResult {\n items: ReviewSplitItem[];\n}\n\n/** What an approved split actually applied — shown as a confirmation so approving is never silent. */\nexport interface ReviewSplitOutcome {\n phasesAdded: number;\n ideaTitles: string[];\n}\n\n/** Live-resolved PR info for an entity's branch — see `core/pr.ts`. */\nexport interface PrInfo {\n number: number;\n url: string;\n state: PrState;\n /** Undefined when no review has been requested/decided, or when unresolved (offline, closed/merged PR). */\n reviewDecision?: ReviewDecision;\n /** Count of unresolved review threads. Only fetched for open/draft PRs; undefined when not fetched or unresolved. */\n unresolvedThreadCount?: number;\n /** Whether a comment or review landed after the PR's last commit — a proxy for \"since the last agent pass\" (a pass ends with a push). Only fetched for open/draft PRs. */\n hasNewCommentsSincePush?: boolean;\n}\n\nexport interface PlanEntry {\n title: string;\n status: PlanStatus;\n kind?: PlanKind;\n id?: string;\n idea?: string;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n /** Absent renders under the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n notes?: MarginNote[];\n /** Prose written against the whole finished plan, distinct from the flat `log` — an\n * agent later splits each entry into rework phases or a follow-up idea. */\n review?: LogEntry[];\n pr?: PrInfo;\n}\n\nexport interface ArchivableIdea {\n id: string;\n title: string;\n pr: PrInfo;\n}\n\nexport interface DecisionEntry {\n title: string;\n date: string;\n status: DecisionStatus;\n supersededBy?: string;\n tags?: string[];\n body: string;\n}\n\nexport interface OpenQuestionEntry {\n title: string;\n status: QuestionStatus;\n raised: string;\n resolvedBy?: string;\n blocks?: string;\n body: string;\n}\n\nexport type ConsistencyIssueKind =\n | 'dangling-resolved-by'\n | 'dangling-superseded-by'\n | 'blocked-plan-active'\n | 'orphan-subject';\n\nexport interface ConsistencyIssue {\n kind: ConsistencyIssueKind;\n section: 'decisions' | 'open-questions' | 'plans';\n title: string;\n message: string;\n planId?: string;\n}\n\nexport type IdeaKind = 'idea' | 'note';\n\nexport type IdeaStatus = 'open' | 'done' | 'dropped';\n\nexport interface IdeaEntry {\n id: string | null;\n title: string;\n body: string;\n kind?: IdeaKind;\n status?: IdeaStatus;\n /** Absent renders under the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n /** Fallback sort key for unordered entries — see `order`. Absent on view-model-only IdeaEntry literals that never enter the worklist sort. */\n created?: string;\n log?: LogEntry[];\n}\n\n// Unified entity — one file per entity, plan as an optional Phases section.\n// Supersedes PlanEntry/IdeaEntry once the migration cutover lands.\n\n/** Work classification — same Conventional-Commits values as PlanKind; `kind` renamed to `type` in the unified schema. */\nexport type EntityType = PlanKind;\n\n/** Plan lifecycle plus the note-only `open`. Notes use open → done/dropped; everything else uses the PlanStatus track. */\nexport type EntityStatus = PlanStatus | 'open';\n\nexport interface EntityEntry {\n id: string;\n title: string;\n /** Absent until the entity is classified (usually when its plan is drafted). */\n type?: EntityType;\n /** \"note\" marks an entity that never grows phases. */\n kind?: 'note';\n /** Stored override, not the source of truth — see entityFrontmatterSchema. */\n status?: EntityStatus;\n agent?: AgentId;\n created: string;\n updated?: string;\n audited?: string;\n auditedHash?: string;\n tags: string[];\n /** Absent renders as the virtual \"No subject\" group. */\n subject?: string;\n /** Absent means unordered — sorts after all ordered entries, by created date. */\n order?: number;\n body: string;\n phases: PhaseItem[];\n log?: LogEntry[];\n clarifications?: LogEntry[];\n notes?: MarginNote[];\n review?: LogEntry[];\n /** Set by readEntities from which of the two scanned dirs the file came from, not the frontmatter. */\n archived?: boolean;\n}\n\n// No `id`/`status`: it only becomes a real idea if a human promotes it.\nexport interface SuggestionEntry {\n date: string;\n title: string;\n description: string;\n}\n\nexport interface RoadmapItem {\n name: string;\n description: string;\n candidates: string[];\n linked: string[];\n}\n\nexport interface RoadmapHorizon {\n title: string;\n items: RoadmapItem[];\n}\n\nexport interface Roadmap {\n goal: string;\n horizons: RoadmapHorizon[];\n standingConcerns: RoadmapItem[];\n}\n\nexport interface RoadmapLink {\n id: string;\n status: PlanStatus;\n taskRuns: number;\n pr?: PrInfo;\n released: boolean;\n}\n\nexport interface RoadmapRollup {\n total: number;\n done: number;\n}\n\nexport interface ResolvedRoadmapItem extends RoadmapItem {\n links: RoadmapLink[];\n rollup: RoadmapRollup;\n}\n\nexport interface ResolvedRoadmapHorizon {\n title: string;\n items: ResolvedRoadmapItem[];\n rollup: RoadmapRollup;\n}\n\nexport interface ResolvedRoadmap {\n goal: string;\n horizons: ResolvedRoadmapHorizon[];\n events: RoadmapEvent[];\n}\n\nexport type RoadmapEventKind = 'created' | 'task-run';\n\nexport interface RoadmapEvent {\n date: string;\n kind: RoadmapEventKind;\n entityId: string;\n horizonTitle: string;\n itemName: string;\n label: string;\n}\n\nexport interface EnvEntry {\n key: string;\n value: string;\n /** Set on GET responses when the value is withheld — secrets never reach the client. */\n isSet?: boolean;\n}\n\nexport interface AgentConfig {\n agent: AgentId;\n model?: string;\n effort?: string;\n}\n\n/** Model/effort passed to an adapter's buildArgs — the AgentConfig minus the agent id. */\nexport interface AgentRunOptions {\n model?: string;\n effort?: string;\n}\n\n/** Maps option names to a fixed value list (renders a Select) or null (free-text or hidden). */\nexport type AgentOptionsDescriptor = Record<string, string[] | null | undefined>;\n\nexport const AGENT_OPTIONS: Record<AgentId, AgentOptionsDescriptor> = {\n 'claude-code': {\n model: ['opus', 'sonnet', 'fable', 'haiku'],\n effort: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n opencode: {\n model: null,\n },\n};\n\nexport function coerceAgentConfig(v: unknown): AgentConfig {\n const toAgent = (a: unknown): AgentId =>\n AGENT_IDS.includes(a as AgentId) ? (a as AgentId) : 'claude-code';\n if (typeof v === 'string') return { agent: toAgent(v) };\n // A missing key must not throw — that would 500 the /api/config read this protects.\n const obj = (v ?? {}) as Record<string, unknown>;\n return {\n agent: toAgent(obj.agent),\n ...(typeof obj.model === 'string' && { model: obj.model }),\n ...(typeof obj.effort === 'string' && { effort: obj.effort }),\n };\n}\n\nexport interface DefaultAgentsMap {\n phase: AgentConfig;\n planDraft: AgentConfig;\n ideaExtend: AgentConfig;\n commitSuggest: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: DefaultAgentsMap = {\n phase: { agent: 'opencode' },\n planDraft: { agent: 'claude-code' },\n ideaExtend: { agent: 'claude-code' },\n commitSuggest: { agent: 'claude-code' },\n};\n\nexport interface PaperCampConfig {\n version: string;\n projectName: string;\n initializedAt: string;\n /** The unified-entity `idea` counter; the per-kind plan counters are legacy, present only in pre-migration configs. */\n nextId?: Partial<Record<PlanKind, number>> & { idea?: number };\n port?: number;\n defaultAgents?: DefaultAgentsMap;\n /** Derived from `ROADMAP.md` on every read (IDEA-95), never written to disk; an idea's\n * `subject` not present here renders as \"No subject\". */\n subjects?: string[];\n /** Opts out of the first-run redirect to Settings > Setup while capabilities are incomplete. */\n setupDismissed?: boolean;\n}\n\nexport type CheckStatus = 'stale' | 'running' | 'pass' | 'fail';\n\nexport interface CheckResult {\n status: CheckStatus;\n lastRun: string | null;\n output: string;\n}\n\nexport type CheckName = 'lint' | 'format' | 'test' | 'consistency';\n\nexport type CapabilityStatus = 'ok' | 'warn' | 'missing';\n\nexport interface CapabilityResult {\n id: string;\n status: CapabilityStatus;\n detail: string;\n}\n\nexport interface AgentAuthStatus {\n loggedIn: boolean | null;\n authMethod: string | null;\n apiProvider: string | null;\n}\n\nexport type ServiceId = 'git' | 'gh' | `agent:${AgentId}`;\n\n/** What a Connections row offers once its service isn't `ok` — copy a command, follow a link, or read plain instructions. */\nexport type ConnectAction =\n /** `runnable` marks a command with no placeholders and no interactive prompts — safe for the server to execute directly instead of just displaying it. */\n | { kind: 'command'; command: string; runnable?: boolean }\n | { kind: 'link'; url: string; label: string }\n | { kind: 'text'; message: string };\n\nexport interface ConnectionResult {\n id: ServiceId;\n label: string;\n unlocks: string;\n status: CapabilityStatus;\n detail: string;\n authenticated: boolean | null;\n connect: ConnectAction | null;\n}\n\nexport interface MergePolicy {\n allowSquashMerge: boolean;\n allowMergeCommit: boolean;\n allowRebaseMerge: boolean;\n squashMergeCommitTitle: string;\n squashMergeCommitMessage: string;\n}\n\nexport type MergePolicyResult =\n | { status: 'ok'; repo: string; policy: MergePolicy }\n | { status: 'unavailable'; reason: string };\n\nexport interface GitStatusEntry {\n path: string;\n status: string;\n staged: boolean;\n renameSource?: string;\n}\n\nexport interface GitStatusResponse {\n branch: string;\n entries: GitStatusEntry[];\n ahead: number;\n branchHygiene: BranchHygieneStatus;\n}\n\nexport type BranchHygieneStatus =\n | 'clean-on-main'\n | 'stale-merged'\n | 'stale-no-upstream'\n | 'dirty'\n | 'fine';\n\nexport interface GitLiveState {\n branch: string;\n ahead: number;\n behind: number;\n dirtyCount: number;\n}\n\nexport interface GitSyncFailure {\n ok: false;\n stage: 'reconcile' | 'stash-pop';\n message: string;\n stashPending: boolean;\n // Prompt for the agent recovery job (see git-sync-recovery.ts) — the deterministic\n // path's failure, the working-tree state, and the goal, packaged for a future\n // launch rather than thrown at the user.\n recoveryPrompt: string;\n}\n\nexport type GitSyncResult = { ok: true } | GitSyncFailure;\n\nexport type AgentTaskStatus = 'starting' | 'running' | 'stopping' | 'done' | 'error';\n\nexport type TaskKind =\n | 'phase'\n | 'audit'\n | 'batch-reconcile'\n | 'run-all'\n | 'draft'\n | 'extend'\n | 'suggest'\n | 'commit-suggest'\n | 'overlap-check'\n | 'prioritise'\n | 'sync'\n | 'reconcile'\n | 'rework'\n | 'fix-review'\n | 'review-split';\n\n// Persisted to papercamp/tasks.log (JSON Lines) — survives a dev-server restart,\n// unlike the in-memory task registry.\nexport interface TaskLogEntry {\n id: string;\n taskKind: TaskKind;\n planId?: string;\n planTitle: string;\n agentId: AgentId;\n startedAt: string;\n endedAt: string;\n outcome: 'done' | 'error';\n}\n\nexport interface TrailHop<T> {\n reached: boolean;\n data?: T;\n}\n\nexport interface ProvenanceTrail {\n id: string;\n idea: TrailHop<{ title: string; status?: EntityStatus; type?: EntityType }>;\n phases: TrailHop<PhaseItem[]>;\n taskRuns: TrailHop<TaskLogEntry[]>;\n commits: TrailHop<string[]>;\n pr: TrailHop<PrInfo>;\n releaseLine: TrailHop<string>;\n}\n\nexport interface AgentTaskState {\n id: string;\n status: AgentTaskStatus;\n taskKind: TaskKind;\n planTitle: string;\n planId?: string;\n phaseIndex?: number;\n fixAttempt?: number;\n fixAttemptCap?: number;\n ideaId?: string;\n agentId: AgentId;\n lines: string[];\n // fix-review only: prefills the commit form once the agent has reported.\n suggestedCommit?: { title: string; message: string };\n errorKind?: 'auth';\n}\n\nexport interface OverlapVerdict {\n verdict: 'existing' | 'extend' | 'new';\n targetId: string | null;\n reasoning: string;\n}\n\n/** `why` carries one line per entry in `order`, same index — the reason for that id's placement. */\nexport interface PrioritiseVerdict {\n order: string[];\n why: string;\n}\n\nexport interface ReconcileQueueItem {\n planId: string;\n title: string;\n before: { body: string; phases: PhaseItem[] };\n}\n"],"names":["PLAN_STATUSES","PLAN_KINDS","AGENT_IDS","AGENT_LABELS","AGENT_OPTIONS","coerceAgentConfig","v","toAgent","a","obj","DEFAULT_AGENTS"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASaC,IAAyB,CAAC,QAAQ,OAAO,SAAS,QAAQ,UAAU,GAEpEC,IAAY,CAAC,eAAe,UAAU,GAItCC,IAAwC;AAAA,EACnD,eAAe;AAAA,EACf,UAAU;AACZ,GAmUaC,IAAyD;AAAA,EACpE,eAAe;AAAA,IACb,OAAO,CAAC,QAAQ,UAAU,SAAS,OAAO;AAAA,IAC1C,QAAQ,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK;AAAA,EAAA;AAAA,EAElD,UAAU;AAAA,IACR,OAAO;AAAA,EAAA;AAEX;AAEO,SAASC,EAAkBC,GAAyB;AACzD,QAAMC,IAAU,CAACC,MACfN,EAAU,SAASM,CAAY,IAAKA,IAAgB;AACtD,MAAI,OAAOF,KAAM,SAAU,QAAO,EAAE,OAAOC,EAAQD,CAAC,EAAA;AAEpD,QAAMG,IAAOH,KAAK,CAAA;AAClB,SAAO;AAAA,IACL,OAAOC,EAAQE,EAAI,KAAK;AAAA,IACxB,GAAI,OAAOA,EAAI,SAAU,YAAY,EAAE,OAAOA,EAAI,MAAA;AAAA,IAClD,GAAI,OAAOA,EAAI,UAAW,YAAY,EAAE,QAAQA,EAAI,OAAA;AAAA,EAAO;AAE/D;AASO,MAAMC,IAAmC;AAAA,EAC9C,OAAO,EAAE,OAAO,WAAA;AAAA,EAChB,WAAW,EAAE,OAAO,cAAA;AAAA,EACpB,YAAY,EAAE,OAAO,cAAA;AAAA,EACrB,eAAe,EAAE,OAAO,cAAA;AAC1B;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dendelion/paper-camp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Local-first, AI-native project management with retro aesthetics",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.12.1",
|
|
@@ -31,14 +31,15 @@
|
|
|
31
31
|
"dev:lib": "vite",
|
|
32
32
|
"cli": "bun src/cli/index.ts",
|
|
33
33
|
"check-types": "tsc --noEmit",
|
|
34
|
-
"lint": "biome check .
|
|
34
|
+
"lint": "biome check .",
|
|
35
35
|
"lint:write": "biome check --write .",
|
|
36
36
|
"test": "vitest run",
|
|
37
37
|
"test:watch": "vitest",
|
|
38
38
|
"knip": "knip",
|
|
39
39
|
"depcruise": "depcruise src --config .dependency-cruiser.cjs",
|
|
40
40
|
"consistency": "knip --include files,dependencies && depcruise src --config .dependency-cruiser.cjs",
|
|
41
|
-
"prepare": "husky"
|
|
41
|
+
"prepare": "husky",
|
|
42
|
+
"comment-stats": "node scripts/comment-stats.mjs"
|
|
42
43
|
},
|
|
43
44
|
"keywords": [
|
|
44
45
|
"project-management",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as a,a as m,j as e,s as d,Z as j,f as p,d as v,c as S,l as x,b as f,M as b,e as D,h as T,P as C,r as w,X as k,o as L}from"./main-CyxblUnu.js";import{S as $}from"./sidebar-section-Ch50IaLb.js";const g=(s,l)=>s.toLowerCase().includes(l.toLowerCase()),Q=(s,l,c=120)=>{const r=s.toLowerCase().indexOf(l.toLowerCase());if(r===-1)return s.slice(0,c);const n=Math.max(0,r-40),i=Math.min(s.length,r+l.length+40);let h=s.slice(n,i);return n>0&&(h=`…${h}`),i<s.length&&(h=`${h}…`),h},z=({query:s})=>{const l=a(o=>o.repoDocs),c=a(o=>o.setActiveDocTitle),r=a(o=>o.setDocSearchQuery),n=m(),i=[];for(const o of l)(g(o.name,s)||g(o.content,s))&&i.push({title:o.name,snippet:Q(o.content,s)});const h=o=>{n({to:"/docs/$section",params:{section:"repo-docs"}}),c(o),r("")};return i.length===0?e.jsxs("p",{style:{opacity:.5},children:['No results found for "',s,'".']}):e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm",style:{opacity:.5,marginBottom:d[3]},children:[i.length," result",i.length===1?"":"s",' for "',s,'"']}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:d[1]},children:i.map(o=>e.jsx(j,{variant:"ghost",size:"small",fullWidth:!0,onClick:()=>h(o.title),style:{justifyContent:"flex-start",padding:`${d[2]} ${d[3]}`},children:e.jsxs("span",{style:{textAlign:"left"},children:[e.jsx("span",{style:{fontFamily:p.serif,fontWeight:600,fontSize:"0.95rem",display:"block",marginBottom:"0.2rem"},children:o.title}),e.jsx("span",{className:"text-sm",style:{opacity:.6},children:o.snippet})]})},o.title))})]})},A=()=>{const s=a(n=>n.repoDocs),l=a(n=>n.activeDocTitle),c=s.find(n=>n.name===l);if(!c)return null;const r=c.name.endsWith(".md");return e.jsxs("div",{children:[e.jsx("h2",{style:{...v,margin:`0 0 ${d[4]}`},children:c.name}),r?e.jsx("div",{style:{fontFamily:p.body,fontSize:f.base,lineHeight:x.relaxed,color:S.textProse},children:e.jsx(b,{children:c.content})}):e.jsx("pre",{style:{fontFamily:p.mono,fontSize:f.xs,background:"rgba(0,0,0,0.04)",borderRadius:6,padding:d[4],overflowX:"auto",lineHeight:x.normal,whiteSpace:"pre-wrap"},children:c.content})]})},F=()=>{const s=a(i=>i.docSearchQuery),l=a(i=>i.activeDocTitle),c=m(),r=D(),n=()=>c({to:"/docs"});return s.trim()?e.jsx("div",{children:e.jsx(z,{query:s})}):r==="repo-docs"&&l?e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:d[4]},children:e.jsx(T,{items:[{id:"docs",label:"Docs",onClick:n},{id:"repo-doc",label:l}]})}),e.jsx(A,{})]}):e.jsxs("div",{children:[e.jsx(C,{children:"Docs"}),e.jsx("p",{style:{opacity:.5},children:"Select a section from the sidebar."})]})},R=s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),u=({children:s})=>e.jsx("span",{className:"text-sm",style:{display:"block",padding:`${d[1]} ${d[3]}`,opacity:.35,fontStyle:"italic"},children:s}),M=()=>{const s=a(t=>t.repoDocs),l=a(t=>t.repoDocsLoading),c=a(t=>t.loadRepoDocs),r=a(t=>t.activeDocTitle),n=a(t=>t.setActiveDocTitle),i=a(t=>t.docSearchQuery),h=a(t=>t.setDocSearchQuery),o=D(),y=m();return w.useEffect(()=>{c()},[c]),e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{marginBottom:d[4]},children:e.jsx(k,{size:"small","aria-label":"Search docs",placeholder:"Search docs…",value:i,onChange:t=>h(t.target.value)})}),e.jsx($,{label:"Repo Docs",children:l&&s.length===0?e.jsx(u,{children:"Loading…"}):s.length>0?s.map(t=>e.jsx(L,{size:"small",active:o==="repo-docs"&&r===t.name,onClick:()=>{y({to:"/docs/$section",params:{section:"repo-docs"}}),n(t.name)},children:R(t.name)},t.name)):e.jsx(u,{children:"No repo docs found"})})]})};export{F as DocsPage,M as DocsSidebar};
|
|
2
|
-
//# sourceMappingURL=index-BnXxehKU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BnXxehKU.js","sources":["../../../src/app/features/docs/components/docs-search.tsx","../../../src/app/features/docs/components/repo-doc-detail.tsx","../../../src/app/features/docs/docs-page.tsx","../../../src/app/features/docs/components/docs-sidebar.tsx"],"sourcesContent":["import { useAppStore } from '@/app/stores/app-store';\nimport { fontFamily, space } from '@/app/styles/tokens';\nimport { Button } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\n\ninterface SearchMatch {\n title: string;\n snippet: string;\n}\n\ninterface DocsSearchProps {\n query: string;\n}\n\nconst searchIn = (text: string, query: string): boolean =>\n text.toLowerCase().includes(query.toLowerCase());\n\nconst snippet = (text: string, query: string, maxLen = 120): string => {\n const idx = text.toLowerCase().indexOf(query.toLowerCase());\n if (idx === -1) return text.slice(0, maxLen);\n const start = Math.max(0, idx - 40);\n const end = Math.min(text.length, idx + query.length + 40);\n let s = text.slice(start, end);\n if (start > 0) s = `…${s}`;\n if (end < text.length) s = `${s}…`;\n return s;\n};\n\nexport const DocsSearch = ({ query }: DocsSearchProps) => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const setActiveDocTitle = useAppStore((s) => s.setActiveDocTitle);\n const setDocSearchQuery = useAppStore((s) => s.setDocSearchQuery);\n const navigate = useNavigate();\n\n const results: SearchMatch[] = [];\n\n for (const f of repoDocs) {\n if (searchIn(f.name, query) || searchIn(f.content, query)) {\n results.push({\n title: f.name,\n snippet: snippet(f.content, query),\n });\n }\n }\n\n const handleSelect = (title: string) => {\n navigate({ to: '/docs/$section', params: { section: 'repo-docs' } });\n setActiveDocTitle(title);\n setDocSearchQuery('');\n };\n\n if (results.length === 0) {\n return <p style={{ opacity: 0.5 }}>No results found for \"{query}\".</p>;\n }\n\n return (\n <div>\n <p className=\"text-sm\" style={{ opacity: 0.5, marginBottom: space[3] }}>\n {results.length} result{results.length === 1 ? '' : 's'} for \"{query}\"\n </p>\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}>\n {results.map((m) => (\n <Button\n key={m.title}\n variant=\"ghost\"\n size=\"small\"\n fullWidth\n onClick={() => handleSelect(m.title)}\n style={{ justifyContent: 'flex-start', padding: `${space[2]} ${space[3]}` }}\n >\n <span style={{ textAlign: 'left' }}>\n <span\n style={{\n fontFamily: fontFamily.serif,\n fontWeight: 600,\n fontSize: '0.95rem',\n display: 'block',\n marginBottom: '0.2rem',\n }}\n >\n {m.title}\n </span>\n <span className=\"text-sm\" style={{ opacity: 0.6 }}>\n {m.snippet}\n </span>\n </span>\n </Button>\n ))}\n </div>\n </div>\n );\n};\n","import { detailHeadingStyle } from '@/app/components/detail-heading-style';\nimport { Markdown } from '@/app/components/markdown';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color, fontFamily, fontSize, lineHeight, space } from '@/app/styles/tokens';\n\nexport const RepoDocDetail = () => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n\n const file = repoDocs.find((f) => f.name === activeDocTitle);\n if (!file) return null;\n\n const isMarkdown = file.name.endsWith('.md');\n\n return (\n <div>\n <h2 style={{ ...detailHeadingStyle, margin: `0 0 ${space[4]}` }}>{file.name}</h2>\n\n {isMarkdown ? (\n <div\n style={{\n fontFamily: fontFamily.body,\n fontSize: fontSize.base,\n lineHeight: lineHeight.relaxed,\n color: color.textProse,\n }}\n >\n <Markdown>{file.content}</Markdown>\n </div>\n ) : (\n <pre\n style={{\n fontFamily: fontFamily.mono,\n fontSize: fontSize.xs,\n background: 'rgba(0,0,0,0.04)',\n borderRadius: 6,\n padding: space[4],\n overflowX: 'auto',\n lineHeight: lineHeight.normal,\n whiteSpace: 'pre-wrap',\n }}\n >\n {file.content}\n </pre>\n )}\n </div>\n );\n};\n","import { PageTitle } from '@/app/components/page-title';\nimport { useResolvedDocSection } from '@/app/hooks';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { space } from '@/app/styles/tokens';\nimport { Breadcrumb } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { DocsSearch } from './components/docs-search';\nimport { RepoDocDetail } from './components/repo-doc-detail';\n\nexport const DocsPage = () => {\n const docSearchQuery = useAppStore((s) => s.docSearchQuery);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n const navigate = useNavigate();\n const activeDocSection = useResolvedDocSection();\n\n const handleBackToDocs = () => navigate({ to: '/docs' });\n\n if (docSearchQuery.trim()) {\n return (\n <div>\n <DocsSearch query={docSearchQuery} />\n </div>\n );\n }\n\n if (activeDocSection === 'repo-docs' && activeDocTitle) {\n return (\n <div>\n <div style={{ marginBottom: space[4] }}>\n <Breadcrumb\n items={[\n { id: 'docs', label: 'Docs', onClick: handleBackToDocs },\n { id: 'repo-doc', label: activeDocTitle },\n ]}\n />\n </div>\n <RepoDocDetail />\n </div>\n );\n }\n\n return (\n <div>\n <PageTitle>Docs</PageTitle>\n <p style={{ opacity: 0.5 }}>Select a section from the sidebar.</p>\n </div>\n );\n};\n","import { useResolvedDocSection } from '@/app/hooks';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { space } from '@/app/styles/tokens';\nimport { Input, ListItem } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useEffect } from 'react';\nimport { SidebarSection } from '../../plans/components/sidebar-section';\n\nconst simplecaseLabel = (name: string) =>\n name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n\nconst EmptyState = ({ children }: { children: React.ReactNode }) => (\n <span\n className=\"text-sm\"\n style={{\n display: 'block',\n padding: `${space[1]} ${space[3]}`,\n opacity: 0.35,\n fontStyle: 'italic',\n }}\n >\n {children}\n </span>\n);\n\nexport const DocsSidebar = () => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const repoDocsLoading = useAppStore((s) => s.repoDocsLoading);\n const loadRepoDocs = useAppStore((s) => s.loadRepoDocs);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n const setActiveDocTitle = useAppStore((s) => s.setActiveDocTitle);\n const docSearchQuery = useAppStore((s) => s.docSearchQuery);\n const setDocSearchQuery = useAppStore((s) => s.setDocSearchQuery);\n const activeDocSection = useResolvedDocSection();\n const navigate = useNavigate();\n\n useEffect(() => {\n loadRepoDocs();\n }, [loadRepoDocs]);\n\n return (\n <>\n <div style={{ marginBottom: space[4] }}>\n <Input\n size=\"small\"\n aria-label=\"Search docs\"\n placeholder=\"Search docs…\"\n value={docSearchQuery}\n onChange={(e) => setDocSearchQuery(e.target.value)}\n />\n </div>\n\n <SidebarSection label=\"Repo Docs\">\n {repoDocsLoading && repoDocs.length === 0 ? (\n <EmptyState>Loading…</EmptyState>\n ) : repoDocs.length > 0 ? (\n repoDocs.map((f) => (\n <ListItem\n key={f.name}\n size=\"small\"\n active={activeDocSection === 'repo-docs' && activeDocTitle === f.name}\n onClick={() => {\n navigate({ to: '/docs/$section', params: { section: 'repo-docs' } });\n setActiveDocTitle(f.name);\n }}\n >\n {simplecaseLabel(f.name)}\n </ListItem>\n ))\n ) : (\n <EmptyState>No repo docs found</EmptyState>\n )}\n </SidebarSection>\n </>\n );\n};\n"],"names":["searchIn","text","query","snippet","maxLen","idx","start","end","s","DocsSearch","repoDocs","useAppStore","setActiveDocTitle","setDocSearchQuery","navigate","useNavigate","results","f","handleSelect","title","jsxs","space","m","jsx","Button","fontFamily","RepoDocDetail","activeDocTitle","file","isMarkdown","detailHeadingStyle","fontSize","lineHeight","color","Markdown","DocsPage","docSearchQuery","activeDocSection","useResolvedDocSection","handleBackToDocs","Breadcrumb","PageTitle","simplecaseLabel","name","EmptyState","children","DocsSidebar","repoDocsLoading","loadRepoDocs","useEffect","Fragment","Input","e","SidebarSection","ListItem"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{u as m,C as w,r,j as e,P as v,s as f,p as x,b as g,A as S,f as j,O as L,c as y,E as D}from"./main-CyxblUnu.js";const N={phase:"Phase run",audit:"Audit","batch-reconcile":"Batch reconcile","run-all":"Run all phases",draft:"Draft",extend:"Extend",suggest:"Suggest ideas","commit-suggest":"Commit suggest","overlap-check":"Overlap check",sync:"Sync",reconcile:"Reconcile","fix-review":"Fix review"},p=s=>String(s).padStart(2,"0"),A=s=>{const t=new Date(s);return`${t.getFullYear()}-${p(t.getMonth()+1)}-${p(t.getDate())}`},T=s=>new Date(s).toLocaleDateString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),k=s=>{const t=new Date(s);return`${p(t.getHours())}:${p(t.getMinutes())}:${p(t.getSeconds())}`},c={fontSize:g.sm,fontWeight:600,opacity:.6,whiteSpace:"nowrap",overflow:"hidden"},E=({id:s})=>{const[t,o]=r.useState(null);return r.useEffect(()=>{o(null),D(s).then(l=>o(l.lines)).catch(()=>o([]))},[s]),t===null?e.jsx("p",{style:{opacity:.5,margin:0},children:"Loading…"}):t.length===0?e.jsx("p",{style:{opacity:.5,margin:0},children:"No output recorded."}):e.jsx("pre",{style:{fontFamily:j.mono,fontSize:g.xs,margin:0,maxHeight:320,overflowY:"auto",whiteSpace:"pre-wrap"},children:t.join(`
|
|
2
|
-
`)})},b=({size:s=14})=>e.jsx("svg",{width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("polyline",{points:"9 18 15 12 9 6"})}),R=({entry:s,highlighted:t})=>{const[o,l]=r.useState(t);r.useEffect(()=>{t&&l(!0)},[t]);const d=()=>l(i=>!i);return e.jsxs("div",{className:t?"task-row-highlighted":void 0,style:{display:"flex",flexDirection:"column",gap:f[1],borderRadius:10},children:[e.jsx("div",{role:"button",tabIndex:0,onClick:d,onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),d())},style:{cursor:"pointer",borderRadius:10},children:e.jsx(x,{size:"small",texture:"canvas",className:"plan-row-card",children:e.jsxs("div",{className:"task-rows-grid",children:[e.jsx("span",{className:"task-rows-chevron","aria-expanded":o,style:{display:"inline-flex",alignItems:"center",opacity:.5},children:e.jsx(b,{})}),e.jsx("span",{style:{fontWeight:600,whiteSpace:"nowrap",overflow:"hidden"},children:N[s.taskKind]}),e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",opacity:.7},children:s.planTitle}),e.jsx("span",{className:"text-sm",style:{opacity:.5,whiteSpace:"nowrap"},children:S[s.agentId]}),e.jsxs("span",{className:"task-rows-cell-time",style:{fontFamily:j.mono,fontSize:g.xs,opacity:.55,whiteSpace:"nowrap"},children:[k(s.startedAt),"–",k(s.endedAt)]}),e.jsx("div",{style:{display:"flex",alignItems:"center"},children:e.jsx(L,{size:"small",fillColor:s.outcome==="done"?"rgba(143, 185, 150, 0.25)":"rgba(201, 139, 139, 0.25)",textColor:s.outcome==="done"?y.accentGreenDark:y.accentRoseDark,children:s.outcome})})]})})}),o&&e.jsx(x,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsx(E,{id:s.id})})]})},C=()=>{const s=m(a=>a.taskLog),t=m(a=>a.taskLogLoading),o=m(a=>a.loadTaskLog),{taskId:l}=w({from:"/tasks"}),d=r.useRef(null);r.useEffect(()=>{o()},[o]),r.useEffect(()=>{var n;if(!l)return;const a=(n=d.current)==null?void 0:n.querySelector(".task-row-highlighted");a==null||a.scrollIntoView({behavior:"smooth",block:"center"})},[l]);const i=[...s].sort((a,n)=>n.endedAt.localeCompare(a.endedAt)),u=[];for(const a of i){const n=A(a.endedAt),h=u.at(-1);(h==null?void 0:h.key)===n?h.entries.push(a):u.push({key:n,entries:[a]})}return e.jsxs("div",{ref:d,children:[e.jsx(v,{children:"Tasks"}),t&&e.jsx("p",{style:{opacity:.5},children:"Loading…"}),!t&&i.length===0&&e.jsx("p",{style:{opacity:.5},children:"No tasks have run yet."}),!t&&i.length>0&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:f[1]},children:[e.jsx(x,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsxs("div",{className:"task-rows-grid",children:[e.jsx("span",{}),e.jsx("span",{style:c,children:"Task"}),e.jsx("span",{style:c,children:"Plan"}),e.jsx("span",{style:c,children:"Agent"}),e.jsx("span",{className:"task-rows-cell-time",style:c,children:"Time"}),e.jsx("span",{style:c,children:"Outcome"})]})}),u.map(a=>e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:f[1]},children:[e.jsx(x,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsx("span",{style:{...c,opacity:.75},children:T(a.entries[0].endedAt)})}),a.entries.map(n=>e.jsx(R,{entry:n,highlighted:n.id===l},n.id))]},a.key))]})]})};export{C as TasksPage};
|
|
3
|
-
//# sourceMappingURL=index-C2kYil0S.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-C2kYil0S.js","sources":["../../../src/app/features/tasks/tasks-page.tsx"],"sourcesContent":["import { PageTitle } from '@/app/components/page-title';\nimport { fetchTaskLogLines } from '@/app/services/content/docs-api';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color, fontFamily, fontSize, space } from '@/app/styles/tokens';\nimport { AGENT_LABELS, type TaskKind, type TaskLogEntry } from '@/types/index';\nimport { Card, Stamp } from '@dendelion/paper-ui';\nimport { useSearch } from '@tanstack/react-router';\nimport { useEffect, useRef, useState } from 'react';\n\nconst TASK_KIND_LABELS: Record<TaskKind, string> = {\n phase: 'Phase run',\n audit: 'Audit',\n 'batch-reconcile': 'Batch reconcile',\n 'run-all': 'Run all phases',\n draft: 'Draft',\n extend: 'Extend',\n suggest: 'Suggest ideas',\n 'commit-suggest': 'Commit suggest',\n 'overlap-check': 'Overlap check',\n sync: 'Sync',\n reconcile: 'Reconcile',\n 'fix-review': 'Fix review',\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst dayKey = (iso: string) => {\n const d = new Date(iso);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n};\n\nconst formatDayHeader = (iso: string) =>\n new Date(iso).toLocaleDateString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n\nconst formatTime = (iso: string) => {\n const d = new Date(iso);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n};\n\nconst headerLabelStyle: React.CSSProperties = {\n fontSize: fontSize.sm,\n fontWeight: 600,\n opacity: 0.6,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n};\n\nconst TaskLogLines = ({ id }: { id: string }) => {\n const [lines, setLines] = useState<string[] | null>(null);\n\n useEffect(() => {\n setLines(null);\n fetchTaskLogLines(id)\n .then((data) => setLines(data.lines))\n .catch(() => setLines([]));\n }, [id]);\n\n if (lines === null) return <p style={{ opacity: 0.5, margin: 0 }}>Loading…</p>;\n if (lines.length === 0) return <p style={{ opacity: 0.5, margin: 0 }}>No output recorded.</p>;\n return (\n <pre\n style={{\n fontFamily: fontFamily.mono,\n fontSize: fontSize.xs,\n margin: 0,\n maxHeight: 320,\n overflowY: 'auto',\n whiteSpace: 'pre-wrap',\n }}\n >\n {lines.join('\\n')}\n </pre>\n );\n};\n\nconst ChevronRightIcon = ({ size = 14 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst TaskRow = ({ entry, highlighted }: { entry: TaskLogEntry; highlighted: boolean }) => {\n const [expanded, setExpanded] = useState(highlighted);\n useEffect(() => {\n if (highlighted) setExpanded(true);\n }, [highlighted]);\n const toggle = () => setExpanded((v) => !v);\n\n return (\n <div\n className={highlighted ? 'task-row-highlighted' : undefined}\n style={{ display: 'flex', flexDirection: 'column', gap: space[1], borderRadius: 10 }}\n >\n {/* biome-ignore lint/a11y/useSemanticElements: the clickable row wraps a Card whose block layout a native <button> would break; keyboard toggling is wired on the div. */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggle();\n }\n }}\n style={{ cursor: 'pointer', borderRadius: 10 }}\n >\n <Card size=\"small\" texture=\"canvas\" className=\"plan-row-card\">\n <div className=\"task-rows-grid\">\n <span\n className=\"task-rows-chevron\"\n aria-expanded={expanded}\n style={{ display: 'inline-flex', alignItems: 'center', opacity: 0.5 }}\n >\n <ChevronRightIcon />\n </span>\n <span style={{ fontWeight: 600, whiteSpace: 'nowrap', overflow: 'hidden' }}>\n {TASK_KIND_LABELS[entry.taskKind]}\n </span>\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: 0.7,\n }}\n >\n {entry.planTitle}\n </span>\n <span className=\"text-sm\" style={{ opacity: 0.5, whiteSpace: 'nowrap' }}>\n {AGENT_LABELS[entry.agentId]}\n </span>\n <span\n className=\"task-rows-cell-time\"\n style={{\n fontFamily: fontFamily.mono,\n fontSize: fontSize.xs,\n opacity: 0.55,\n whiteSpace: 'nowrap',\n }}\n >\n {formatTime(entry.startedAt)}–{formatTime(entry.endedAt)}\n </span>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Stamp\n size=\"small\"\n fillColor={\n entry.outcome === 'done'\n ? 'rgba(143, 185, 150, 0.25)'\n : 'rgba(201, 139, 139, 0.25)'\n }\n textColor={entry.outcome === 'done' ? color.accentGreenDark : color.accentRoseDark}\n >\n {entry.outcome}\n </Stamp>\n </div>\n </div>\n </Card>\n </div>\n {expanded && (\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <TaskLogLines id={entry.id} />\n </Card>\n )}\n </div>\n );\n};\n\nexport const TasksPage = () => {\n const taskLog = useAppStore((s) => s.taskLog);\n const taskLogLoading = useAppStore((s) => s.taskLogLoading);\n const loadTaskLog = useAppStore((s) => s.loadTaskLog);\n const { taskId } = useSearch({ from: '/tasks' });\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n loadTaskLog();\n }, [loadTaskLog]);\n\n useEffect(() => {\n if (!taskId) return;\n const row = containerRef.current?.querySelector('.task-row-highlighted');\n row?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, [taskId]);\n\n const sorted = [...taskLog].sort((a, b) => b.endedAt.localeCompare(a.endedAt));\n\n const groups: { key: string; entries: TaskLogEntry[] }[] = [];\n for (const entry of sorted) {\n const key = dayKey(entry.endedAt);\n const group = groups.at(-1);\n if (group?.key === key) group.entries.push(entry);\n else groups.push({ key, entries: [entry] });\n }\n\n return (\n <div ref={containerRef}>\n <PageTitle>Tasks</PageTitle>\n {taskLogLoading && <p style={{ opacity: 0.5 }}>Loading…</p>}\n {!taskLogLoading && sorted.length === 0 && (\n <p style={{ opacity: 0.5 }}>No tasks have run yet.</p>\n )}\n {!taskLogLoading && sorted.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}>\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <div className=\"task-rows-grid\">\n <span />\n <span style={headerLabelStyle}>Task</span>\n <span style={headerLabelStyle}>Plan</span>\n <span style={headerLabelStyle}>Agent</span>\n <span className=\"task-rows-cell-time\" style={headerLabelStyle}>\n Time\n </span>\n <span style={headerLabelStyle}>Outcome</span>\n </div>\n </Card>\n {groups.map((group) => (\n <div\n key={group.key}\n style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}\n >\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <span style={{ ...headerLabelStyle, opacity: 0.75 }}>\n {formatDayHeader(group.entries[0].endedAt)}\n </span>\n </Card>\n {group.entries.map((entry) => (\n <TaskRow key={entry.id} entry={entry} highlighted={entry.id === taskId} />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"names":["TASK_KIND_LABELS","pad","n","dayKey","iso","d","formatDayHeader","formatTime","headerLabelStyle","fontSize","TaskLogLines","id","lines","setLines","useState","useEffect","fetchTaskLogLines","data","jsx","fontFamily","ChevronRightIcon","size","TaskRow","entry","highlighted","expanded","setExpanded","toggle","v","jsxs","space","e","Card","AGENT_LABELS","Stamp","color","TasksPage","taskLog","useAppStore","s","taskLogLoading","loadTaskLog","taskId","useSearch","containerRef","useRef","row","_a","sorted","b","groups","key","group","PageTitle"],"mappings":"sHASA,MAAMA,EAA6C,CACjD,MAAO,YACP,MAAO,QACP,kBAAmB,kBACnB,UAAW,iBACX,MAAO,QACP,OAAQ,SACR,QAAS,gBACT,iBAAkB,iBAClB,gBAAiB,gBACjB,KAAM,OACN,UAAW,YACX,aAAc,YAChB,EAEMC,EAAOC,GAAc,OAAOA,CAAC,EAAE,SAAS,EAAG,GAAG,EAE9CC,EAAUC,GAAgB,CAC9B,MAAMC,EAAI,IAAI,KAAKD,CAAG,EACtB,MAAO,GAAGC,EAAE,YAAA,CAAa,IAAIJ,EAAII,EAAE,SAAA,EAAa,CAAC,CAAC,IAAIJ,EAAII,EAAE,QAAA,CAAS,CAAC,EACxE,EAEMC,EAAmBF,GACvB,IAAI,KAAKA,CAAG,EAAE,mBAAmB,OAAW,CAC1C,QAAS,OACT,KAAM,UACN,MAAO,OACP,IAAK,SACP,CAAC,EAEGG,EAAcH,GAAgB,CAClC,MAAMC,EAAI,IAAI,KAAKD,CAAG,EACtB,MAAO,GAAGH,EAAII,EAAE,SAAA,CAAU,CAAC,IAAIJ,EAAII,EAAE,WAAA,CAAY,CAAC,IAAIJ,EAAII,EAAE,WAAA,CAAY,CAAC,EAC3E,EAEMG,EAAwC,CAC5C,SAAUC,EAAS,GACnB,WAAY,IACZ,QAAS,GACT,WAAY,SACZ,SAAU,QACZ,EAEMC,EAAe,CAAC,CAAE,GAAAC,KAAyB,CAC/C,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAA0B,IAAI,EASxD,OAPAC,EAAAA,UAAU,IAAM,CACdF,EAAS,IAAI,EACbG,EAAkBL,CAAE,EACjB,KAAMM,GAASJ,EAASI,EAAK,KAAK,CAAC,EACnC,MAAM,IAAMJ,EAAS,CAAA,CAAE,CAAC,CAC7B,EAAG,CAACF,CAAE,CAAC,EAEHC,IAAU,KAAaM,EAAAA,IAAC,IAAA,CAAE,MAAO,CAAE,QAAS,GAAK,OAAQ,CAAA,EAAK,SAAA,UAAA,CAAQ,EACtEN,EAAM,SAAW,EAAUM,EAAAA,IAAC,IAAA,CAAE,MAAO,CAAE,QAAS,GAAK,OAAQ,CAAA,EAAK,SAAA,sBAAmB,EAEvFA,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,WAAYC,EAAW,KACvB,SAAUV,EAAS,GACnB,OAAQ,EACR,UAAW,IACX,UAAW,OACX,WAAY,UAAA,EAGb,SAAAG,EAAM,KAAK;AAAA,CAAI,CAAA,CAAA,CAGtB,EAEMQ,EAAmB,CAAC,CAAE,KAAAC,EAAO,MACjCH,EAAAA,IAAC,MAAA,CACC,MAAOG,EACP,OAAQA,EACR,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,cAAY,OAEZ,SAAAH,EAAAA,IAAC,WAAA,CAAS,OAAO,gBAAA,CAAiB,CAAA,CACpC,EAGII,EAAU,CAAC,CAAE,MAAAC,EAAO,YAAAC,KAAiE,CACzF,KAAM,CAACC,EAAUC,CAAW,EAAIZ,EAAAA,SAASU,CAAW,EACpDT,EAAAA,UAAU,IAAM,CACVS,KAAyB,EAAI,CACnC,EAAG,CAACA,CAAW,CAAC,EAChB,MAAMG,EAAS,IAAMD,EAAaE,GAAM,CAACA,CAAC,EAE1C,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWL,EAAc,uBAAyB,OAClD,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAKM,EAAM,CAAC,EAAG,aAAc,EAAA,EAGhF,SAAA,CAAAZ,EAAAA,IAAC,MAAA,CACC,KAAK,SACL,SAAU,EACV,QAASS,EACT,UAAYI,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACFJ,EAAA,EAEJ,EACA,MAAO,CAAE,OAAQ,UAAW,aAAc,EAAA,EAE1C,SAAAT,EAAAA,IAACc,EAAA,CAAK,KAAK,QAAQ,QAAQ,SAAS,UAAU,gBAC5C,SAAAH,OAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAX,EAAAA,IAAC,OAAA,CACC,UAAU,oBACV,gBAAeO,EACf,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,QAAS,EAAA,EAEhE,eAACL,EAAA,CAAA,CAAiB,CAAA,CAAA,EAEpBF,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,WAAY,IAAK,WAAY,SAAU,SAAU,QAAA,EAC7D,SAAAlB,EAAiBuB,EAAM,QAAQ,EAClC,EACAL,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,SACV,aAAc,WACd,WAAY,SACZ,QAAS,EAAA,EAGV,SAAAK,EAAM,SAAA,CAAA,EAETL,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,MAAO,CAAE,QAAS,GAAK,WAAY,QAAA,EAC1D,SAAAe,EAAaV,EAAM,OAAO,EAC7B,EACAM,EAAAA,KAAC,OAAA,CACC,UAAU,sBACV,MAAO,CACL,WAAYV,EAAW,KACvB,SAAUV,EAAS,GACnB,QAAS,IACT,WAAY,QAAA,EAGb,SAAA,CAAAF,EAAWgB,EAAM,SAAS,EAAE,IAAEhB,EAAWgB,EAAM,OAAO,CAAA,CAAA,CAAA,EAEzDL,MAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,UACzC,SAAAA,EAAAA,IAACgB,EAAA,CACC,KAAK,QACL,UACEX,EAAM,UAAY,OACd,4BACA,4BAEN,UAAWA,EAAM,UAAY,OAASY,EAAM,gBAAkBA,EAAM,eAEnE,SAAAZ,EAAM,OAAA,CAAA,CACT,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EAEDE,GACCP,EAAAA,IAACc,EAAA,CAAK,KAAK,QAAQ,QAAQ,QAAQ,UAAU,gBAC3C,SAAAd,EAAAA,IAACR,EAAA,CAAa,GAAIa,EAAM,GAAI,CAAA,CAC9B,CAAA,CAAA,CAAA,CAIR,EAEaa,EAAY,IAAM,CAC7B,MAAMC,EAAUC,EAAaC,GAAMA,EAAE,OAAO,EACtCC,EAAiBF,EAAaC,GAAMA,EAAE,cAAc,EACpDE,EAAcH,EAAaC,GAAMA,EAAE,WAAW,EAC9C,CAAE,OAAAG,CAAA,EAAWC,EAAU,CAAE,KAAM,SAAU,EACzCC,EAAeC,EAAAA,OAAuB,IAAI,EAEhD9B,EAAAA,UAAU,IAAM,CACd0B,EAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAEhB1B,EAAAA,UAAU,IAAM,OACd,GAAI,CAAC2B,EAAQ,OACb,MAAMI,GAAMC,EAAAH,EAAa,UAAb,YAAAG,EAAsB,cAAc,yBAChDD,GAAA,MAAAA,EAAK,eAAe,CAAE,SAAU,SAAU,MAAO,UACnD,EAAG,CAACJ,CAAM,CAAC,EAEX,MAAMM,EAAS,CAAC,GAAGX,CAAO,EAAE,KAAK,CAAC,EAAGY,IAAMA,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC,EAEvEC,EAAqD,CAAA,EAC3D,UAAW3B,KAASyB,EAAQ,CAC1B,MAAMG,EAAMhD,EAAOoB,EAAM,OAAO,EAC1B6B,EAAQF,EAAO,GAAG,EAAE,GACtBE,GAAA,YAAAA,EAAO,OAAQD,EAAKC,EAAM,QAAQ,KAAK7B,CAAK,EAC3C2B,EAAO,KAAK,CAAE,IAAAC,EAAK,QAAS,CAAC5B,CAAK,EAAG,CAC5C,CAEA,OACEM,EAAAA,KAAC,MAAA,CAAI,IAAKe,EACR,SAAA,CAAA1B,EAAAA,IAACmC,GAAU,SAAA,OAAA,CAAK,EACfb,SAAmB,IAAA,CAAE,MAAO,CAAE,QAAS,EAAA,EAAO,SAAA,WAAQ,EACtD,CAACA,GAAkBQ,EAAO,SAAW,GACpC9B,EAAAA,IAAC,IAAA,CAAE,MAAO,CAAE,QAAS,EAAA,EAAO,SAAA,wBAAA,CAAsB,EAEnD,CAACsB,GAAkBQ,EAAO,OAAS,UACjC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAKlB,EAAM,CAAC,GAClE,SAAA,CAAAZ,EAAAA,IAACc,EAAA,CAAK,KAAK,QAAQ,QAAQ,QAAQ,UAAU,gBAC3C,SAAAH,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAX,EAAAA,IAAC,OAAA,EAAK,EACNA,EAAAA,IAAC,OAAA,CAAK,MAAOV,EAAkB,SAAA,OAAI,EACnCU,EAAAA,IAAC,OAAA,CAAK,MAAOV,EAAkB,SAAA,OAAI,EACnCU,EAAAA,IAAC,OAAA,CAAK,MAAOV,EAAkB,SAAA,QAAK,QACnC,OAAA,CAAK,UAAU,sBAAsB,MAAOA,EAAkB,SAAA,OAE/D,EACAU,EAAAA,IAAC,OAAA,CAAK,MAAOV,EAAkB,SAAA,SAAA,CAAO,CAAA,CAAA,CACxC,CAAA,CACF,EACC0C,EAAO,IAAKE,GACXvB,EAAAA,KAAC,MAAA,CAEC,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAKC,EAAM,CAAC,CAAA,EAE/D,SAAA,CAAAZ,EAAAA,IAACc,EAAA,CAAK,KAAK,QAAQ,QAAQ,QAAQ,UAAU,gBAC3C,SAAAd,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,GAAGV,EAAkB,QAAS,GAAA,EAC1C,SAAAF,EAAgB8C,EAAM,QAAQ,CAAC,EAAE,OAAO,CAAA,CAC3C,CAAA,CACF,EACCA,EAAM,QAAQ,IAAK7B,GAClBL,EAAAA,IAACI,EAAA,CAAuB,MAAAC,EAAc,YAAaA,EAAM,KAAOmB,CAAA,EAAlDnB,EAAM,EAAoD,CACzE,CAAA,CAAA,EAVI6B,EAAM,GAAA,CAYd,CAAA,CAAA,CACH,CAAA,EAEJ,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as m,t as I,r as h,g as D,j as e,J as L,s,Y as F,b as j,c as T,Z as v,F as B,G as H,a as _,H as C,P,f as R,M,p as w}from"./main-CyxblUnu.js";const g="__no-subject__",W=({horizonTitle:t,item:n,candidateName:l,onClose:o,onPromoted:d})=>{const x=m(r=>r.promoteRoadmapItem),a=m(r=>r.launchIdeaExtend),{subjects:f}=I(),[c,p]=h.useState(g),[i,u]=h.useState(!1),[y,b]=h.useState(null),{toast:z}=D();h.useEffect(()=>{n&&(p(l?n.name:g),u(!1),b(null))},[n,l]);const E=async()=>{if(!(!n||!t)){u(!0),b(null);try{const r=await x(t,n,c===g?void 0:c,l??void 0),k=m.getState().ideaEntries.find(S=>S.id===r);if(k)try{await a(r,B(k,t))}catch(S){z({title:"Idea created, but the refine agent failed to launch",description:H(S.message),variant:"error"})}d(),o()}catch(r){b(r.message)}finally{u(!1)}}};return e.jsx(L,{open:n!==null,onClose:o,title:l??(n==null?void 0:n.name)??"",size:"small",children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:s[4]},children:[!l&&e.jsx("p",{style:{margin:0,opacity:.8},children:n==null?void 0:n.description}),e.jsx("div",{children:e.jsx(F,{size:"small",value:c,onChange:p,disabled:i,options:[{value:g,label:"No subject"},...f.map(r=>({value:r,label:r}))]})}),y&&e.jsx("p",{style:{margin:0,color:T.accentRoseDark,fontSize:j.sm},children:y}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:s[2]},children:[e.jsx(v,{type:"button",variant:"ghost",onClick:o,disabled:i,children:"Cancel"}),e.jsx(v,{type:"button",variant:"primary",onClick:E,disabled:i,children:i?"Promoting…":"Promote to idea"})]})]})})},$=t=>{if(t.length===0)return null;const n=t.filter(d=>d.status==="done").length,l=t.filter(d=>d.status!=="done"&&d.status!=="dropped").length,o=[];return l>0&&o.push(`${l} in queue`),n>0&&o.push(`${n} shipped`),o.length>0?o.join(", "):null},A={fontFamily:R.handwritten,fontSize:j.md,fontWeight:600,opacity:.7,lineHeight:1,padding:`${s[2]} ${s[1]} 0`},J=({size:t=14})=>e.jsx("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("polyline",{points:"9 18 15 12 9 6"})}),q=({name:t,onPromote:n})=>e.jsx(w,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:s[3]},children:[e.jsx("span",{style:{flex:1},children:t}),e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:n,children:"Promote to idea"})]})}),G=({item:t,graduated:n,onPromote:l,onPromoteCandidate:o,onViewGraduated:d})=>{const[x,a]=h.useState(!1),f=t.candidates.length>0,c=$(n);return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:s[1]},children:[e.jsx(w,{size:"small",texture:"canvas",className:"plan-row-card",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:s[3]},children:[f&&e.jsx("button",{type:"button","aria-expanded":x,"aria-label":x?"Hide candidates":"Show candidates",onClick:()=>a(p=>!p),style:{display:"inline-flex",alignItems:"center",background:"none",border:"none",cursor:"pointer",opacity:.5,padding:0,transform:x?"rotate(90deg)":void 0},children:e.jsx(J,{})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:s[1],flex:1},children:[e.jsx("span",{style:{fontWeight:600},children:t.name}),e.jsx("span",{style:{fontSize:j.sm,opacity:.7},children:t.description}),c&&e.jsx("button",{type:"button",onClick:d,style:{alignSelf:"flex-start",background:"none",border:"none",padding:0,cursor:"pointer",fontSize:j["2xs"],opacity:.65,textDecoration:"underline"},children:c})]}),e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:l,children:"Promote to idea"})]})}),f&&x&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s[1],paddingLeft:s[6]},children:t.candidates.map(p=>e.jsx(q,{name:p,onPromote:()=>o(p)},p))})]})},O=()=>{const[t,n]=h.useState(null),[l,o]=h.useState(!0),[d,x]=h.useState(!1),[a,f]=h.useState(null),c=m(i=>i.plans),p=_();return h.useEffect(()=>{C().then(n).catch(()=>x(!0)).finally(()=>o(!1))},[]),l?e.jsxs("div",{children:[e.jsx(P,{children:"Roadmap"}),e.jsx("p",{style:{opacity:.5},children:"Loading…"})]}):d?e.jsxs("div",{children:[e.jsx(P,{children:"Roadmap"}),e.jsx("p",{style:{opacity:.5},children:"Couldn't load the roadmap — the server may need a restart to pick up new routes."})]}):!t||t.horizons.length===0?e.jsxs("div",{children:[e.jsx(P,{children:"Roadmap"}),e.jsx("p",{style:{opacity:.5},children:"No `ROADMAP.md` found at the project root."})]}):e.jsxs("div",{children:[e.jsxs("div",{style:{marginBottom:s[6],paddingBottom:s[4],borderBottom:"1px solid rgba(0, 0, 0, 0.08)"},children:[e.jsx("span",{style:{fontFamily:R.handwritten,fontSize:j.xs,fontWeight:600,opacity:.55},children:"The goal"}),e.jsx("div",{style:{fontFamily:R.serif,fontSize:j.lg,lineHeight:1.4,marginTop:s[2]},children:e.jsx(M,{children:t.goal})})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s[6]},children:t.horizons.map(i=>e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:s[1]},children:[e.jsx("div",{style:A,children:i.title}),i.items.map(u=>e.jsx(G,{item:u,graduated:(c==null?void 0:c.entries.filter(y=>y.subject===u.name))??[],onPromote:()=>f({horizonTitle:i.title,item:u}),onPromoteCandidate:y=>f({horizonTitle:i.title,item:u,candidateName:y}),onViewGraduated:()=>p({to:"/",search:{subject:u.name}})},u.name))]},i.title))}),e.jsx(W,{horizonTitle:(a==null?void 0:a.horizonTitle)??null,item:(a==null?void 0:a.item)??null,candidateName:a==null?void 0:a.candidateName,onClose:()=>f(null),onPromoted:()=>C().then(n)})]})};export{O as RoadmapPage};
|
|
2
|
-
//# sourceMappingURL=index-CRRHTP77.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CRRHTP77.js","sources":["../../../src/app/features/roadmap/promote-roadmap-item-modal.tsx","../../../src/app/features/roadmap/roadmap-page.tsx"],"sourcesContent":["import { buildRoadmapPromotePrompt } from '@/app/features/plans/prompts';\nimport { useProjectSubjects } from '@/app/hooks/use-project-subjects';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color, fontSize, space } from '@/app/styles/tokens';\nimport { oneLineErrorSummary } from '@/app/utils/error-summary';\nimport type { RoadmapItem } from '@/types/index';\nimport { Button, Modal, Select, useToast } from '@dendelion/paper-ui';\nimport { useEffect, useState } from 'react';\n\nconst NO_SUBJECT = '__no-subject__';\n\ninterface PromoteRoadmapItemModalProps {\n horizonTitle: string | null;\n item: RoadmapItem | null;\n candidateName?: string | null;\n onClose: () => void;\n onPromoted: () => void;\n}\n\nexport const PromoteRoadmapItemModal = ({\n horizonTitle,\n item,\n candidateName,\n onClose,\n onPromoted,\n}: PromoteRoadmapItemModalProps) => {\n const promoteRoadmapItem = useAppStore((s) => s.promoteRoadmapItem);\n const launchIdeaExtend = useAppStore((s) => s.launchIdeaExtend);\n const { subjects } = useProjectSubjects();\n const [subject, setSubject] = useState(NO_SUBJECT);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const { toast } = useToast();\n\n useEffect(() => {\n if (item) {\n // A candidate defaults to its parent item's name — the \"big bet becomes a\n // Subject\" rule — but the picker still lets the user override it.\n setSubject(candidateName ? item.name : NO_SUBJECT);\n setLoading(false);\n setError(null);\n }\n }, [item, candidateName]);\n\n const handlePromote = async () => {\n if (!item || !horizonTitle) return;\n setLoading(true);\n setError(null);\n try {\n const id = await promoteRoadmapItem(\n horizonTitle,\n item,\n subject === NO_SUBJECT ? undefined : subject,\n candidateName ?? undefined,\n );\n const idea = useAppStore.getState().ideaEntries.find((e) => e.id === id);\n if (idea) {\n try {\n await launchIdeaExtend(id, buildRoadmapPromotePrompt(idea, horizonTitle));\n } catch (err) {\n // The idea was created either way — a failed refine launch just means\n // no background research ran, not that the promotion itself failed.\n toast({\n title: 'Idea created, but the refine agent failed to launch',\n description: oneLineErrorSummary((err as Error).message),\n variant: 'error',\n });\n }\n }\n onPromoted();\n onClose();\n } catch (err) {\n setError((err as Error).message);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Modal\n open={item !== null}\n onClose={onClose}\n title={candidateName ?? item?.name ?? ''}\n size=\"small\"\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[4] }}>\n {!candidateName && <p style={{ margin: 0, opacity: 0.8 }}>{item?.description}</p>}\n <div>\n <Select\n size=\"small\"\n value={subject}\n onChange={setSubject}\n disabled={loading}\n options={[\n { value: NO_SUBJECT, label: 'No subject' },\n ...subjects.map((s) => ({ value: s, label: s })),\n ]}\n />\n </div>\n {error && (\n <p style={{ margin: 0, color: color.accentRoseDark, fontSize: fontSize.sm }}>{error}</p>\n )}\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: space[2] }}>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"primary\" onClick={handlePromote} disabled={loading}>\n {loading ? 'Promoting…' : 'Promote to idea'}\n </Button>\n </div>\n </div>\n </Modal>\n );\n};\n","import { Markdown } from '@/app/components/markdown';\nimport { PageTitle } from '@/app/components/page-title';\nimport { fetchRoadmap } from '@/app/services/content/docs-api';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { fontFamily, fontSize, space } from '@/app/styles/tokens';\nimport type { PlanEntry, Roadmap, RoadmapItem } from '@/types/index';\nimport { Button, Card } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useEffect, useState } from 'react';\nimport { PromoteRoadmapItemModal } from './promote-roadmap-item-modal';\n\nconst graduationLabel = (graduated: PlanEntry[]): string | null => {\n if (graduated.length === 0) return null;\n const shipped = graduated.filter((p) => p.status === 'done').length;\n const queued = graduated.filter((p) => p.status !== 'done' && p.status !== 'dropped').length;\n const parts: string[] = [];\n if (queued > 0) parts.push(`${queued} in queue`);\n if (shipped > 0) parts.push(`${shipped} shipped`);\n return parts.length > 0 ? parts.join(', ') : null;\n};\n\nconst horizonHeaderStyle: React.CSSProperties = {\n fontFamily: fontFamily.handwritten,\n fontSize: fontSize.md,\n fontWeight: 600,\n opacity: 0.7,\n lineHeight: 1,\n padding: `${space[2]} ${space[1]} 0`,\n};\n\nconst ChevronRightIcon = ({ size = 14 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst CandidateRow = ({\n name,\n onPromote,\n}: {\n name: string;\n onPromote: () => void;\n}) => (\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <div style={{ display: 'flex', alignItems: 'center', gap: space[3] }}>\n <span style={{ flex: 1 }}>{name}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"small\" onClick={onPromote}>\n Promote to idea\n </Button>\n </div>\n </Card>\n);\n\nconst RoadmapItemRow = ({\n item,\n graduated,\n onPromote,\n onPromoteCandidate,\n onViewGraduated,\n}: {\n item: RoadmapItem;\n graduated: PlanEntry[];\n onPromote: () => void;\n onPromoteCandidate: (candidateName: string) => void;\n onViewGraduated: () => void;\n}) => {\n const [expanded, setExpanded] = useState(false);\n const hasCandidates = item.candidates.length > 0;\n const label = graduationLabel(graduated);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}>\n <Card size=\"small\" texture=\"canvas\" className=\"plan-row-card\">\n <div style={{ display: 'flex', alignItems: 'center', gap: space[3] }}>\n {hasCandidates && (\n // Raw <button>: icon-only toggle, paper-ui Button doesn't offer this compact chrome.\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-label={expanded ? 'Hide candidates' : 'Show candidates'}\n onClick={() => setExpanded((v) => !v)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n opacity: 0.5,\n padding: 0,\n transform: expanded ? 'rotate(90deg)' : undefined,\n }}\n >\n <ChevronRightIcon />\n </button>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[1], flex: 1 }}>\n <span style={{ fontWeight: 600 }}>{item.name}</span>\n <span style={{ fontSize: fontSize.sm, opacity: 0.7 }}>{item.description}</span>\n {label && (\n <button\n type=\"button\"\n onClick={onViewGraduated}\n style={{\n alignSelf: 'flex-start',\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n fontSize: fontSize['2xs'],\n opacity: 0.65,\n textDecoration: 'underline',\n }}\n >\n {label}\n </button>\n )}\n </div>\n <Button type=\"button\" variant=\"ghost\" size=\"small\" onClick={onPromote}>\n Promote to idea\n </Button>\n </div>\n </Card>\n {hasCandidates && expanded && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: space[1],\n paddingLeft: space[6],\n }}\n >\n {item.candidates.map((candidateName) => (\n <CandidateRow\n key={candidateName}\n name={candidateName}\n onPromote={() => onPromoteCandidate(candidateName)}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport const RoadmapPage = () => {\n const [roadmap, setRoadmap] = useState<Roadmap | null>(null);\n const [loading, setLoading] = useState(true);\n const [loadFailed, setLoadFailed] = useState(false);\n const [promoting, setPromoting] = useState<{\n horizonTitle: string;\n item: RoadmapItem;\n candidateName?: string;\n } | null>(null);\n const plans = useAppStore((s) => s.plans);\n const navigate = useNavigate();\n\n useEffect(() => {\n fetchRoadmap()\n .then(setRoadmap)\n .catch(() => setLoadFailed(true))\n .finally(() => setLoading(false));\n }, []);\n\n if (loading) {\n return (\n <div>\n <PageTitle>Roadmap</PageTitle>\n <p style={{ opacity: 0.5 }}>Loading…</p>\n </div>\n );\n }\n\n if (loadFailed) {\n return (\n <div>\n <PageTitle>Roadmap</PageTitle>\n <p style={{ opacity: 0.5 }}>\n Couldn't load the roadmap — the server may need a restart to pick up new routes.\n </p>\n </div>\n );\n }\n\n if (!roadmap || roadmap.horizons.length === 0) {\n return (\n <div>\n <PageTitle>Roadmap</PageTitle>\n <p style={{ opacity: 0.5 }}>No `ROADMAP.md` found at the project root.</p>\n </div>\n );\n }\n\n return (\n <div>\n <div\n style={{\n marginBottom: space[6],\n paddingBottom: space[4],\n borderBottom: '1px solid rgba(0, 0, 0, 0.08)',\n }}\n >\n <span\n style={{\n fontFamily: fontFamily.handwritten,\n fontSize: fontSize.xs,\n fontWeight: 600,\n opacity: 0.55,\n }}\n >\n The goal\n </span>\n <div\n style={{\n fontFamily: fontFamily.serif,\n fontSize: fontSize.lg,\n lineHeight: 1.4,\n marginTop: space[2],\n }}\n >\n <Markdown>{roadmap.goal}</Markdown>\n </div>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[6] }}>\n {roadmap.horizons.map((horizon) => (\n <div\n key={horizon.title}\n style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}\n >\n <div style={horizonHeaderStyle}>{horizon.title}</div>\n {horizon.items.map((item) => (\n <RoadmapItemRow\n key={item.name}\n item={item}\n graduated={plans?.entries.filter((p) => p.subject === item.name) ?? []}\n onPromote={() => setPromoting({ horizonTitle: horizon.title, item })}\n onPromoteCandidate={(candidateName) =>\n setPromoting({ horizonTitle: horizon.title, item, candidateName })\n }\n onViewGraduated={() => navigate({ to: '/', search: { subject: item.name } })}\n />\n ))}\n </div>\n ))}\n </div>\n <PromoteRoadmapItemModal\n horizonTitle={promoting?.horizonTitle ?? null}\n item={promoting?.item ?? null}\n candidateName={promoting?.candidateName}\n onClose={() => setPromoting(null)}\n onPromoted={() => fetchRoadmap().then(setRoadmap)}\n />\n </div>\n );\n};\n"],"names":["NO_SUBJECT","PromoteRoadmapItemModal","horizonTitle","item","candidateName","onClose","onPromoted","promoteRoadmapItem","useAppStore","s","launchIdeaExtend","subjects","useProjectSubjects","subject","setSubject","useState","loading","setLoading","error","setError","toast","useToast","useEffect","handlePromote","id","idea","e","buildRoadmapPromotePrompt","err","oneLineErrorSummary","jsx","Modal","jsxs","space","Select","color","fontSize","Button","graduationLabel","graduated","shipped","p","queued","parts","horizonHeaderStyle","fontFamily","ChevronRightIcon","size","CandidateRow","name","onPromote","Card","RoadmapItemRow","onPromoteCandidate","onViewGraduated","expanded","setExpanded","hasCandidates","label","v","RoadmapPage","roadmap","setRoadmap","loadFailed","setLoadFailed","promoting","setPromoting","plans","navigate","useNavigate","fetchRoadmap","PageTitle","Markdown","horizon"],"mappings":"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"}
|