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
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Backlog filtering, ordering, and hygiene helpers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTaskRefinementState = getTaskRefinementState;
7
+ exports.listBacklogTasks = listBacklogTasks;
8
+ exports.getBacklogReadiness = getBacklogReadiness;
9
+ exports.reviewBacklog = reviewBacklog;
10
+ exports.isStaleBacklogTask = isStaleBacklogTask;
11
+ const next_work_1 = require("./next-work");
12
+ const DEFAULT_STALE_AFTER_DAYS = 60;
13
+ const PRIORITY_RANK = {
14
+ critical: 0,
15
+ high: 1,
16
+ medium: 2,
17
+ low: 3
18
+ };
19
+ function getTaskRefinementState(task) {
20
+ return task.refinementState ?? 'ready';
21
+ }
22
+ function listBacklogTasks(repository, options = {}) {
23
+ return Array.from(repository.tasks.values())
24
+ .filter(task => options.includeDone || task.status !== 'done')
25
+ .filter(task => matchesBacklogFilters(task, options))
26
+ .sort((a, b) => compareBacklogTasks(a, b, repository, options.now ?? new Date()));
27
+ }
28
+ function getBacklogReadiness(task, repository, options = {}) {
29
+ const missing = [];
30
+ if (!task.body.trim()) {
31
+ missing.push('body');
32
+ }
33
+ if (!task.priority) {
34
+ missing.push('priority');
35
+ }
36
+ if (options.requireEpic && !task.epic) {
37
+ missing.push('epic');
38
+ }
39
+ if (options.requireMilestone && !task.milestone) {
40
+ missing.push('milestone');
41
+ }
42
+ const readiness = (0, next_work_1.getTaskReadiness)(task, repository);
43
+ return {
44
+ ready: missing.length === 0
45
+ && readiness.blockingTaskIds.length === 0
46
+ && readiness.missingDependencyIds.length === 0,
47
+ missing,
48
+ blockingTaskIds: readiness.blockingTaskIds,
49
+ missingDependencyIds: readiness.missingDependencyIds
50
+ };
51
+ }
52
+ function reviewBacklog(repository, options = {}) {
53
+ const now = options.now ?? new Date();
54
+ return listBacklogTasks(repository, { ...options, now })
55
+ .map(task => {
56
+ const readiness = getBacklogReadiness(task, repository, options);
57
+ const stale = isStaleBacklogTask(task, {
58
+ now,
59
+ staleAfterDays: options.staleAfterDays
60
+ });
61
+ const reasons = [
62
+ ...readiness.missing.map(field => `Missing ${field}`),
63
+ ...readiness.blockingTaskIds.map(id => `Blocked by ${id}`),
64
+ ...readiness.missingDependencyIds.map(id => `Missing dependency ${id}`)
65
+ ];
66
+ if (stale) {
67
+ reasons.push(`No updates in ${options.staleAfterDays ?? DEFAULT_STALE_AFTER_DAYS} days`);
68
+ }
69
+ return {
70
+ task,
71
+ stale,
72
+ incomplete: !readiness.ready,
73
+ reasons,
74
+ recommendations: reviewRecommendations(task, readiness, stale)
75
+ };
76
+ })
77
+ .filter(item => item.stale || item.incomplete);
78
+ }
79
+ function isStaleBacklogTask(task, options = {}) {
80
+ const state = getTaskRefinementState(task);
81
+ if (task.status === 'done' || state === 'discarded') {
82
+ return false;
83
+ }
84
+ const updatedAt = task.updatedAt ? Date.parse(task.updatedAt) : undefined;
85
+ if (!updatedAt || Number.isNaN(updatedAt)) {
86
+ return true;
87
+ }
88
+ const staleAfterDays = options.staleAfterDays ?? DEFAULT_STALE_AFTER_DAYS;
89
+ const now = options.now ?? new Date();
90
+ return now.getTime() - updatedAt >= staleAfterDays * 86400000;
91
+ }
92
+ function matchesBacklogFilters(task, options) {
93
+ if (options.refinementState) {
94
+ const states = Array.isArray(options.refinementState)
95
+ ? options.refinementState
96
+ : [options.refinementState];
97
+ if (!states.includes(getTaskRefinementState(task))) {
98
+ return false;
99
+ }
100
+ }
101
+ if (options.assignee && task.assignee !== options.assignee) {
102
+ return false;
103
+ }
104
+ if (options.epic && task.epic !== options.epic) {
105
+ return false;
106
+ }
107
+ if (options.milestone && task.milestone !== options.milestone) {
108
+ return false;
109
+ }
110
+ if (options.priority && task.priority !== options.priority) {
111
+ return false;
112
+ }
113
+ if (options.tags?.length) {
114
+ const tags = new Set(task.tags ?? []);
115
+ if (!options.tags.every(tag => tags.has(tag))) {
116
+ return false;
117
+ }
118
+ }
119
+ if (options.query && !searchableText(task).includes(options.query.trim().toLowerCase())) {
120
+ return false;
121
+ }
122
+ return true;
123
+ }
124
+ function compareBacklogTasks(a, b, repository, now) {
125
+ return compareScopedOrder(a, b)
126
+ || comparePriority(a.priority, b.priority)
127
+ || compareDates(a.dueDate, b.dueDate, now)
128
+ || compareDates(targetDateForTask(a, repository), targetDateForTask(b, repository), now)
129
+ || a.id.localeCompare(b.id);
130
+ }
131
+ function compareScopedOrder(a, b) {
132
+ const aScope = a.epic ?? 'global';
133
+ const bScope = b.epic ?? 'global';
134
+ if (aScope === bScope) {
135
+ return orderValue(a) - orderValue(b);
136
+ }
137
+ return aScope.localeCompare(bScope);
138
+ }
139
+ function comparePriority(a, b) {
140
+ return priorityValue(a) - priorityValue(b);
141
+ }
142
+ function priorityValue(priority) {
143
+ return priority ? PRIORITY_RANK[priority] : 99;
144
+ }
145
+ function orderValue(task) {
146
+ return typeof task.backlogOrder === 'number'
147
+ ? task.backlogOrder
148
+ : Number.POSITIVE_INFINITY;
149
+ }
150
+ function compareDates(a, b, now) {
151
+ return dateRank(a, now) - dateRank(b, now);
152
+ }
153
+ function dateRank(value, now) {
154
+ if (!value) {
155
+ return Number.POSITIVE_INFINITY;
156
+ }
157
+ const time = Date.parse(value);
158
+ return Number.isNaN(time) ? Number.POSITIVE_INFINITY : time - now.getTime();
159
+ }
160
+ function targetDateForTask(task, repository) {
161
+ return task.epic
162
+ ? repository.epics.get(task.epic)?.targetDate
163
+ : task.milestone
164
+ ? repository.milestones.get(task.milestone)?.targetDate
165
+ : undefined;
166
+ }
167
+ function reviewRecommendations(task, readiness, stale) {
168
+ const recommendations = [];
169
+ if (readiness.missing.includes('body')) {
170
+ recommendations.push('refine');
171
+ }
172
+ if (readiness.missing.includes('priority')) {
173
+ recommendations.push('prioritize');
174
+ }
175
+ if (readiness.missing.includes('epic')) {
176
+ recommendations.push('link to an epic');
177
+ }
178
+ if (readiness.missing.includes('milestone')) {
179
+ recommendations.push('link to a milestone');
180
+ }
181
+ if (readiness.blockingTaskIds.length || readiness.missingDependencyIds.length) {
182
+ recommendations.push('review dependencies');
183
+ }
184
+ if (stale && getTaskRefinementState(task) === 'deferred') {
185
+ recommendations.push('discard or reactivate');
186
+ }
187
+ else if (stale) {
188
+ recommendations.push('refine, defer, or discard');
189
+ }
190
+ return Array.from(new Set(recommendations));
191
+ }
192
+ function searchableText(task) {
193
+ return [
194
+ task.id,
195
+ task.title,
196
+ task.status,
197
+ task.priority,
198
+ task.assignee,
199
+ task.epic,
200
+ task.milestone,
201
+ getTaskRefinementState(task),
202
+ task.tags?.join(' '),
203
+ task.body
204
+ ].filter(Boolean).join(' ').toLowerCase();
205
+ }
206
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../src/backlog.ts"],"names":[],"mappings":"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"}
package/dist/bulk.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Transaction-like bulk task update workflows.
3
+ */
4
+ import { Repository, Task } from './types';
5
+ export type BulkTaskUpdateField = 'status' | 'priority' | 'assignee' | 'milestone' | 'estimate';
6
+ export type BulkTaskUpdatePatch = Partial<Pick<Task, 'status' | 'priority' | 'assignee' | 'milestone' | 'estimate'>>;
7
+ export interface BulkTaskUpdateOptions {
8
+ taskIds: string[];
9
+ patch: BulkTaskUpdatePatch;
10
+ dryRun?: boolean;
11
+ now?: Date;
12
+ expectedUpdatedAt?: Record<string, string | undefined>;
13
+ }
14
+ export interface BulkTaskUpdateChange {
15
+ id: string;
16
+ before: Task;
17
+ task: Task;
18
+ changedFields: BulkTaskUpdateField[];
19
+ preview: string;
20
+ }
21
+ export interface BulkTaskUpdateResult {
22
+ dryRun: boolean;
23
+ taskIds: string[];
24
+ changedTasks: BulkTaskUpdateChange[];
25
+ changedFields: BulkTaskUpdateField[];
26
+ }
27
+ export declare function bulkUpdateTasks(rootPath: string, repository: Repository, options: BulkTaskUpdateOptions): Promise<BulkTaskUpdateResult>;
28
+ export declare function normalizeBulkTaskPatch(patch: BulkTaskUpdatePatch): BulkTaskUpdatePatch;
29
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../src/bulk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,UAAU,EAAE,IAAI,EAA6C,MAAM,SAAS,CAAC;AAEtF,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,UAAU,GACV,UAAU,GACV,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAC5C,IAAI,EACJ,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAC9D,CAAC,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,IAAI,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAKD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAiF/B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAoBtF"}
package/dist/bulk.js ADDED
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Transaction-like bulk task update workflows.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.bulkUpdateTasks = bulkUpdateTasks;
40
+ exports.normalizeBulkTaskPatch = normalizeBulkTaskPatch;
41
+ const files_1 = require("./files");
42
+ const repositoryApi = __importStar(require("./repository"));
43
+ const TASK_STATUSES = ['todo', 'in-progress', 'review', 'done'];
44
+ const TASK_PRIORITIES = ['low', 'medium', 'high', 'critical'];
45
+ async function bulkUpdateTasks(rootPath, repository, options) {
46
+ const taskIds = normalizeTaskIds(options.taskIds);
47
+ if (taskIds.length === 0) {
48
+ throw new Error('At least one task ID is required');
49
+ }
50
+ const patch = normalizeBulkTaskPatch(options.patch);
51
+ const conflicts = findBulkUpdateConflicts(repository, taskIds, options.expectedUpdatedAt);
52
+ if (conflicts.length > 0) {
53
+ throw new Error(`Bulk update conflict: ${conflicts.join('; ')}`);
54
+ }
55
+ const originals = new Map();
56
+ const changedTasks = [];
57
+ const changedFields = new Set();
58
+ const updatedAt = (options.now ?? new Date()).toISOString();
59
+ try {
60
+ for (const taskId of taskIds) {
61
+ const task = repository.tasks.get(taskId);
62
+ const before = cloneTask(task);
63
+ const updated = cloneTask(task);
64
+ const fields = applyBulkTaskPatch(updated, patch);
65
+ originals.set(taskId, before);
66
+ if (fields.length === 0) {
67
+ continue;
68
+ }
69
+ updated.updatedAt = updatedAt;
70
+ repository.tasks.set(taskId, updated);
71
+ fields.forEach(field => changedFields.add(field));
72
+ changedTasks.push({
73
+ id: taskId,
74
+ before,
75
+ task: updated,
76
+ changedFields: fields,
77
+ preview: repositoryApi.generateEntityContent(updated)
78
+ });
79
+ }
80
+ const validation = repositoryApi.validateRepositoryState(repository);
81
+ const errors = validation.errors.filter(error => error.severity === 'error');
82
+ if (errors.length > 0) {
83
+ throw new Error(`Bulk update failed validation: ${formatValidationErrors(errors)}`);
84
+ }
85
+ }
86
+ finally {
87
+ for (const [taskId, original] of originals) {
88
+ repository.tasks.set(taskId, original);
89
+ }
90
+ }
91
+ const result = {
92
+ dryRun: Boolean(options.dryRun),
93
+ taskIds,
94
+ changedTasks,
95
+ changedFields: Array.from(changedFields)
96
+ };
97
+ if (options.dryRun || changedTasks.length === 0) {
98
+ return result;
99
+ }
100
+ const originalContents = new Map();
101
+ try {
102
+ for (const change of changedTasks) {
103
+ if (!change.before.filePath) {
104
+ throw new Error(`Task file path is unavailable: ${change.id}`);
105
+ }
106
+ originalContents.set(change.before.filePath, await (0, files_1.readFile)(change.before.filePath));
107
+ }
108
+ for (const change of changedTasks) {
109
+ await repositoryApi.saveEntity(rootPath, change.task);
110
+ }
111
+ }
112
+ catch (error) {
113
+ await rollbackTaskFiles(originalContents);
114
+ throw error;
115
+ }
116
+ return result;
117
+ }
118
+ function normalizeBulkTaskPatch(patch) {
119
+ const normalized = {};
120
+ for (const [field, value] of Object.entries(patch)) {
121
+ switch (field) {
122
+ case 'status':
123
+ normalized.status = parseEnum(value, TASK_STATUSES, 'status');
124
+ break;
125
+ case 'priority':
126
+ normalized.priority = parseOptionalEnum(value, TASK_PRIORITIES, 'priority');
127
+ break;
128
+ case 'assignee':
129
+ case 'milestone':
130
+ case 'estimate':
131
+ normalized[field] = parseOptionalString(value);
132
+ break;
133
+ default:
134
+ throw new Error(`Unsupported bulk task update field: ${field}`);
135
+ }
136
+ }
137
+ return normalized;
138
+ }
139
+ function findBulkUpdateConflicts(repository, taskIds, expectedUpdatedAt) {
140
+ const conflicts = [];
141
+ for (const taskId of taskIds) {
142
+ const task = repository.tasks.get(taskId);
143
+ if (!task) {
144
+ conflicts.push(`Task not found: ${taskId}`);
145
+ continue;
146
+ }
147
+ if (!task.filePath) {
148
+ conflicts.push(`Task file path is unavailable: ${taskId}`);
149
+ }
150
+ if (expectedUpdatedAt
151
+ && Object.prototype.hasOwnProperty.call(expectedUpdatedAt, taskId)
152
+ && task.updatedAt !== expectedUpdatedAt[taskId]) {
153
+ conflicts.push(`Task changed since preview: ${taskId}`);
154
+ }
155
+ }
156
+ return conflicts;
157
+ }
158
+ function applyBulkTaskPatch(task, patch) {
159
+ const changed = [];
160
+ for (const field of Object.keys(patch)) {
161
+ const nextValue = patch[field];
162
+ if (task[field] === nextValue) {
163
+ continue;
164
+ }
165
+ task[field] = nextValue;
166
+ changed.push(field);
167
+ }
168
+ return changed;
169
+ }
170
+ function normalizeTaskIds(taskIds) {
171
+ return Array.from(new Set(taskIds.map(taskId => taskId.trim()).filter(Boolean)));
172
+ }
173
+ function cloneTask(task) {
174
+ return {
175
+ ...task,
176
+ dependsOn: task.dependsOn ? [...task.dependsOn] : undefined,
177
+ tags: task.tags ? [...task.tags] : undefined,
178
+ links: task.links ? { ...task.links } : undefined,
179
+ metadata: { ...task.metadata }
180
+ };
181
+ }
182
+ async function rollbackTaskFiles(originalContents) {
183
+ await Promise.all(Array.from(originalContents.entries()).map(([filePath, content]) => (0, files_1.writeFile)(filePath, content)));
184
+ }
185
+ function parseEnum(value, allowed, field) {
186
+ if (typeof value !== 'string' || !allowed.includes(value)) {
187
+ throw new Error(`${field} must be one of: ${allowed.join(', ')}`);
188
+ }
189
+ return value;
190
+ }
191
+ function parseOptionalEnum(value, allowed, field) {
192
+ if (value === '') {
193
+ return undefined;
194
+ }
195
+ return parseEnum(value, allowed, field);
196
+ }
197
+ function parseOptionalString(value) {
198
+ if (typeof value !== 'string') {
199
+ throw new Error('Expected a string value');
200
+ }
201
+ return value.trim() || undefined;
202
+ }
203
+ function formatValidationErrors(errors) {
204
+ return errors.slice(0, 3).map(error => error.message).join('; ');
205
+ }
206
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../src/bulk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * File discovery module
3
+ * Discovers and loads PlanFS files from a repository
4
+ */
5
+ export interface DiscoveredFile {
6
+ path: string;
7
+ name: string;
8
+ type: 'task' | 'epic' | 'milestone' | 'decision';
9
+ archived?: boolean;
10
+ }
11
+ export interface PlanfsInitializationResult {
12
+ root: string;
13
+ created: string[];
14
+ existing: string[];
15
+ }
16
+ /**
17
+ * Discover all PlanFS files in a repository
18
+ */
19
+ export declare function discoverFiles(rootPath: string): Promise<DiscoveredFile[]>;
20
+ export declare function discoverArchiveFiles(rootPath: string): Promise<DiscoveredFile[]>;
21
+ /**
22
+ * Read file content
23
+ */
24
+ export declare function readFile(filePath: string): Promise<string>;
25
+ /**
26
+ * Write file content
27
+ */
28
+ export declare function writeFile(filePath: string, content: string): Promise<void>;
29
+ export declare function deleteFile(filePath: string): Promise<void>;
30
+ /**
31
+ * Check if .planfs directory exists
32
+ */
33
+ export declare function planfsDirectoryExists(rootPath: string): Promise<boolean>;
34
+ /**
35
+ * Ensure .planfs directory structure exists
36
+ */
37
+ export declare function ensurePlanfsStructure(rootPath: string): Promise<PlanfsInitializationResult>;
38
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC,CA8B3B;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC,CA6B3B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,0BAA0B,CAAC,CAkBrC"}