octie-cli 1.0.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 +523 -0
- package/dist/cli/commands/approve.d.ts +27 -0
- package/dist/cli/commands/approve.d.ts.map +1 -0
- package/dist/cli/commands/approve.js +119 -0
- package/dist/cli/commands/approve.js.map +1 -0
- package/dist/cli/commands/batch.d.ts +15 -0
- package/dist/cli/commands/batch.d.ts.map +1 -0
- package/dist/cli/commands/batch.js +521 -0
- package/dist/cli/commands/batch.js.map +1 -0
- package/dist/cli/commands/create.d.ts +9 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +321 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +9 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +143 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +66 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/find.d.ts +16 -0
- package/dist/cli/commands/find.d.ts.map +1 -0
- package/dist/cli/commands/find.js +252 -0
- package/dist/cli/commands/find.js.map +1 -0
- package/dist/cli/commands/get.d.ts +9 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +74 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +9 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +200 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +807 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +57 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +9 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +175 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/merge.d.ts +9 -0
- package/dist/cli/commands/merge.d.ts.map +1 -0
- package/dist/cli/commands/merge.js +113 -0
- package/dist/cli/commands/merge.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +94 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/update.d.ts +9 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +423 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/wire.d.ts +15 -0
- package/dist/cli/commands/wire.d.ts.map +1 -0
- package/dist/cli/commands/wire.js +164 -0
- package/dist/cli/commands/wire.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +100 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/json.d.ts +16 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +29 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/markdown.d.ts +15 -0
- package/dist/cli/output/markdown.d.ts.map +1 -0
- package/dist/cli/output/markdown.js +206 -0
- package/dist/cli/output/markdown.js.map +1 -0
- package/dist/cli/output/table.d.ts +23 -0
- package/dist/cli/output/table.d.ts.map +1 -0
- package/dist/cli/output/table.js +150 -0
- package/dist/cli/output/table.js.map +1 -0
- package/dist/cli/utils/helpers.d.ts +126 -0
- package/dist/cli/utils/helpers.d.ts.map +1 -0
- package/dist/cli/utils/helpers.js +325 -0
- package/dist/cli/utils/helpers.js.map +1 -0
- package/dist/core/graph/algorithms.d.ts +11 -0
- package/dist/core/graph/algorithms.d.ts.map +1 -0
- package/dist/core/graph/algorithms.js +14 -0
- package/dist/core/graph/algorithms.js.map +1 -0
- package/dist/core/graph/cycle.d.ts +155 -0
- package/dist/core/graph/cycle.d.ts.map +1 -0
- package/dist/core/graph/cycle.js +297 -0
- package/dist/core/graph/cycle.js.map +1 -0
- package/dist/core/graph/index.d.ts +223 -0
- package/dist/core/graph/index.d.ts.map +1 -0
- package/dist/core/graph/index.js +475 -0
- package/dist/core/graph/index.js.map +1 -0
- package/dist/core/graph/operations.d.ts +240 -0
- package/dist/core/graph/operations.d.ts.map +1 -0
- package/dist/core/graph/operations.js +503 -0
- package/dist/core/graph/operations.js.map +1 -0
- package/dist/core/graph/sort.d.ts +76 -0
- package/dist/core/graph/sort.d.ts.map +1 -0
- package/dist/core/graph/sort.js +254 -0
- package/dist/core/graph/sort.js.map +1 -0
- package/dist/core/graph/traversal.d.ts +122 -0
- package/dist/core/graph/traversal.d.ts.map +1 -0
- package/dist/core/graph/traversal.js +336 -0
- package/dist/core/graph/traversal.js.map +1 -0
- package/dist/core/models/task-node.d.ts +328 -0
- package/dist/core/models/task-node.d.ts.map +1 -0
- package/dist/core/models/task-node.js +1090 -0
- package/dist/core/models/task-node.js.map +1 -0
- package/dist/core/registry/index.d.ts +102 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +249 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/root-guard.d.ts +19 -0
- package/dist/core/registry/root-guard.d.ts.map +1 -0
- package/dist/core/registry/root-guard.js +28 -0
- package/dist/core/registry/root-guard.js.map +1 -0
- package/dist/core/storage/atomic-write.d.ts +181 -0
- package/dist/core/storage/atomic-write.d.ts.map +1 -0
- package/dist/core/storage/atomic-write.js +379 -0
- package/dist/core/storage/atomic-write.js.map +1 -0
- package/dist/core/storage/file-store.d.ts +148 -0
- package/dist/core/storage/file-store.d.ts.map +1 -0
- package/dist/core/storage/file-store.js +423 -0
- package/dist/core/storage/file-store.js.map +1 -0
- package/dist/core/storage/indexer.d.ts +138 -0
- package/dist/core/storage/indexer.d.ts.map +1 -0
- package/dist/core/storage/indexer.js +350 -0
- package/dist/core/storage/indexer.js.map +1 -0
- package/dist/core/utils/status-helpers.d.ts +59 -0
- package/dist/core/utils/status-helpers.d.ts.map +1 -0
- package/dist/core/utils/status-helpers.js +149 -0
- package/dist/core/utils/status-helpers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +504 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +182 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/routes/graph.d.ts +17 -0
- package/dist/web/routes/graph.d.ts.map +1 -0
- package/dist/web/routes/graph.js +277 -0
- package/dist/web/routes/graph.js.map +1 -0
- package/dist/web/routes/projects.d.ts +14 -0
- package/dist/web/routes/projects.d.ts.map +1 -0
- package/dist/web/routes/projects.js +102 -0
- package/dist/web/routes/projects.js.map +1 -0
- package/dist/web/routes/tasks.d.ts +17 -0
- package/dist/web/routes/tasks.d.ts.map +1 -0
- package/dist/web/routes/tasks.js +538 -0
- package/dist/web/routes/tasks.js.map +1 -0
- package/dist/web/server.d.ts +121 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +389 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web-ui/assets/index-BB0qvF1y.css +1 -0
- package/dist/web-ui/assets/index-Vmm72oKY.js +34 -0
- package/dist/web-ui/index.html +14 -0
- package/dist/web-ui/vite.svg +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update command - Update an existing task
|
|
3
|
+
*/
|
|
4
|
+
import { Command, Option } from 'commander';
|
|
5
|
+
import { getProjectPath, loadGraph, saveGraph, success, error, info, parseMultipleIds } from '../utils/helpers.js';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
import { wouldCreateCycle } from '../../core/graph/algorithms.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a short UUID to a full criterion ID within a task
|
|
13
|
+
* @param task - The task containing success criteria
|
|
14
|
+
* @param idOrPrefix - Full UUID or short prefix
|
|
15
|
+
* @returns Full UUID if found, or throws error
|
|
16
|
+
*/
|
|
17
|
+
function resolveCriterionId(task, idOrPrefix) {
|
|
18
|
+
// First try exact match
|
|
19
|
+
const exactMatch = task.success_criteria.find(c => c.id === idOrPrefix);
|
|
20
|
+
if (exactMatch)
|
|
21
|
+
return exactMatch.id;
|
|
22
|
+
// Try prefix match (case-insensitive)
|
|
23
|
+
const lowerPrefix = idOrPrefix.toLowerCase();
|
|
24
|
+
const matches = task.success_criteria.filter(c => c.id.toLowerCase().startsWith(lowerPrefix));
|
|
25
|
+
if (matches.length === 0) {
|
|
26
|
+
throw new Error(`Success criterion with ID '${idOrPrefix}' not found.`);
|
|
27
|
+
}
|
|
28
|
+
if (matches.length > 1) {
|
|
29
|
+
const matchIds = matches.map(c => c.id.substring(0, 8)).join(', ');
|
|
30
|
+
throw new Error(`Ambiguous criterion ID '${idOrPrefix}'. Matches: ${matchIds}`);
|
|
31
|
+
}
|
|
32
|
+
return matches[0].id;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a short UUID to a full deliverable ID within a task
|
|
36
|
+
* @param task - The task containing deliverables
|
|
37
|
+
* @param idOrPrefix - Full UUID or short prefix
|
|
38
|
+
* @returns Full UUID if found, or throws error
|
|
39
|
+
*/
|
|
40
|
+
function resolveDeliverableId(task, idOrPrefix) {
|
|
41
|
+
// First try exact match
|
|
42
|
+
const exactMatch = task.deliverables.find(d => d.id === idOrPrefix);
|
|
43
|
+
if (exactMatch)
|
|
44
|
+
return exactMatch.id;
|
|
45
|
+
// Try prefix match (case-insensitive)
|
|
46
|
+
const lowerPrefix = idOrPrefix.toLowerCase();
|
|
47
|
+
const matches = task.deliverables.filter(d => d.id.toLowerCase().startsWith(lowerPrefix));
|
|
48
|
+
if (matches.length === 0) {
|
|
49
|
+
throw new Error(`Deliverable with ID '${idOrPrefix}' not found.`);
|
|
50
|
+
}
|
|
51
|
+
if (matches.length > 1) {
|
|
52
|
+
const matchIds = matches.map(d => d.id.substring(0, 8)).join(', ');
|
|
53
|
+
throw new Error(`Ambiguous deliverable ID '${idOrPrefix}'. Matches: ${matchIds}`);
|
|
54
|
+
}
|
|
55
|
+
return matches[0].id;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve a short UUID to a full need_fix ID within a task
|
|
59
|
+
* @param task - The task containing need_fix items
|
|
60
|
+
* @param idOrPrefix - Full UUID or short prefix
|
|
61
|
+
* @returns Full UUID if found, or throws error
|
|
62
|
+
*/
|
|
63
|
+
function resolveNeedFixId(task, idOrPrefix) {
|
|
64
|
+
// First try exact match
|
|
65
|
+
const exactMatch = task.need_fix.find(f => f.id === idOrPrefix);
|
|
66
|
+
if (exactMatch)
|
|
67
|
+
return exactMatch.id;
|
|
68
|
+
// Try prefix match (case-insensitive)
|
|
69
|
+
const lowerPrefix = idOrPrefix.toLowerCase();
|
|
70
|
+
const matches = task.need_fix.filter(f => f.id.toLowerCase().startsWith(lowerPrefix));
|
|
71
|
+
if (matches.length === 0) {
|
|
72
|
+
throw new Error(`Need_fix item with ID '${idOrPrefix}' not found.`);
|
|
73
|
+
}
|
|
74
|
+
if (matches.length > 1) {
|
|
75
|
+
const matchIds = matches.map(f => f.id.substring(0, 8)).join(', ');
|
|
76
|
+
throw new Error(`Ambiguous need_fix ID '${idOrPrefix}'. Matches: ${matchIds}`);
|
|
77
|
+
}
|
|
78
|
+
return matches[0].id;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create the update command
|
|
82
|
+
*/
|
|
83
|
+
export const updateCommand = new Command('update')
|
|
84
|
+
.description('Update an existing task')
|
|
85
|
+
.argument('<id>', 'Task ID to update (full UUID or first 7-8 characters)')
|
|
86
|
+
.addOption(new Option('--priority <priority>', 'Task priority')
|
|
87
|
+
.choices(['top', 'second', 'later']))
|
|
88
|
+
.option('--add-deliverable <text>', 'Add a deliverable')
|
|
89
|
+
.option('--complete-deliverable <id>', 'Mark deliverable(s) as complete (supports: id, id1,id2, or "id1","id2")', parseMultipleIds, [])
|
|
90
|
+
.option('--remove-deliverable <id>', 'Remove a deliverable by ID (NOTE: cannot remove completed items)')
|
|
91
|
+
.option('--add-success-criterion <text>', 'Add a success criterion')
|
|
92
|
+
.option('--complete-criterion <id>', 'Mark success criterion(s) as complete (supports: id, id1,id2, or "id1","id2")', parseMultipleIds, [])
|
|
93
|
+
.option('--remove-criterion <id>', 'Remove a success criterion by ID (NOTE: cannot remove completed items)')
|
|
94
|
+
.option('--block <ids>', 'Add blocker(s) - supports comma-separated IDs (requires --dependency-explanation)')
|
|
95
|
+
.option('--blockers <ids>', 'Add blocker(s) - alias for --block (requires --dependency-explanation)')
|
|
96
|
+
.option('--unblock <id>', 'Remove a blocker (removes graph edge)')
|
|
97
|
+
.option('--dependency-explanation <text>', 'Set/update dependencies explanation (required with --block)')
|
|
98
|
+
.option('--clear-dependencies', 'Clear dependencies explanation (for removing last blocker)')
|
|
99
|
+
.option('--add-related-file <path>', 'Add a related file path')
|
|
100
|
+
.option('--remove-related-file <path>', 'Remove a related file path')
|
|
101
|
+
.option('--verify-c7 <library:notes>', 'Add C7 library verification (format: library-id or library-id:notes)')
|
|
102
|
+
.option('--remove-c7-verified <library>', 'Remove a C7 verification by library ID')
|
|
103
|
+
.option('--add-need-fix <text>', 'Add a need_fix item (blocking issue). Use --need-fix-source to specify source.')
|
|
104
|
+
.addOption(new Option('--need-fix-source <source>', 'Source of need_fix')
|
|
105
|
+
.choices(['review', 'runtime', 'regression'])
|
|
106
|
+
.default('review'))
|
|
107
|
+
.option('--need-fix-file <path>', 'Optional file path for need_fix item')
|
|
108
|
+
.option('--complete-need-fix <id>', 'Mark need_fix item as resolved (supports short UUID)')
|
|
109
|
+
.addOption(new Option('--notes <text>', 'Append to notes (can be specified multiple times)')
|
|
110
|
+
.argParser((value, previous) => [...(previous || []), value])
|
|
111
|
+
.default([]))
|
|
112
|
+
.option('--notes-file <path>', 'Read notes from file and append (multi-line notes support)')
|
|
113
|
+
.action(async (id, options, command) => {
|
|
114
|
+
try {
|
|
115
|
+
// Get global options
|
|
116
|
+
const globalOpts = command.parent?.opts() || {};
|
|
117
|
+
const projectPath = await getProjectPath(globalOpts.project);
|
|
118
|
+
const graph = await loadGraph(projectPath);
|
|
119
|
+
const task = graph.getNodeByIdOrPrefix(id);
|
|
120
|
+
if (!task) {
|
|
121
|
+
error(`Task not found: ${id}`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
let updated = false;
|
|
125
|
+
// Update priority
|
|
126
|
+
if (options.priority) {
|
|
127
|
+
task.setPriority(options.priority);
|
|
128
|
+
updated = true;
|
|
129
|
+
}
|
|
130
|
+
// Add deliverable
|
|
131
|
+
if (options.addDeliverable) {
|
|
132
|
+
task.addDeliverable({
|
|
133
|
+
id: randomUUID(),
|
|
134
|
+
text: options.addDeliverable,
|
|
135
|
+
completed: false,
|
|
136
|
+
});
|
|
137
|
+
updated = true;
|
|
138
|
+
}
|
|
139
|
+
// Complete deliverable(s) - now supports multiple IDs with short UUID support
|
|
140
|
+
if (options.completeDeliverable && options.completeDeliverable.length > 0) {
|
|
141
|
+
for (const deliverableIdOrPrefix of options.completeDeliverable) {
|
|
142
|
+
const fullId = resolveDeliverableId(task, deliverableIdOrPrefix);
|
|
143
|
+
task.completeDeliverable(fullId);
|
|
144
|
+
}
|
|
145
|
+
updated = true;
|
|
146
|
+
}
|
|
147
|
+
// Remove deliverable (supports short UUID)
|
|
148
|
+
if (options.removeDeliverable) {
|
|
149
|
+
const fullId = resolveDeliverableId(task, options.removeDeliverable);
|
|
150
|
+
task.removeDeliverable(fullId);
|
|
151
|
+
updated = true;
|
|
152
|
+
}
|
|
153
|
+
// Add success criterion
|
|
154
|
+
if (options.addSuccessCriterion) {
|
|
155
|
+
task.addSuccessCriterion({
|
|
156
|
+
id: randomUUID(),
|
|
157
|
+
text: options.addSuccessCriterion,
|
|
158
|
+
completed: false,
|
|
159
|
+
});
|
|
160
|
+
updated = true;
|
|
161
|
+
}
|
|
162
|
+
// Complete criterion/criteria - now supports multiple IDs with short UUID support
|
|
163
|
+
if (options.completeCriterion && options.completeCriterion.length > 0) {
|
|
164
|
+
for (const criterionIdOrPrefix of options.completeCriterion) {
|
|
165
|
+
const fullId = resolveCriterionId(task, criterionIdOrPrefix);
|
|
166
|
+
task.completeCriterion(fullId);
|
|
167
|
+
}
|
|
168
|
+
updated = true;
|
|
169
|
+
}
|
|
170
|
+
// Remove criterion (supports short UUID)
|
|
171
|
+
if (options.removeCriterion) {
|
|
172
|
+
const fullId = resolveCriterionId(task, options.removeCriterion);
|
|
173
|
+
task.removeSuccessCriterion(fullId);
|
|
174
|
+
updated = true;
|
|
175
|
+
}
|
|
176
|
+
// Add need_fix item (blocking issue)
|
|
177
|
+
if (options.addNeedFix) {
|
|
178
|
+
const source = options.needFixSource || 'review';
|
|
179
|
+
if (!['review', 'runtime', 'regression'].includes(source)) {
|
|
180
|
+
error(`Invalid --need-fix-source: '${source}'. Must be one of: review, runtime, regression`);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
task.addNeedFix(options.addNeedFix, {
|
|
184
|
+
file_path: options.needFixFile,
|
|
185
|
+
source: source,
|
|
186
|
+
});
|
|
187
|
+
updated = true;
|
|
188
|
+
}
|
|
189
|
+
// Complete need_fix item (supports short UUID)
|
|
190
|
+
if (options.completeNeedFix) {
|
|
191
|
+
const fullId = resolveNeedFixId(task, options.completeNeedFix);
|
|
192
|
+
task.completeNeedFix(fullId);
|
|
193
|
+
updated = true;
|
|
194
|
+
}
|
|
195
|
+
// Add blocker (twin validation: requires --dependency-explanation)
|
|
196
|
+
// Support both --block and --blockers
|
|
197
|
+
const blockerId = options.block || options.blockers;
|
|
198
|
+
if (blockerId) {
|
|
199
|
+
if (!options.dependencyExplanation) {
|
|
200
|
+
error('When using --block/--blockers, --dependency-explanation is required (twin feature).');
|
|
201
|
+
info(`Current dependencies: "${task.dependencies || '(none)'}"`);
|
|
202
|
+
info('Example: --block abc123 --dependency-explanation "Needs API spec from abc123"');
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
// Resolve short UUID to full UUID
|
|
206
|
+
const blockerTask = graph.getNodeByIdOrPrefix(blockerId);
|
|
207
|
+
if (!blockerTask) {
|
|
208
|
+
error(`Task with ID '${blockerId}' not found`);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
// Check for self-blocking
|
|
212
|
+
if (blockerTask.id === task.id) {
|
|
213
|
+
error('A task cannot block itself.');
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
// Check if adding this blocker would create a cycle
|
|
217
|
+
if (wouldCreateCycle(graph, blockerTask.id, task.id)) {
|
|
218
|
+
error(`Adding blocker '${blockerTask.id.substring(0, 8)}' would create a cycle.`);
|
|
219
|
+
info('Cycles are not allowed in the task graph. Use "octie graph cycles" to see existing cycles.');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
task.addBlocker(blockerTask.id);
|
|
223
|
+
graph.addEdge(blockerTask.id, task.id);
|
|
224
|
+
// Update dependencies explanation (append to existing)
|
|
225
|
+
const existingDeps = task.dependencies || '';
|
|
226
|
+
task.setDependencies(existingDeps ? `${existingDeps}\n${options.dependencyExplanation}` : options.dependencyExplanation);
|
|
227
|
+
updated = true;
|
|
228
|
+
}
|
|
229
|
+
// Remove blocker
|
|
230
|
+
if (options.unblock) {
|
|
231
|
+
// Resolve short UUID to full UUID
|
|
232
|
+
const unblockTask = graph.getNodeByIdOrPrefix(options.unblock);
|
|
233
|
+
if (!unblockTask) {
|
|
234
|
+
error(`Task with ID '${options.unblock}' not found`);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
task.removeBlocker(unblockTask.id);
|
|
238
|
+
graph.removeEdge(unblockTask.id, task.id);
|
|
239
|
+
// If no more blockers, clear dependencies automatically
|
|
240
|
+
if (task.blockers.length === 0) {
|
|
241
|
+
task.clearDependencies();
|
|
242
|
+
info('No more blockers - dependencies explanation cleared automatically.');
|
|
243
|
+
}
|
|
244
|
+
updated = true;
|
|
245
|
+
}
|
|
246
|
+
// Set/update dependencies explanation
|
|
247
|
+
if (options.dependencyExplanation && !options.block) {
|
|
248
|
+
// Standalone dependency explanation update (must have blockers)
|
|
249
|
+
if (task.blockers.length === 0) {
|
|
250
|
+
error('Cannot set dependencies explanation without blockers.');
|
|
251
|
+
info('Use --block to add a blocker first, or provide both --block and --dependency-explanation together.');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
task.setDependencies(options.dependencyExplanation);
|
|
255
|
+
updated = true;
|
|
256
|
+
}
|
|
257
|
+
// Clear dependencies (for explicit clearing when last blocker removed)
|
|
258
|
+
if (options.clearDependencies) {
|
|
259
|
+
task.clearDependencies();
|
|
260
|
+
updated = true;
|
|
261
|
+
}
|
|
262
|
+
// Add related file
|
|
263
|
+
if (options.addRelatedFile) {
|
|
264
|
+
task.addRelatedFile(options.addRelatedFile);
|
|
265
|
+
updated = true;
|
|
266
|
+
}
|
|
267
|
+
// Remove related file
|
|
268
|
+
if (options.removeRelatedFile) {
|
|
269
|
+
task.removeRelatedFile(options.removeRelatedFile);
|
|
270
|
+
updated = true;
|
|
271
|
+
}
|
|
272
|
+
// Add C7 verification
|
|
273
|
+
if (options.verifyC7) {
|
|
274
|
+
const entry = options.verifyC7;
|
|
275
|
+
// Handle Windows Git Bash path conversion: "/path" becomes "C:/Program Files/Git/path"
|
|
276
|
+
// Detect and strip the Git Bash prefix
|
|
277
|
+
let cleanEntry = entry;
|
|
278
|
+
const gitBashPrefix = /^[A-Za-z]:\/(\/)?Program Files\/Git\//;
|
|
279
|
+
if (gitBashPrefix.test(entry)) {
|
|
280
|
+
// Extract the original Unix path after "Program Files/Git/"
|
|
281
|
+
const match = entry.match(/Program Files\/Git\/(.*)$/);
|
|
282
|
+
if (match) {
|
|
283
|
+
cleanEntry = '/' + match[1];
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Now parse the library-id:notes format
|
|
287
|
+
const colonIndex = cleanEntry.indexOf(':');
|
|
288
|
+
if (colonIndex === -1) {
|
|
289
|
+
task.addC7Verification({
|
|
290
|
+
library_id: cleanEntry.trim(),
|
|
291
|
+
verified_at: new Date().toISOString(),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
task.addC7Verification({
|
|
296
|
+
library_id: cleanEntry.substring(0, colonIndex).trim(),
|
|
297
|
+
verified_at: new Date().toISOString(),
|
|
298
|
+
notes: cleanEntry.substring(colonIndex + 1).trim(),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
updated = true;
|
|
302
|
+
}
|
|
303
|
+
// Remove C7 verification
|
|
304
|
+
if (options.removeC7Verified) {
|
|
305
|
+
// Handle Windows Git Bash path conversion: "/path" becomes "C:/Program Files/Git/path"
|
|
306
|
+
let libraryId = options.removeC7Verified;
|
|
307
|
+
const gitBashPrefix = /^[A-Za-z]:\/(\/)?Program Files\/Git\//;
|
|
308
|
+
if (gitBashPrefix.test(libraryId)) {
|
|
309
|
+
const match = libraryId.match(/Program Files\/Git\/(.*)$/);
|
|
310
|
+
if (match) {
|
|
311
|
+
libraryId = '/' + match[1];
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
task.removeC7Verification(libraryId);
|
|
315
|
+
updated = true;
|
|
316
|
+
}
|
|
317
|
+
// Append notes (supports multiple --notes flags)
|
|
318
|
+
if (options.notes && options.notes.length > 0) {
|
|
319
|
+
for (const note of options.notes) {
|
|
320
|
+
task.appendNotes(note);
|
|
321
|
+
}
|
|
322
|
+
updated = true;
|
|
323
|
+
}
|
|
324
|
+
// Append notes from file
|
|
325
|
+
if (options.notesFile) {
|
|
326
|
+
const notesPath = resolve(options.notesFile);
|
|
327
|
+
if (!existsSync(notesPath)) {
|
|
328
|
+
error(`Notes file not found: ${notesPath}`);
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const fileContent = readFileSync(notesPath, 'utf-8').trim();
|
|
333
|
+
task.appendNotes(fileContent);
|
|
334
|
+
updated = true;
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
error(`Failed to read notes file: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (!updated) {
|
|
342
|
+
error('No updates specified');
|
|
343
|
+
process.exit(1);
|
|
344
|
+
}
|
|
345
|
+
// Update in graph
|
|
346
|
+
graph.updateNode(task);
|
|
347
|
+
// Save
|
|
348
|
+
await saveGraph(projectPath, graph);
|
|
349
|
+
success(`Task updated: ${chalk.cyan(id)}`);
|
|
350
|
+
process.exit(0);
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
if (err instanceof Error) {
|
|
354
|
+
error(err.message);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
error('Failed to update task');
|
|
358
|
+
}
|
|
359
|
+
process.exit(1);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
// Add help text to explain blockers vs dependencies
|
|
363
|
+
updateCommand.on('--help', () => {
|
|
364
|
+
console.log('');
|
|
365
|
+
console.log(chalk.bold('Status System:'));
|
|
366
|
+
console.log(' Status is AUTOMATICALLY calculated from task state.');
|
|
367
|
+
console.log(' Use \'octie approve <id>\' to transition from in_review to completed.');
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log(chalk.cyan(' Automatic Transitions:'));
|
|
370
|
+
console.log(' • Any item checked → in_progress');
|
|
371
|
+
console.log(' • All items complete → in_review');
|
|
372
|
+
console.log(' • Blocker added → blocked');
|
|
373
|
+
console.log(' • All blockers completed → in_progress (if items checked) or ready (if not)');
|
|
374
|
+
console.log('');
|
|
375
|
+
console.log(chalk.cyan(' Manual Transition (via \'octie approve\' command only):'));
|
|
376
|
+
console.log(' • in_review → completed');
|
|
377
|
+
console.log('');
|
|
378
|
+
console.log(chalk.bold('Need Fix Items (Blocking Issues):'));
|
|
379
|
+
console.log(chalk.cyan(' --add-need-fix <text>') + ': Add a blocking issue found during work.');
|
|
380
|
+
console.log(' Sources: review (code review), runtime (testing), regression (after completion).');
|
|
381
|
+
console.log(' Status automatically changes to in_progress when need_fix is added.');
|
|
382
|
+
console.log('');
|
|
383
|
+
console.log(chalk.cyan(' --complete-need-fix <id>') + ': Mark issue as resolved.');
|
|
384
|
+
console.log(' Supports short UUID (first 7-8 chars).');
|
|
385
|
+
console.log('');
|
|
386
|
+
console.log(chalk.yellow(' Example:'));
|
|
387
|
+
console.log(' octie update abc --add-need-fix "Null pointer in edge case" \\');
|
|
388
|
+
console.log(' --need-fix-source review --need-fix-file "src/auth.ts"');
|
|
389
|
+
console.log('');
|
|
390
|
+
console.log(chalk.bold('Blockers & Dependencies (Twin Feature):'));
|
|
391
|
+
console.log(chalk.cyan(' --block <id>') + ': Add a blocker (creates graph edge).');
|
|
392
|
+
console.log(' REQUIRES --dependency-explanation (twin validation).');
|
|
393
|
+
console.log(' Prevents self-blocking and cycle creation.');
|
|
394
|
+
console.log('');
|
|
395
|
+
console.log(chalk.cyan(' --unblock <id>') + ': Remove a blocker (removes graph edge).');
|
|
396
|
+
console.log(' If last blocker removed, dependencies auto-cleared.');
|
|
397
|
+
console.log('');
|
|
398
|
+
console.log(chalk.cyan(' --dependency-explanation <text>') + ': Set/update dependencies explanation.');
|
|
399
|
+
console.log(' Required with --block.');
|
|
400
|
+
console.log('');
|
|
401
|
+
console.log(chalk.cyan(' --clear-dependencies') + ': Explicitly clear dependencies explanation.');
|
|
402
|
+
console.log('');
|
|
403
|
+
console.log(chalk.yellow(' Examples:'));
|
|
404
|
+
console.log(' Add blocker with explanation:');
|
|
405
|
+
console.log(' octie update abc --block xyz --dependency-explanation "Needs xyz output"');
|
|
406
|
+
console.log('');
|
|
407
|
+
console.log(' Update existing dependencies text:');
|
|
408
|
+
console.log(' octie update abc --dependency-explanation "Updated reason"');
|
|
409
|
+
console.log('');
|
|
410
|
+
console.log(' Remove blocker (auto-clears if last one):');
|
|
411
|
+
console.log(' octie update abc --unblock xyz');
|
|
412
|
+
console.log('');
|
|
413
|
+
console.log(chalk.red(' Error Conditions:'));
|
|
414
|
+
console.log(' --block without --dependency-explanation → Error');
|
|
415
|
+
console.log(' Self-blocking (task blocks itself) → Error');
|
|
416
|
+
console.log(' Would create cycle → Error');
|
|
417
|
+
console.log(' Cannot uncomplete/remove completed items → Error');
|
|
418
|
+
console.log('');
|
|
419
|
+
console.log(chalk.bold('Short UUID Support:'));
|
|
420
|
+
console.log(' All ID parameters support short UUIDs (first 7-8 characters).');
|
|
421
|
+
console.log(' Example: octie update abc1234 --complete-criterion xyz5678');
|
|
422
|
+
});
|
|
423
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire command - Insert an existing task between two connected tasks
|
|
3
|
+
*
|
|
4
|
+
* This command wires an existing task (B) into a blocker chain:
|
|
5
|
+
* Before: A → C (A blocks C)
|
|
6
|
+
* After: A → B → C (A blocks B, B blocks C)
|
|
7
|
+
*
|
|
8
|
+
* It uses the existing blocker manipulation patterns and twin validation system.
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
/**
|
|
12
|
+
* Create the wire command
|
|
13
|
+
*/
|
|
14
|
+
export declare const wireCommand: Command;
|
|
15
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,eAAO,MAAM,WAAW,SAmIpB,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire command - Insert an existing task between two connected tasks
|
|
3
|
+
*
|
|
4
|
+
* This command wires an existing task (B) into a blocker chain:
|
|
5
|
+
* Before: A → C (A blocks C)
|
|
6
|
+
* After: A → B → C (A blocks B, B blocks C)
|
|
7
|
+
*
|
|
8
|
+
* It uses the existing blocker manipulation patterns and twin validation system.
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { getProjectPath, loadGraph, saveGraph, success, error, info } from '../utils/helpers.js';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
/**
|
|
14
|
+
* Create the wire command
|
|
15
|
+
*/
|
|
16
|
+
export const wireCommand = new Command('wire')
|
|
17
|
+
.description('Insert an existing task between two connected tasks on a blocker chain')
|
|
18
|
+
.argument('<task-id>', 'Task ID to insert (full UUID or first 7-8 characters)')
|
|
19
|
+
.requiredOption('--after <id>', 'Source task ID - will become the inserted task\'s blocker')
|
|
20
|
+
.requiredOption('--before <id>', 'Target task ID - will block on the inserted task instead')
|
|
21
|
+
.requiredOption('--dep-on-after <text>', 'Why the inserted task depends on the --after task (twin validation)')
|
|
22
|
+
.requiredOption('--dep-on-before <text>', 'Why the --before task depends on the inserted task')
|
|
23
|
+
.action(async (taskId, options, command) => {
|
|
24
|
+
try {
|
|
25
|
+
// Get global options
|
|
26
|
+
const globalOpts = command.parent?.opts() || {};
|
|
27
|
+
const projectPath = await getProjectPath(globalOpts.project);
|
|
28
|
+
const graph = await loadGraph(projectPath);
|
|
29
|
+
// Resolve task IDs (support short UUIDs)
|
|
30
|
+
const taskB = graph.getNodeByIdOrPrefix(taskId);
|
|
31
|
+
if (!taskB) {
|
|
32
|
+
error(`Task not found: ${taskId}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const taskA = graph.getNodeByIdOrPrefix(options.after);
|
|
36
|
+
if (!taskA) {
|
|
37
|
+
error(`--after task not found: ${options.after}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const taskC = graph.getNodeByIdOrPrefix(options.before);
|
|
41
|
+
if (!taskC) {
|
|
42
|
+
error(`--before task not found: ${options.before}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// Use resolved full IDs
|
|
46
|
+
const bId = taskB.id;
|
|
47
|
+
const aId = taskA.id;
|
|
48
|
+
const cId = taskC.id;
|
|
49
|
+
// Validation 1: B cannot be the same as A or C
|
|
50
|
+
if (bId === aId) {
|
|
51
|
+
error('Cannot wire a task after itself.');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
if (bId === cId) {
|
|
55
|
+
error('Cannot wire a task before itself.');
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
// Validation 2: A and C must be different
|
|
59
|
+
if (aId === cId) {
|
|
60
|
+
error('--after and --before must be different tasks.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
// Validation 3: Edge A→C must exist
|
|
64
|
+
if (!graph.hasEdge(aId, cId)) {
|
|
65
|
+
error(`No edge exists from ${chalk.cyan(aId)} to ${chalk.cyan(cId)}.`);
|
|
66
|
+
info('The --after and --before tasks must already be connected.');
|
|
67
|
+
info(`Use 'octie list --graph' to view current task relationships.`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
// Validation 4: C must have A as a blocker
|
|
71
|
+
if (!taskC.blockers.includes(aId)) {
|
|
72
|
+
error(`${chalk.cyan(cId)} is not blocked by ${chalk.cyan(aId)}.`);
|
|
73
|
+
info('The --before task must have --after as a blocker.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// Validation 5: B should not already block C (would create duplicate edge)
|
|
77
|
+
if (graph.hasEdge(bId, cId)) {
|
|
78
|
+
error(`${chalk.cyan(bId)} already blocks ${chalk.cyan(cId)}.`);
|
|
79
|
+
info('Cannot create a duplicate edge.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
// Validation 6: A should not already block B (would create duplicate edge)
|
|
83
|
+
if (graph.hasEdge(aId, bId)) {
|
|
84
|
+
error(`${chalk.cyan(aId)} already blocks ${chalk.cyan(bId)}.`);
|
|
85
|
+
info('Cannot create a duplicate edge.');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// === WIRING OPERATION ===
|
|
89
|
+
// Step 1: Add A as blocker to B (with twin: dependencies)
|
|
90
|
+
taskB.addBlocker(aId);
|
|
91
|
+
graph.addEdge(aId, bId);
|
|
92
|
+
const existingDepsB = taskB.dependencies || '';
|
|
93
|
+
taskB.setDependencies(existingDepsB
|
|
94
|
+
? `${existingDepsB}\n${options.depOnAfter}`
|
|
95
|
+
: options.depOnAfter);
|
|
96
|
+
// Step 2: Transfer C's blocker from A to B
|
|
97
|
+
// First, remove A from C's blockers and remove edge A→C
|
|
98
|
+
taskC.removeBlocker(aId);
|
|
99
|
+
graph.removeEdge(aId, cId);
|
|
100
|
+
// Then, add B as blocker to C and add edge B→C
|
|
101
|
+
taskC.addBlocker(bId);
|
|
102
|
+
graph.addEdge(bId, cId);
|
|
103
|
+
// Replace C's dependencies with the new explanation for B
|
|
104
|
+
// (since the dependency on A is replaced with dependency on B)
|
|
105
|
+
taskC.setDependencies(options.depOnBefore);
|
|
106
|
+
// Step 3: Update nodes in graph
|
|
107
|
+
graph.updateNode(taskB);
|
|
108
|
+
graph.updateNode(taskC);
|
|
109
|
+
// Step 4: Save
|
|
110
|
+
await saveGraph(projectPath, graph);
|
|
111
|
+
// Success message
|
|
112
|
+
success(`Wired ${chalk.cyan(bId)} between ${chalk.cyan(aId)} and ${chalk.cyan(cId)}`);
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log(chalk.gray(' Before: ') + `${chalk.cyan(aId)} → ${chalk.cyan(cId)}`);
|
|
115
|
+
console.log(chalk.gray(' After: ') + `${chalk.cyan(aId)} → ${chalk.cyan(bId)} → ${chalk.cyan(cId)}`);
|
|
116
|
+
console.log('');
|
|
117
|
+
console.log(chalk.gray('Task ') + chalk.cyan(bId) + chalk.gray(' now blocks on ') + chalk.cyan(aId));
|
|
118
|
+
console.log(chalk.gray('Task ') + chalk.cyan(cId) + chalk.gray(' now blocks on ') + chalk.cyan(bId));
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err instanceof Error) {
|
|
123
|
+
error(err.message);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
error('Failed to wire task');
|
|
127
|
+
}
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
// Add help text
|
|
132
|
+
wireCommand.on('--help', () => {
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(chalk.bold('Description:'));
|
|
135
|
+
console.log(' Insert an existing task into a blocker chain between two connected tasks.');
|
|
136
|
+
console.log(' This operation uses the twin validation system (blockers + dependencies).');
|
|
137
|
+
console.log('');
|
|
138
|
+
console.log(chalk.bold('Workflow:'));
|
|
139
|
+
console.log(' 1. Create the intermediate task first (using octie create)');
|
|
140
|
+
console.log(' 2. Wire it into the chain using this command');
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(chalk.bold('Visual Example:'));
|
|
143
|
+
console.log(' ' + chalk.gray('Before:') + ' A → C (A blocks C)');
|
|
144
|
+
console.log(' ' + chalk.gray('After:') + ' A → B → C (A blocks B, B blocks C)');
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log(chalk.bold('Twin Validation (Required):'));
|
|
147
|
+
console.log(chalk.cyan(' --dep-on-after') + ' Why B depends on A (sets B.dependencies)');
|
|
148
|
+
console.log(chalk.cyan(' --dep-on-before') + ' Why C depends on B (replaces C\'s old dependency on A)');
|
|
149
|
+
console.log('');
|
|
150
|
+
console.log(chalk.yellow(' Example:'));
|
|
151
|
+
console.log(' octie create --title "Review API spec" # Creates task xyz789');
|
|
152
|
+
console.log(' octie wire xyz789 \\');
|
|
153
|
+
console.log(' --after abc123 \\');
|
|
154
|
+
console.log(' --before def456 \\');
|
|
155
|
+
console.log(' --dep-on-after "Needs API spec to create models" \\');
|
|
156
|
+
console.log(' --dep-on-before "Frontend needs TypeScript models"');
|
|
157
|
+
console.log('');
|
|
158
|
+
console.log(chalk.red(' Validation Errors:'));
|
|
159
|
+
console.log(' - Edge A→C doesn\'t exist → Error (tasks must be connected)');
|
|
160
|
+
console.log(' - C doesn\'t have A as blocker → Error (invalid chain)');
|
|
161
|
+
console.log(' - B already blocks C → Error (duplicate edge)');
|
|
162
|
+
console.log(' - Missing --dep-on-* options → Error (twin validation)');
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/cli/commands/wire.ts"],"names":[],"mappings":"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"}
|