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.
Files changed (162) hide show
  1. package/README.md +523 -0
  2. package/dist/cli/commands/approve.d.ts +27 -0
  3. package/dist/cli/commands/approve.d.ts.map +1 -0
  4. package/dist/cli/commands/approve.js +119 -0
  5. package/dist/cli/commands/approve.js.map +1 -0
  6. package/dist/cli/commands/batch.d.ts +15 -0
  7. package/dist/cli/commands/batch.d.ts.map +1 -0
  8. package/dist/cli/commands/batch.js +521 -0
  9. package/dist/cli/commands/batch.js.map +1 -0
  10. package/dist/cli/commands/create.d.ts +9 -0
  11. package/dist/cli/commands/create.d.ts.map +1 -0
  12. package/dist/cli/commands/create.js +321 -0
  13. package/dist/cli/commands/create.js.map +1 -0
  14. package/dist/cli/commands/delete.d.ts +9 -0
  15. package/dist/cli/commands/delete.d.ts.map +1 -0
  16. package/dist/cli/commands/delete.js +143 -0
  17. package/dist/cli/commands/delete.js.map +1 -0
  18. package/dist/cli/commands/export.d.ts +9 -0
  19. package/dist/cli/commands/export.d.ts.map +1 -0
  20. package/dist/cli/commands/export.js +66 -0
  21. package/dist/cli/commands/export.js.map +1 -0
  22. package/dist/cli/commands/find.d.ts +16 -0
  23. package/dist/cli/commands/find.d.ts.map +1 -0
  24. package/dist/cli/commands/find.js +252 -0
  25. package/dist/cli/commands/find.js.map +1 -0
  26. package/dist/cli/commands/get.d.ts +9 -0
  27. package/dist/cli/commands/get.d.ts.map +1 -0
  28. package/dist/cli/commands/get.js +74 -0
  29. package/dist/cli/commands/get.js.map +1 -0
  30. package/dist/cli/commands/graph.d.ts +9 -0
  31. package/dist/cli/commands/graph.d.ts.map +1 -0
  32. package/dist/cli/commands/graph.js +200 -0
  33. package/dist/cli/commands/graph.js.map +1 -0
  34. package/dist/cli/commands/import.d.ts +9 -0
  35. package/dist/cli/commands/import.d.ts.map +1 -0
  36. package/dist/cli/commands/import.js +807 -0
  37. package/dist/cli/commands/import.js.map +1 -0
  38. package/dist/cli/commands/init.d.ts +9 -0
  39. package/dist/cli/commands/init.d.ts.map +1 -0
  40. package/dist/cli/commands/init.js +57 -0
  41. package/dist/cli/commands/init.js.map +1 -0
  42. package/dist/cli/commands/list.d.ts +9 -0
  43. package/dist/cli/commands/list.d.ts.map +1 -0
  44. package/dist/cli/commands/list.js +175 -0
  45. package/dist/cli/commands/list.js.map +1 -0
  46. package/dist/cli/commands/merge.d.ts +9 -0
  47. package/dist/cli/commands/merge.d.ts.map +1 -0
  48. package/dist/cli/commands/merge.js +113 -0
  49. package/dist/cli/commands/merge.js.map +1 -0
  50. package/dist/cli/commands/serve.d.ts +9 -0
  51. package/dist/cli/commands/serve.d.ts.map +1 -0
  52. package/dist/cli/commands/serve.js +94 -0
  53. package/dist/cli/commands/serve.js.map +1 -0
  54. package/dist/cli/commands/update.d.ts +9 -0
  55. package/dist/cli/commands/update.d.ts.map +1 -0
  56. package/dist/cli/commands/update.js +423 -0
  57. package/dist/cli/commands/update.js.map +1 -0
  58. package/dist/cli/commands/wire.d.ts +15 -0
  59. package/dist/cli/commands/wire.d.ts.map +1 -0
  60. package/dist/cli/commands/wire.js +164 -0
  61. package/dist/cli/commands/wire.js.map +1 -0
  62. package/dist/cli/index.d.ts +7 -0
  63. package/dist/cli/index.d.ts.map +1 -0
  64. package/dist/cli/index.js +100 -0
  65. package/dist/cli/index.js.map +1 -0
  66. package/dist/cli/output/json.d.ts +16 -0
  67. package/dist/cli/output/json.d.ts.map +1 -0
  68. package/dist/cli/output/json.js +29 -0
  69. package/dist/cli/output/json.js.map +1 -0
  70. package/dist/cli/output/markdown.d.ts +15 -0
  71. package/dist/cli/output/markdown.d.ts.map +1 -0
  72. package/dist/cli/output/markdown.js +206 -0
  73. package/dist/cli/output/markdown.js.map +1 -0
  74. package/dist/cli/output/table.d.ts +23 -0
  75. package/dist/cli/output/table.d.ts.map +1 -0
  76. package/dist/cli/output/table.js +150 -0
  77. package/dist/cli/output/table.js.map +1 -0
  78. package/dist/cli/utils/helpers.d.ts +126 -0
  79. package/dist/cli/utils/helpers.d.ts.map +1 -0
  80. package/dist/cli/utils/helpers.js +325 -0
  81. package/dist/cli/utils/helpers.js.map +1 -0
  82. package/dist/core/graph/algorithms.d.ts +11 -0
  83. package/dist/core/graph/algorithms.d.ts.map +1 -0
  84. package/dist/core/graph/algorithms.js +14 -0
  85. package/dist/core/graph/algorithms.js.map +1 -0
  86. package/dist/core/graph/cycle.d.ts +155 -0
  87. package/dist/core/graph/cycle.d.ts.map +1 -0
  88. package/dist/core/graph/cycle.js +297 -0
  89. package/dist/core/graph/cycle.js.map +1 -0
  90. package/dist/core/graph/index.d.ts +223 -0
  91. package/dist/core/graph/index.d.ts.map +1 -0
  92. package/dist/core/graph/index.js +475 -0
  93. package/dist/core/graph/index.js.map +1 -0
  94. package/dist/core/graph/operations.d.ts +240 -0
  95. package/dist/core/graph/operations.d.ts.map +1 -0
  96. package/dist/core/graph/operations.js +503 -0
  97. package/dist/core/graph/operations.js.map +1 -0
  98. package/dist/core/graph/sort.d.ts +76 -0
  99. package/dist/core/graph/sort.d.ts.map +1 -0
  100. package/dist/core/graph/sort.js +254 -0
  101. package/dist/core/graph/sort.js.map +1 -0
  102. package/dist/core/graph/traversal.d.ts +122 -0
  103. package/dist/core/graph/traversal.d.ts.map +1 -0
  104. package/dist/core/graph/traversal.js +336 -0
  105. package/dist/core/graph/traversal.js.map +1 -0
  106. package/dist/core/models/task-node.d.ts +328 -0
  107. package/dist/core/models/task-node.d.ts.map +1 -0
  108. package/dist/core/models/task-node.js +1090 -0
  109. package/dist/core/models/task-node.js.map +1 -0
  110. package/dist/core/registry/index.d.ts +102 -0
  111. package/dist/core/registry/index.d.ts.map +1 -0
  112. package/dist/core/registry/index.js +249 -0
  113. package/dist/core/registry/index.js.map +1 -0
  114. package/dist/core/registry/root-guard.d.ts +19 -0
  115. package/dist/core/registry/root-guard.d.ts.map +1 -0
  116. package/dist/core/registry/root-guard.js +28 -0
  117. package/dist/core/registry/root-guard.js.map +1 -0
  118. package/dist/core/storage/atomic-write.d.ts +181 -0
  119. package/dist/core/storage/atomic-write.d.ts.map +1 -0
  120. package/dist/core/storage/atomic-write.js +379 -0
  121. package/dist/core/storage/atomic-write.js.map +1 -0
  122. package/dist/core/storage/file-store.d.ts +148 -0
  123. package/dist/core/storage/file-store.d.ts.map +1 -0
  124. package/dist/core/storage/file-store.js +423 -0
  125. package/dist/core/storage/file-store.js.map +1 -0
  126. package/dist/core/storage/indexer.d.ts +138 -0
  127. package/dist/core/storage/indexer.d.ts.map +1 -0
  128. package/dist/core/storage/indexer.js +350 -0
  129. package/dist/core/storage/indexer.js.map +1 -0
  130. package/dist/core/utils/status-helpers.d.ts +59 -0
  131. package/dist/core/utils/status-helpers.d.ts.map +1 -0
  132. package/dist/core/utils/status-helpers.js +149 -0
  133. package/dist/core/utils/status-helpers.js.map +1 -0
  134. package/dist/index.d.ts +10 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +10 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/types/index.d.ts +504 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +182 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/web/routes/graph.d.ts +17 -0
  143. package/dist/web/routes/graph.d.ts.map +1 -0
  144. package/dist/web/routes/graph.js +277 -0
  145. package/dist/web/routes/graph.js.map +1 -0
  146. package/dist/web/routes/projects.d.ts +14 -0
  147. package/dist/web/routes/projects.d.ts.map +1 -0
  148. package/dist/web/routes/projects.js +102 -0
  149. package/dist/web/routes/projects.js.map +1 -0
  150. package/dist/web/routes/tasks.d.ts +17 -0
  151. package/dist/web/routes/tasks.d.ts.map +1 -0
  152. package/dist/web/routes/tasks.js +538 -0
  153. package/dist/web/routes/tasks.js.map +1 -0
  154. package/dist/web/server.d.ts +121 -0
  155. package/dist/web/server.d.ts.map +1 -0
  156. package/dist/web/server.js +389 -0
  157. package/dist/web/server.js.map +1 -0
  158. package/dist/web-ui/assets/index-BB0qvF1y.css +1 -0
  159. package/dist/web-ui/assets/index-Vmm72oKY.js +34 -0
  160. package/dist/web-ui/index.html +14 -0
  161. package/dist/web-ui/vite.svg +1 -0
  162. 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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"}