@dendelion/paper-camp 0.11.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-CwotynaS.js → index-DFJlDY3W.js} +2 -2
- package/dist/app/assets/{index-CwotynaS.js.map → index-DFJlDY3W.js.map} +1 -1
- 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-B7k4s_9g.css → main-RP3LpwgH.css} +1 -1
- package/dist/app/assets/{sidebar-section-DVSoUVEe.js → sidebar-section-BrJbBK_b.js} +2 -2
- package/dist/app/assets/{sidebar-section-DVSoUVEe.js.map → sidebar-section-BrJbBK_b.js.map} +1 -1
- package/dist/app/index.html +2 -2
- package/dist/chunks/{roadmap.HCld8rN3.js → scaffold.B_3sY6Rg.js} +1857 -1601
- package/dist/chunks/scaffold.B_3sY6Rg.js.map +1 -0
- package/dist/cli/index.js +8114 -7252
- package/dist/cli/index.js.map +1 -1
- package/dist/core/git-pr/pr.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 -87
- 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 +5 -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/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 +169 -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-DHHPg0hQ.js +0 -4
- package/dist/app/assets/index-DHHPg0hQ.js.map +0 -1
- package/dist/app/assets/index-DyLHu3dg.js +0 -2
- package/dist/app/assets/index-DyLHu3dg.js.map +0 -1
- package/dist/app/assets/index-DzMK8ayh.js +0 -3
- package/dist/app/assets/index-DzMK8ayh.js.map +0 -1
- package/dist/app/assets/main-BNLbBO0E.js +0 -233
- package/dist/app/assets/main-BNLbBO0E.js.map +0 -1
- package/dist/chunks/roadmap.HCld8rN3.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' | 'prioritise' | '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,6 +441,7 @@ 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';
|
|
@@ -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 | 'prioritise'\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\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,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,4 +0,0 @@
|
|
|
1
|
-
import{u as k,t as F,r,g as L,j as e,J as N,s as l,Y as B,b,c as O,Z as v,F as _,G as M,a as G,C as H,H as C,P as A,f as z,M as T,p as D,O as I,S,I as W,X as E,L as q,N as U}from"./main-BNLbBO0E.js";import{Q as de}from"./main-BNLbBO0E.js";const w="__no-subject__",$=({horizonTitle:s,item:t,candidateName:n,onClose:d,onPromoted:c})=>{const x=k(a=>a.promoteRoadmapItem),i=k(a=>a.launchIdeaExtend),{subjects:f}=F(),[p,g]=r.useState(w),[u,y]=r.useState(!1),[j,h]=r.useState(null),{toast:R}=L();r.useEffect(()=>{t&&(g(n?t.name:w),y(!1),h(null))},[t,n]);const o=async()=>{if(!(!t||!s)){y(!0),h(null);try{const a=await x(s,t,p===w?void 0:p,n??void 0),m=k.getState().ideaEntries.find(P=>P.id===a);if(m)try{await i(a,_(m,s))}catch(P){R({title:"Idea created, but the refine agent failed to launch",description:M(P.message),variant:"error"})}c(),d()}catch(a){h(a.message)}finally{y(!1)}}};return e.jsx(N,{open:t!==null,onClose:d,title:n??(t==null?void 0:t.name)??"",size:"small",children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:l[4]},children:[!n&&e.jsx("p",{style:{margin:0,opacity:.8},children:t==null?void 0:t.description}),e.jsx("div",{children:e.jsx(B,{size:"small",value:p,onChange:g,disabled:u,options:[{value:w,label:"No subject"},...f.map(a=>({value:a,label:a}))]})}),j&&e.jsx("p",{style:{margin:0,color:O.accentRoseDark,fontSize:b.sm},children:j}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:l[2]},children:[e.jsx(v,{type:"button",variant:"ghost",onClick:d,disabled:u,children:"Cancel"}),e.jsx(v,{type:"button",variant:"primary",onClick:o,disabled:u,children:u?"Promoting…":"Promote to idea"})]})]})})},J=s=>({shipped:s.filter(t=>t.status==="done").length,queued:s.filter(t=>t.status!=="done"&&t.status!=="dropped").length}),K={fontFamily:z.handwritten,fontSize:b.md,fontWeight:600,opacity:.7,lineHeight:1,padding:`${l[2]} ${l[1]} 0`},V={fontFamily:z.body,fontSize:b["2xs"],fontWeight:400,opacity:.5,padding:`0 ${l[1]}`},X=({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"})}),Y=({name:s,onPromote:t})=>e.jsx(D,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:l[3]},children:[e.jsx("span",{style:{flex:1},children:s}),e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:t,children:"Promote to idea"})]})}),Z=({onAdd:s})=>{const[t,n]=r.useState(""),[d,c]=r.useState(!1),x=async()=>{if(t.trim()){c(!0);try{await s(t.trim()),n("")}finally{c(!1)}}};return e.jsxs("div",{style:{display:"flex",gap:l[2]},children:[e.jsx(E,{size:"small",value:t,onChange:i=>n(i.target.value),onKeyDown:i=>{i.key==="Enter"&&x()},placeholder:"Add candidate…",disabled:d,style:{flex:1}}),e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:x,disabled:d||!t.trim(),children:"Add"})]})},Q=({onAdd:s})=>{const[t,n]=r.useState(!1),[d,c]=r.useState(""),[x,i]=r.useState(""),[f,p]=r.useState(!1),g=async()=>{if(d.trim()){p(!0);try{await s(d.trim(),x.trim()),c(""),i(""),n(!1)}finally{p(!1)}}};return t?e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:l[2]},children:[e.jsx(E,{size:"small",value:d,onChange:u=>c(u.target.value),placeholder:"Item name…",disabled:f,autoFocus:!0}),e.jsx(E,{size:"small",value:x,onChange:u=>i(u.target.value),onKeyDown:u=>{u.key==="Enter"&&g()},placeholder:"Description…",disabled:f}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:l[2]},children:[e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:()=>n(!1),disabled:f,children:"Cancel"}),e.jsx(v,{type:"button",variant:"secondary",size:"small",onClick:g,disabled:f||!d.trim(),children:"Add"})]})]}):e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:()=>n(!0),children:"+ Add item"})},ee=({plan:s,onOpen:t})=>e.jsx(D,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsxs("button",{type:"button",onClick:t,style:{display:"flex",alignItems:"center",gap:l[3],width:"100%",background:"none",border:"none",padding:0,cursor:"pointer",font:"inherit",color:"inherit",textAlign:"left"},children:[e.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.title}),e.jsx(I,{size:"small",fillColor:S[s.status].fill,textColor:S[s.status].text,children:U[s.status]})]})}),te=({item:s,graduated:t,highlighted:n,onPromote:d,onPromoteCandidate:c,onAddCandidate:x,onViewGraduated:i,onOpenGraduated:f})=>{const[p,g]=r.useState(n),u=s.candidates.length>0,{shipped:y,queued:j}=J(t);return e.jsxs("div",{className:n?"roadmap-item-highlighted":void 0,style:{display:"flex",flexDirection:"column",gap:l[1]},children:[e.jsx(D,{size:"small",texture:"canvas",className:"plan-row-card",children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:l[1]},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:l[2]},children:[e.jsx("button",{type:"button","aria-expanded":p,"aria-label":p?"Collapse item":"Expand item",onClick:()=>g(h=>!h),style:{display:"inline-flex",alignItems:"center",background:"none",border:"none",cursor:"pointer",opacity:.5,padding:0,transform:p?"rotate(90deg)":void 0},children:e.jsx(X,{})}),e.jsx("span",{style:{fontWeight:600,flex:1},children:s.name}),e.jsx(v,{type:"button",variant:"ghost",size:"small",onClick:d,children:"Promote to idea"})]}),e.jsx("span",{className:p?void 0:"roadmap-item-desc",style:{fontSize:b.sm,opacity:.7},children:s.description}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:l[1]},children:[(j>0||y>0)&&e.jsxs("button",{type:"button",onClick:i,style:{display:"flex",alignItems:"center",gap:l[1],background:"none",border:"none",padding:0,cursor:"pointer"},children:[j>0&&e.jsxs(I,{size:"small",fillColor:S.planned.fill,textColor:S.planned.text,children:[j," in queue"]}),y>0&&e.jsxs(I,{size:"small",fillColor:S.done.fill,textColor:S.done.text,children:[y," shipped"]})]}),u&&e.jsxs(I,{size:"small",fillColor:"rgba(0, 0, 0, 0.06)",textColor:"rgba(0, 0, 0, 0.55)",children:[s.candidates.length," candidate",s.candidates.length===1?"":"s"]})]})]})}),p&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:l[1],paddingLeft:l[6]},children:[s.candidates.map(h=>e.jsx(Y,{name:h,onPromote:()=>c(h)},h)),t.map(h=>e.jsx(ee,{plan:h,onOpen:()=>f(h.title)},h.title)),e.jsx(Z,{onAdd:x})]})]})},se=({goal:s})=>{const[t,n]=r.useState(!1),[d,...c]=s.split(/\n{2,}/),x=c.length>0;return e.jsxs("div",{style:{marginBottom:l[6],paddingBottom:l[4],borderBottom:"1px solid rgba(0, 0, 0, 0.08)"},children:[e.jsx("span",{style:{fontFamily:z.handwritten,fontSize:b.xs,fontWeight:600,opacity:.55},children:"The goal"}),e.jsxs("div",{style:{fontFamily:z.serif,fontSize:b.lg,lineHeight:1.4,marginTop:l[2]},children:[e.jsx("div",{className:t?void 0:"roadmap-goal-line-clamp",children:e.jsx(T,{children:d})}),t&&x&&e.jsx(T,{children:c.join(`
|
|
2
|
-
|
|
3
|
-
`)})]}),x&&e.jsx("button",{type:"button",onClick:()=>n(i=>!i),style:{background:"none",border:"none",padding:0,marginTop:l[2],cursor:"pointer",fontSize:b["2xs"],opacity:.65,textDecoration:"underline"},children:t?"Show less":"Show more"})]})},ae=({items:s,graduatedByItem:t})=>{const n=s.filter(c=>t(c).length>0).length,d=s.length-n;return e.jsxs("div",{style:V,children:[n," graduated · ",d," charted"]})},le=()=>{const[s,t]=r.useState(null),[n,d]=r.useState(!0),[c,x]=r.useState(!1),[i,f]=r.useState(null),p=k(o=>o.plans),g=G(),{item:u}=H({from:"/roadmap"}),y=r.useRef(null);if(r.useEffect(()=>{C().then(t).catch(()=>x(!0)).finally(()=>d(!1))},[]),r.useEffect(()=>{var a;if(!u||n)return;const o=(a=y.current)==null?void 0:a.querySelector(".roadmap-item-highlighted");o==null||o.scrollIntoView({behavior:"smooth",block:"center"})},[u,n]),n)return e.jsxs("div",{children:[e.jsx(A,{children:"Roadmap"}),e.jsx("p",{style:{opacity:.5},children:"Loading…"})]});if(c)return e.jsxs("div",{children:[e.jsx(A,{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."})]});if(!s||s.horizons.length===0)return e.jsxs("div",{children:[e.jsx(A,{children:"Roadmap"}),e.jsx("p",{style:{opacity:.5},children:"No `ROADMAP.md` found at the project root."})]});const j=o=>(p==null?void 0:p.entries.filter(a=>a.subject===o.name))??[],h=async(o,a,m)=>{await q(o,a,m),t(await C())},R=async(o,a,m)=>{await W(o,a,m),t(await C())};return e.jsxs("div",{ref:y,children:[e.jsx(se,{goal:s.goal}),e.jsx("div",{className:"roadmap-horizons-grid",children:s.horizons.map(o=>e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:l[1]},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:l[2]},children:[e.jsx("div",{style:K,children:o.title}),e.jsx(ae,{items:o.items,graduatedByItem:j})]}),o.items.map(a=>e.jsx(te,{item:a,graduated:j(a),highlighted:a.name===u,onPromote:()=>f({horizonTitle:o.title,item:a}),onPromoteCandidate:m=>f({horizonTitle:o.title,item:a,candidateName:m}),onAddCandidate:m=>R(o.title,a.name,m),onViewGraduated:()=>g({to:"/",search:{subject:a.name}}),onOpenGraduated:m=>g({to:"/plans/$planId",params:{planId:encodeURIComponent(m)}})},a.name)),e.jsx(Q,{onAdd:(a,m)=>h(o.title,a,m)})]},o.title))}),e.jsx($,{horizonTitle:(i==null?void 0:i.horizonTitle)??null,item:(i==null?void 0:i.item)??null,candidateName:i==null?void 0:i.candidateName,onClose:()=>f(null),onPromoted:()=>C().then(t)})]})};export{le as RoadmapPage,de as useRoadmapItemNames};
|
|
4
|
-
//# sourceMappingURL=index-DHHPg0hQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DHHPg0hQ.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 { STATUS_LABEL, STATUS_STAMP } from '@/app/features/plans/constants';\nimport { addRoadmapCandidate, addRoadmapItem, 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, Input, Stamp } from '@dendelion/paper-ui';\nimport { useNavigate, useSearch } from '@tanstack/react-router';\nimport { useEffect, useRef, useState } from 'react';\nimport { PromoteRoadmapItemModal } from './promote-roadmap-item-modal';\n\nconst graduationCounts = (graduated: PlanEntry[]) => ({\n shipped: graduated.filter((p) => p.status === 'done').length,\n queued: graduated.filter((p) => p.status !== 'done' && p.status !== 'dropped').length,\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 horizonPulseStyle: React.CSSProperties = {\n fontFamily: fontFamily.body,\n fontSize: fontSize['2xs'],\n fontWeight: 400,\n opacity: 0.5,\n padding: `0 ${space[1]}`,\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 AddCandidateForm = ({ onAdd }: { onAdd: (name: string) => Promise<void> }) => {\n const [name, setName] = useState('');\n const [saving, setSaving] = useState(false);\n\n const handleAdd = async () => {\n if (!name.trim()) return;\n setSaving(true);\n try {\n await onAdd(name.trim());\n setName('');\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <div style={{ display: 'flex', gap: space[2] }}>\n <Input\n size=\"small\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleAdd();\n }}\n placeholder=\"Add candidate…\"\n disabled={saving}\n style={{ flex: 1 }}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"small\"\n onClick={handleAdd}\n disabled={saving || !name.trim()}\n >\n Add\n </Button>\n </div>\n );\n};\n\nconst AddItemForm = ({\n onAdd,\n}: {\n onAdd: (name: string, description: string) => Promise<void>;\n}) => {\n const [open, setOpen] = useState(false);\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [saving, setSaving] = useState(false);\n\n const handleAdd = async () => {\n if (!name.trim()) return;\n setSaving(true);\n try {\n await onAdd(name.trim(), description.trim());\n setName('');\n setDescription('');\n setOpen(false);\n } finally {\n setSaving(false);\n }\n };\n\n if (!open) {\n return (\n <Button type=\"button\" variant=\"ghost\" size=\"small\" onClick={() => setOpen(true)}>\n + Add item\n </Button>\n );\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[2] }}>\n <Input\n size=\"small\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Item name…\"\n disabled={saving}\n autoFocus\n />\n <Input\n size=\"small\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleAdd();\n }}\n placeholder=\"Description…\"\n disabled={saving}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: space[2] }}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"small\"\n onClick={() => setOpen(false)}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleAdd}\n disabled={saving || !name.trim()}\n >\n Add\n </Button>\n </div>\n </div>\n );\n};\n\nconst GraduatedRow = ({ plan, onOpen }: { plan: PlanEntry; onOpen: () => void }) => (\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <button\n type=\"button\"\n onClick={onOpen}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: space[3],\n width: '100%',\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n textAlign: 'left',\n }}\n >\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {plan.title}\n </span>\n <Stamp\n size=\"small\"\n fillColor={STATUS_STAMP[plan.status].fill}\n textColor={STATUS_STAMP[plan.status].text}\n >\n {STATUS_LABEL[plan.status]}\n </Stamp>\n </button>\n </Card>\n);\n\nconst RoadmapItemRow = ({\n item,\n graduated,\n highlighted,\n onPromote,\n onPromoteCandidate,\n onAddCandidate,\n onViewGraduated,\n onOpenGraduated,\n}: {\n item: RoadmapItem;\n graduated: PlanEntry[];\n highlighted: boolean;\n onPromote: () => void;\n onPromoteCandidate: (candidateName: string) => void;\n onAddCandidate: (name: string) => Promise<void>;\n onViewGraduated: () => void;\n onOpenGraduated: (title: string) => void;\n}) => {\n const [expanded, setExpanded] = useState(highlighted);\n const hasCandidates = item.candidates.length > 0;\n const { shipped, queued } = graduationCounts(graduated);\n\n return (\n <div\n className={highlighted ? 'roadmap-item-highlighted' : undefined}\n style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}\n >\n <Card size=\"small\" texture=\"canvas\" className=\"plan-row-card\">\n <div style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: space[2] }}>\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 ? 'Collapse item' : 'Expand item'}\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 <span style={{ fontWeight: 600, flex: 1 }}>{item.name}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"small\" onClick={onPromote}>\n Promote to idea\n </Button>\n </div>\n <span\n className={expanded ? undefined : 'roadmap-item-desc'}\n style={{ fontSize: fontSize.sm, opacity: 0.7 }}\n >\n {item.description}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: space[1] }}>\n {(queued > 0 || shipped > 0) && (\n <button\n type=\"button\"\n onClick={onViewGraduated}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: space[1],\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n }}\n >\n {queued > 0 && (\n <Stamp\n size=\"small\"\n fillColor={STATUS_STAMP.planned.fill}\n textColor={STATUS_STAMP.planned.text}\n >\n {queued} in queue\n </Stamp>\n )}\n {shipped > 0 && (\n <Stamp\n size=\"small\"\n fillColor={STATUS_STAMP.done.fill}\n textColor={STATUS_STAMP.done.text}\n >\n {shipped} shipped\n </Stamp>\n )}\n </button>\n )}\n {hasCandidates && (\n <Stamp size=\"small\" fillColor=\"rgba(0, 0, 0, 0.06)\" textColor=\"rgba(0, 0, 0, 0.55)\">\n {item.candidates.length} candidate{item.candidates.length === 1 ? '' : 's'}\n </Stamp>\n )}\n </div>\n </div>\n </Card>\n {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 {graduated.map((plan) => (\n <GraduatedRow key={plan.title} plan={plan} onOpen={() => onOpenGraduated(plan.title)} />\n ))}\n <AddCandidateForm onAdd={onAddCandidate} />\n </div>\n )}\n </div>\n );\n};\n\nconst GoalBanner = ({ goal }: { goal: string }) => {\n const [expanded, setExpanded] = useState(false);\n const [firstParagraph, ...restParagraphs] = goal.split(/\\n{2,}/);\n const hasMore = restParagraphs.length > 0;\n\n return (\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 <div className={expanded ? undefined : 'roadmap-goal-line-clamp'}>\n <Markdown>{firstParagraph}</Markdown>\n </div>\n {expanded && hasMore && <Markdown>{restParagraphs.join('\\n\\n')}</Markdown>}\n </div>\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n style={{\n background: 'none',\n border: 'none',\n padding: 0,\n marginTop: space[2],\n cursor: 'pointer',\n fontSize: fontSize['2xs'],\n opacity: 0.65,\n textDecoration: 'underline',\n }}\n >\n {expanded ? 'Show less' : 'Show more'}\n </button>\n )}\n </div>\n );\n};\n\nconst HorizonPulse = ({\n items,\n graduatedByItem,\n}: { items: RoadmapItem[]; graduatedByItem: (item: RoadmapItem) => PlanEntry[] }) => {\n const graduated = items.filter((item) => graduatedByItem(item).length > 0).length;\n const charted = items.length - graduated;\n return (\n <div style={horizonPulseStyle}>\n {graduated} graduated · {charted} charted\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 const { item: highlightedItem } = useSearch({ from: '/roadmap' });\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n fetchRoadmap()\n .then(setRoadmap)\n .catch(() => setLoadFailed(true))\n .finally(() => setLoading(false));\n }, []);\n\n useEffect(() => {\n if (!highlightedItem || loading) return;\n const row = containerRef.current?.querySelector('.roadmap-item-highlighted');\n row?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, [highlightedItem, loading]);\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 const graduatedByItem = (item: RoadmapItem) =>\n plans?.entries.filter((p) => p.subject === item.name) ?? [];\n\n const handleAddItem = async (horizonTitle: string, name: string, description: string) => {\n await addRoadmapItem(horizonTitle, name, description);\n setRoadmap(await fetchRoadmap());\n };\n\n const handleAddCandidate = async (horizonTitle: string, itemName: string, name: string) => {\n await addRoadmapCandidate(horizonTitle, itemName, name);\n setRoadmap(await fetchRoadmap());\n };\n\n return (\n <div ref={containerRef}>\n <GoalBanner goal={roadmap.goal} />\n <div className=\"roadmap-horizons-grid\">\n {roadmap.horizons.map((horizon) => (\n <div\n key={horizon.title}\n style={{ display: 'flex', flexDirection: 'column', gap: space[1] }}\n >\n <div style={{ display: 'flex', alignItems: 'baseline', gap: space[2] }}>\n <div style={horizonHeaderStyle}>{horizon.title}</div>\n <HorizonPulse items={horizon.items} graduatedByItem={graduatedByItem} />\n </div>\n {horizon.items.map((item) => (\n <RoadmapItemRow\n key={item.name}\n item={item}\n graduated={graduatedByItem(item)}\n highlighted={item.name === highlightedItem}\n onPromote={() => setPromoting({ horizonTitle: horizon.title, item })}\n onPromoteCandidate={(candidateName) =>\n setPromoting({ horizonTitle: horizon.title, item, candidateName })\n }\n onAddCandidate={(name) => handleAddCandidate(horizon.title, item.name, name)}\n onViewGraduated={() => navigate({ to: '/', search: { subject: item.name } })}\n onOpenGraduated={(title) =>\n navigate({ to: '/plans/$planId', params: { planId: encodeURIComponent(title) } })\n }\n />\n ))}\n <AddItemForm\n onAdd={(name, description) => handleAddItem(horizon.title, name, description)}\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","graduationCounts","graduated","p","horizonHeaderStyle","fontFamily","horizonPulseStyle","ChevronRightIcon","size","CandidateRow","name","onPromote","Card","AddCandidateForm","onAdd","setName","saving","setSaving","handleAdd","Input","AddItemForm","open","setOpen","description","setDescription","GraduatedRow","plan","onOpen","Stamp","STATUS_STAMP","STATUS_LABEL","RoadmapItemRow","highlighted","onPromoteCandidate","onAddCandidate","onViewGraduated","onOpenGraduated","expanded","setExpanded","hasCandidates","shipped","queued","v","GoalBanner","goal","firstParagraph","restParagraphs","hasMore","Markdown","HorizonPulse","items","graduatedByItem","charted","RoadmapPage","roadmap","setRoadmap","loadFailed","setLoadFailed","promoting","setPromoting","plans","navigate","useNavigate","highlightedItem","useSearch","containerRef","useRef","fetchRoadmap","row","_a","PageTitle","handleAddItem","addRoadmapItem","handleAddCandidate","itemName","addRoadmapCandidate","horizon","title"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as u,g as E,i as G,k as W,j as e,s as n,m as _,p as M,Z as L,O as Y,b as S,n as b,q as C,A as N,t as J,X as T,K as Q,v as ee,w as K,P as te,x as se,c as ae,D as I,y as ie,z as B,Y as P,B as ne,a as le,o as U}from"./main-BNLbBO0E.js";import{S as $}from"./sidebar-section-DVSoUVEe.js";function oe(t){if(t==="git")return{label:"Git",unlocks:"Commits, phase logging, branch creation",fix:o=>o.startsWith("Not inside")?"git init":'git config user.name "Your Name" && git config user.email you@example.com'};if(t==="gh")return{label:"GitHub CLI",unlocks:"PR badges, review flow, fix-review",fix:o=>o.includes("not found")?"Install: https://cli.github.com":o.includes("no origin remote")?"git remote add origin <url>":o.includes("not reachable")?"gh repo view":"gh auth login"};const s=t.slice(6);return{label:`${N[s]} CLI`,unlocks:`Launching ${N[s]} for phase runs, drafts, and reviews`,fix:()=>`Install the ${N[s]} CLI and add it to PATH`}}const re={ok:{fill:"rgba(143, 185, 150, 0.25)",text:"#5E8A66",label:"Ready"},warn:{fill:"rgba(212, 163, 115, 0.25)",text:"#A67B4F",label:"Needs attention"},missing:{fill:"rgba(201, 139, 139, 0.25)",text:"#6E3A3A",label:"Missing"}},de=({result:t,isLast:s,onRecheck:o,rechecking:p})=>{const h=oe(t.id),r=re[t.status],m=t.status!=="ok"?h.fix(t.detail):null;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{paddingBottom:n[3],paddingTop:n[3]},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3]},children:[e.jsx("span",{style:{flex:1,fontWeight:500},children:h.label}),e.jsx(Y,{size:"small",fillColor:r.fill,textColor:r.text,children:r.label}),e.jsx(L,{size:"small",variant:"secondary",onClick:()=>o(t.id),disabled:p,children:p?"Checking…":"Recheck"})]}),e.jsxs("p",{style:{opacity:.65,fontSize:S.sm,margin:`${n[1]} 0 0`},children:["Unlocks: ",h.unlocks]}),e.jsx("p",{style:{opacity:.5,fontSize:S.sm,margin:`${n[1]} 0 0`},children:t.detail}),m&&e.jsx("code",{style:{display:"block",marginTop:n[2],padding:n[2],background:"rgba(0,0,0,0.06)",borderRadius:4,fontSize:S.sm},children:m})]}),!s&&e.jsx(b,{})]})},ce=()=>{const[t,s]=u.useState(null),[o,p]=u.useState(!1),[h,r]=u.useState(null),[m,x]=u.useState(!1),{toast:d}=E(),j=u.useCallback(a=>{if(a===null){p(!0);return}p(!1),s(a)},[]);u.useEffect(()=>{G().then(j),W().then(a=>x((a==null?void 0:a.setupDismissed)??!1))},[j]);const c=async a=>{r(a),j(await G()),r(null)},v=async()=>{const a=!m,{ok:g}=await C({setupDismissed:a});g?(x(a),d({title:"Saved",variant:"success"})):d({title:"Failed to save",variant:"error"})},w=(t==null?void 0:t.every(a=>a.status==="ok"))??!0;return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:n[6]},children:e.jsx("h2",{style:{margin:0},children:"Setup"})}),t===null&&!o&&e.jsx("p",{children:"Loading…"}),o&&e.jsx("div",{style:{marginBottom:n[4]},children:e.jsx(_,{variant:"warning",children:"Failed to load capabilities. Try refreshing."})}),t&&e.jsxs(e.Fragment,{children:[!w&&e.jsx("div",{style:{marginBottom:n[4]},children:e.jsx(_,{variant:"warning",children:"Some capabilities are incomplete — features that depend on them stay disabled until fixed. Run the fix command in your terminal, then recheck."})}),e.jsx(M,{size:"small",children:t.map((a,g)=>e.jsx(de,{result:a,isLast:g===t.length-1,onRecheck:c,rechecking:h===a.id},a.id))}),e.jsx("div",{style:{marginTop:n[4]},children:e.jsx(L,{variant:"secondary",size:"small",onClick:v,children:m?"Show Setup on open again":"Don't show Setup on open"})})]})]})},ue=({name:t,isLast:s,onRename:o,onRemove:p})=>{const[h,r]=u.useState(t),{toast:m}=E(),x=async()=>{const d=h.trim();if(!d||d===t){r(t);return}await o(t,d)||(r(t),m({title:"Failed to rename",variant:"error"}))};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3],paddingBottom:n[2],paddingTop:n[2]},children:[e.jsx(T,{size:"small",value:h,onChange:d=>r(d.target.value),onBlur:x,style:{flex:1}}),e.jsx(ee,{icon:e.jsx("span",{children:"×"}),variant:"ghost",size:"small",label:`Remove ${t}`,onClick:()=>p(t)})]}),!s&&e.jsx(b,{})]})},pe=()=>{const{subjects:t,loading:s,addSubject:o,renameSubject:p,removeSubject:h}=J(),[r,m]=u.useState(""),{toast:x}=E(),d=async()=>{const c=r.trim();if(!c)return;await o(c)?m(""):x({title:"Failed to add subject",variant:"error"})},j=async c=>{await h(c)||x({title:"Failed to remove subject",variant:"error"})};return e.jsxs("div",{children:[e.jsxs("div",{style:{marginBottom:n[6]},children:[e.jsx("h2",{style:{margin:0},children:"Subjects"}),e.jsx("p",{style:{opacity:.5,marginTop:n[1]},children:'Group ideas by subject. Removing one falls its ideas back to "No subject" — file contents are untouched.'})]}),s&&e.jsx("p",{children:"Loading…"}),!s&&e.jsxs(M,{size:"small",children:[t.length===0&&e.jsx("p",{style:{opacity:.45,margin:0,paddingBottom:n[2]},children:"No subjects yet."}),t.map((c,v)=>e.jsx(ue,{name:c,isLast:v===t.length-1,onRename:p,onRemove:j},c)),t.length>0&&e.jsx(b,{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3],paddingTop:n[3]},children:[e.jsx(T,{size:"small",placeholder:"New subject",value:r,onChange:c=>m(c.target.value),onKeyDown:c=>{c.key==="Enter"&&d()},style:{flex:1}}),e.jsxs(L,{variant:"secondary",size:"small",onClick:d,disabled:!r.trim(),children:[e.jsx(Q,{size:14})," Add"]})]})]})]})},H=["phase","planDraft","ideaExtend","commitSuggest"],he={phase:"Phase run",planDraft:"Plan draft",ideaExtend:"Idea extend",commitSuggest:"Commit suggest"},Z=110,X=140,O=160,q=110,me=()=>e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3],paddingBottom:n[1]},children:[e.jsx("span",{style:{width:Z,flexShrink:0,fontSize:S.sm,opacity:.45},children:"Task"}),e.jsx("span",{style:{width:X,flexShrink:0,fontSize:S.sm,opacity:.45},children:"Agent"}),e.jsx("span",{style:{width:O,flexShrink:0,fontSize:S.sm,opacity:.45},children:"Model"}),e.jsx("span",{style:{width:q,flexShrink:0,fontSize:S.sm,opacity:.45},children:"Effort"})]}),ge=({taskKey:t,agentConfig:s,isLast:o,onSave:p})=>{const h=B[s.agent]??B["claude-code"],r=h.model,m=h.effort,[x,d]=u.useState(s.model??"");u.useEffect(()=>{d(s.model??"")},[s.model]);const j=a=>{var z;const g=a,k=B[g],A={agent:g};s.model&&(k.model===null||(z=k.model)!=null&&z.includes(s.model))&&(A.model=s.model),s.effort&&Array.isArray(k.effort)&&(A.effort=s.effort),p(t,A)},c=a=>{p(t,{...s,model:a||void 0})},v=()=>{p(t,{...s,model:x||void 0})},w=a=>{p(t,{...s,effort:a||void 0})};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3],paddingBottom:n[2],paddingTop:n[2]},children:[e.jsx("span",{style:{width:Z,flexShrink:0,fontSize:S.sm,opacity:.65},children:he[t]}),e.jsx(P,{size:"small",width:X,value:s.agent,onChange:j,options:ne.map(a=>({value:a,label:N[a]}))}),Array.isArray(r)?e.jsx(P,{size:"small",width:O,value:s.model??"",onChange:c,options:[{value:"",label:"Default"},...r.map(a=>({value:a,label:a}))]}):r===null?e.jsx(T,{size:"small",style:{width:O},value:x,placeholder:"Default model",onChange:a=>d(a.target.value),onBlur:v}):null,e.jsx("div",{style:{visibility:Array.isArray(m)?"visible":"hidden"},children:e.jsx(P,{size:"small",width:q,value:s.effort??"",onChange:w,options:[{value:"",label:"Default"},...(Array.isArray(m)?m:[]).map(a=>({value:a,label:a}))]})})]}),!o&&e.jsx(b,{})]})},xe=()=>{const t=u.useRef(null),[s,o]=u.useState(void 0),{iconDataUri:p,loading:h}=se(),[r,m]=u.useState(null),x=r??p,[d,j]=u.useState(!1),[c,v]=u.useState(""),[w,a]=u.useState(""),{toast:g}=E();u.useEffect(()=>{W().then(i=>{o(i),(i==null?void 0:i.port)!==void 0&&v(String(i.port)),(i==null?void 0:i.projectName)!==void 0&&a(i.projectName)})},[]);const k=async(i,y)=>{const l=s==null?void 0:s.defaultAgents,f={phase:(l==null?void 0:l.phase)??I.phase,planDraft:(l==null?void 0:l.planDraft)??I.planDraft,ideaExtend:(l==null?void 0:l.ideaExtend)??I.ideaExtend,commitSuggest:(l==null?void 0:l.commitSuggest)??I.commitSuggest,[i]:y},{ok:D,error:F}=await C({defaultAgents:f});D?(o(R=>R&&{...R,defaultAgents:f}),g({title:"Saved",variant:"success"})):g({title:"Failed to save",description:F,variant:"error"})},A=async()=>{const i=Number(c);if(!s||!Number.isInteger(i)||i<=0||i===s.port)return;const{ok:y,error:l}=await C({port:i});y?(o(f=>f&&{...f,port:i}),g({title:"Saved",variant:"success"})):g({title:"Failed to save",description:l,variant:"error"})},z=async()=>{const i=w.trim();if(!s||!i||i===s.projectName)return;const{ok:y,error:l}=await C({projectName:i});y?(o(f=>f&&{...f,projectName:i}),a(i),g({title:"Saved",variant:"success"})):g({title:"Failed to save",description:l,variant:"error"})},V=async i=>{var f;const y=(f=i.target.files)==null?void 0:f[0];if(!y)return;j(!0);const l=new FileReader;l.onloadend=async()=>{const D=l.result,F=await ie(D);j(!1),F?(m(D),g({title:"Saved",variant:"success"})):g({title:"Failed to save",variant:"error"})},l.readAsDataURL(y)};return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:n[6]},children:e.jsx("h2",{style:{margin:0},children:"Project Info"})}),s===void 0&&e.jsx("p",{children:"Loading…"}),s===null&&e.jsxs(_,{variant:"warning",children:["No papercamp/config.json found — run ",e.jsx("code",{children:"paper-camp init"})," in this directory first."]}),s&&e.jsxs(M,{size:"small",children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-end",gap:n[3],paddingBottom:n[3]},children:[e.jsx(T,{value:w,onChange:i=>a(i.target.value),onBlur:z,label:"Project Name"}),e.jsxs(Y,{size:"small",fillColor:"rgba(143, 185, 150, 0.25)",textColor:ae.accentGreenDark,children:["v",s.version]})]}),e.jsx(b,{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:n[3],paddingBottom:n[3],paddingTop:n[3]},children:[x&&e.jsx("img",{src:x,alt:"Project icon",style:{width:40,height:40,objectFit:"contain",flexShrink:0,borderRadius:4}}),e.jsxs("div",{children:[e.jsx("input",{ref:t,type:"file",accept:".svg,.png,.jpg,.jpeg,.gif,.webp",onChange:V,style:{display:"none"}}),e.jsx(L,{variant:"secondary",size:"small",onClick:()=>{var i;return(i=t.current)==null?void 0:i.click()},disabled:d,children:d?"Uploading…":"Choose File"}),h&&e.jsx("p",{className:"text-sm",style:{opacity:.5,margin:`${n[1]} 0 0`},children:"Loading…"}),!h&&!x&&!d&&e.jsx("p",{className:"text-sm",style:{opacity:.45,margin:`${n[1]} 0 0`},children:"No icon set."})]})]}),e.jsx(b,{}),e.jsx("div",{style:{display:"flex",alignItems:"flex-end",gap:n[3],paddingBottom:n[3],paddingTop:n[3]},children:e.jsx(T,{type:"number",value:c,onChange:i=>v(i.target.value),onBlur:A,label:"Port",helperText:"Default for `paper-camp dev`. Does not affect the running server."})}),e.jsx(b,{}),e.jsx(me,{}),H.map((i,y)=>{var l;return e.jsx(ge,{taskKey:i,agentConfig:((l=s.defaultAgents)==null?void 0:l[i])??I[i],isLast:y===H.length-1,onSave:k},i)})]}),e.jsxs("p",{style:{opacity:.45,fontSize:S.sm,marginTop:n[4]},children:[e.jsx("strong",{children:"Initialized:"})," ",s?new Date(s.initializedAt).toLocaleString():"—"]})]})},ve=()=>{const t=K();return e.jsxs("div",{children:[e.jsx(te,{children:"Settings"}),t==="subjects"?e.jsx(pe,{}):t==="setup"?e.jsx(ce,{}):e.jsx(xe,{})]})},ye=()=>{const t=K(),s=le();return e.jsxs(e.Fragment,{children:[e.jsxs($,{label:"General",children:[e.jsx(U,{size:"small",active:t===null,onClick:()=>s({to:"/settings"}),children:"Project Info"}),e.jsx(U,{size:"small",active:t==="setup",onClick:()=>s({to:"/settings/$section",params:{section:"setup"}}),children:"Setup"})]}),e.jsx($,{label:"Ideas",children:e.jsx(U,{size:"small",active:t==="subjects",onClick:()=>s({to:"/settings/$section",params:{section:"subjects"}}),children:"Subjects"})})]})};export{ve as SettingsPage,ye as SettingsSidebar};
|
|
2
|
-
//# sourceMappingURL=index-DyLHu3dg.js.map
|