openplanr 1.2.8 → 1.4.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 (171) hide show
  1. package/README.md +30 -3
  2. package/dist/agents/task-parser.d.ts.map +1 -1
  3. package/dist/agents/task-parser.js +8 -34
  4. package/dist/agents/task-parser.js.map +1 -1
  5. package/dist/ai/prompts/prompt-builder.d.ts +14 -0
  6. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  7. package/dist/ai/prompts/prompt-builder.js +32 -1
  8. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  9. package/dist/ai/prompts/system-prompts.d.ts +3 -2
  10. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  11. package/dist/ai/prompts/system-prompts.js +117 -7
  12. package/dist/ai/prompts/system-prompts.js.map +1 -1
  13. package/dist/ai/schemas/ai-response-schemas.d.ts +62 -0
  14. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  15. package/dist/ai/schemas/ai-response-schemas.js +51 -1
  16. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  17. package/dist/ai/types.d.ts.map +1 -1
  18. package/dist/ai/types.js +2 -0
  19. package/dist/ai/types.js.map +1 -1
  20. package/dist/cli/commands/backlog.d.ts +12 -0
  21. package/dist/cli/commands/backlog.d.ts.map +1 -1
  22. package/dist/cli/commands/backlog.js +88 -2
  23. package/dist/cli/commands/backlog.js.map +1 -1
  24. package/dist/cli/commands/config.d.ts.map +1 -1
  25. package/dist/cli/commands/config.js +8 -2
  26. package/dist/cli/commands/config.js.map +1 -1
  27. package/dist/cli/commands/linear.d.ts +8 -0
  28. package/dist/cli/commands/linear.d.ts.map +1 -0
  29. package/dist/cli/commands/linear.js +550 -0
  30. package/dist/cli/commands/linear.js.map +1 -0
  31. package/dist/cli/commands/quick.d.ts +17 -0
  32. package/dist/cli/commands/quick.d.ts.map +1 -1
  33. package/dist/cli/commands/quick.js +31 -15
  34. package/dist/cli/commands/quick.js.map +1 -1
  35. package/dist/cli/commands/revise.d.ts +9 -8
  36. package/dist/cli/commands/revise.d.ts.map +1 -1
  37. package/dist/cli/commands/revise.js +93 -25
  38. package/dist/cli/commands/revise.js.map +1 -1
  39. package/dist/cli/commands/spec.d.ts +28 -0
  40. package/dist/cli/commands/spec.d.ts.map +1 -0
  41. package/dist/cli/commands/spec.js +529 -0
  42. package/dist/cli/commands/spec.js.map +1 -0
  43. package/dist/cli/index.js +4 -0
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/models/schema.d.ts +44 -0
  46. package/dist/models/schema.d.ts.map +1 -1
  47. package/dist/models/schema.js +50 -0
  48. package/dist/models/schema.js.map +1 -1
  49. package/dist/models/types.d.ts +188 -3
  50. package/dist/models/types.d.ts.map +1 -1
  51. package/dist/services/artifact-gathering.d.ts +4 -0
  52. package/dist/services/artifact-gathering.d.ts.map +1 -1
  53. package/dist/services/artifact-gathering.js +1 -1
  54. package/dist/services/artifact-gathering.js.map +1 -1
  55. package/dist/services/artifact-service.d.ts +12 -1
  56. package/dist/services/artifact-service.d.ts.map +1 -1
  57. package/dist/services/artifact-service.js +49 -6
  58. package/dist/services/artifact-service.js.map +1 -1
  59. package/dist/services/atomic-write-service.d.ts +2 -2
  60. package/dist/services/atomic-write-service.js +2 -2
  61. package/dist/services/audit-log-service.d.ts +3 -6
  62. package/dist/services/audit-log-service.d.ts.map +1 -1
  63. package/dist/services/audit-log-service.js +4 -7
  64. package/dist/services/audit-log-service.js.map +1 -1
  65. package/dist/services/cascade-service.d.ts +2 -2
  66. package/dist/services/cascade-service.js +3 -3
  67. package/dist/services/cascade-service.js.map +1 -1
  68. package/dist/services/config-service.d.ts.map +1 -1
  69. package/dist/services/config-service.js +1 -0
  70. package/dist/services/config-service.js.map +1 -1
  71. package/dist/services/credentials-service.js +2 -2
  72. package/dist/services/credentials-service.js.map +1 -1
  73. package/dist/services/diff-service.d.ts +1 -1
  74. package/dist/services/diff-service.js +1 -1
  75. package/dist/services/evidence-verifier.d.ts +1 -1
  76. package/dist/services/evidence-verifier.d.ts.map +1 -1
  77. package/dist/services/evidence-verifier.js +5 -2
  78. package/dist/services/evidence-verifier.js.map +1 -1
  79. package/dist/services/git-service.d.ts +4 -4
  80. package/dist/services/git-service.js +4 -4
  81. package/dist/services/graph-integrity.d.ts +2 -3
  82. package/dist/services/graph-integrity.d.ts.map +1 -1
  83. package/dist/services/graph-integrity.js +2 -3
  84. package/dist/services/graph-integrity.js.map +1 -1
  85. package/dist/services/linear/body-formatters.d.ts +69 -0
  86. package/dist/services/linear/body-formatters.d.ts.map +1 -0
  87. package/dist/services/linear/body-formatters.js +183 -0
  88. package/dist/services/linear/body-formatters.js.map +1 -0
  89. package/dist/services/linear/constants.d.ts +61 -0
  90. package/dist/services/linear/constants.d.ts.map +1 -0
  91. package/dist/services/linear/constants.js +84 -0
  92. package/dist/services/linear/constants.js.map +1 -0
  93. package/dist/services/linear/errors.d.ts +14 -0
  94. package/dist/services/linear/errors.d.ts.map +1 -0
  95. package/dist/services/linear/errors.js +106 -0
  96. package/dist/services/linear/errors.js.map +1 -0
  97. package/dist/services/linear/estimate-resolver.d.ts +50 -0
  98. package/dist/services/linear/estimate-resolver.d.ts.map +1 -0
  99. package/dist/services/linear/estimate-resolver.js +82 -0
  100. package/dist/services/linear/estimate-resolver.js.map +1 -0
  101. package/dist/services/linear/plan-builders.d.ts +64 -0
  102. package/dist/services/linear/plan-builders.d.ts.map +1 -0
  103. package/dist/services/linear/plan-builders.js +237 -0
  104. package/dist/services/linear/plan-builders.js.map +1 -0
  105. package/dist/services/linear/scope-loaders.d.ts +79 -0
  106. package/dist/services/linear/scope-loaders.d.ts.map +1 -0
  107. package/dist/services/linear/scope-loaders.js +227 -0
  108. package/dist/services/linear/scope-loaders.js.map +1 -0
  109. package/dist/services/linear/strategy-context.d.ts +66 -0
  110. package/dist/services/linear/strategy-context.d.ts.map +1 -0
  111. package/dist/services/linear/strategy-context.js +121 -0
  112. package/dist/services/linear/strategy-context.js.map +1 -0
  113. package/dist/services/linear-mapping-service.d.ts +11 -0
  114. package/dist/services/linear-mapping-service.d.ts.map +1 -0
  115. package/dist/services/linear-mapping-service.js +220 -0
  116. package/dist/services/linear-mapping-service.js.map +1 -0
  117. package/dist/services/linear-pull-service.d.ts +137 -0
  118. package/dist/services/linear-pull-service.d.ts.map +1 -0
  119. package/dist/services/linear-pull-service.js +720 -0
  120. package/dist/services/linear-pull-service.js.map +1 -0
  121. package/dist/services/linear-push-service.d.ts +86 -0
  122. package/dist/services/linear-push-service.d.ts.map +1 -0
  123. package/dist/services/linear-push-service.js +956 -0
  124. package/dist/services/linear-push-service.js.map +1 -0
  125. package/dist/services/linear-service.d.ts +122 -0
  126. package/dist/services/linear-service.d.ts.map +1 -0
  127. package/dist/services/linear-service.js +361 -0
  128. package/dist/services/linear-service.js.map +1 -0
  129. package/dist/services/prompt-service.d.ts +19 -0
  130. package/dist/services/prompt-service.d.ts.map +1 -1
  131. package/dist/services/prompt-service.js +64 -0
  132. package/dist/services/prompt-service.js.map +1 -1
  133. package/dist/services/revise-apply-service.d.ts +55 -0
  134. package/dist/services/revise-apply-service.d.ts.map +1 -0
  135. package/dist/services/revise-apply-service.js +255 -0
  136. package/dist/services/revise-apply-service.js.map +1 -0
  137. package/dist/services/revise-cache-service.d.ts +1 -1
  138. package/dist/services/revise-cache-service.js +1 -1
  139. package/dist/services/revise-plan-service.d.ts +38 -0
  140. package/dist/services/revise-plan-service.d.ts.map +1 -0
  141. package/dist/services/revise-plan-service.js +151 -0
  142. package/dist/services/revise-plan-service.js.map +1 -0
  143. package/dist/services/revise-service.d.ts +18 -11
  144. package/dist/services/revise-service.d.ts.map +1 -1
  145. package/dist/services/revise-service.js +57 -12
  146. package/dist/services/revise-service.js.map +1 -1
  147. package/dist/services/spec-service.d.ts +292 -0
  148. package/dist/services/spec-service.d.ts.map +1 -0
  149. package/dist/services/spec-service.js +805 -0
  150. package/dist/services/spec-service.js.map +1 -0
  151. package/dist/services/template-sections.d.ts +1 -1
  152. package/dist/services/template-sections.js +1 -1
  153. package/dist/templates/backlog/backlog-item.md.hbs +3 -0
  154. package/dist/templates/quick/quick-task.md.hbs +6 -0
  155. package/dist/templates/spec/spec-shaped.md.hbs +89 -0
  156. package/dist/templates/spec/spec.md.hbs +68 -0
  157. package/dist/templates/spec/story.md.hbs +51 -0
  158. package/dist/templates/spec/task.md.hbs +98 -0
  159. package/dist/utils/constants.d.ts +18 -0
  160. package/dist/utils/constants.d.ts.map +1 -1
  161. package/dist/utils/constants.js +25 -0
  162. package/dist/utils/constants.js.map +1 -1
  163. package/dist/utils/diff.d.ts +22 -1
  164. package/dist/utils/diff.d.ts.map +1 -1
  165. package/dist/utils/diff.js +136 -1
  166. package/dist/utils/diff.js.map +1 -1
  167. package/dist/utils/markdown.d.ts +23 -0
  168. package/dist/utils/markdown.d.ts.map +1 -1
  169. package/dist/utils/markdown.js +79 -0
  170. package/dist/utils/markdown.js.map +1 -1
  171. package/package.json +3 -2
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Local-only Linear ↔ OpenPlanr mapping table for `planr linear status`.
3
+ */
4
+ import { listArtifacts, readArtifact } from './artifact-service.js';
5
+ import { buildCascadeOrder } from './cascade-service.js';
6
+ import { isLikelyLinearIssueId } from './linear-service.js';
7
+ /**
8
+ * Flag frontmatter values that don't parse as a plausible Linear issue id —
9
+ * typos like `ENG42` (no hyphen), truncations, or values copied from other
10
+ * tools. Linear issue ids accept two legitimate shapes: UUID v4 (canonical
11
+ * API form) and `ENG-42` identifier form; both return `undefined` here.
12
+ * Anything else gets flagged so the status table highlights it clearly.
13
+ *
14
+ * Note: earlier versions also flagged UUID-shaped values as "looks like a
15
+ * workflow state id" — removed in Gap D because every pushed Linear issue id
16
+ * is a UUID, so that check fired on healthy data.
17
+ */
18
+ function staleNoteForIssueId(raw) {
19
+ if (!raw?.trim()) {
20
+ return undefined;
21
+ }
22
+ if (!isLikelyLinearIssueId(raw)) {
23
+ return 'stale-id (value does not look like a Linear issue id; re-run `planr linear push`)';
24
+ }
25
+ return undefined;
26
+ }
27
+ function cell(s, max = 48) {
28
+ const t = s.trim() || '—';
29
+ return t.length <= max ? t : `${t.slice(0, max - 1)}…`;
30
+ }
31
+ function toStr(v) {
32
+ if (typeof v !== 'string')
33
+ return undefined;
34
+ const t = v.trim();
35
+ return t.length > 0 ? t : undefined;
36
+ }
37
+ function rowForEpic(openPlanrId, d) {
38
+ const pid = toStr(d.linearProjectId);
39
+ if (!pid) {
40
+ return {
41
+ kind: 'epic',
42
+ openPlanrId,
43
+ linearIdentifier: '(not pushed)',
44
+ linearUrl: '—',
45
+ lastKnownState: '—',
46
+ };
47
+ }
48
+ const strategy = toStr(d.linearMappingStrategy) ?? 'project';
49
+ const url = toStr(d.linearProjectUrl) ?? '—';
50
+ let identifier;
51
+ if (strategy === 'milestone-of') {
52
+ const mid = toStr(d.linearMilestoneId);
53
+ identifier = mid ? `milestone:${mid.slice(0, 8)}` : 'milestone:(pending)';
54
+ }
55
+ else if (strategy === 'label-on') {
56
+ const lid = toStr(d.linearLabelId);
57
+ identifier = lid ? `label:${lid.slice(0, 8)}` : 'label:(pending)';
58
+ }
59
+ else {
60
+ identifier = toStr(d.linearProjectIdentifier) ?? `project:${pid.slice(0, 8)}`;
61
+ }
62
+ return {
63
+ kind: 'epic',
64
+ openPlanrId,
65
+ linearIdentifier: identifier,
66
+ linearUrl: url,
67
+ lastKnownState: '—',
68
+ };
69
+ }
70
+ /**
71
+ * Generic row builder for issue-shaped artifacts (feature / story / task /
72
+ * quick / backlog). All five have the same frontmatter fields
73
+ * (`linearIssueId`, `linearIssueIdentifier`, `linearIssueUrl`) so a single
74
+ * implementation handles them — only the `kind` label differs.
75
+ */
76
+ function rowForIssueArtifact(kind, openPlanrId, d) {
77
+ const issueId = toStr(d.linearIssueId);
78
+ const stale = staleNoteForIssueId(issueId);
79
+ const usable = Boolean(issueId && !stale);
80
+ return {
81
+ kind,
82
+ openPlanrId,
83
+ linearIdentifier: usable
84
+ ? (toStr(d.linearIssueIdentifier) ?? issueId.slice(0, 8))
85
+ : issueId
86
+ ? issueId.slice(0, 8)
87
+ : '(not pushed)',
88
+ linearUrl: usable ? (toStr(d.linearIssueUrl) ?? '—') : '—',
89
+ lastKnownState: String(d.status ?? '—'),
90
+ note: stale,
91
+ };
92
+ }
93
+ async function pushTaskRow(projectDir, config, rows, taskId) {
94
+ const a = await readArtifact(projectDir, config, 'task', taskId);
95
+ if (!a)
96
+ return;
97
+ rows.push(rowForIssueArtifact('task', taskId, a.data));
98
+ }
99
+ /**
100
+ * Collect mapping rows from local frontmatter only (no Linear API).
101
+ * With `scopeEpicId`, only that epic and descendants (features, stories, tasks in cascade + tasks with `featureId` in scope).
102
+ */
103
+ export async function collectLinearMappingTable(projectDir, config, scopeEpicId) {
104
+ const rows = [];
105
+ if (scopeEpicId) {
106
+ const plan = await buildCascadeOrder(projectDir, config, 'epic', scopeEpicId);
107
+ const featureIdsInScope = new Set(plan.levels[1]?.artifactIds ?? []);
108
+ const storyIdsInScope = new Set(plan.levels[2]?.artifactIds ?? []);
109
+ const taskIdsCascade = new Set(plan.levels[3]?.artifactIds ?? []);
110
+ const ep = await readArtifact(projectDir, config, 'epic', scopeEpicId);
111
+ if (ep) {
112
+ rows.push(rowForEpic(scopeEpicId, ep.data));
113
+ }
114
+ for (const fid of [...featureIdsInScope].sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))) {
115
+ const a = await readArtifact(projectDir, config, 'feature', fid);
116
+ if (a) {
117
+ rows.push(rowForIssueArtifact('feature', fid, a.data));
118
+ }
119
+ }
120
+ for (const sid of [...storyIdsInScope].sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))) {
121
+ const a = await readArtifact(projectDir, config, 'story', sid);
122
+ if (a) {
123
+ rows.push(rowForIssueArtifact('story', sid, a.data));
124
+ }
125
+ }
126
+ for (const tid of [...taskIdsCascade].sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))) {
127
+ await pushTaskRow(projectDir, config, rows, tid);
128
+ }
129
+ const allTasks = await listArtifacts(projectDir, config, 'task');
130
+ for (const t of allTasks.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
131
+ if (taskIdsCascade.has(t.id))
132
+ continue;
133
+ const ta = await readArtifact(projectDir, config, 'task', t.id);
134
+ const feat = ta?.data.featureId;
135
+ if (feat && featureIdsInScope.has(feat)) {
136
+ await pushTaskRow(projectDir, config, rows, t.id);
137
+ }
138
+ }
139
+ // Linked QT / BL artifacts (`epicId` or `parentEpic` pointing at this epic).
140
+ const quicks = await listArtifacts(projectDir, config, 'quick');
141
+ for (const q of quicks.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
142
+ const a = await readArtifact(projectDir, config, 'quick', q.id);
143
+ if (!a)
144
+ continue;
145
+ const linked = toStr(a.data.epicId) ?? toStr(a.data.parentEpic);
146
+ if (linked === scopeEpicId) {
147
+ rows.push(rowForIssueArtifact('quick', q.id, a.data));
148
+ }
149
+ }
150
+ const backlogs = await listArtifacts(projectDir, config, 'backlog');
151
+ for (const b of backlogs.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
152
+ const a = await readArtifact(projectDir, config, 'backlog', b.id);
153
+ if (!a)
154
+ continue;
155
+ const linked = toStr(a.data.epicId) ?? toStr(a.data.parentEpic);
156
+ if (linked === scopeEpicId) {
157
+ rows.push(rowForIssueArtifact('backlog', b.id, a.data));
158
+ }
159
+ }
160
+ return rows;
161
+ }
162
+ const epics = await listArtifacts(projectDir, config, 'epic');
163
+ for (const e of epics.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
164
+ const a = await readArtifact(projectDir, config, 'epic', e.id);
165
+ if (a) {
166
+ rows.push(rowForEpic(e.id, a.data));
167
+ }
168
+ }
169
+ const features = await listArtifacts(projectDir, config, 'feature');
170
+ for (const f of features.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
171
+ const a = await readArtifact(projectDir, config, 'feature', f.id);
172
+ if (a) {
173
+ rows.push(rowForIssueArtifact('feature', f.id, a.data));
174
+ }
175
+ }
176
+ const stories = await listArtifacts(projectDir, config, 'story');
177
+ for (const s of stories.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
178
+ const a = await readArtifact(projectDir, config, 'story', s.id);
179
+ if (a) {
180
+ rows.push(rowForIssueArtifact('story', s.id, a.data));
181
+ }
182
+ }
183
+ const tasks = await listArtifacts(projectDir, config, 'task');
184
+ for (const t of tasks.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
185
+ await pushTaskRow(projectDir, config, rows, t.id);
186
+ }
187
+ const quicks = await listArtifacts(projectDir, config, 'quick');
188
+ for (const q of quicks.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
189
+ const a = await readArtifact(projectDir, config, 'quick', q.id);
190
+ if (a)
191
+ rows.push(rowForIssueArtifact('quick', q.id, a.data));
192
+ }
193
+ const backlogs = await listArtifacts(projectDir, config, 'backlog');
194
+ for (const b of backlogs.sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))) {
195
+ const a = await readArtifact(projectDir, config, 'backlog', b.id);
196
+ if (a)
197
+ rows.push(rowForIssueArtifact('backlog', b.id, a.data));
198
+ }
199
+ return rows;
200
+ }
201
+ export function formatLinearMappingTable(rows) {
202
+ const lines = [];
203
+ const kindW = 7;
204
+ const idW = 14;
205
+ const idenW = 22;
206
+ const stW = 14;
207
+ const noteW = 40;
208
+ // URL goes LAST and is printed in full (no truncation). Clickable URLs are
209
+ // the primary value of this table; truncating them to a fixed width made
210
+ // them useless for copy-paste. Rows with long URLs now trail off freely
211
+ // without disturbing earlier columns.
212
+ lines.push(`${'Kind'.padEnd(kindW)} ${'OpenPlanr id'.padEnd(idW)} ${'Linear id'.padEnd(idenW)} ${'State'.padEnd(stW)} ${'Note'.padEnd(noteW)} URL`);
213
+ lines.push(`${'─'.repeat(kindW)} ${'─'.repeat(idW)} ${'─'.repeat(idenW)} ${'─'.repeat(stW)} ${'─'.repeat(noteW)} ───`);
214
+ for (const r of rows) {
215
+ const note = r.note ? cell(r.note, noteW) : '';
216
+ lines.push(`${r.kind.padEnd(kindW)} ${r.openPlanrId.padEnd(idW)} ${cell(r.linearIdentifier, idenW).padEnd(idenW)} ${cell(r.lastKnownState, stW).padEnd(stW)} ${note.padEnd(noteW)} ${r.linearUrl}`);
217
+ }
218
+ return lines.join('\n');
219
+ }
220
+ //# sourceMappingURL=linear-mapping-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-mapping-service.js","sourceRoot":"","sources":["../../src/services/linear-mapping-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Linear → OpenPlanr pull-direction sync.
3
+ *
4
+ * Two concerns consolidated here because both are strictly pull and share
5
+ * the same client lifecycle and auth surface:
6
+ *
7
+ * 1. **Workflow-status sync**: for Features and Stories with a stored
8
+ * `linearIssueId`, fetch the current Linear workflow state name and
9
+ * write OpenPlanr `status` frontmatter when mapped.
10
+ *
11
+ * 2. **Task checkbox sync**: bidirectional 3-way merge between local
12
+ * TASK markdown and Linear TaskList issue description bodies.
13
+ * Pull-side lives here; push-side lives in `linear-push-service.ts`.
14
+ *
15
+ * Keeping them in one module reduces call-site noise for
16
+ * `planr linear sync` and gives the next reader one file to understand
17
+ * everything that pulls state from Linear.
18
+ */
19
+ import type { LinearClient } from '@linear/sdk';
20
+ import type { ParsedSubtask } from '../agents/task-parser.js';
21
+ import type { BacklogStatus, OpenPlanrConfig, TaskStatus } from '../models/types.js';
22
+ export declare function buildNameToStatusMap(user: Record<string, string> | undefined): Map<string, TaskStatus>;
23
+ export declare function mapLinearNameToTaskStatus(stateName: string, byName: Map<string, TaskStatus>): TaskStatus | undefined;
24
+ export declare function buildNameToBacklogStatusMap(user: Record<string, string> | undefined): Map<string, BacklogStatus>;
25
+ export declare function mapLinearNameToBacklogStatus(stateName: string, byName: Map<string, BacklogStatus>): BacklogStatus | undefined;
26
+ export interface LinearStatusSyncSummary {
27
+ /** Local artifacts overwritten with Linear's state (the pull direction). */
28
+ updated: number;
29
+ /** Linear issues updated from local state (the push-on-sync direction). */
30
+ pushedToLinear: number;
31
+ /** Local and Linear already agree — no write either direction. */
32
+ unchanged: number;
33
+ /** Per-artifact conflicts resolved via `--on-conflict` (includes non-interactive defaults). */
34
+ conflictDecisions: number;
35
+ /** Linear returned a state name we don't know how to map. */
36
+ unmapped: number;
37
+ /** Artifact had no `linearIssueId` or an unparseable one. */
38
+ skippedNoId: number;
39
+ /** Linear didn't return the issue (deleted / no access). */
40
+ missingFromApi: number;
41
+ /** Push-back to Linear failed (API error); local frontmatter left unchanged. */
42
+ pushFailures: number;
43
+ }
44
+ /**
45
+ * Shared three-way merge strategy — governs how both checkbox sync and
46
+ * status sync resolve conflicts. Reused from the existing checkbox merge
47
+ * so users get one flag (`--on-conflict`) for both.
48
+ */
49
+ export type ConflictStrategy = 'prompt' | 'local' | 'linear';
50
+ /**
51
+ * One side of a three-way status decision. Analogous to the `CheckboxConflict`
52
+ * record used by the task-checkbox merge, but scalar (single `status` value
53
+ * per artifact, not per-checkbox).
54
+ */
55
+ export interface StatusConflict {
56
+ base: string | undefined;
57
+ local: string;
58
+ remote: string;
59
+ }
60
+ /**
61
+ * Pure three-way merge decision for a single artifact's workflow status.
62
+ *
63
+ * Mirrors `resolveTaskCheckboxFinalStates` but on a scalar. Returns
64
+ * `side='unchanged'` when local and remote already agree (counter path),
65
+ * `side='linear'` when the remote changed and should be pulled, `side='local'`
66
+ * when the local changed and should be pushed back to Linear. True
67
+ * conflicts (both diverged from base, or no base and they disagree) are
68
+ * resolved per `strategy`.
69
+ */
70
+ export declare function resolveStatusFinalState(c: StatusConflict, strategy: ConflictStrategy): {
71
+ final: string;
72
+ side: 'unchanged' | 'local' | 'linear';
73
+ conflictDecisions: number;
74
+ isTrueConflict: boolean;
75
+ };
76
+ export declare function syncLinearStatusIntoArtifacts(projectDir: string, config: OpenPlanrConfig, client: LinearClient, options?: {
77
+ dryRun?: boolean;
78
+ onConflict?: ConflictStrategy;
79
+ }): Promise<LinearStatusSyncSummary>;
80
+ export declare function formatLinearStatusSyncLine(s: LinearStatusSyncSummary): string;
81
+ export type TaskCheckboxConflictStrategy = 'prompt' | 'local' | 'linear';
82
+ export interface LinearTaskCheckboxSyncSummary {
83
+ filesProcessed: number;
84
+ filesUpdatedLocal: number;
85
+ linearIssuesUpdated: number;
86
+ /** Number of per-id decisions for divergent local vs Linear (includes non-interactive defaults). */
87
+ conflictDecisions: number;
88
+ skippedNoIssue: number;
89
+ /** Artifacts whose `linearIssueId` frontmatter was present but malformed (H1). */
90
+ skippedStaleId: number;
91
+ }
92
+ /**
93
+ * Rebuild a `ParsedSubtask` list in document order: local file order, then any ids only in remote, then apply `final` done flags.
94
+ */
95
+ export declare function mergeByIdForFormat(local: ParsedSubtask[], remote: ParsedSubtask[], final: ReadonlyMap<string, boolean>): ParsedSubtask[];
96
+ /** Merged issue body: return text for an artifact’s section, or the whole body when a single file owns the issue. */
97
+ export declare function extractTaskSectionFromMergedDescription(merged: string, taskFileId: string, siblingFileCount: number): string;
98
+ export declare function replaceTaskSectionInMergedDescription(merged: string, taskFileId: string, newSectionBody: string): string;
99
+ export interface CheckboxConflict {
100
+ id: string;
101
+ base: boolean | undefined;
102
+ local: boolean | undefined;
103
+ remote: boolean | undefined;
104
+ }
105
+ /**
106
+ * One auto-resolved conflict entry (M4). Captured when a non-interactive
107
+ * default picks the Linear or local side so the user can review decisions
108
+ * after the fact in `.planr/reports/linear-sync-conflicts-<date>.md`.
109
+ */
110
+ export interface AutoResolvedConflict {
111
+ label: string;
112
+ id: string;
113
+ base: boolean | undefined;
114
+ local: boolean | undefined;
115
+ remote: boolean | undefined;
116
+ chosen: 'local' | 'linear';
117
+ timestamp: string;
118
+ }
119
+ /**
120
+ * Three-way merge for checkbox `id -> done` and presence. A key is **absent** in a version when the task line is not in that side’s parse.
121
+ * Exported for unit tests.
122
+ */
123
+ export declare function resolveTaskCheckboxFinalStates(local: Map<string, boolean>, remote: Map<string, boolean>, base: Map<string, boolean>, strategy: TaskCheckboxConflictStrategy, label: string, onAutoResolve?: (entry: AutoResolvedConflict) => void): Promise<{
124
+ final: Map<string, boolean>;
125
+ conflictDecisions: number;
126
+ }>;
127
+ /** Drop checkbox lines for ids that should be absent, apply done states, append new lines for ids in `rebuilt` that are still missing. */
128
+ export declare function applyCheckboxMergeToLocalBody(body: string, final: ReadonlyMap<string, boolean>, rebuilt: ParsedSubtask[]): string;
129
+ /**
130
+ * For each `task` artifact with `linearIssueId`, load the shared Linear description (once per issue id),
131
+ * reconcile checkboxes with the local file using three-way merge, then write back local and/or Linear.
132
+ */
133
+ export declare function runLinearTaskCheckboxSync(projectDir: string, config: OpenPlanrConfig, client: LinearClient, opts?: {
134
+ onConflict?: TaskCheckboxConflictStrategy;
135
+ dryRun?: boolean;
136
+ }): Promise<LinearTaskCheckboxSyncSummary>;
137
+ //# sourceMappingURL=linear-pull-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-pull-service.d.ts","sourceRoot":"","sources":["../../src/services/linear-pull-service.ts"],"names":[],"mappings":"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"}