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.
- package/README.md +125 -0
- package/dist/ai.d.ts +98 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +265 -0
- package/dist/ai.js.map +1 -0
- package/dist/backlog.d.ts +40 -0
- package/dist/backlog.d.ts.map +1 -0
- package/dist/backlog.js +206 -0
- package/dist/backlog.js.map +1 -0
- package/dist/bulk.d.ts +29 -0
- package/dist/bulk.d.ts.map +1 -0
- package/dist/bulk.js +206 -0
- package/dist/bulk.js.map +1 -0
- package/dist/files.d.ts +38 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +179 -0
- package/dist/files.js.map +1 -0
- package/dist/git.d.ts +74 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +426 -0
- package/dist/git.js.map +1 -0
- package/dist/graph.d.ts +56 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +188 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +248 -0
- package/dist/loader.js.map +1 -0
- package/dist/milestone.d.ts +23 -0
- package/dist/milestone.d.ts.map +1 -0
- package/dist/milestone.js +60 -0
- package/dist/milestone.js.map +1 -0
- package/dist/next-work.d.ts +34 -0
- package/dist/next-work.d.ts.map +1 -0
- package/dist/next-work.js +239 -0
- package/dist/next-work.js.map +1 -0
- package/dist/parser.d.ts +37 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +132 -0
- package/dist/parser.js.map +1 -0
- package/dist/pull-request.d.ts +38 -0
- package/dist/pull-request.d.ts.map +1 -0
- package/dist/pull-request.js +147 -0
- package/dist/pull-request.js.map +1 -0
- package/dist/references.d.ts +10 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +30 -0
- package/dist/references.js.map +1 -0
- package/dist/repository.d.ts +85 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +495 -0
- package/dist/repository.js.map +1 -0
- package/dist/search.d.ts +25 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +150 -0
- package/dist/search.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +24 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +540 -0
- package/dist/validator.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Repository loader
|
|
4
|
+
* Main API for loading and querying a PlanFS repository
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.loadRepository = loadRepository;
|
|
41
|
+
exports.getAllEntities = getAllEntities;
|
|
42
|
+
exports.validateRepositoryState = validateRepositoryState;
|
|
43
|
+
exports.saveEntity = saveEntity;
|
|
44
|
+
exports.generateEntityContent = generateEntityContent;
|
|
45
|
+
exports.isArchivedEntity = isArchivedEntity;
|
|
46
|
+
exports.listArchivedEntities = listArchivedEntities;
|
|
47
|
+
exports.archiveEntity = archiveEntity;
|
|
48
|
+
exports.restoreArchivedEntity = restoreArchivedEntity;
|
|
49
|
+
exports.deleteArchivedEntity = deleteArchivedEntity;
|
|
50
|
+
exports.getTasksByStatus = getTasksByStatus;
|
|
51
|
+
exports.getTasksByAssignee = getTasksByAssignee;
|
|
52
|
+
exports.getTasksByEpic = getTasksByEpic;
|
|
53
|
+
exports.initializeRepository = initializeRepository;
|
|
54
|
+
exports.getNextTaskId = getNextTaskId;
|
|
55
|
+
exports.getNextEpicId = getNextEpicId;
|
|
56
|
+
exports.getNextMilestoneId = getNextMilestoneId;
|
|
57
|
+
exports.createTaskTemplate = createTaskTemplate;
|
|
58
|
+
exports.createEpicTemplate = createEpicTemplate;
|
|
59
|
+
exports.createMilestoneTemplate = createMilestoneTemplate;
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
const yaml_1 = require("yaml");
|
|
62
|
+
const files_1 = require("./files");
|
|
63
|
+
const loader_1 = require("./loader");
|
|
64
|
+
const references_1 = require("./references");
|
|
65
|
+
const validator_1 = require("./validator");
|
|
66
|
+
/**
|
|
67
|
+
* Load a PlanFS repository
|
|
68
|
+
*/
|
|
69
|
+
async function loadRepository(rootPath) {
|
|
70
|
+
// Check if .planfs directory exists
|
|
71
|
+
const exists = await (0, files_1.planfsDirectoryExists)(rootPath);
|
|
72
|
+
if (!exists) {
|
|
73
|
+
throw new Error(`No .planfs directory found in ${rootPath}. Initialize with ensurePlanfsStructure() first.`);
|
|
74
|
+
}
|
|
75
|
+
const repository = {
|
|
76
|
+
root: rootPath,
|
|
77
|
+
tasks: new Map(),
|
|
78
|
+
epics: new Map(),
|
|
79
|
+
milestones: new Map(),
|
|
80
|
+
decisions: new Map(),
|
|
81
|
+
archivedTasks: new Map(),
|
|
82
|
+
archivedEpics: new Map(),
|
|
83
|
+
diagnostics: []
|
|
84
|
+
};
|
|
85
|
+
// Discover and load all files
|
|
86
|
+
const files = await (0, files_1.discoverFiles)(rootPath);
|
|
87
|
+
for (const file of files) {
|
|
88
|
+
try {
|
|
89
|
+
const content = await (0, files_1.readFile)(file.path);
|
|
90
|
+
const entity = (0, loader_1.loadEntity)(file, content, { tolerant: true });
|
|
91
|
+
switch (entity.type) {
|
|
92
|
+
case 'task':
|
|
93
|
+
repository.tasks.set(entity.id, entity);
|
|
94
|
+
break;
|
|
95
|
+
case 'epic':
|
|
96
|
+
repository.epics.set(entity.id, entity);
|
|
97
|
+
break;
|
|
98
|
+
case 'milestone':
|
|
99
|
+
repository.milestones.set(entity.id, entity);
|
|
100
|
+
break;
|
|
101
|
+
case 'decision':
|
|
102
|
+
repository.decisions.set(entity.id, entity);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const message = `Failed to load entity from ${file.path}: ${error instanceof Error ? error.message : String(error)}`;
|
|
108
|
+
repository.diagnostics?.push({
|
|
109
|
+
path: file.path,
|
|
110
|
+
message: `${message}. Repair by restoring valid YAML frontmatter with id and title fields.`,
|
|
111
|
+
severity: 'error'
|
|
112
|
+
});
|
|
113
|
+
console.error(message);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const archivedFiles = await (0, files_1.discoverArchiveFiles)(rootPath);
|
|
117
|
+
for (const file of archivedFiles) {
|
|
118
|
+
try {
|
|
119
|
+
const content = await (0, files_1.readFile)(file.path);
|
|
120
|
+
const entity = (0, loader_1.loadEntity)(file, content, { tolerant: true });
|
|
121
|
+
if (entity.type === 'task') {
|
|
122
|
+
repository.archivedTasks?.set(entity.id, entity);
|
|
123
|
+
}
|
|
124
|
+
else if (entity.type === 'epic') {
|
|
125
|
+
repository.archivedEpics?.set(entity.id, entity);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
const message = `Failed to load archived entity from ${file.path}: ${error instanceof Error ? error.message : String(error)}`;
|
|
130
|
+
repository.diagnostics?.push({
|
|
131
|
+
path: file.path,
|
|
132
|
+
message: `${message}. Repair by restoring valid YAML frontmatter with id and title fields.`,
|
|
133
|
+
severity: 'error'
|
|
134
|
+
});
|
|
135
|
+
console.error(message);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return repository;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get all entities from a repository
|
|
142
|
+
*/
|
|
143
|
+
function getAllEntities(repository, options = {}) {
|
|
144
|
+
const entities = [];
|
|
145
|
+
entities.push(...Array.from(repository.tasks.values()));
|
|
146
|
+
entities.push(...Array.from(repository.epics.values()));
|
|
147
|
+
entities.push(...Array.from(repository.milestones.values()));
|
|
148
|
+
entities.push(...Array.from(repository.decisions.values()));
|
|
149
|
+
if (options.includeArchived) {
|
|
150
|
+
entities.push(...Array.from(repository.archivedTasks?.values() ?? []));
|
|
151
|
+
entities.push(...Array.from(repository.archivedEpics?.values() ?? []));
|
|
152
|
+
}
|
|
153
|
+
return entities;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validate a repository
|
|
157
|
+
*/
|
|
158
|
+
function validateRepositoryState(repository) {
|
|
159
|
+
const entities = getAllEntities(repository);
|
|
160
|
+
const archivedEntities = (0, references_1.listArchivedReferenceEntities)(repository);
|
|
161
|
+
const entityErrors = [
|
|
162
|
+
...entities.flatMap(entity => (0, validator_1.validateEntity)(entity)),
|
|
163
|
+
...archivedEntities.flatMap(entity => (0, validator_1.validateEntity)(entity))
|
|
164
|
+
];
|
|
165
|
+
const repositoryErrors = (0, validator_1.validateRepository)(entities, {
|
|
166
|
+
referenceEntities: archivedEntities
|
|
167
|
+
});
|
|
168
|
+
const errors = [...entityErrors, ...repositoryErrors];
|
|
169
|
+
errors.push(...repository.diagnostics ?? []);
|
|
170
|
+
return {
|
|
171
|
+
valid: !errors.some(error => error.severity === 'error'),
|
|
172
|
+
errors
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Save an entity to disk
|
|
177
|
+
*/
|
|
178
|
+
async function saveEntity(rootPath, entity) {
|
|
179
|
+
assertSafeSaveIdentity(entity);
|
|
180
|
+
const dir = entity.archive && (entity.type === 'task' || entity.type === 'epic')
|
|
181
|
+
? path.join('archive', (0, loader_1.getEntityDirectory)(entity.type))
|
|
182
|
+
: (0, loader_1.getEntityDirectory)(entity.type);
|
|
183
|
+
const filename = (0, loader_1.getFilenameFromId)(entity.id);
|
|
184
|
+
const filePath = path.join(rootPath, '.planfs', dir, filename);
|
|
185
|
+
const content = generateEntityContent(entity);
|
|
186
|
+
await (0, files_1.writeFile)(filePath, content);
|
|
187
|
+
}
|
|
188
|
+
function assertSafeSaveIdentity(entity) {
|
|
189
|
+
if (!entity.id || typeof entity.id !== 'string') {
|
|
190
|
+
throw new Error('Refusing to save entity with missing id. Repair the id field before saving.');
|
|
191
|
+
}
|
|
192
|
+
if (!entity.filePath) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const existingId = path.basename(entity.filePath, '.md');
|
|
196
|
+
if (existingId && existingId !== entity.id) {
|
|
197
|
+
throw new Error(`Refusing to save ${entity.id}: entity id does not match existing file name ${existingId}. Repair the id field or rename the file before saving.`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Generate file content from an entity
|
|
202
|
+
*/
|
|
203
|
+
function generateEntityContent(entity) {
|
|
204
|
+
const metadata = { ...entity.metadata };
|
|
205
|
+
metadata.id = entity.id;
|
|
206
|
+
metadata.title = entity.title || '';
|
|
207
|
+
metadata.status = entity.status || '';
|
|
208
|
+
if (entity.archive)
|
|
209
|
+
metadata.archive = entity.archive;
|
|
210
|
+
// Add type-specific metadata
|
|
211
|
+
switch (entity.type) {
|
|
212
|
+
case 'task': {
|
|
213
|
+
const task = entity;
|
|
214
|
+
if (task.priority)
|
|
215
|
+
metadata.priority = task.priority;
|
|
216
|
+
if (task.assignee)
|
|
217
|
+
metadata.assignee = task.assignee;
|
|
218
|
+
if (task.epic)
|
|
219
|
+
metadata.epic = task.epic;
|
|
220
|
+
if (task.milestone)
|
|
221
|
+
metadata.milestone = task.milestone;
|
|
222
|
+
if (task.dependsOn)
|
|
223
|
+
metadata.dependsOn = task.dependsOn;
|
|
224
|
+
if (task.tags)
|
|
225
|
+
metadata.tags = task.tags;
|
|
226
|
+
if (task.dueDate)
|
|
227
|
+
metadata.dueDate = task.dueDate;
|
|
228
|
+
if (task.estimate)
|
|
229
|
+
metadata.estimate = task.estimate;
|
|
230
|
+
if (task.refinementState)
|
|
231
|
+
metadata.refinementState = task.refinementState;
|
|
232
|
+
if (task.backlogOrder !== undefined)
|
|
233
|
+
metadata.backlogOrder = task.backlogOrder;
|
|
234
|
+
if (task.links)
|
|
235
|
+
metadata.links = task.links;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
case 'epic': {
|
|
239
|
+
const epic = entity;
|
|
240
|
+
if (epic.priority)
|
|
241
|
+
metadata.priority = epic.priority;
|
|
242
|
+
if (epic.owner)
|
|
243
|
+
metadata.owner = epic.owner;
|
|
244
|
+
if (epic.description)
|
|
245
|
+
metadata.description = epic.description;
|
|
246
|
+
if (epic.targetDate)
|
|
247
|
+
metadata.targetDate = epic.targetDate;
|
|
248
|
+
if (epic.tags)
|
|
249
|
+
metadata.tags = epic.tags;
|
|
250
|
+
if (epic.links)
|
|
251
|
+
metadata.links = epic.links;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
case 'milestone': {
|
|
255
|
+
const milestone = entity;
|
|
256
|
+
metadata.targetDate = milestone.targetDate;
|
|
257
|
+
if (milestone.description)
|
|
258
|
+
metadata.description = milestone.description;
|
|
259
|
+
if (milestone.owner)
|
|
260
|
+
metadata.owner = milestone.owner;
|
|
261
|
+
if (milestone.links)
|
|
262
|
+
metadata.links = milestone.links;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case 'decision': {
|
|
266
|
+
const decision = entity;
|
|
267
|
+
if (decision.date)
|
|
268
|
+
metadata.date = decision.date;
|
|
269
|
+
if (decision.context)
|
|
270
|
+
metadata.context = decision.context;
|
|
271
|
+
if (decision.decision)
|
|
272
|
+
metadata.decision = decision.decision;
|
|
273
|
+
if (decision.consequences)
|
|
274
|
+
metadata.consequences = decision.consequences;
|
|
275
|
+
if (decision.author)
|
|
276
|
+
metadata.author = decision.author;
|
|
277
|
+
if (decision.supersedes)
|
|
278
|
+
metadata.supersedes = decision.supersedes;
|
|
279
|
+
if (decision.supersededBy)
|
|
280
|
+
metadata.supersededBy = decision.supersededBy;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (entity.createdAt)
|
|
285
|
+
metadata.createdAt = entity.createdAt;
|
|
286
|
+
if (entity.updatedAt)
|
|
287
|
+
metadata.updatedAt = entity.updatedAt;
|
|
288
|
+
return `---\n${(0, yaml_1.stringify)(metadata).trimEnd()}\n---\n\n${entity.body}`;
|
|
289
|
+
}
|
|
290
|
+
function isArchivedEntity(entity) {
|
|
291
|
+
return Boolean(entity.archive);
|
|
292
|
+
}
|
|
293
|
+
function listArchivedEntities(repository) {
|
|
294
|
+
return [
|
|
295
|
+
...Array.from(repository.archivedTasks?.values() ?? []),
|
|
296
|
+
...Array.from(repository.archivedEpics?.values() ?? [])
|
|
297
|
+
];
|
|
298
|
+
}
|
|
299
|
+
async function archiveEntity(rootPath, entityId, options = {}) {
|
|
300
|
+
const repository = await loadRepository(rootPath);
|
|
301
|
+
const entity = repository.tasks.get(entityId) ?? repository.epics.get(entityId);
|
|
302
|
+
if (!entity) {
|
|
303
|
+
throw new Error(`Active task or epic not found: ${entityId}`);
|
|
304
|
+
}
|
|
305
|
+
const toArchive = [entity];
|
|
306
|
+
if (entity.type === 'epic' && options.includeChildren) {
|
|
307
|
+
toArchive.push(...Array.from(repository.tasks.values()).filter(task => task.epic === entity.id));
|
|
308
|
+
}
|
|
309
|
+
const archived = [];
|
|
310
|
+
const archivedAt = (options.now ?? new Date()).toISOString();
|
|
311
|
+
for (const current of toArchive) {
|
|
312
|
+
const originalPath = path.relative(rootPath, current.filePath);
|
|
313
|
+
const archive = { archivedAt, originalPath };
|
|
314
|
+
const archivedEntity = {
|
|
315
|
+
...current,
|
|
316
|
+
archive,
|
|
317
|
+
updatedAt: archivedAt,
|
|
318
|
+
metadata: {
|
|
319
|
+
...current.metadata,
|
|
320
|
+
archive,
|
|
321
|
+
updatedAt: archivedAt
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
await saveEntity(rootPath, archivedEntity);
|
|
325
|
+
await (0, files_1.deleteFile)(current.filePath);
|
|
326
|
+
archived.push(archivedEntity);
|
|
327
|
+
}
|
|
328
|
+
return { archived };
|
|
329
|
+
}
|
|
330
|
+
async function restoreArchivedEntity(rootPath, entityId, options = {}) {
|
|
331
|
+
const repository = await loadRepository(rootPath);
|
|
332
|
+
const entity = repository.archivedTasks?.get(entityId) ?? repository.archivedEpics?.get(entityId);
|
|
333
|
+
if (!entity) {
|
|
334
|
+
throw new Error(`Archived task or epic not found: ${entityId}`);
|
|
335
|
+
}
|
|
336
|
+
const restoredAt = (options.now ?? new Date()).toISOString();
|
|
337
|
+
const restored = removeArchiveMetadata({
|
|
338
|
+
...entity,
|
|
339
|
+
updatedAt: restoredAt,
|
|
340
|
+
metadata: {
|
|
341
|
+
...entity.metadata,
|
|
342
|
+
updatedAt: restoredAt
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
if (restored.type === 'task' && options.recalculateBacklogOrder !== false) {
|
|
346
|
+
restored.backlogOrder = nextBacklogOrder(repository, restored);
|
|
347
|
+
}
|
|
348
|
+
await saveEntity(rootPath, restored);
|
|
349
|
+
await (0, files_1.deleteFile)(entity.filePath);
|
|
350
|
+
return restored;
|
|
351
|
+
}
|
|
352
|
+
async function deleteArchivedEntity(rootPath, entityId) {
|
|
353
|
+
const repository = await loadRepository(rootPath);
|
|
354
|
+
const entity = repository.archivedTasks?.get(entityId) ?? repository.archivedEpics?.get(entityId);
|
|
355
|
+
if (!entity) {
|
|
356
|
+
throw new Error(`Archived task or epic not found: ${entityId}`);
|
|
357
|
+
}
|
|
358
|
+
await (0, files_1.deleteFile)(entity.filePath);
|
|
359
|
+
return entity;
|
|
360
|
+
}
|
|
361
|
+
function removeArchiveMetadata(entity) {
|
|
362
|
+
const copy = { ...entity, metadata: { ...entity.metadata } };
|
|
363
|
+
delete copy.archive;
|
|
364
|
+
delete copy.metadata.archive;
|
|
365
|
+
return copy;
|
|
366
|
+
}
|
|
367
|
+
function nextBacklogOrder(repository, task) {
|
|
368
|
+
const scope = task.epic ?? 'global';
|
|
369
|
+
const orders = Array.from(repository.tasks.values())
|
|
370
|
+
.filter(candidate => (candidate.epic ?? 'global') === scope)
|
|
371
|
+
.map(candidate => candidate.backlogOrder)
|
|
372
|
+
.filter((value) => typeof value === 'number');
|
|
373
|
+
return orders.length > 0 ? Math.max(...orders) + 10 : 10;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Query tasks by status
|
|
377
|
+
*/
|
|
378
|
+
function getTasksByStatus(repository, status) {
|
|
379
|
+
return Array.from(repository.tasks.values()).filter(task => task.status === status);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Query tasks by assignee
|
|
383
|
+
*/
|
|
384
|
+
function getTasksByAssignee(repository, assignee) {
|
|
385
|
+
return Array.from(repository.tasks.values()).filter(task => task.assignee === assignee);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Query tasks by epic
|
|
389
|
+
*/
|
|
390
|
+
function getTasksByEpic(repository, epicId) {
|
|
391
|
+
return Array.from(repository.tasks.values()).filter(task => task.epic === epicId);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Initialize a new repository
|
|
395
|
+
*/
|
|
396
|
+
async function initializeRepository(rootPath) {
|
|
397
|
+
return (0, files_1.ensurePlanfsStructure)(rootPath);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Get next task ID
|
|
401
|
+
*/
|
|
402
|
+
function getNextTaskId(repository) {
|
|
403
|
+
let maxNum = 0;
|
|
404
|
+
for (const id of repository.tasks.keys()) {
|
|
405
|
+
if (id.startsWith('TASK-')) {
|
|
406
|
+
const num = parseInt(id.substring(5), 10);
|
|
407
|
+
if (!isNaN(num) && num > maxNum) {
|
|
408
|
+
maxNum = num;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return `TASK-${String(maxNum + 1).padStart(3, '0')}`;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get an available epic ID from a title
|
|
416
|
+
*/
|
|
417
|
+
function getNextEpicId(repository, title) {
|
|
418
|
+
return getAvailableSlugId('EPIC', title, repository.epics);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Get an available milestone ID from a title
|
|
422
|
+
*/
|
|
423
|
+
function getNextMilestoneId(repository, title) {
|
|
424
|
+
return getAvailableSlugId('MILESTONE', title, repository.milestones);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Create a new task template
|
|
428
|
+
*/
|
|
429
|
+
function createTaskTemplate(id, title) {
|
|
430
|
+
const now = new Date().toISOString();
|
|
431
|
+
return {
|
|
432
|
+
id,
|
|
433
|
+
type: 'task',
|
|
434
|
+
title,
|
|
435
|
+
status: 'todo',
|
|
436
|
+
filePath: '',
|
|
437
|
+
metadata: {},
|
|
438
|
+
body: '',
|
|
439
|
+
createdAt: now,
|
|
440
|
+
updatedAt: now
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Create a new epic template
|
|
445
|
+
*/
|
|
446
|
+
function createEpicTemplate(id, title) {
|
|
447
|
+
const now = new Date().toISOString();
|
|
448
|
+
return {
|
|
449
|
+
id,
|
|
450
|
+
type: 'epic',
|
|
451
|
+
title,
|
|
452
|
+
status: 'active',
|
|
453
|
+
filePath: '',
|
|
454
|
+
metadata: {},
|
|
455
|
+
body: '',
|
|
456
|
+
createdAt: now,
|
|
457
|
+
updatedAt: now
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Create a new milestone template
|
|
462
|
+
*/
|
|
463
|
+
function createMilestoneTemplate(id, title, targetDate) {
|
|
464
|
+
const now = new Date().toISOString();
|
|
465
|
+
return {
|
|
466
|
+
id,
|
|
467
|
+
type: 'milestone',
|
|
468
|
+
title,
|
|
469
|
+
status: 'active',
|
|
470
|
+
targetDate,
|
|
471
|
+
filePath: '',
|
|
472
|
+
metadata: {},
|
|
473
|
+
body: '',
|
|
474
|
+
createdAt: now,
|
|
475
|
+
updatedAt: now
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
function getAvailableSlugId(prefix, title, existing) {
|
|
479
|
+
const base = `${prefix}-${slugify(title)}`;
|
|
480
|
+
let candidate = base;
|
|
481
|
+
let suffix = 2;
|
|
482
|
+
while (existing.has(candidate)) {
|
|
483
|
+
candidate = `${base}-${suffix}`;
|
|
484
|
+
suffix += 1;
|
|
485
|
+
}
|
|
486
|
+
return candidate;
|
|
487
|
+
}
|
|
488
|
+
function slugify(value) {
|
|
489
|
+
return value
|
|
490
|
+
.trim()
|
|
491
|
+
.toLowerCase()
|
|
492
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
493
|
+
.replace(/^-+|-+$/g, '') || 'untitled';
|
|
494
|
+
}
|
|
495
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search and filtering helpers
|
|
3
|
+
*/
|
|
4
|
+
import { Entity, Repository, Task } from './types';
|
|
5
|
+
export interface EntityFilterCriteria {
|
|
6
|
+
query?: string;
|
|
7
|
+
status?: string | string[];
|
|
8
|
+
assignee?: string;
|
|
9
|
+
epic?: string;
|
|
10
|
+
milestone?: string;
|
|
11
|
+
priority?: string;
|
|
12
|
+
refinementState?: string;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface SavedFilter {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
criteria: EntityFilterCriteria;
|
|
20
|
+
}
|
|
21
|
+
export declare function searchEntities(repository: Repository, criteria?: EntityFilterCriteria): Entity[];
|
|
22
|
+
export declare function searchTasks(repository: Repository, criteria?: EntityFilterCriteria): Task[];
|
|
23
|
+
export declare function matchesCriteria(entity: Entity, criteria?: EntityFilterCriteria): boolean;
|
|
24
|
+
export declare function loadSavedFilters(rootPath: string): Promise<SavedFilter[]>;
|
|
25
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,QAAQ,GAAE,oBAAyB,GAClC,MAAM,EAAE,CAEV;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,QAAQ,GAAE,oBAAyB,GAClC,IAAI,EAAE,CAIR;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,oBAAyB,GAClC,OAAO,CAgDT;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0B/E"}
|