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
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
|
package/dist/ai.d.ts.map
ADDED
|
@@ -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"}
|