@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.
Files changed (58) hide show
  1. package/dist/app/assets/index-B6eOrr41.js +4 -0
  2. package/dist/app/assets/index-B6eOrr41.js.map +1 -0
  3. package/dist/app/assets/index-BajRXbXg.js +2 -0
  4. package/dist/app/assets/index-BajRXbXg.js.map +1 -0
  5. package/dist/app/assets/index-DAexv1XS.js +3 -0
  6. package/dist/app/assets/index-DAexv1XS.js.map +1 -0
  7. package/dist/app/assets/{index-CwotynaS.js → index-DFJlDY3W.js} +2 -2
  8. package/dist/app/assets/{index-CwotynaS.js.map → index-DFJlDY3W.js.map} +1 -1
  9. package/dist/app/assets/main-Bno8vU-0.js +288 -0
  10. package/dist/app/assets/main-Bno8vU-0.js.map +1 -0
  11. package/dist/app/assets/{main-B7k4s_9g.css → main-RP3LpwgH.css} +1 -1
  12. package/dist/app/assets/{sidebar-section-DVSoUVEe.js → sidebar-section-BrJbBK_b.js} +2 -2
  13. package/dist/app/assets/{sidebar-section-DVSoUVEe.js.map → sidebar-section-BrJbBK_b.js.map} +1 -1
  14. package/dist/app/index.html +2 -2
  15. package/dist/chunks/{roadmap.HCld8rN3.js → scaffold.B_3sY6Rg.js} +1857 -1601
  16. package/dist/chunks/scaffold.B_3sY6Rg.js.map +1 -0
  17. package/dist/cli/index.js +8114 -7252
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/core/git-pr/pr.d.ts.map +1 -1
  20. package/dist/core/index.d.ts +1 -0
  21. package/dist/core/index.d.ts.map +1 -1
  22. package/dist/core/index.js +94 -87
  23. package/dist/core/parse/parser.d.ts +2 -3
  24. package/dist/core/parse/parser.d.ts.map +1 -1
  25. package/dist/core/parse/schemas.d.ts +1 -0
  26. package/dist/core/parse/schemas.d.ts.map +1 -1
  27. package/dist/core/readers.d.ts.map +1 -1
  28. package/dist/core/roadmap.d.ts +5 -1
  29. package/dist/core/roadmap.d.ts.map +1 -1
  30. package/dist/core/run-order-file.d.ts +8 -0
  31. package/dist/core/run-order-file.d.ts.map +1 -0
  32. package/dist/core/run-order-file.test.d.ts +2 -0
  33. package/dist/core/run-order-file.test.d.ts.map +1 -0
  34. package/dist/core/run-order.d.ts +28 -9
  35. package/dist/core/run-order.d.ts.map +1 -1
  36. package/dist/core/scaffold/templates.d.ts +1 -1
  37. package/dist/core/scaffold/templates.d.ts.map +1 -1
  38. package/dist/core/sections.d.ts +3 -1
  39. package/dist/core/sections.d.ts.map +1 -1
  40. package/dist/core/serialize/serializer.d.ts +7 -3
  41. package/dist/core/serialize/serializer.d.ts.map +1 -1
  42. package/dist/core/trail.d.ts +7 -0
  43. package/dist/core/trail.d.ts.map +1 -0
  44. package/dist/core/trail.test.d.ts +2 -0
  45. package/dist/core/trail.test.d.ts.map +1 -0
  46. package/dist/types/index.d.ts +169 -10
  47. package/dist/types/index.d.ts.map +1 -1
  48. package/dist/types/index.js.map +1 -1
  49. package/package.json +4 -3
  50. package/dist/app/assets/index-DHHPg0hQ.js +0 -4
  51. package/dist/app/assets/index-DHHPg0hQ.js.map +0 -1
  52. package/dist/app/assets/index-DyLHu3dg.js +0 -2
  53. package/dist/app/assets/index-DyLHu3dg.js.map +0 -1
  54. package/dist/app/assets/index-DzMK8ayh.js +0 -3
  55. package/dist/app/assets/index-DzMK8ayh.js.map +0 -1
  56. package/dist/app/assets/main-BNLbBO0E.js +0 -233
  57. package/dist/app/assets/main-BNLbBO0E.js.map +0 -1
  58. package/dist/chunks/roadmap.HCld8rN3.js.map +0 -1
@@ -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
- /** Off by default. When true, the PostToolUse hook logs new-file creations to progress.md. */
228
- autoLogNewFiles?: boolean;
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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"}
@@ -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.11.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 . && node scripts/check-comments.mjs",
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