planfs-core 1.2.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 (70) hide show
  1. package/README.md +125 -0
  2. package/dist/ai.d.ts +98 -0
  3. package/dist/ai.d.ts.map +1 -0
  4. package/dist/ai.js +265 -0
  5. package/dist/ai.js.map +1 -0
  6. package/dist/backlog.d.ts +40 -0
  7. package/dist/backlog.d.ts.map +1 -0
  8. package/dist/backlog.js +206 -0
  9. package/dist/backlog.js.map +1 -0
  10. package/dist/bulk.d.ts +29 -0
  11. package/dist/bulk.d.ts.map +1 -0
  12. package/dist/bulk.js +206 -0
  13. package/dist/bulk.js.map +1 -0
  14. package/dist/files.d.ts +38 -0
  15. package/dist/files.d.ts.map +1 -0
  16. package/dist/files.js +179 -0
  17. package/dist/files.js.map +1 -0
  18. package/dist/git.d.ts +74 -0
  19. package/dist/git.d.ts.map +1 -0
  20. package/dist/git.js +426 -0
  21. package/dist/git.js.map +1 -0
  22. package/dist/graph.d.ts +56 -0
  23. package/dist/graph.d.ts.map +1 -0
  24. package/dist/graph.js +188 -0
  25. package/dist/graph.js.map +1 -0
  26. package/dist/index.d.ts +20 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +36 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/loader.d.ts +26 -0
  31. package/dist/loader.d.ts.map +1 -0
  32. package/dist/loader.js +248 -0
  33. package/dist/loader.js.map +1 -0
  34. package/dist/milestone.d.ts +23 -0
  35. package/dist/milestone.d.ts.map +1 -0
  36. package/dist/milestone.js +60 -0
  37. package/dist/milestone.js.map +1 -0
  38. package/dist/next-work.d.ts +34 -0
  39. package/dist/next-work.d.ts.map +1 -0
  40. package/dist/next-work.js +239 -0
  41. package/dist/next-work.js.map +1 -0
  42. package/dist/parser.d.ts +37 -0
  43. package/dist/parser.d.ts.map +1 -0
  44. package/dist/parser.js +132 -0
  45. package/dist/parser.js.map +1 -0
  46. package/dist/pull-request.d.ts +38 -0
  47. package/dist/pull-request.d.ts.map +1 -0
  48. package/dist/pull-request.js +147 -0
  49. package/dist/pull-request.js.map +1 -0
  50. package/dist/references.d.ts +10 -0
  51. package/dist/references.d.ts.map +1 -0
  52. package/dist/references.js +30 -0
  53. package/dist/references.js.map +1 -0
  54. package/dist/repository.d.ts +85 -0
  55. package/dist/repository.d.ts.map +1 -0
  56. package/dist/repository.js +495 -0
  57. package/dist/repository.js.map +1 -0
  58. package/dist/search.d.ts +25 -0
  59. package/dist/search.d.ts.map +1 -0
  60. package/dist/search.js +150 -0
  61. package/dist/search.js.map +1 -0
  62. package/dist/types.d.ts +119 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +6 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/validator.d.ts +24 -0
  67. package/dist/validator.d.ts.map +1 -0
  68. package/dist/validator.js +540 -0
  69. package/dist/validator.js.map +1 -0
  70. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # planfs-core
2
+
3
+ Core parsing and validation library for PlanFS.
4
+
5
+ ## Overview
6
+
7
+ `planfs-core` provides the foundation for all PlanFS tools:
8
+
9
+ - **File Discovery** - Discover `.planfs/` files in a repository
10
+ - **Parsing** - Extract YAML frontmatter and markdown body
11
+ - **Type System** - Strong typing for all entity types
12
+ - **Validation** - Schema validation and constraint checking
13
+ - **Repository API** - Load and query repositories
14
+ - **Entity Generation** - Create and serialize entities
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install planfs-core
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ ### Loading a Repository
25
+
26
+ ```typescript
27
+ import { loadRepository, validateRepositoryState } from 'planfs-core';
28
+
29
+ const repo = await loadRepository('/path/to/project');
30
+
31
+ console.log(`Found ${repo.tasks.size} tasks`);
32
+ console.log(`Found ${repo.epics.size} epics`);
33
+
34
+ // Validate
35
+ const result = validateRepositoryState(repo);
36
+ if (!result.valid) {
37
+ console.error('Validation errors:', result.errors);
38
+ }
39
+ ```
40
+
41
+ ### Creating Entities
42
+
43
+ ```typescript
44
+ import { createTaskTemplate, saveEntity } from 'planfs-core';
45
+
46
+ const task = createTaskTemplate('TASK-042', 'Implement feature X');
47
+ task.priority = 'high';
48
+ task.body = 'Detailed description of the work.';
49
+
50
+ await saveEntity('/path/to/project', task);
51
+ ```
52
+
53
+ ### Querying
54
+
55
+ ```typescript
56
+ import { getTasksByStatus, getTasksByAssignee } from 'planfs-core';
57
+
58
+ const todoTasks = getTasksByStatus(repo, 'todo');
59
+ const myTasks = getTasksByAssignee(repo, 'user@example.com');
60
+ ```
61
+
62
+ ## API Reference
63
+
64
+ ### Types
65
+
66
+ - `Entity` - Base entity interface
67
+ - `Task` - Task entity with status, priority, assignee, etc.
68
+ - `Epic` - Epic entity for larger bodies of work
69
+ - `Milestone` - Delivery milestone with target date
70
+ - `Decision` - Architecture decision record
71
+ - `Repository` - Container for all entities
72
+
73
+ ### Functions
74
+
75
+ **File I/O:**
76
+ - `loadRepository(rootPath)` - Load entire repository
77
+ - `initializeRepository(rootPath)` - Initialize new repository
78
+ - `saveEntity(rootPath, entity)` - Save entity to disk
79
+ - `readFile(path)` - Read file content
80
+ - `writeFile(path, content)` - Write file content
81
+
82
+ **Validation:**
83
+ - `validateEntity(entity)` - Validate single entity
84
+ - `validateRepository(entities)` - Validate collection
85
+ - `validateAll(entities)` - Full validation
86
+
87
+ **Querying:**
88
+ - `getTasksByStatus(repo, status)` - Filter tasks by status
89
+ - `getTasksByAssignee(repo, assignee)` - Filter tasks by assignee
90
+ - `getTasksByEpic(repo, epicId)` - Get tasks in epic
91
+ - `getAllEntities(repo)` - Get all entities
92
+ - `getNextTaskId(repo)` - Generate next task ID
93
+
94
+ **Entity Creation:**
95
+ - `createTaskTemplate(id, title)` - Create new task template
96
+ - `generateEntityContent(entity)` - Generate file content from entity
97
+
98
+ ### Parsing
99
+
100
+ - `parseFrontmatter(content)` - Parse YAML frontmatter and markdown
101
+ - `normalizeMetadata(metadata)` - Convert kebab-case and snake_case to camelCase
102
+
103
+ ## Testing
104
+
105
+ Run tests:
106
+ ```bash
107
+ npm test
108
+ ```
109
+
110
+ Run with coverage:
111
+ ```bash
112
+ npm test -- --coverage
113
+ ```
114
+
115
+ ## Architecture
116
+
117
+ See [Architecture Documentation](../../docs/ARCHITECTURE.md) for system design details.
118
+
119
+ ## File Format
120
+
121
+ See [File Format Specification](../../docs/FILE_FORMAT.md) for complete format details.
122
+
123
+ ## License
124
+
125
+ MIT
package/dist/ai.d.ts ADDED
@@ -0,0 +1,98 @@
1
+ /**
2
+ * AI-oriented planning helpers.
3
+ */
4
+ import { RefinementState, Repository, Task, TaskPriority, TaskStatus } from './types';
5
+ export interface PlanningSummaryOptions {
6
+ assignee?: string;
7
+ epic?: string;
8
+ milestone?: string;
9
+ status?: TaskStatus | TaskStatus[];
10
+ refinementState?: RefinementState | RefinementState[];
11
+ limit?: number;
12
+ recentLimit?: number;
13
+ now?: Date;
14
+ }
15
+ export interface PlanningSummaryTask {
16
+ id: string;
17
+ title: string;
18
+ status: TaskStatus;
19
+ filePath: string;
20
+ priority?: TaskPriority;
21
+ assignee?: string;
22
+ epic?: string;
23
+ milestone?: string;
24
+ dueDate?: string;
25
+ refinementState?: RefinementState;
26
+ }
27
+ export interface PlanningSummaryReadinessTask extends PlanningSummaryTask {
28
+ readiness: string;
29
+ blockingTaskIds: string[];
30
+ missingDependencyIds: string[];
31
+ reasons: string[];
32
+ }
33
+ export interface PlanningSummary {
34
+ generatedAt: string;
35
+ scope: {
36
+ assignee?: string;
37
+ epic?: string;
38
+ milestone?: string;
39
+ status?: TaskStatus[];
40
+ refinementState?: RefinementState[];
41
+ };
42
+ counts: {
43
+ tasks: number;
44
+ openTasks: number;
45
+ activeEpics: number;
46
+ activeMilestones: number;
47
+ blockedTasks: number;
48
+ readyTasks: number;
49
+ staleTasks: number;
50
+ recentlyCompletedTasks: number;
51
+ };
52
+ openTasks: PlanningSummaryTask[];
53
+ activeEpics: Array<{
54
+ id: string;
55
+ title: string;
56
+ status: string;
57
+ filePath: string;
58
+ priority?: string;
59
+ targetDate?: string;
60
+ }>;
61
+ activeMilestones: Array<{
62
+ id: string;
63
+ title: string;
64
+ status: string;
65
+ filePath: string;
66
+ targetDate: string;
67
+ }>;
68
+ blockedWork: PlanningSummaryReadinessTask[];
69
+ readyWork: PlanningSummaryReadinessTask[];
70
+ stalePlanIndicators: Array<{
71
+ id: string;
72
+ title: string;
73
+ filePath: string;
74
+ updatedAt?: string;
75
+ reasons: string[];
76
+ }>;
77
+ recentlyCompletedWork: PlanningSummaryTask[];
78
+ }
79
+ export type TaskUpdateField = 'status' | 'priority' | 'assignee' | 'refinementState' | 'dueDate' | 'epic' | 'milestone' | 'tags' | 'estimate';
80
+ export type TaskUpdatePatch = Partial<Pick<Task, 'status' | 'priority' | 'assignee' | 'refinementState' | 'dueDate' | 'epic' | 'milestone' | 'tags' | 'estimate'>>;
81
+ export interface TaskUpdateOptions {
82
+ id: string;
83
+ patch: TaskUpdatePatch;
84
+ dryRun?: boolean;
85
+ now?: Date;
86
+ expectedUpdatedAt?: string | null;
87
+ }
88
+ export interface TaskUpdateResult {
89
+ task: Task;
90
+ before: Task;
91
+ changedFields: TaskUpdateField[];
92
+ dryRun: boolean;
93
+ preview?: string;
94
+ }
95
+ export declare function buildPlanningSummary(repository: Repository, options?: PlanningSummaryOptions): PlanningSummary;
96
+ export declare function updateTaskPlanning(rootPath: string, repository: Repository, options: TaskUpdateOptions): Promise<TaskUpdateResult>;
97
+ export declare function parseTaskUpdatePatch(values: Record<string, unknown>): TaskUpdatePatch;
98
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
package/dist/ai.js ADDED
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ /**
3
+ * AI-oriented planning helpers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildPlanningSummary = buildPlanningSummary;
7
+ exports.updateTaskPlanning = updateTaskPlanning;
8
+ exports.parseTaskUpdatePatch = parseTaskUpdatePatch;
9
+ const backlog_1 = require("./backlog");
10
+ const next_work_1 = require("./next-work");
11
+ const repository_1 = require("./repository");
12
+ const DEFAULT_SUMMARY_LIMIT = 25;
13
+ const DEFAULT_RECENT_LIMIT = 10;
14
+ const OPEN_STATUSES = ['todo', 'in-progress', 'review'];
15
+ const TASK_STATUSES = ['todo', 'in-progress', 'review', 'done'];
16
+ const TASK_PRIORITIES = ['low', 'medium', 'high', 'critical'];
17
+ const REFINEMENT_STATES = ['captured', 'needs-refinement', 'ready', 'deferred', 'discarded'];
18
+ function buildPlanningSummary(repository, options = {}) {
19
+ const now = options.now ?? new Date();
20
+ const scopedTasks = Array.from(repository.tasks.values())
21
+ .filter(task => matchesSummaryScope(task, options));
22
+ const openTasks = scopedTasks.filter(task => OPEN_STATUSES.includes(task.status));
23
+ const nextWork = (0, next_work_1.getNextWorkCandidates)(repository, {
24
+ assignee: options.assignee,
25
+ epic: options.epic,
26
+ milestone: options.milestone,
27
+ status: options.status,
28
+ includeBlocked: true,
29
+ limit: options.limit
30
+ }).filter(candidate => matchesSummaryScope(candidate.task, options));
31
+ const readyWork = nextWork.filter(candidate => ['ready', 'in-progress', 'needs-review'].includes(candidate.readiness.status));
32
+ const blockedWork = nextWork.filter(candidate => ['blocked', 'missing-dependency'].includes(candidate.readiness.status));
33
+ const stalePlanIndicators = openTasks
34
+ .filter(task => (0, backlog_1.isStaleBacklogTask)(task, { now }))
35
+ .map(task => ({
36
+ id: task.id,
37
+ title: task.title,
38
+ filePath: task.filePath,
39
+ updatedAt: task.updatedAt,
40
+ reasons: [task.updatedAt ? 'Task has not been updated recently' : 'Task has no updatedAt timestamp']
41
+ }));
42
+ const recentlyCompletedWork = scopedTasks
43
+ .filter(task => task.status === 'done')
44
+ .sort((a, b) => compareUpdatedAtDesc(a, b))
45
+ .slice(0, options.recentLimit ?? DEFAULT_RECENT_LIMIT)
46
+ .map(toSummaryTask);
47
+ return {
48
+ generatedAt: now.toISOString(),
49
+ scope: {
50
+ assignee: options.assignee,
51
+ epic: options.epic,
52
+ milestone: options.milestone,
53
+ status: normalizeArray(options.status),
54
+ refinementState: normalizeArray(options.refinementState)
55
+ },
56
+ counts: {
57
+ tasks: scopedTasks.length,
58
+ openTasks: openTasks.length,
59
+ activeEpics: Array.from(repository.epics.values()).filter(epic => epic.status === 'active').length,
60
+ activeMilestones: Array.from(repository.milestones.values()).filter(milestone => milestone.status === 'active').length,
61
+ blockedTasks: blockedWork.length,
62
+ readyTasks: readyWork.length,
63
+ staleTasks: stalePlanIndicators.length,
64
+ recentlyCompletedTasks: recentlyCompletedWork.length
65
+ },
66
+ openTasks: openTasks.slice(0, options.limit ?? DEFAULT_SUMMARY_LIMIT).map(toSummaryTask),
67
+ activeEpics: Array.from(repository.epics.values())
68
+ .filter(epic => epic.status === 'active')
69
+ .map(epic => ({
70
+ id: epic.id,
71
+ title: epic.title,
72
+ status: epic.status,
73
+ filePath: epic.filePath,
74
+ priority: epic.priority,
75
+ targetDate: epic.targetDate
76
+ })),
77
+ activeMilestones: Array.from(repository.milestones.values())
78
+ .filter(milestone => milestone.status === 'active')
79
+ .map(milestone => ({
80
+ id: milestone.id,
81
+ title: milestone.title,
82
+ status: milestone.status,
83
+ filePath: milestone.filePath,
84
+ targetDate: milestone.targetDate
85
+ })),
86
+ blockedWork: blockedWork.map(candidate => toReadinessTask(candidate.task, repository, candidate.reasons)),
87
+ readyWork: readyWork.map(candidate => toReadinessTask(candidate.task, repository, candidate.reasons)),
88
+ stalePlanIndicators: stalePlanIndicators.slice(0, options.limit ?? DEFAULT_SUMMARY_LIMIT),
89
+ recentlyCompletedWork
90
+ };
91
+ }
92
+ async function updateTaskPlanning(rootPath, repository, options) {
93
+ const task = repository.tasks.get(options.id);
94
+ if (!task) {
95
+ throw new Error(`Task not found: ${options.id}`);
96
+ }
97
+ const expectedUpdatedAt = options.expectedUpdatedAt === null ? undefined : options.expectedUpdatedAt;
98
+ if (options.expectedUpdatedAt !== undefined && task.updatedAt !== expectedUpdatedAt) {
99
+ throw new Error(`Update conflict: ${options.id} changed since preview`);
100
+ }
101
+ const before = cloneTask(task);
102
+ const updated = cloneTask(task);
103
+ const changedFields = applyTaskPatch(updated, options.patch);
104
+ if (changedFields.length === 0) {
105
+ return { task: updated, before, changedFields, dryRun: Boolean(options.dryRun) };
106
+ }
107
+ updated.updatedAt = (options.now ?? new Date()).toISOString();
108
+ repository.tasks.set(updated.id, updated);
109
+ const validation = (0, repository_1.validateRepositoryState)(repository);
110
+ const errors = validation.errors.filter(error => error.severity === 'error');
111
+ repository.tasks.set(before.id, before);
112
+ if (errors.length > 0) {
113
+ throw new Error(`Update failed validation: ${formatValidationErrors(errors)}`);
114
+ }
115
+ if (!options.dryRun) {
116
+ await (0, repository_1.saveEntity)(rootPath, updated);
117
+ }
118
+ return {
119
+ task: updated,
120
+ before,
121
+ changedFields,
122
+ dryRun: Boolean(options.dryRun),
123
+ preview: options.dryRun ? (0, repository_1.generateEntityContent)(updated) : undefined
124
+ };
125
+ }
126
+ function parseTaskUpdatePatch(values) {
127
+ const patch = {};
128
+ for (const [field, value] of Object.entries(values)) {
129
+ if (value === undefined) {
130
+ continue;
131
+ }
132
+ switch (field) {
133
+ case 'status':
134
+ patch.status = parseEnum(value, TASK_STATUSES, 'status');
135
+ break;
136
+ case 'priority':
137
+ patch.priority = parseOptionalEnum(value, TASK_PRIORITIES, 'priority');
138
+ break;
139
+ case 'refinementState':
140
+ patch.refinementState = parseOptionalEnum(value, REFINEMENT_STATES, 'refinementState');
141
+ break;
142
+ case 'assignee':
143
+ case 'dueDate':
144
+ case 'epic':
145
+ case 'milestone':
146
+ case 'estimate':
147
+ patch[field] = parseOptionalString(value);
148
+ break;
149
+ case 'tags':
150
+ patch.tags = parseTags(value);
151
+ break;
152
+ default:
153
+ throw new Error(`Unsupported task update field: ${field}`);
154
+ }
155
+ }
156
+ return patch;
157
+ }
158
+ function matchesSummaryScope(task, options) {
159
+ if (options.assignee && task.assignee !== options.assignee) {
160
+ return false;
161
+ }
162
+ if (options.epic && task.epic !== options.epic) {
163
+ return false;
164
+ }
165
+ if (options.milestone && task.milestone !== options.milestone) {
166
+ return false;
167
+ }
168
+ if (options.status && !normalizeArray(options.status).includes(task.status)) {
169
+ return false;
170
+ }
171
+ if (options.refinementState && !normalizeArray(options.refinementState).includes(task.refinementState ?? 'ready')) {
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+ function toReadinessTask(task, repository, reasons) {
177
+ const readiness = (0, next_work_1.getTaskReadiness)(task, repository);
178
+ return {
179
+ ...toSummaryTask(task),
180
+ readiness: readiness.status,
181
+ blockingTaskIds: readiness.blockingTaskIds,
182
+ missingDependencyIds: readiness.missingDependencyIds,
183
+ reasons
184
+ };
185
+ }
186
+ function toSummaryTask(task) {
187
+ return {
188
+ id: task.id,
189
+ title: task.title,
190
+ status: task.status,
191
+ filePath: task.filePath,
192
+ priority: task.priority,
193
+ assignee: task.assignee,
194
+ epic: task.epic,
195
+ milestone: task.milestone,
196
+ dueDate: task.dueDate,
197
+ refinementState: task.refinementState
198
+ };
199
+ }
200
+ function applyTaskPatch(task, patch) {
201
+ const changed = [];
202
+ for (const field of Object.keys(patch)) {
203
+ const nextValue = patch[field];
204
+ if (JSON.stringify(task[field]) === JSON.stringify(nextValue)) {
205
+ continue;
206
+ }
207
+ task[field] = nextValue;
208
+ changed.push(field);
209
+ }
210
+ return changed;
211
+ }
212
+ function cloneTask(task) {
213
+ return {
214
+ ...task,
215
+ dependsOn: task.dependsOn ? [...task.dependsOn] : undefined,
216
+ tags: task.tags ? [...task.tags] : undefined,
217
+ links: task.links ? { ...task.links } : undefined,
218
+ metadata: { ...task.metadata }
219
+ };
220
+ }
221
+ function compareUpdatedAtDesc(a, b) {
222
+ return dateValue(b.updatedAt) - dateValue(a.updatedAt) || b.id.localeCompare(a.id);
223
+ }
224
+ function dateValue(value) {
225
+ const parsed = value ? Date.parse(value) : 0;
226
+ return Number.isNaN(parsed) ? 0 : parsed;
227
+ }
228
+ function normalizeArray(value) {
229
+ if (!value) {
230
+ return [];
231
+ }
232
+ return Array.isArray(value) ? value : [value];
233
+ }
234
+ function parseEnum(value, allowed, field) {
235
+ if (typeof value !== 'string' || !allowed.includes(value)) {
236
+ throw new Error(`${field} must be one of: ${allowed.join(', ')}`);
237
+ }
238
+ return value;
239
+ }
240
+ function parseOptionalEnum(value, allowed, field) {
241
+ if (value === '') {
242
+ return undefined;
243
+ }
244
+ return parseEnum(value, allowed, field);
245
+ }
246
+ function parseOptionalString(value) {
247
+ if (typeof value !== 'string') {
248
+ throw new Error('Expected a string value');
249
+ }
250
+ return value.trim() || undefined;
251
+ }
252
+ function parseTags(value) {
253
+ if (typeof value === 'string') {
254
+ const tags = value.split(',').map(tag => tag.trim()).filter(Boolean);
255
+ return tags.length ? tags : undefined;
256
+ }
257
+ if (Array.isArray(value) && value.every(tag => typeof tag === 'string')) {
258
+ return value.map(tag => tag.trim()).filter(Boolean);
259
+ }
260
+ throw new Error('tags must be a comma-separated string or string array');
261
+ }
262
+ function formatValidationErrors(errors) {
263
+ return errors.slice(0, 3).map(error => error.message).join('; ');
264
+ }
265
+ //# sourceMappingURL=ai.js.map
package/dist/ai.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Backlog filtering, ordering, and hygiene helpers.
3
+ */
4
+ import { RefinementState, Repository, Task, TaskPriority } from './types';
5
+ export interface BacklogOptions {
6
+ refinementState?: RefinementState | RefinementState[];
7
+ assignee?: string;
8
+ epic?: string;
9
+ milestone?: string;
10
+ priority?: TaskPriority;
11
+ tags?: string[];
12
+ query?: string;
13
+ requireEpic?: boolean;
14
+ requireMilestone?: boolean;
15
+ includeDone?: boolean;
16
+ now?: Date;
17
+ staleAfterDays?: number;
18
+ }
19
+ export interface BacklogReadiness {
20
+ ready: boolean;
21
+ missing: string[];
22
+ blockingTaskIds: string[];
23
+ missingDependencyIds: string[];
24
+ }
25
+ export interface BacklogReviewItem {
26
+ task: Task;
27
+ stale: boolean;
28
+ incomplete: boolean;
29
+ reasons: string[];
30
+ recommendations: string[];
31
+ }
32
+ export declare function getTaskRefinementState(task: Task): RefinementState;
33
+ export declare function listBacklogTasks(repository: Repository, options?: BacklogOptions): Task[];
34
+ export declare function getBacklogReadiness(task: Task, repository: Repository, options?: Pick<BacklogOptions, 'requireEpic' | 'requireMilestone'>): BacklogReadiness;
35
+ export declare function reviewBacklog(repository: Repository, options?: BacklogOptions): BacklogReviewItem[];
36
+ export declare function isStaleBacklogTask(task: Task, options?: {
37
+ now?: Date;
38
+ staleAfterDays?: number;
39
+ }): boolean;
40
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../src/backlog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,eAAe,GAAG,eAAe,EAAE,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAUD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAElE;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,cAAmB,GAC3B,IAAI,EAAE,CAKR;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,kBAAkB,CAAM,GACrE,gBAAgB,CAwBlB;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,cAAmB,GAC3B,iBAAiB,EAAE,CA4BrB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAcT"}