@refrakt-md/plan 0.9.4 → 0.9.6

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 (81) hide show
  1. package/dist/cli-plugin.d.ts.map +1 -1
  2. package/dist/cli-plugin.js +54 -0
  3. package/dist/cli-plugin.js.map +1 -1
  4. package/dist/commands/build.d.ts.map +1 -1
  5. package/dist/commands/build.js +13 -0
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/history.d.ts +21 -0
  8. package/dist/commands/history.d.ts.map +1 -0
  9. package/dist/commands/history.js +261 -0
  10. package/dist/commands/history.js.map +1 -0
  11. package/dist/commands/next.d.ts.map +1 -1
  12. package/dist/commands/next.js +22 -6
  13. package/dist/commands/next.js.map +1 -1
  14. package/dist/commands/plan-behaviors.js +2 -1
  15. package/dist/commands/plan-behaviors.js.map +1 -1
  16. package/dist/commands/render-pipeline.d.ts.map +1 -1
  17. package/dist/commands/render-pipeline.js +148 -128
  18. package/dist/commands/render-pipeline.js.map +1 -1
  19. package/dist/commands/serve.d.ts.map +1 -1
  20. package/dist/commands/serve.js +54 -0
  21. package/dist/commands/serve.js.map +1 -1
  22. package/dist/commands/templates.js +4 -4
  23. package/dist/commands/templates.js.map +1 -1
  24. package/dist/commands/update.d.ts.map +1 -1
  25. package/dist/commands/update.js +39 -11
  26. package/dist/commands/update.js.map +1 -1
  27. package/dist/commands/validate.d.ts.map +1 -1
  28. package/dist/commands/validate.js +119 -1
  29. package/dist/commands/validate.js.map +1 -1
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +86 -23
  32. package/dist/config.js.map +1 -1
  33. package/dist/entity-tabs-behavior.d.ts +13 -0
  34. package/dist/entity-tabs-behavior.d.ts.map +1 -0
  35. package/dist/entity-tabs-behavior.js +94 -0
  36. package/dist/entity-tabs-behavior.js.map +1 -0
  37. package/dist/history.d.ts +121 -0
  38. package/dist/history.d.ts.map +1 -0
  39. package/dist/history.js +417 -0
  40. package/dist/history.js.map +1 -0
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/pipeline.d.ts +10 -1
  46. package/dist/pipeline.d.ts.map +1 -1
  47. package/dist/pipeline.js +563 -47
  48. package/dist/pipeline.js.map +1 -1
  49. package/dist/scanner.d.ts +10 -2
  50. package/dist/scanner.d.ts.map +1 -1
  51. package/dist/scanner.js +112 -4
  52. package/dist/scanner.js.map +1 -1
  53. package/dist/tags/bug.d.ts.map +1 -1
  54. package/dist/tags/bug.js +22 -1
  55. package/dist/tags/bug.js.map +1 -1
  56. package/dist/tags/decision.d.ts.map +1 -1
  57. package/dist/tags/decision.js +23 -1
  58. package/dist/tags/decision.js.map +1 -1
  59. package/dist/tags/milestone.d.ts.map +1 -1
  60. package/dist/tags/milestone.js +7 -4
  61. package/dist/tags/milestone.js.map +1 -1
  62. package/dist/tags/plan-history.d.ts +4 -0
  63. package/dist/tags/plan-history.d.ts.map +1 -0
  64. package/dist/tags/plan-history.js +46 -0
  65. package/dist/tags/plan-history.js.map +1 -0
  66. package/dist/tags/spec.d.ts.map +1 -1
  67. package/dist/tags/spec.js +4 -5
  68. package/dist/tags/spec.js.map +1 -1
  69. package/dist/tags/work.d.ts.map +1 -1
  70. package/dist/tags/work.js +28 -7
  71. package/dist/tags/work.js.map +1 -1
  72. package/dist/types.d.ts +20 -0
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/util.d.ts +2 -0
  75. package/dist/util.d.ts.map +1 -1
  76. package/dist/util.js +10 -0
  77. package/dist/util.js.map +1 -1
  78. package/package.json +14 -9
  79. package/styles/default.css +0 -586
  80. package/styles/minimal.css +0 -386
  81. package/styles/tokens.css +0 -13
@@ -0,0 +1,417 @@
1
+ // ─── Git-Native Entity History ───
2
+ // Derives structured lifecycle events from git commits for plan entities.
3
+ import { execSync } from 'node:child_process';
4
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ // ─── Parsing ───
7
+ /** Regex to parse the opening Markdoc tag on line 1: {% type key="value" ... %} */
8
+ const TAG_ATTR_RE = /(\w+)="([^"]*)"/g;
9
+ /**
10
+ * Parse attributes from a Markdoc opening tag line.
11
+ * Expects the line to look like: {% type key="value" key2="value2" ... %}
12
+ */
13
+ export function parseTagAttributes(line) {
14
+ const attrs = {};
15
+ let match;
16
+ TAG_ATTR_RE.lastIndex = 0;
17
+ while ((match = TAG_ATTR_RE.exec(line)) !== null) {
18
+ attrs[match[1]] = match[2];
19
+ }
20
+ return attrs;
21
+ }
22
+ /** Checkbox line pattern: - [ ] text or - [x] text (case-insensitive x) */
23
+ const CHECKBOX_RE = /^[\s]*-\s+\[([ xX])\]\s+(.+)/;
24
+ /**
25
+ * Extract all checkbox lines from file content.
26
+ */
27
+ export function parseCheckboxes(content) {
28
+ const results = [];
29
+ for (const line of content.split('\n')) {
30
+ const match = CHECKBOX_RE.exec(line);
31
+ if (match) {
32
+ results.push({
33
+ text: match[2].trim(),
34
+ checked: match[1] !== ' ',
35
+ });
36
+ }
37
+ }
38
+ return results;
39
+ }
40
+ /**
41
+ * Detect whether a ## Resolution section exists in the content.
42
+ */
43
+ export function hasResolutionSection(content) {
44
+ return /^##\s+Resolution\s*$/m.test(content);
45
+ }
46
+ // ─── Diffing ───
47
+ /**
48
+ * Diff two attribute maps and return the changes.
49
+ */
50
+ export function diffAttributes(prev, curr) {
51
+ const changes = [];
52
+ const allKeys = new Set([...Object.keys(prev), ...Object.keys(curr)]);
53
+ for (const key of allKeys) {
54
+ const oldVal = prev[key] ?? null;
55
+ const newVal = curr[key] ?? null;
56
+ if (oldVal !== newVal) {
57
+ changes.push({ field: key, from: oldVal, to: newVal });
58
+ }
59
+ }
60
+ return changes;
61
+ }
62
+ /**
63
+ * Diff two checkbox lists by text matching.
64
+ */
65
+ export function diffCriteria(prev, curr) {
66
+ const changes = [];
67
+ const prevByText = new Map(prev.map(c => [c.text, c.checked]));
68
+ const currByText = new Map(curr.map(c => [c.text, c.checked]));
69
+ // Check for removed or changed criteria
70
+ for (const [text, wasChecked] of prevByText) {
71
+ const isChecked = currByText.get(text);
72
+ if (isChecked === undefined) {
73
+ changes.push({ text, action: 'removed' });
74
+ }
75
+ else if (wasChecked && !isChecked) {
76
+ changes.push({ text, action: 'unchecked' });
77
+ }
78
+ else if (!wasChecked && isChecked) {
79
+ changes.push({ text, action: 'checked' });
80
+ }
81
+ }
82
+ // Check for added criteria
83
+ for (const [text] of currByText) {
84
+ if (!prevByText.has(text)) {
85
+ changes.push({ text, action: 'added' });
86
+ }
87
+ }
88
+ return changes;
89
+ }
90
+ /**
91
+ * Get the ordered list of commits that touched a file (oldest first).
92
+ * Uses --follow to track renames.
93
+ */
94
+ export function getFileCommits(filePath, cwd) {
95
+ try {
96
+ const output = execSync(`git log --follow --format="%H %aI %aN%n%s" -- "${filePath}"`, { cwd, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'] });
97
+ const commits = [];
98
+ const lines = output.trim().split('\n');
99
+ for (let i = 0; i < lines.length; i += 2) {
100
+ const metaLine = lines[i]?.trim();
101
+ const messageLine = lines[i + 1]?.trim();
102
+ if (!metaLine)
103
+ continue;
104
+ // Parse: HASH ISO_DATE AUTHOR_NAME
105
+ const spaceIdx1 = metaLine.indexOf(' ');
106
+ const spaceIdx2 = metaLine.indexOf(' ', spaceIdx1 + 1);
107
+ if (spaceIdx1 === -1 || spaceIdx2 === -1)
108
+ continue;
109
+ const hash = metaLine.slice(0, spaceIdx1);
110
+ const date = metaLine.slice(spaceIdx1 + 1, spaceIdx2);
111
+ const author = metaLine.slice(spaceIdx2 + 1);
112
+ commits.push({ hash, date, author, message: messageLine ?? '' });
113
+ }
114
+ // Reverse to oldest-first for diffing
115
+ commits.reverse();
116
+ return commits;
117
+ }
118
+ catch {
119
+ return [];
120
+ }
121
+ }
122
+ /**
123
+ * Get file contents at a specific commit.
124
+ */
125
+ export function getFileAtCommit(hash, filePath, cwd) {
126
+ try {
127
+ return execSync(`git show "${hash}:${filePath}"`, { cwd, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'] });
128
+ }
129
+ catch {
130
+ // File may not exist at this commit (pre-rename)
131
+ // Try to find the file via diff-tree to handle renames
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Detect whether the current repository is a shallow clone.
137
+ */
138
+ export function isShallowClone(cwd) {
139
+ try {
140
+ const result = execSync('git rev-parse --is-shallow-repository', {
141
+ cwd,
142
+ encoding: 'utf-8',
143
+ stdio: ['pipe', 'pipe', 'pipe'],
144
+ }).trim();
145
+ return result === 'true';
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ function snapshotFromContent(content) {
152
+ const firstLine = content.split('\n')[0] ?? '';
153
+ return {
154
+ attributes: parseTagAttributes(firstLine),
155
+ checkboxes: parseCheckboxes(content),
156
+ hasResolution: hasResolutionSection(content),
157
+ rawContent: content,
158
+ };
159
+ }
160
+ /**
161
+ * Extract the history timeline for a single plan entity file.
162
+ *
163
+ * @param filePath - Path to the entity file, relative to cwd
164
+ * @param cwd - Working directory (typically the repo root or plan directory)
165
+ * @returns Array of HistoryEvent objects, oldest first
166
+ */
167
+ export function extractEntityHistory(filePath, cwd) {
168
+ const commits = getFileCommits(filePath, cwd);
169
+ if (commits.length === 0)
170
+ return [];
171
+ const events = [];
172
+ let prevSnapshot = null;
173
+ for (let i = 0; i < commits.length; i++) {
174
+ const commit = commits[i];
175
+ const content = getFileAtCommit(commit.hash, filePath, cwd);
176
+ // If we can't get the file content (e.g. pre-rename), try the old name
177
+ if (content === null) {
178
+ // For renamed files, the first commits may fail to resolve.
179
+ // Record a content event since we know the file was touched.
180
+ if (i === 0) {
181
+ events.push({
182
+ kind: 'created',
183
+ hash: commit.hash,
184
+ shortHash: commit.hash.slice(0, 7),
185
+ date: commit.date,
186
+ author: commit.author,
187
+ message: commit.message,
188
+ initialAttributes: {},
189
+ });
190
+ }
191
+ continue;
192
+ }
193
+ const snapshot = snapshotFromContent(content);
194
+ const shortHash = commit.hash.slice(0, 7);
195
+ if (i === 0) {
196
+ // First commit — this is the creation event
197
+ events.push({
198
+ kind: 'created',
199
+ hash: commit.hash,
200
+ shortHash,
201
+ date: commit.date,
202
+ author: commit.author,
203
+ message: commit.message,
204
+ initialAttributes: { ...snapshot.attributes },
205
+ });
206
+ }
207
+ else {
208
+ // Subsequent commits — diff against previous snapshot
209
+ const attrChanges = prevSnapshot ? diffAttributes(prevSnapshot.attributes, snapshot.attributes) : [];
210
+ const criteriaChanges = prevSnapshot ? diffCriteria(prevSnapshot.checkboxes, snapshot.checkboxes) : [];
211
+ const resolutionAdded = prevSnapshot ? (!prevSnapshot.hasResolution && snapshot.hasResolution) : false;
212
+ const resolutionModified = prevSnapshot?.hasResolution && snapshot.hasResolution && prevSnapshot.rawContent !== snapshot.rawContent;
213
+ if (attrChanges.length > 0 && criteriaChanges.length > 0) {
214
+ // Both attributes and criteria changed — emit a combined event
215
+ // Attribute changes take priority for the event kind
216
+ events.push({
217
+ kind: 'attributes',
218
+ hash: commit.hash,
219
+ shortHash,
220
+ date: commit.date,
221
+ author: commit.author,
222
+ message: commit.message,
223
+ attributeChanges: attrChanges,
224
+ criteriaChanges,
225
+ });
226
+ }
227
+ else if (attrChanges.length > 0) {
228
+ events.push({
229
+ kind: 'attributes',
230
+ hash: commit.hash,
231
+ shortHash,
232
+ date: commit.date,
233
+ author: commit.author,
234
+ message: commit.message,
235
+ attributeChanges: attrChanges,
236
+ });
237
+ }
238
+ else if (criteriaChanges.length > 0) {
239
+ events.push({
240
+ kind: 'criteria',
241
+ hash: commit.hash,
242
+ shortHash,
243
+ date: commit.date,
244
+ author: commit.author,
245
+ message: commit.message,
246
+ criteriaChanges,
247
+ });
248
+ }
249
+ else if (resolutionAdded || resolutionModified) {
250
+ events.push({
251
+ kind: 'resolution',
252
+ hash: commit.hash,
253
+ shortHash,
254
+ date: commit.date,
255
+ author: commit.author,
256
+ message: commit.message,
257
+ });
258
+ }
259
+ else {
260
+ // File changed but no structured diff detected — content edit
261
+ events.push({
262
+ kind: 'content',
263
+ hash: commit.hash,
264
+ shortHash,
265
+ date: commit.date,
266
+ author: commit.author,
267
+ message: commit.message,
268
+ });
269
+ }
270
+ }
271
+ prevSnapshot = snapshot;
272
+ }
273
+ return events;
274
+ }
275
+ /**
276
+ * Get all commits affecting a directory, with their affected file lists.
277
+ * Returns newest-first (git default).
278
+ */
279
+ export function getBatchCommits(planDir, cwd, since) {
280
+ try {
281
+ // Use %x00 as record separator to avoid ambiguity with blank lines in output
282
+ let cmd = `git log --format="%x00%H %aI %aN%n%s" --name-only -- "${planDir}"`;
283
+ if (since) {
284
+ cmd = `git log --since="${since}" --format="%x00%H %aI %aN%n%s" --name-only -- "${planDir}"`;
285
+ }
286
+ const output = execSync(cmd, {
287
+ cwd,
288
+ encoding: 'utf-8',
289
+ maxBuffer: 10 * 1024 * 1024,
290
+ stdio: ['pipe', 'pipe', 'pipe'],
291
+ });
292
+ const commits = [];
293
+ // Split on the NUL byte record separator we injected
294
+ const blocks = output.split('\x00').filter(b => b.trim() !== '');
295
+ for (const block of blocks) {
296
+ const lines = block.split('\n').filter(l => l.trim() !== '');
297
+ if (lines.length < 2)
298
+ continue;
299
+ const metaLine = lines[0].trim();
300
+ const messageLine = lines[1].trim();
301
+ const spaceIdx1 = metaLine.indexOf(' ');
302
+ const spaceIdx2 = metaLine.indexOf(' ', spaceIdx1 + 1);
303
+ if (spaceIdx1 === -1 || spaceIdx2 === -1)
304
+ continue;
305
+ const hash = metaLine.slice(0, spaceIdx1);
306
+ const date = metaLine.slice(spaceIdx1 + 1, spaceIdx2);
307
+ const author = metaLine.slice(spaceIdx2 + 1);
308
+ const files = lines.slice(2).map(l => l.trim()).filter(l => l.length > 0);
309
+ commits.push({ hash, date, author, message: messageLine, files });
310
+ }
311
+ return commits;
312
+ }
313
+ catch {
314
+ return [];
315
+ }
316
+ }
317
+ /**
318
+ * Extract history for all plan entities in a directory.
319
+ * Groups commits by file path and runs per-entity extraction for files
320
+ * with more than one commit. Single-commit files get a created event.
321
+ *
322
+ * @returns Map of file path → HistoryEvent[]
323
+ */
324
+ export function extractBatchHistory(planDir, cwd, options = {}) {
325
+ const batchCommits = getBatchCommits(planDir, cwd, options.since);
326
+ // Group by file: track which commits touch each file + latest hash
327
+ const fileCommitCounts = new Map();
328
+ const fileLatestHash = new Map();
329
+ for (const commit of batchCommits) {
330
+ for (const file of commit.files) {
331
+ fileCommitCounts.set(file, (fileCommitCounts.get(file) ?? 0) + 1);
332
+ // First occurrence (newest commit) sets the latest hash
333
+ if (!fileLatestHash.has(file)) {
334
+ fileLatestHash.set(file, commit.hash);
335
+ }
336
+ }
337
+ }
338
+ const cache = options.cache;
339
+ const result = new Map();
340
+ for (const [file, count] of fileCommitCounts) {
341
+ // Check cache
342
+ const latestHash = fileLatestHash.get(file);
343
+ if (cache) {
344
+ const cached = cache.entries[file];
345
+ if (cached && cached.latestCommit === latestHash) {
346
+ result.set(file, cached.events);
347
+ continue;
348
+ }
349
+ }
350
+ let events;
351
+ if (count === 1) {
352
+ // Single commit — emit a created event directly from batch data
353
+ const commit = batchCommits.find(c => c.files.includes(file));
354
+ const content = getFileAtCommit(commit.hash, file, cwd);
355
+ const attrs = content ? parseTagAttributes(content.split('\n')[0] ?? '') : {};
356
+ events = [{
357
+ kind: 'created',
358
+ hash: commit.hash,
359
+ shortHash: commit.hash.slice(0, 7),
360
+ date: commit.date,
361
+ author: commit.author,
362
+ message: commit.message,
363
+ initialAttributes: attrs,
364
+ }];
365
+ }
366
+ else {
367
+ events = extractEntityHistory(file, cwd);
368
+ }
369
+ result.set(file, events);
370
+ // Update cache
371
+ if (cache) {
372
+ cache.entries[file] = { latestCommit: latestHash, events };
373
+ }
374
+ }
375
+ return result;
376
+ }
377
+ const HISTORY_CACHE_FILENAME = '.plan-history-cache.json';
378
+ /**
379
+ * Read the history cache from disk.
380
+ */
381
+ export function readHistoryCache(planDir) {
382
+ const cachePath = join(planDir, HISTORY_CACHE_FILENAME);
383
+ if (!existsSync(cachePath))
384
+ return { entries: {} };
385
+ try {
386
+ return JSON.parse(readFileSync(cachePath, 'utf8'));
387
+ }
388
+ catch {
389
+ return { entries: {} };
390
+ }
391
+ }
392
+ /**
393
+ * Write the history cache to disk.
394
+ * Silently skips if the directory doesn't exist or writing fails.
395
+ */
396
+ export function writeHistoryCache(planDir, cache) {
397
+ try {
398
+ writeFileSync(join(planDir, HISTORY_CACHE_FILENAME), JSON.stringify(cache, null, '\t') + '\n');
399
+ }
400
+ catch {
401
+ // Non-critical — cache will be rebuilt next time
402
+ }
403
+ }
404
+ /**
405
+ * Build a unified global timeline from batch history results.
406
+ * Returns events sorted by date descending (newest first), with commit hash grouping info.
407
+ */
408
+ export function buildGlobalTimeline(batchHistory) {
409
+ const allEvents = [];
410
+ for (const events of batchHistory.values()) {
411
+ allEvents.push(...events);
412
+ }
413
+ // Sort newest first
414
+ allEvents.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
415
+ return allEvents;
416
+ }
417
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { RunePackage } from '@refrakt-md/types';
2
2
  export declare const plan: RunePackage;
3
3
  export default plan;
4
- export { scanPlanFiles, parseFile } from './scanner.js';
5
4
  export { planPipelineHooks } from './pipeline.js';
6
- export type { PlanEntity, PlanRuneType, Criterion, ScanCache, ScanCacheEntry, ScanOptions } from './types.js';
5
+ export { parseFileContent, scanPlanSources } from './scanner.js';
6
+ export type { PlanEntity, PlanRuneType, Criterion, FileSource, ScanCache, ScanCacheEntry, ScanOptions } from './types.js';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAcrD,eAAO,MAAM,IAAI,EAAE,WA+HlB,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBrD,eAAO,MAAM,IAAI,EAAE,WAsIlB,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { tabsBehavior } from '@refrakt-md/behaviors';
2
+ import { entityTabsBehavior } from './entity-tabs-behavior.js';
2
3
  import { spec } from './tags/spec.js';
3
4
  import { work } from './tags/work.js';
4
5
  import { bug } from './tags/bug.js';
@@ -8,12 +9,13 @@ import { backlog } from './tags/backlog.js';
8
9
  import { decisionLog } from './tags/decision-log.js';
9
10
  import { planProgress } from './tags/plan-progress.js';
10
11
  import { planActivity } from './tags/plan-activity.js';
12
+ import { planHistory } from './tags/plan-history.js';
11
13
  import { config } from './config.js';
12
14
  import { planPipelineHooks } from './pipeline.js';
13
15
  export const plan = {
14
16
  name: 'plan',
15
17
  displayName: 'Plan',
16
- version: '0.9.4',
18
+ version: '0.9.6',
17
19
  runes: {
18
20
  'spec': {
19
21
  transform: spec,
@@ -129,16 +131,23 @@ Custom properties cascade naturally without JavaScript.
129
131
  reinterprets: {},
130
132
  fixture: `{% plan-activity limit="10" /%}`,
131
133
  },
134
+ 'plan-history': {
135
+ transform: planHistory,
136
+ description: 'Git-native entity history timeline showing attribute transitions, criteria progress, and lifecycle events',
137
+ reinterprets: {},
138
+ fixture: `{% plan-history limit="20" /%}`,
139
+ },
132
140
  },
133
141
  theme: {
134
142
  runes: config,
135
143
  },
136
144
  behaviors: {
137
145
  'milestone-backlog': tabsBehavior,
146
+ 'plan-entity-tabs': entityTabsBehavior,
138
147
  },
139
148
  pipeline: planPipelineHooks,
140
149
  };
141
150
  export default plan;
142
- export { scanPlanFiles, parseFile } from './scanner.js';
143
151
  export { planPipelineHooks } from './pipeline.js';
152
+ export { parseFileContent, scanPlanSources } from './scanner.js';
144
153
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { PackagePipelineHooks, EntityRegistration } from '@refrakt-md/types';
2
+ import { type HistoryEvent } from './history.js';
2
3
  /** A directed reference from one entity to another */
3
4
  export interface EntityRelationship {
4
5
  /** The entity that contains the reference */
@@ -8,8 +9,12 @@ export interface EntityRelationship {
8
9
  toId: string;
9
10
  toType: string;
10
11
  /** Relationship kind */
11
- kind: 'blocks' | 'blocked-by' | 'related';
12
+ kind: 'blocks' | 'blocked-by' | 'depends-on' | 'dependency-of' | 'implements' | 'implemented-by' | 'informs' | 'informed-by' | 'related';
12
13
  }
14
+ /** Set scanner dependency data for the pipeline's aggregate() hook to consume */
15
+ export declare function setScannerDependencies(deps: Map<string, string[]>): void;
16
+ /** Set the plan directory path for the pipeline's aggregate() hook to consume */
17
+ export declare function setPlanDir(dir: string): void;
13
18
  export interface PlanAggregatedData {
14
19
  workEntities: EntityRegistration[];
15
20
  bugEntities: EntityRegistration[];
@@ -18,6 +23,10 @@ export interface PlanAggregatedData {
18
23
  milestoneEntities: EntityRegistration[];
19
24
  /** Bidirectional relationship index: entityId → relationships */
20
25
  relationships: Map<string, EntityRelationship[]>;
26
+ /** Git-derived history events per entity file path */
27
+ history: Map<string, HistoryEvent[]>;
28
+ /** Repository URL for commit links (parsed from git remote or config) */
29
+ repositoryUrl?: string;
21
30
  }
22
31
  export declare const planPipelineHooks: PackagePipelineHooks;
23
32
  //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAiQlF,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IAClC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IAClC,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;IACxC,iEAAiE;IACjE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;CACjD;AASD,eAAO,MAAM,iBAAiB,EAAE,oBA0L/B,CAAC"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQlF,OAAO,EAIN,KAAK,YAAY,EAEjB,MAAM,cAAc,CAAC;AA6QtB,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IAClC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,GAAG,gBAAgB,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;CACzI;AASD,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAGxE;AAQD,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,MAAM,WAAW,kBAAkB;IAClC,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;IACxC,iEAAiE;IACjE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACjD,sDAAsD;IACtD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACrC,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAgCD,eAAO,MAAM,iBAAiB,EAAE,oBAuU/B,CAAC"}