@dendelion/paper-camp 0.5.0 → 0.7.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 (44) hide show
  1. package/dist/app/assets/main-5JSkR2Qf.js +182 -0
  2. package/dist/app/assets/main-5JSkR2Qf.js.map +1 -0
  3. package/dist/app/assets/main-B8HU5n_F.css +1 -0
  4. package/dist/app/index.html +2 -2
  5. package/dist/chunks/{serializer._5uZJ4OM.js → serializer.DiYtNSka.js} +1399 -1109
  6. package/dist/chunks/serializer.DiYtNSka.js.map +1 -0
  7. package/dist/cli/index.js +6143 -5891
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/core/branch.d.ts +8 -0
  10. package/dist/core/branch.d.ts.map +1 -0
  11. package/dist/core/entity.test.d.ts +2 -0
  12. package/dist/core/entity.test.d.ts.map +1 -0
  13. package/dist/core/index.js +55 -50
  14. package/dist/core/parser.d.ts +9 -1
  15. package/dist/core/parser.d.ts.map +1 -1
  16. package/dist/core/pr.d.ts +27 -0
  17. package/dist/core/pr.d.ts.map +1 -0
  18. package/dist/core/pr.test.d.ts +2 -0
  19. package/dist/core/pr.test.d.ts.map +1 -0
  20. package/dist/core/readers.d.ts +22 -20
  21. package/dist/core/readers.d.ts.map +1 -1
  22. package/dist/core/scaffold.d.ts.map +1 -1
  23. package/dist/core/schemas.d.ts +44 -5
  24. package/dist/core/schemas.d.ts.map +1 -1
  25. package/dist/core/serializer.d.ts +37 -6
  26. package/dist/core/serializer.d.ts.map +1 -1
  27. package/dist/core/status.d.ts +27 -0
  28. package/dist/core/status.d.ts.map +1 -0
  29. package/dist/core/status.test.d.ts +2 -0
  30. package/dist/core/status.test.d.ts.map +1 -0
  31. package/dist/core/templates.d.ts +1 -1
  32. package/dist/core/templates.d.ts.map +1 -1
  33. package/dist/types/index.d.ts +77 -3
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/index.js.map +1 -1
  36. package/package.json +2 -2
  37. package/dist/app/assets/main-BN5y2u1i.js +0 -216
  38. package/dist/app/assets/main-BN5y2u1i.js.map +0 -1
  39. package/dist/app/assets/main-DvILXiwx.css +0 -1
  40. package/dist/chunks/serializer._5uZJ4OM.js.map +0 -1
  41. package/dist/core/idea-status.d.ts +0 -7
  42. package/dist/core/idea-status.d.ts.map +0 -1
  43. package/dist/core/idea-status.test.d.ts +0 -2
  44. package/dist/core/idea-status.test.d.ts.map +0 -1
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Feature-branch name for an entity, matching the `kind/id-slug` convention
3
+ * that `branchEntityId`/`getFeatureBranchPlanId` parse back out. Shared so
4
+ * branch creation (`ensureBranch`) and PR resolution (`resolvePrMerged`)
5
+ * target the exact same name.
6
+ */
7
+ export declare function branchName(id: string | undefined, type: string | undefined, title: string): string | undefined;
8
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/core/branch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,SAAS,CAQpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.test.d.ts","sourceRoot":"","sources":["../../src/core/entity.test.ts"],"names":[],"mappings":""}
@@ -1,55 +1,60 @@
1
- import { A as e, P as r, a as n, b as t, c as i, d as o, e as l, f as d, g as p, h as m, i as P, j as E, k as S, l as c, m as f, n as I, o as A, p as F, q as g, r as N, s as h, t as y, u as T, v as _, w as C, x as D, y as O, z as u, B as L, C as x, D as G, E as Q, F as v, G as M, H as z, I as B, J as R, K as j, L as k, M as w, N as K, O as U, Q as b } from "../chunks/serializer._5uZJ4OM.js";
2
- import { AGENT_IDS as H, AGENT_LABELS as J, AGENT_OPTIONS as V, DEFAULT_AGENTS as W, PLAN_KINDS as X, PLAN_STATUSES as Y, coerceAgentConfig as Z } from "../types/index.js";
1
+ import { A as e, P as t, a as r, b as n, c as i, d as o, e as p, f as m, g as E, h as d, i as l, j as S, k as c, l as P, m as f, n as F, o as y, p as I, q as A, r as g, s as h, t as N, u as T, v as D, w as _, x as u, y as C, z as O, B as L, C as v, D as G, E as Q, F as x, G as R, H as k, I as z, J as B, K as U, L as j, M as w, N as K, O as M, Q as V, R as W, S as b, T as q, U as H, V as J } from "../chunks/serializer.DiYtNSka.js";
2
+ import { AGENT_IDS as Y, AGENT_LABELS as Z, AGENT_OPTIONS as $, DEFAULT_AGENTS as aa, PLAN_KINDS as sa, PLAN_STATUSES as ea, coerceAgentConfig as ta } from "../types/index.js";
3
3
  export {
4
- H as AGENT_IDS,
5
- J as AGENT_LABELS,
6
- V as AGENT_OPTIONS,
4
+ Y as AGENT_IDS,
5
+ Z as AGENT_LABELS,
6
+ $ as AGENT_OPTIONS,
7
7
  e as AlreadyInitializedError,
8
- W as DEFAULT_AGENTS,
9
- r as PAPER_CAMP_VERSION,
10
- X as PLAN_KINDS,
11
- Y as PLAN_STATUSES,
12
- n as agentConfigSchema,
13
- t as appendBlock,
8
+ aa as DEFAULT_AGENTS,
9
+ t as PAPER_CAMP_VERSION,
10
+ sa as PLAN_KINDS,
11
+ ea as PLAN_STATUSES,
12
+ r as agentConfigSchema,
13
+ n as appendBlock,
14
14
  i as applyEnvEntries,
15
- o as archivePlanFile,
16
- l as assignPlanId,
17
- Z as coerceAgentConfig,
18
- d as dateString,
19
- p as decisionFieldsSchema,
20
- m as findConsistencyIssues,
21
- P as formatDecisionEntry,
22
- E as formatIdeaFile,
23
- S as formatIdeasIndex,
24
- c as formatOpenQuestionEntry,
25
- f as formatOpenQuestions,
26
- I as formatPlanEntry,
27
- A as formatPlanFile,
28
- F as formatPlans,
29
- g as formatPlansIndex,
30
- N as formatProgressEntry,
31
- h as ideaFrontmatterSchema,
32
- y as initProject,
33
- T as openQuestionFieldsSchema,
34
- _ as paperCampConfigSchema,
35
- C as parseDecisions,
36
- D as parseEnv,
37
- O as parseFrontmatter,
38
- u as parseIdeaFile,
39
- L as parseIdeas,
40
- x as parseOpenQuestions,
41
- G as parsePlanFile,
42
- Q as parsePlans,
43
- v as parseProgress,
44
- M as parseRawEntries,
45
- z as planFieldsSchema,
46
- B as planFrontmatterSchema,
47
- R as prependProgressItem,
48
- j as readAllIdeaFiles,
49
- k as readAllPlanFiles,
50
- w as readIdeasMerged,
51
- K as readPlansMerged,
52
- U as serializeFrontmatter,
53
- b as todayDateString
15
+ o as archiveEntityFile,
16
+ p as assignEntityId,
17
+ m as assignPlanId,
18
+ ta as coerceAgentConfig,
19
+ E as dateString,
20
+ d as decisionFieldsSchema,
21
+ l as entityFrontmatterSchema,
22
+ S as entityToIdea,
23
+ c as entityToPlan,
24
+ P as findConsistencyIssues,
25
+ f as formatDecisionEntry,
26
+ F as formatEntitiesIndex,
27
+ y as formatEntityFile,
28
+ I as formatIdeaFile,
29
+ A as formatOpenQuestionEntry,
30
+ g as formatOpenQuestions,
31
+ h as formatPlanEntry,
32
+ N as formatPlanFile,
33
+ T as formatPlans,
34
+ D as formatProgressEntry,
35
+ _ as ideaFrontmatterSchema,
36
+ u as initProject,
37
+ C as openQuestionFieldsSchema,
38
+ O as paperCampConfigSchema,
39
+ L as parseDecisions,
40
+ v as parseEntityFile,
41
+ G as parseEnv,
42
+ Q as parseFrontmatter,
43
+ x as parseIdeaFile,
44
+ R as parseIdeas,
45
+ k as parseOpenQuestions,
46
+ z as parsePlanFile,
47
+ B as parsePlans,
48
+ U as parseProgress,
49
+ j as parseRawEntries,
50
+ w as planFieldsSchema,
51
+ K as planFrontmatterSchema,
52
+ M as prependProgressItem,
53
+ V as readEntities,
54
+ W as readEntitiesWithDerivedStatus,
55
+ b as readNoteEntries,
56
+ q as readWorkEntries,
57
+ H as serializeFrontmatter,
58
+ J as todayDateString
54
59
  };
55
60
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { ConsistencyIssue, DecisionEntry, IdeaEntry, OpenQuestionEntry, ParseResult, ParseWarning, PlanEntry, ProgressEntry, RawEntry } from '../types/index';
2
+ import { ConsistencyIssue, DecisionEntry, EntityEntry, IdeaEntry, OpenQuestionEntry, ParseResult, ParseWarning, PlanEntry, ProgressEntry, RawEntry } from '../types/index';
3
3
  export declare function parseRawEntries(markdown: string): RawEntry[];
4
4
  export declare function parsePlans(markdown: string): ParseResult<PlanEntry>;
5
5
  export declare function parseDecisions(markdown: string): ParseResult<DecisionEntry>;
@@ -20,6 +20,14 @@ export declare function parseFrontmatter<T>(content: string, schema: z.ZodType<T
20
20
  * The body after frontmatter is scanned for ### Phases and ### Log sections,
21
21
  * same as the monolithic parser.
22
22
  */
23
+ /**
24
+ * Parses a unified entity file (FEAT-42 phases 7+): one file per entity — an
25
+ * "idea" for its whole life, plan as an optional `### Phases` body section.
26
+ * Same body pipeline as parsePlanFile (Phases/Log/Clarifications extraction);
27
+ * the frontmatter differs: `type` instead of `kind`, no `idea:` backlink, and
28
+ * the note/status asymmetry from the idea schema folded in.
29
+ */
30
+ export declare function parseEntityFile(content: string): ParseResult<EntityEntry>;
23
31
  export declare function parsePlanFile(content: string): ParseResult<PlanEntry>;
24
32
  /**
25
33
  * Parse a single per-idea file with YAML frontmatter.
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EAET,iBAAiB,EACjB,WAAW,EACX,YAAY,EAEZ,SAAS,EACT,aAAa,EACb,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAsHxB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwC5D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAqCnE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,CAwB3E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAyBnF;AAQD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GACnB;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAyC5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAwCrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAmBrE;AAMD;8EAC8E;AAC9E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAYxD;AAED;;0BAE0B;AAC1B,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,EAAE,EAC1B,aAAa,EAAE,iBAAiB,EAAE,EAClC,KAAK,EAAE,SAAS,EAAE,GACjB,gBAAgB,EAAE,CA0CpB;AAKD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAwB/D"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,EAET,iBAAiB,EACjB,WAAW,EACX,YAAY,EAEZ,SAAS,EACT,aAAa,EACb,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAuHxB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwC5D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAqCnE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,CAwB3E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAyBnF;AAQD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GACnB;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAyC5D;AAED;;;;GAIG;AACH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CA+CzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAwCrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAuBrE;AAMD;8EAC8E;AAC9E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAYxD;AAED;;0BAE0B;AAC1B,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,EAAE,EAC1B,aAAa,EAAE,iBAAiB,EAAE,EAClC,KAAK,EAAE,SAAS,EAAE,GACjB,gBAAgB,EAAE,CA0CpB;AAKD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAwB/D"}
@@ -0,0 +1,27 @@
1
+ import { PrInfo, ReviewThread } from '../types/index';
2
+ /**
3
+ * Cache window for the resolved PR set — long enough that a worklist read doesn't
4
+ * re-shell out to `gh` on every request, short enough that a merge or state
5
+ * change shows up within the same working session.
6
+ */
7
+ export declare const PR_CACHE_TTL_MS: number;
8
+ /**
9
+ * Per-comment detail for a PR's unresolved review threads, for the fix-review
10
+ * launch path (`POST /api/agent/launch-fix-review`) to hand to
11
+ * `buildFixReviewPrompt`. Each thread is represented by its first comment, since
12
+ * that's the one that states what needs fixing. Best-effort: resolves `[]` on
13
+ * any failure so a launch with no readable threads falls back to
14
+ * `buildFixReviewPrompt`'s own empty-threads guard rather than erroring out.
15
+ */
16
+ export declare function fetchUnresolvedThreads(root: string, url: string): Promise<ReviewThread[]>;
17
+ /**
18
+ * Every PR in the repo indexed by the entity id it references, resolved via a
19
+ * single `gh pr list` and cached for `ttlMs` — see IDEA-56's PR-driven status
20
+ * derivation. `undefined` when the lookup can't resolve at all (no `gh`, not
21
+ * authenticated, offline, no GitHub remote); callers fall back to stored status.
22
+ * An entity simply absent from the returned map has no PR (a confirmed answer).
23
+ */
24
+ export declare function resolvePrsByEntity(root: string, ttlMs?: number): Promise<Map<string, PrInfo> | undefined>;
25
+ /** Test-only: clears the module-level PR cache between test cases. */
26
+ export declare function clearPrCache(): void;
27
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/core/pr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAkB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW3E;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAgB,CAAC;AAkM7C;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiB/F;AAoED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,SAAkB,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAS1C;AAED,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pr.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.test.d.ts","sourceRoot":"","sources":["../../src/core/pr.test.ts"],"names":[],"mappings":""}
@@ -1,27 +1,29 @@
1
- import { IdeaEntry, ParseResult, PlanEntry } from '../types/index';
1
+ import { EntityEntry, IdeaEntry, ParseResult, PlanEntry, PrInfo } from '../types/index';
2
2
  /**
3
- * Reads all per-file plans from a directory, including its `archive/` subdirectory
4
- * (done/dropped plans live there — see core/serializer.ts's archive move). Excludes
5
- * index.md in either directory.
6
- * Returns empty result if the directory doesn't exist or has no plan files.
3
+ * Reads every entity from the unified directory, including its `archive/`
4
+ * subdirectory (done/dropped entities live there). Excludes index.md.
7
5
  */
8
- export declare function readAllPlanFiles(plansDir: string): Promise<ParseResult<PlanEntry> & {
6
+ export declare function readEntities(ideasDir: string): Promise<ParseResult<EntityEntry> & {
9
7
  fileCount: number;
10
8
  }>;
11
9
  /**
12
- * Reads all per-file ideas from a directory (non-recursive, excludes index.md).
10
+ * PlanEntry view of a work entity (anything that isn't a note): `kind` is the
11
+ * entity's `type`. Lets the plan-shaped pipeline (API responses, prompts, UI)
12
+ * keep working until the UI morphs to entities directly.
13
+ *
14
+ * `status` is derived from phases + PR state rather than read straight off
15
+ * `e.status` — see `deriveStatus`. `pr` is the entity's resolved PR (or
16
+ * `undefined`); `prLookupResolved` is whether the PR listing succeeded (a
17
+ * failed/absent lookup falls back to the stored override). Note this only
18
+ * affects the *view*: `e.status` itself stays the raw stored override, so
19
+ * round-tripping an `EntityEntry` back to disk never persists a derived value.
13
20
  */
14
- export declare function readAllIdeaFiles(ideasDir: string): Promise<ParseResult<IdeaEntry> & {
15
- fileCount: number;
16
- }>;
17
- /**
18
- * Merges per-file plan entries with monolithic fallback, deduplicating by id/title.
19
- * Per-file entries take precedence; any plan in per-file that also exists in
20
- * the monolithic file is only included once (per-file version wins).
21
- */
22
- export declare function readPlansMerged(plansDir: string, monolithicPath: string): Promise<ParseResult<PlanEntry>>;
23
- /**
24
- * Merges per-file idea entries with monolithic fallback, deduplicating by id.
25
- */
26
- export declare function readIdeasMerged(ideasDir: string, monolithicPath: string): Promise<ParseResult<IdeaEntry>>;
21
+ export declare function entityToPlan(e: EntityEntry, pr?: PrInfo, prLookupResolved?: boolean): PlanEntry;
22
+ /** IdeaEntry view of a note entity, for the note-shaped API/UI surface. */
23
+ export declare function entityToIdea(e: EntityEntry): IdeaEntry;
24
+ export declare function readEntitiesWithDerivedStatus(ideasDir: string): Promise<ParseResult<EntityEntry>>;
25
+ /** All work entities (non-notes) in PlanEntry shape the `/api/plans` view. */
26
+ export declare function readWorkEntries(ideasDir: string): Promise<ParseResult<PlanEntry>>;
27
+ /** All note entities in IdeaEntry shape the `/api/ideas` view. */
28
+ export declare function readNoteEntries(ideasDir: string): Promise<ParseResult<IdeaEntry>>;
27
29
  //# sourceMappingURL=readers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"readers.d.ts","sourceRoot":"","sources":["../../src/core/readers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA0BtF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBzD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CA0BjC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAkCjC"}
1
+ {"version":3,"file":"readers.d.ts","sourceRoot":"","sources":["../../src/core/readers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAET,WAAW,EAEX,SAAS,EAET,MAAM,EACP,MAAM,gBAAgB,CAAC;AAgCxB;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB3D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,SAAS,CAmB7F;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,CAStD;AAiBD,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAOnC;AAED,gFAAgF;AAChF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAQvF;AAED,oEAAoE;AACpE,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAMvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,SAAS,EAAE,MAAM;CAG9B;AAaD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDxF"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,SAAS,EAAE,MAAM;CAG9B;AAaD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CxF"}
@@ -83,21 +83,59 @@ export declare const planFrontmatterSchema: z.ZodObject<{
83
83
  export declare const ideaFrontmatterSchema: z.ZodObject<{
84
84
  id: z.ZodString;
85
85
  title: z.ZodString;
86
+ kind: z.ZodOptional<z.ZodEnum<{
87
+ idea: "idea";
88
+ note: "note";
89
+ }>>;
86
90
  status: z.ZodOptional<z.ZodEnum<{
91
+ done: "done";
92
+ dropped: "dropped";
93
+ open: "open";
94
+ }>>;
95
+ }, z.core.$strip>;
96
+ export declare const entityFrontmatterSchema: z.ZodObject<{
97
+ id: z.ZodString;
98
+ title: z.ZodString;
99
+ type: z.ZodOptional<z.ZodEnum<{
100
+ feat: "feat";
101
+ fix: "fix";
102
+ chore: "chore";
103
+ docs: "docs";
104
+ refactor: "refactor";
105
+ }>>;
106
+ kind: z.ZodOptional<z.ZodEnum<{
107
+ note: "note";
108
+ }>>;
109
+ status: z.ZodOptional<z.ZodEnum<{
110
+ idea: "idea";
87
111
  planned: "planned";
112
+ "in-progress": "in-progress";
113
+ review: "review";
88
114
  done: "done";
115
+ dropped: "dropped";
116
+ open: "open";
117
+ }>>;
118
+ agent: z.ZodOptional<z.ZodEnum<{
119
+ "claude-code": "claude-code";
120
+ opencode: "opencode";
89
121
  }>>;
122
+ created: z.ZodString;
123
+ updated: z.ZodOptional<z.ZodString>;
124
+ audited: z.ZodOptional<z.ZodString>;
125
+ 'audited-hash': z.ZodOptional<z.ZodString>;
126
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
90
127
  }, z.core.$strip>;
91
128
  export declare const paperCampConfigSchema: z.ZodObject<{
92
129
  version: z.ZodString;
93
130
  projectName: z.ZodString;
94
131
  initializedAt: z.ZodString;
95
132
  nextId: z.ZodOptional<z.ZodObject<{
96
- feat: z.ZodNumber;
97
- fix: z.ZodNumber;
98
- chore: z.ZodNumber;
99
- docs: z.ZodNumber;
100
- refactor: z.ZodNumber;
133
+ idea: z.ZodOptional<z.ZodNumber>;
134
+ feat: z.ZodOptional<z.ZodNumber>;
135
+ fix: z.ZodOptional<z.ZodNumber>;
136
+ chore: z.ZodOptional<z.ZodNumber>;
137
+ docs: z.ZodOptional<z.ZodNumber>;
138
+ refactor: z.ZodOptional<z.ZodNumber>;
101
139
  }, z.core.$strip>>;
102
140
  defaultAgent: z.ZodOptional<z.ZodEnum<{
103
141
  "claude-code": "claude-code";
@@ -143,4 +181,5 @@ export type DecisionFields = z.infer<typeof decisionFieldsSchema>;
143
181
  export type OpenQuestionFields = z.infer<typeof openQuestionFieldsSchema>;
144
182
  export type PlanFrontmatter = z.infer<typeof planFrontmatterSchema>;
145
183
  export type IdeaFrontmatter = z.infer<typeof ideaFrontmatterSchema>;
184
+ export type EntityFrontmatter = z.infer<typeof entityFrontmatterSchema>;
146
185
  //# sourceMappingURL=schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;kBAO7B,CAAC;AAEF,eAAO,MAAM,UAAU,aAAiE,CAAC;AAQzF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAKnC,CAAC;AAYH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;iBAShC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBhC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;kBAO7B,CAAC;AAEF,eAAO,MAAM,UAAU,aAAiE,CAAC;AAQzF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAKnC,CAAC;AAYH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;iBAgB9B,CAAC;AASL,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+ChC,CAAC;AAEL,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BhC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { IdeaEntry, LogEntry, PhaseItem, PlanEntry } from '../types/index';
1
+ import { EntityEntry, LogEntry, PhaseItem } from '../types/index';
2
2
  export declare function todayDateString(): string;
3
3
  /**
4
4
  * Mints the next `<KIND>-<N>` plan ID from the persistent counter in `papercamp/config.json`,
@@ -88,23 +88,54 @@ interface NewPlanFileInput {
88
88
  * ...
89
89
  */
90
90
  export declare function formatPlanFile(input: NewPlanFileInput): string;
91
+ interface NewEntityFileInput {
92
+ id: string;
93
+ title: string;
94
+ type?: string;
95
+ kind?: string;
96
+ status?: string;
97
+ agent?: string;
98
+ created: string;
99
+ updated?: string;
100
+ audited?: string;
101
+ auditedHash?: string;
102
+ tags?: string[];
103
+ body?: string;
104
+ phases?: PhaseItem[];
105
+ log?: LogEntry[];
106
+ clarifications?: LogEntry[];
107
+ }
108
+ /**
109
+ * Serializes a unified entity file (FEAT-42 phases 7+) — same body sections as
110
+ * formatPlanFile (Clarifications/Phases/Log), but `type` instead of `kind`, no
111
+ * `idea:` backlink, and no `## id: title` body heading (title lives in
112
+ * frontmatter only).
113
+ */
114
+ export declare function formatEntityFile(input: NewEntityFileInput): string;
115
+ /**
116
+ * Mints the next lifetime IDEA-N entity id from the unified `nextId.idea`
117
+ * counter — the single id space every entity lives in after the FEAT-42
118
+ * migration. Same chaining/guarantees as assignPlanId (which it delegates to).
119
+ */
120
+ export declare function assignEntityId(configPath: string): Promise<string | undefined>;
91
121
  interface NewIdeaFileInput {
92
122
  id: string;
93
123
  title: string;
124
+ kind?: string;
94
125
  status?: string;
95
126
  body?: string;
127
+ log?: LogEntry[];
96
128
  }
97
129
  /**
98
130
  * Serializes an idea entry as a standalone file with YAML frontmatter.
99
131
  */
100
132
  export declare function formatIdeaFile(input: NewIdeaFileInput): string;
101
133
  /**
102
- * Moves a per-file plan from papercamp/plans/<id>.md to papercamp/plans/archive/<id>.md.
134
+ * Moves an entity from papercamp/ideas/<id>.md to papercamp/ideas/archive/<id>.md.
103
135
  * This is a pure file move — no parse-and-re-serialize step.
104
- * Returns true if the file was moved, false if no per-file exists for this plan.
136
+ * Returns true if the file was moved, false if no file exists for this entity.
105
137
  */
106
- export declare function archivePlanFile(root: string, planId: string): Promise<boolean>;
107
- export declare function formatPlansIndex(entries: PlanEntry[]): string;
108
- export declare function formatIdeasIndex(ideas: IdeaEntry[]): string;
138
+ export declare function archiveEntityFile(root: string, entityId: string): Promise<boolean>;
139
+ export declare function formatEntitiesIndex(entities: EntityEntry[]): string;
109
140
  export {};
110
141
  //# sourceMappingURL=serializer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/core/serializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/core/serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { EntityStatus, PhaseItem, PrInfo } from '../types/index';
2
+ /** The subset of an entity's shape the status ladder needs to look at. */
3
+ export interface StatusDerivationInput {
4
+ kind?: 'note';
5
+ status?: EntityStatus;
6
+ phases: PhaseItem[];
7
+ }
8
+ /**
9
+ * Derives lifecycle status from the entity's phases and its GitHub PR instead of
10
+ * trusting the stored `status` field, so it can't drift from reality — see
11
+ * IDEA-56. Tracking keys off the PR (matched by id), not a local branch: the PR
12
+ * is canonical across clones and survives the branch being deleted after merge.
13
+ *
14
+ * Ladder: idea (no phases) -> planned (phases, no PR) -> in-progress (PR open or
15
+ * draft) -> review (PR open/draft AND every phase checked) -> done (PR merged).
16
+ * A closed-unmerged PR reads as `dropped`. `dropped` can never be derived
17
+ * (abandonment leaves no trace), so a stored `dropped` always passes through;
18
+ * notes track open/done/dropped by hand and pass through unchanged.
19
+ *
20
+ * `pr` is the entity's resolved PR, or `undefined` when it has none / the lookup
21
+ * couldn't run. `prLookupResolved` says which: `false` (no `gh`, offline) falls
22
+ * the PR-backed rungs back to the stored override or a phases-only `planned`;
23
+ * `true` with no PR is a confirmed "no PR", so it derives `planned`/`idea` (a
24
+ * stored terminal `done` from an unmatchable legacy PR is still trusted).
25
+ */
26
+ export declare function deriveStatus(entity: StatusDerivationInput, pr: PrInfo | undefined, prLookupResolved: boolean): EntityStatus | undefined;
27
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEtE,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,qBAAqB,EAC7B,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,gBAAgB,EAAE,OAAO,GACxB,YAAY,GAAG,SAAS,CAgB1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../src/core/status.test.ts"],"names":[],"mappings":""}
@@ -4,6 +4,6 @@
4
4
  * hook wiring. Kept in one place so `init`'s no-clobber writes stay simple
5
5
  * string dumps.
6
6
  */
7
- export declare const SKILL_MD_CONTENT = "---\nname: paper-camp\ndescription: Work inside a project that has a papercamp/ folder \u2014 its per-file plans, ideas, decisions log, open questions, and progress log. Use this whenever the working directory contains papercamp/ (papercamp/plans/, papercamp/ideas/, papercamp/decisions.md, papercamp/open-questions.md, papercamp/progress.md), and especially before starting, continuing, or completing any plan phase, drafting an idea, logging a decision, or answering \"what are we working on / what's next\".\n---\n\n# Paper Camp\n\nPaper Camp is this project's planning methodology: plans, ideas, decisions, and\nopen questions live as markdown files under `papercamp/`, and an append-only\n`papercamp/progress.md` is the changelog. This skill tells you how to read that\nstate before acting and how to keep it honest as you work.\n\nIf a `papercamp` MCP server is connected in this session, prefer its tools\n(list/get plans, update phase, append progress, etc.) over raw file access \u2014\nthey enforce the same guards (id allocation, branch conflicts) that the file\ngrammar below assumes. Everything in this skill still applies conceptually;\nonly the mechanism changes.\n\n## Before doing any work\n\nRead, in this order, whatever exists:\n\n1. `papercamp/plans/index.md` \u2014 every plan's id/title/status/tags, at a glance.\n2. The specific plan file at `papercamp/plans/<ID>.md` (e.g. `FEAT-31.md`) for\n the plan you're about to work on. Each plan is YAML frontmatter (`id`,\n `title`, `kind`, `status`, `tags`, ...) plus prose, then a `### Phases`\n list of `- [ ]`/`- [x]` checkboxes with an indented description under each.\n3. `papercamp/ideas/index.md` and any linked idea file \u2014 plans often trace\n back to an `idea:` field; the idea explains *why*, the plan explains *what*.\n4. `papercamp/decisions.md` \u2014 settled calls that constrain your approach.\n Don't re-litigate a logged decision without flagging it to the user first.\n5. `papercamp/open-questions.md` \u2014 unresolved questions that might block or\n redirect the work you're about to start.\n6. The last handful of entries in `papercamp/progress.md` for recent context\n on what just happened.\n\nSkip files that don't exist yet (a fresh project may have empty logs).\n\n## While working\n\n- Work one plan phase at a time unless told otherwise \u2014 don't cascade into\n later phases just because they look quick.\n- If a phase's boundary or intent is unclear, ask before continuing.\n- Prose in plans and ideas is more current than your memory of past\n conversations. If they conflict, the files win \u2014 say so and resync.\n\n## Keep the project current as you go\n\n- **Plan phases**: when you finish a phase, flip its checkbox from `- [ ]` to\n `- [x]` in the plan's frontmatter file. Change only that line \u2014 don't touch\n other phases or prose.\n- **Plan status**: keep the plan's `status:` frontmatter honest\n (`planned` / `in-progress` / `review` / `done`). When every phase is\n checked, set status to `review` \u2014 never `done`. `done` is a human-only\n promotion after review; an agent finishing the last phase does not close\n the plan itself.\n- **Progress log**: add one bullet describing what you did under today's\n `## YYYY-MM-DD` heading at the top of `papercamp/progress.md` (newest day\n first; create the heading if today's isn't there yet). Be specific enough\n that a future read of the log alone explains what changed and why, without\n needing to re-read the diff.\n- **Decisions / open questions**: if you settle something ambiguous while\n working, log it in `papercamp/decisions.md`; if you surface a question you\n can't resolve yourself, add it to `papercamp/open-questions.md` rather than\n guessing silently.\n\n## What this skill deliberately does not do\n\nIt does not maintain a separate \"current focus\" file \u2014 that's derived at\nsession start from live plan/progress data, not hand-maintained here. It does\nnot define the file formats in full; treat the existing files under\n`papercamp/` as the grammar reference (mirror their structure exactly rather\nthan inventing a new shape).\n";
7
+ export declare const SKILL_MD_CONTENT = "---\nname: paper-camp\ndescription: Work inside a project that has a papercamp/ folder \u2014 its unified idea entities (each holding its plan as a section), decisions log, open questions, and progress log. Use this whenever the working directory contains papercamp/ (papercamp/ideas/, papercamp/decisions.md, papercamp/open-questions.md, papercamp/progress.md), and especially before starting, continuing, or completing any plan phase, drafting an idea, logging a decision, or answering \"what are we working on / what's next\".\n---\n\n# Paper Camp\n\nPaper Camp is this project's planning methodology: plans, ideas, decisions, and\nopen questions live as markdown files under `papercamp/`, and an append-only\n`papercamp/progress.md` is the changelog. This skill tells you how to read that\nstate before acting and how to keep it honest as you work.\n\nIf a `papercamp` MCP server is connected in this session, prefer its tools\n(list/get plans, update phase, append progress, etc.) over raw file access \u2014\nthey enforce the same guards (id allocation, branch conflicts) that the file\ngrammar below assumes. Everything in this skill still applies conceptually;\nonly the mechanism changes.\n\n## Before doing any work\n\nRead, in this order, whatever exists:\n\n1. `papercamp/ideas/index.md` \u2014 every entity's id/title/type/status/tags, at\n a glance. Ideas and plans are one thing: an entity is an *idea* for its\n whole life, and its plan is a `### Phases` section inside the same file.\n2. The specific entity file at `papercamp/ideas/<ID>.md` (e.g. `IDEA-43.md`)\n for the work you're about to do \u2014 YAML frontmatter (`id`, `title`,\n `type`, `status`, `tags`, ...) plus prose rationale, then optionally a\n `### Phases` list of `- [ ]`/`- [x]` checkboxes with an indented\n description under each. Done/dropped entities live in\n `papercamp/ideas/archive/`.\n3. `papercamp/decisions.md` \u2014 settled calls that constrain your approach.\n Don't re-litigate a logged decision without flagging it to the user first.\n4. `papercamp/open-questions.md` \u2014 unresolved questions that might block or\n redirect the work you're about to start.\n5. The last handful of entries in `papercamp/progress.md` for recent context\n on what just happened.\n\nSkip files that don't exist yet (a fresh project may have empty logs).\n\n## While working\n\n- Work one plan phase at a time unless told otherwise \u2014 don't cascade into\n later phases just because they look quick.\n- If a phase's boundary or intent is unclear, ask before continuing.\n- Prose in plans and ideas is more current than your memory of past\n conversations. If they conflict, the files win \u2014 say so and resync.\n\n## Keep the project current as you go\n\n- **Plan phases**: when you finish a phase, flip its checkbox from `- [ ]` to\n `- [x]` in the plan's frontmatter file. Change only that line \u2014 don't touch\n other phases or prose.\n- **Plan status**: keep the plan's `status:` frontmatter honest\n (`planned` / `in-progress` / `review` / `done`). When every phase is\n checked, set status to `review` \u2014 never `done`. `done` is a human-only\n promotion after review; an agent finishing the last phase does not close\n the plan itself.\n- **Progress log**: add one bullet describing what you did under today's\n `## YYYY-MM-DD` heading at the top of `papercamp/progress.md` (newest day\n first; create the heading if today's isn't there yet). Be specific enough\n that a future read of the log alone explains what changed and why, without\n needing to re-read the diff.\n- **Decisions / open questions**: if you settle something ambiguous while\n working, log it in `papercamp/decisions.md`; if you surface a question you\n can't resolve yourself, add it to `papercamp/open-questions.md` rather than\n guessing silently.\n\n## What this skill deliberately does not do\n\nIt does not maintain a separate \"current focus\" file \u2014 that's derived at\nsession start from live plan/progress data, not hand-maintained here. It does\nnot define the file formats in full; treat the existing files under\n`papercamp/` as the grammar reference (mirror their structure exactly rather\nthan inventing a new shape).\n";
8
8
  export declare const CLAUDE_SETTINGS_JSON: string;
9
9
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,skIAyE5B,CAAC;AAIF,eAAO,MAAM,oBAAoB,QAmB5B,CAAC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,0pIA2E5B,CAAC;AAIF,eAAO,MAAM,oBAAoB,QAmB5B,CAAC"}