@autocode-cli/autocode 0.1.14 → 0.1.17

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 (211) hide show
  1. package/README.md +38 -38
  2. package/dist/cli/commands/comment.d.ts +1 -1
  3. package/dist/cli/commands/comment.js +11 -11
  4. package/dist/cli/commands/comment.js.map +1 -1
  5. package/dist/cli/commands/init.js +1 -1
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/commands/list.d.ts +1 -1
  8. package/dist/cli/commands/list.d.ts.map +1 -1
  9. package/dist/cli/commands/list.js +65 -22
  10. package/dist/cli/commands/list.js.map +1 -1
  11. package/dist/cli/commands/move.d.ts +1 -1
  12. package/dist/cli/commands/move.js +12 -12
  13. package/dist/cli/commands/move.js.map +1 -1
  14. package/dist/cli/commands/new.d.ts +1 -1
  15. package/dist/cli/commands/new.d.ts.map +1 -1
  16. package/dist/cli/commands/new.js +26 -13
  17. package/dist/cli/commands/new.js.map +1 -1
  18. package/dist/cli/commands/next.d.ts +1 -1
  19. package/dist/cli/commands/next.js +15 -15
  20. package/dist/cli/commands/next.js.map +1 -1
  21. package/dist/cli/commands/parent.d.ts +9 -0
  22. package/dist/cli/commands/parent.d.ts.map +1 -0
  23. package/dist/cli/commands/parent.js +94 -0
  24. package/dist/cli/commands/parent.js.map +1 -0
  25. package/dist/cli/commands/serve.js +8 -8
  26. package/dist/cli/commands/serve.js.map +1 -1
  27. package/dist/cli/commands/show.d.ts +1 -1
  28. package/dist/cli/commands/show.d.ts.map +1 -1
  29. package/dist/cli/commands/show.js +51 -31
  30. package/dist/cli/commands/show.js.map +1 -1
  31. package/dist/cli/commands/stats.js +2 -2
  32. package/dist/cli/commands/stats.js.map +1 -1
  33. package/dist/cli/commands/sync.js +3 -3
  34. package/dist/cli/commands/sync.js.map +1 -1
  35. package/dist/cli/parser.d.ts.map +1 -1
  36. package/dist/cli/parser.js +5 -3
  37. package/dist/cli/parser.js.map +1 -1
  38. package/dist/core/column.js +2 -2
  39. package/dist/core/column.js.map +1 -1
  40. package/dist/core/hierarchy.d.ts +97 -0
  41. package/dist/core/hierarchy.d.ts.map +1 -0
  42. package/dist/core/hierarchy.js +274 -0
  43. package/dist/core/hierarchy.js.map +1 -0
  44. package/dist/core/issue.d.ts +62 -0
  45. package/dist/core/issue.d.ts.map +1 -0
  46. package/dist/core/issue.js +247 -0
  47. package/dist/core/issue.js.map +1 -0
  48. package/dist/core/sync.d.ts +9 -9
  49. package/dist/core/sync.d.ts.map +1 -1
  50. package/dist/core/sync.js +61 -58
  51. package/dist/core/sync.js.map +1 -1
  52. package/dist/core/workflow.d.ts +22 -20
  53. package/dist/core/workflow.d.ts.map +1 -1
  54. package/dist/core/workflow.js +68 -51
  55. package/dist/core/workflow.js.map +1 -1
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/server/api-autocomplete.test.d.ts +6 -0
  59. package/dist/server/api-autocomplete.test.d.ts.map +1 -0
  60. package/dist/server/api-autocomplete.test.js +249 -0
  61. package/dist/server/api-autocomplete.test.js.map +1 -0
  62. package/dist/server/api.d.ts.map +1 -1
  63. package/dist/server/api.js +216 -106
  64. package/dist/server/api.js.map +1 -1
  65. package/dist/server/dashboard/pages/column-prompt.d.ts +1 -1
  66. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -1
  67. package/dist/server/dashboard/pages/column-prompt.js +11 -11
  68. package/dist/server/dashboard/pages/column-prompt.js.map +1 -1
  69. package/dist/server/dashboard/pages/column-terminal.d.ts +1 -1
  70. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -1
  71. package/dist/server/dashboard/pages/column-terminal.js +14 -14
  72. package/dist/server/dashboard/pages/column-terminal.js.map +1 -1
  73. package/dist/server/dashboard/pages/index.d.ts +3 -1
  74. package/dist/server/dashboard/pages/index.d.ts.map +1 -1
  75. package/dist/server/dashboard/pages/index.js +3 -1
  76. package/dist/server/dashboard/pages/index.js.map +1 -1
  77. package/dist/server/dashboard/pages/issue-graph.d.ts +9 -0
  78. package/dist/server/dashboard/pages/issue-graph.d.ts.map +1 -0
  79. package/dist/server/dashboard/pages/issue-graph.js +581 -0
  80. package/dist/server/dashboard/pages/issue-graph.js.map +1 -0
  81. package/dist/server/dashboard/pages/issue-view.d.ts +8 -0
  82. package/dist/server/dashboard/pages/issue-view.d.ts.map +1 -0
  83. package/dist/server/dashboard/pages/{ticket-view.js → issue-view.js} +128 -128
  84. package/dist/server/dashboard/pages/issue-view.js.map +1 -0
  85. package/dist/server/dashboard/pages/main-dashboard.js +21 -21
  86. package/dist/server/dashboard/pages/main-dashboard.js.map +1 -1
  87. package/dist/server/dashboard/pages/new-issue.d.ts +8 -0
  88. package/dist/server/dashboard/pages/new-issue.d.ts.map +1 -0
  89. package/dist/server/dashboard/pages/new-issue.js +648 -0
  90. package/dist/server/dashboard/pages/new-issue.js.map +1 -0
  91. package/dist/server/dashboard/pages/new-issue.test.d.ts +6 -0
  92. package/dist/server/dashboard/pages/new-issue.test.d.ts.map +1 -0
  93. package/dist/server/dashboard/pages/new-issue.test.js +349 -0
  94. package/dist/server/dashboard/pages/new-issue.test.js.map +1 -0
  95. package/dist/server/dashboard/pages/pipeline-configurator.js +1 -1
  96. package/dist/server/dashboard/pages/shared.d.ts +2 -2
  97. package/dist/server/dashboard/pages/shared.d.ts.map +1 -1
  98. package/dist/server/dashboard/pages/shared.js +5 -5
  99. package/dist/server/dashboard/pages/shared.js.map +1 -1
  100. package/dist/server/dashboard/pages/stats-page.js +11 -11
  101. package/dist/server/dashboard/scripts/index.js +134 -134
  102. package/dist/server/dashboard/styles/board.d.ts +1 -1
  103. package/dist/server/dashboard/styles/board.js +10 -10
  104. package/dist/server/dashboard.d.ts +1 -1
  105. package/dist/server/dashboard.d.ts.map +1 -1
  106. package/dist/server/dashboard.js +1 -1
  107. package/dist/server/dashboard.js.map +1 -1
  108. package/dist/server/index.d.ts.map +1 -1
  109. package/dist/server/index.js +40 -24
  110. package/dist/server/index.js.map +1 -1
  111. package/dist/server/websocket.d.ts +6 -6
  112. package/dist/server/websocket.d.ts.map +1 -1
  113. package/dist/server/websocket.js +10 -10
  114. package/dist/server/websocket.js.map +1 -1
  115. package/dist/services/claude.d.ts +13 -13
  116. package/dist/services/claude.d.ts.map +1 -1
  117. package/dist/services/claude.js +98 -98
  118. package/dist/services/claude.js.map +1 -1
  119. package/dist/services/issue-io.d.ts +81 -0
  120. package/dist/services/issue-io.d.ts.map +1 -0
  121. package/dist/services/{ticket-io.js → issue-io.js} +54 -53
  122. package/dist/services/issue-io.js.map +1 -0
  123. package/dist/services/stats.d.ts +2 -0
  124. package/dist/services/stats.d.ts.map +1 -1
  125. package/dist/services/stats.js.map +1 -1
  126. package/dist/types/index.d.ts +6 -4
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/utils/fs.d.ts +2 -2
  129. package/dist/utils/fs.d.ts.map +1 -1
  130. package/dist/utils/fs.js +2 -2
  131. package/dist/utils/fs.js.map +1 -1
  132. package/package.json +3 -3
  133. package/templates/catalog.yaml +2 -2
  134. package/templates/prompts/api-endpoints-test.en.md +2 -2
  135. package/templates/prompts/api-endpoints-test.fr.md +2 -2
  136. package/templates/prompts/backlog.en.md +6 -6
  137. package/templates/prompts/backlog.fr.md +1 -1
  138. package/templates/prompts/changelog.en.md +6 -6
  139. package/templates/prompts/changelog.fr.md +3 -3
  140. package/templates/prompts/dashboard-responsive.en.md +1 -1
  141. package/templates/prompts/deploy-prod.en.md +3 -3
  142. package/templates/prompts/deploy-prod.fr.md +3 -3
  143. package/templates/prompts/deploy-staging.en.md +3 -3
  144. package/templates/prompts/deploy-staging.fr.md +3 -3
  145. package/templates/prompts/design.en.md +5 -5
  146. package/templates/prompts/design.fr.md +3 -3
  147. package/templates/prompts/dev.en.md +4 -4
  148. package/templates/prompts/dev.fr.md +3 -3
  149. package/templates/prompts/done.en.md +5 -5
  150. package/templates/prompts/done.fr.md +2 -2
  151. package/templates/prompts/error-handling-review.en.md +1 -1
  152. package/templates/prompts/error-handling-review.fr.md +1 -1
  153. package/templates/prompts/file-watcher-test.en.md +4 -4
  154. package/templates/prompts/file-watcher-test.fr.md +1 -1
  155. package/templates/prompts/git-commit.en.md +5 -5
  156. package/templates/prompts/git-commit.fr.md +3 -3
  157. package/templates/prompts/git-push.en.md +3 -3
  158. package/templates/prompts/git-push.fr.md +3 -3
  159. package/templates/prompts/git-tag.en.md +3 -3
  160. package/templates/prompts/git-tag.fr.md +3 -3
  161. package/templates/prompts/in-progress.en.md +6 -6
  162. package/templates/prompts/in-progress.fr.md +3 -3
  163. package/templates/prompts/qualification.en.md +8 -8
  164. package/templates/prompts/qualification.fr.md +3 -3
  165. package/templates/prompts/retest-cypress.en.md +3 -3
  166. package/templates/prompts/retest-cypress.fr.md +3 -3
  167. package/templates/prompts/retest-playwright.en.md +4 -4
  168. package/templates/prompts/retest-playwright.fr.md +3 -3
  169. package/templates/prompts/retest.en.md +4 -4
  170. package/templates/prompts/retest.fr.md +3 -3
  171. package/templates/prompts/review-best-practices.en.md +3 -3
  172. package/templates/prompts/review-best-practices.fr.md +3 -3
  173. package/templates/prompts/review-code.en.md +4 -4
  174. package/templates/prompts/review-code.fr.md +3 -3
  175. package/templates/prompts/review-consistency.en.md +3 -3
  176. package/templates/prompts/review-consistency.fr.md +3 -3
  177. package/templates/prompts/review-no-duplication.en.md +3 -3
  178. package/templates/prompts/review-no-duplication.fr.md +3 -3
  179. package/templates/prompts/review-security.en.md +4 -4
  180. package/templates/prompts/review-security.fr.md +3 -3
  181. package/templates/prompts/specification.en.md +5 -5
  182. package/templates/prompts/specification.fr.md +3 -3
  183. package/templates/prompts/splitter.en.md +13 -13
  184. package/templates/prompts/splitter.fr.md +3 -3
  185. package/templates/prompts/template-validation.en.md +1 -1
  186. package/templates/prompts/template-validation.fr.md +1 -1
  187. package/templates/prompts/testing-coverage.en.md +1 -1
  188. package/templates/prompts/testing-coverage.fr.md +1 -1
  189. package/templates/prompts/testing-cypress.en.md +4 -4
  190. package/templates/prompts/testing-cypress.fr.md +3 -3
  191. package/templates/prompts/testing-integration.en.md +4 -4
  192. package/templates/prompts/testing-integration.fr.md +3 -3
  193. package/templates/prompts/testing-playwright.en.md +4 -4
  194. package/templates/prompts/testing-playwright.fr.md +3 -3
  195. package/templates/prompts/testing-unit.en.md +4 -4
  196. package/templates/prompts/testing-unit.fr.md +3 -3
  197. package/templates/prompts/update-docs.en.md +3 -3
  198. package/templates/prompts/update-docs.fr.md +3 -3
  199. package/templates/prompts/validate-staging.en.md +3 -3
  200. package/templates/prompts/validate-staging.fr.md +3 -3
  201. package/templates/prompts/websocket-test.en.md +1 -1
  202. package/dist/core/ticket.d.ts +0 -50
  203. package/dist/core/ticket.d.ts.map +0 -1
  204. package/dist/core/ticket.js +0 -224
  205. package/dist/core/ticket.js.map +0 -1
  206. package/dist/server/dashboard/pages/ticket-view.d.ts +0 -8
  207. package/dist/server/dashboard/pages/ticket-view.d.ts.map +0 -1
  208. package/dist/server/dashboard/pages/ticket-view.js.map +0 -1
  209. package/dist/services/ticket-io.d.ts +0 -80
  210. package/dist/services/ticket-io.d.ts.map +0 -1
  211. package/dist/services/ticket-io.js.map +0 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Issue Hierarchy Module
3
+ *
4
+ * Manages parent-child relationships between issues with depth-first selection.
5
+ * Columns are identified by NAME (not index):
6
+ * - BACKLOG: column name contains "backlog"
7
+ * - DONE: column name is exactly "done"
8
+ * - WORK: any other column
9
+ */
10
+ import type { Issue, Column } from '../types/index.js';
11
+ /**
12
+ * Check if column is a backlog column (name contains "backlog")
13
+ */
14
+ export declare function isBacklogColumn(column: Column): boolean;
15
+ /**
16
+ * Check if column is a done column (name is exactly "done")
17
+ */
18
+ export declare function isDoneColumn(column: Column): boolean;
19
+ /**
20
+ * Check if column is a work column (not backlog, not done)
21
+ */
22
+ export declare function isWorkColumn(column: Column): boolean;
23
+ /**
24
+ * Check if issue is in backlog
25
+ */
26
+ export declare function isIssueInBacklog(issue: Issue): boolean;
27
+ /**
28
+ * Check if issue is done
29
+ */
30
+ export declare function isIssueDone(issue: Issue): boolean;
31
+ /**
32
+ * Check if issue is in progress (work column)
33
+ */
34
+ export declare function isIssueInProgress(issue: Issue): boolean;
35
+ /**
36
+ * Get direct children of an issue
37
+ */
38
+ export declare function getChildren(rootDir: string, parentKey: string): Issue[];
39
+ /**
40
+ * Get all descendants (subtree) of an issue recursively
41
+ */
42
+ export declare function getSubtree(rootDir: string, key: string): Issue[];
43
+ /**
44
+ * Get ancestors (parent chain) from issue up to root
45
+ */
46
+ export declare function getAncestors(rootDir: string, key: string): Issue[];
47
+ /**
48
+ * Get depth of issue in hierarchy (0 = root)
49
+ */
50
+ export declare function getDepth(rootDir: string, key: string): number;
51
+ /**
52
+ * Check if setting parentKey as parent of key would create a cycle
53
+ */
54
+ export declare function wouldCreateCycle(rootDir: string, key: string, proposedParentKey: string): boolean;
55
+ /**
56
+ * Check if issue can be moved to Done (all descendants must be Done)
57
+ */
58
+ export declare function isEligibleForCompletion(rootDir: string, key: string): {
59
+ eligible: boolean;
60
+ blockers: string[];
61
+ };
62
+ /**
63
+ * Check if issue can be deleted (no children)
64
+ */
65
+ export declare function canDeleteIssue(rootDir: string, key: string): {
66
+ canDelete: boolean;
67
+ reason?: string;
68
+ };
69
+ /**
70
+ * Get all issues in the active scope
71
+ * Active scope = issues in progress + all their descendants
72
+ */
73
+ export declare function getActiveScope(rootDir: string): Issue[];
74
+ /**
75
+ * Check if issue is in active scope
76
+ */
77
+ export declare function isInActiveScope(rootDir: string, key: string): boolean;
78
+ /**
79
+ * Set parent for an issue (with validation)
80
+ */
81
+ export declare function setParent(rootDir: string, key: string, parentKey: string | null): {
82
+ success: boolean;
83
+ error?: string;
84
+ };
85
+ /**
86
+ * Find the next actionable issue using depth-first selection
87
+ *
88
+ * Rules:
89
+ * 1. P0 in backlog can preempt active scope (emergency handling)
90
+ * 2. Select from work columns (not backlog, not done) - deepest eligible first
91
+ * 3. Backlog is storage only - issues must be manually moved to work columns
92
+ *
93
+ * Eligible = not Done AND no non-Done descendants
94
+ * Tie-breaker: priority, then created_at (FIFO)
95
+ */
96
+ export declare function findActionableIssueWithHierarchy(rootDir: string): Issue | null;
97
+ //# sourceMappingURL=hierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/core/hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAC;AAgBjE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGvD;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,CAGvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,CAahE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,CAelE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAOjG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAU/G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CASpG;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAevD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGrE;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2BtC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CA2D9E"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Issue Hierarchy Module
3
+ *
4
+ * Manages parent-child relationships between issues with depth-first selection.
5
+ * Columns are identified by NAME (not index):
6
+ * - BACKLOG: column name contains "backlog"
7
+ * - DONE: column name is exactly "done"
8
+ * - WORK: any other column
9
+ */
10
+ import { getColumnBySlug } from './column.js';
11
+ import { listIssues, getIssue, findIssueDir } from './issue.js';
12
+ import { updateMetadata } from '../services/issue-io.js';
13
+ // ============================================
14
+ // COLUMN IDENTIFICATION (by name, not index)
15
+ // ============================================
16
+ /**
17
+ * Normalize column name for comparison
18
+ */
19
+ function normalizeColumnName(name) {
20
+ return name.toLowerCase().trim();
21
+ }
22
+ /**
23
+ * Check if column is a backlog column (name contains "backlog")
24
+ */
25
+ export function isBacklogColumn(column) {
26
+ return normalizeColumnName(column.name).includes('backlog');
27
+ }
28
+ /**
29
+ * Check if column is a done column (name is exactly "done")
30
+ */
31
+ export function isDoneColumn(column) {
32
+ return normalizeColumnName(column.name) === 'done';
33
+ }
34
+ /**
35
+ * Check if column is a work column (not backlog, not done)
36
+ */
37
+ export function isWorkColumn(column) {
38
+ return !isBacklogColumn(column) && !isDoneColumn(column);
39
+ }
40
+ // ============================================
41
+ // ISSUE STATE HELPERS
42
+ // ============================================
43
+ /**
44
+ * Check if issue is in backlog
45
+ */
46
+ export function isIssueInBacklog(issue) {
47
+ const column = getColumnBySlug(issue.column_slug);
48
+ return column ? isBacklogColumn(column) : false;
49
+ }
50
+ /**
51
+ * Check if issue is done
52
+ */
53
+ export function isIssueDone(issue) {
54
+ const column = getColumnBySlug(issue.column_slug);
55
+ return column ? isDoneColumn(column) : false;
56
+ }
57
+ /**
58
+ * Check if issue is in progress (work column)
59
+ */
60
+ export function isIssueInProgress(issue) {
61
+ const column = getColumnBySlug(issue.column_slug);
62
+ return column ? isWorkColumn(column) : false;
63
+ }
64
+ // ============================================
65
+ // HIERARCHY TRAVERSAL
66
+ // ============================================
67
+ /**
68
+ * Get direct children of an issue
69
+ */
70
+ export function getChildren(rootDir, parentKey) {
71
+ const allIssues = listIssues(rootDir);
72
+ return allIssues.filter(t => t.parent_key === parentKey);
73
+ }
74
+ /**
75
+ * Get all descendants (subtree) of an issue recursively
76
+ */
77
+ export function getSubtree(rootDir, key) {
78
+ const allIssues = listIssues(rootDir);
79
+ const descendants = [];
80
+ const queue = [key];
81
+ while (queue.length > 0) {
82
+ const currentKey = queue.shift();
83
+ const children = allIssues.filter(t => t.parent_key === currentKey);
84
+ descendants.push(...children);
85
+ queue.push(...children.map(c => c.key));
86
+ }
87
+ return descendants;
88
+ }
89
+ /**
90
+ * Get ancestors (parent chain) from issue up to root
91
+ */
92
+ export function getAncestors(rootDir, key) {
93
+ const ancestors = [];
94
+ let current = getIssue(rootDir, key);
95
+ while (current?.parent_key) {
96
+ const parent = getIssue(rootDir, current.parent_key);
97
+ if (parent) {
98
+ ancestors.push(parent);
99
+ current = parent;
100
+ }
101
+ else {
102
+ break;
103
+ }
104
+ }
105
+ return ancestors;
106
+ }
107
+ /**
108
+ * Get depth of issue in hierarchy (0 = root)
109
+ */
110
+ export function getDepth(rootDir, key) {
111
+ return getAncestors(rootDir, key).length;
112
+ }
113
+ // ============================================
114
+ // VALIDATION
115
+ // ============================================
116
+ /**
117
+ * Check if setting parentKey as parent of key would create a cycle
118
+ */
119
+ export function wouldCreateCycle(rootDir, key, proposedParentKey) {
120
+ // Can't be own parent
121
+ if (key === proposedParentKey)
122
+ return true;
123
+ // Check if proposedParentKey is in the subtree of key
124
+ const subtree = getSubtree(rootDir, key);
125
+ return subtree.some(t => t.key === proposedParentKey);
126
+ }
127
+ /**
128
+ * Check if issue can be moved to Done (all descendants must be Done)
129
+ */
130
+ export function isEligibleForCompletion(rootDir, key) {
131
+ const descendants = getSubtree(rootDir, key);
132
+ const blockers = descendants
133
+ .filter(t => !isIssueDone(t))
134
+ .map(t => t.key);
135
+ return {
136
+ eligible: blockers.length === 0,
137
+ blockers,
138
+ };
139
+ }
140
+ /**
141
+ * Check if issue can be deleted (no children)
142
+ */
143
+ export function canDeleteIssue(rootDir, key) {
144
+ const children = getChildren(rootDir, key);
145
+ if (children.length > 0) {
146
+ return {
147
+ canDelete: false,
148
+ reason: `Cannot delete: ${children.length} child issue(s) exist`,
149
+ };
150
+ }
151
+ return { canDelete: true };
152
+ }
153
+ // ============================================
154
+ // ACTIVE SCOPE
155
+ // ============================================
156
+ /**
157
+ * Get all issues in the active scope
158
+ * Active scope = issues in progress + all their descendants
159
+ */
160
+ export function getActiveScope(rootDir) {
161
+ const allIssues = listIssues(rootDir);
162
+ const inProgressIssues = allIssues.filter(isIssueInProgress);
163
+ if (inProgressIssues.length === 0)
164
+ return [];
165
+ const activeScope = new Set();
166
+ for (const issue of inProgressIssues) {
167
+ activeScope.add(issue.key);
168
+ const subtree = getSubtree(rootDir, issue.key);
169
+ subtree.forEach(t => activeScope.add(t.key));
170
+ }
171
+ return allIssues.filter(t => activeScope.has(t.key));
172
+ }
173
+ /**
174
+ * Check if issue is in active scope
175
+ */
176
+ export function isInActiveScope(rootDir, key) {
177
+ const activeScope = getActiveScope(rootDir);
178
+ return activeScope.some(t => t.key === key);
179
+ }
180
+ // ============================================
181
+ // MODIFICATION
182
+ // ============================================
183
+ /**
184
+ * Set parent for an issue (with validation)
185
+ */
186
+ export function setParent(rootDir, key, parentKey) {
187
+ const issue = getIssue(rootDir, key);
188
+ if (!issue) {
189
+ return { success: false, error: `Issue '${key}' not found` };
190
+ }
191
+ if (parentKey !== null) {
192
+ // Validate parent exists
193
+ const parent = getIssue(rootDir, parentKey);
194
+ if (!parent) {
195
+ return { success: false, error: `Parent issue '${parentKey}' not found` };
196
+ }
197
+ // Check for cycles
198
+ if (wouldCreateCycle(rootDir, key, parentKey)) {
199
+ return { success: false, error: 'Cannot set parent: would create a cycle' };
200
+ }
201
+ }
202
+ // Update the issue's parent_key
203
+ const issueDir = findIssueDir(rootDir, key);
204
+ if (!issueDir) {
205
+ return { success: false, error: `Issue directory for '${key}' not found` };
206
+ }
207
+ updateMetadata(issueDir, { parent_key: parentKey });
208
+ return { success: true };
209
+ }
210
+ // ============================================
211
+ // ACTIONABLE ISSUE SELECTION (depth-first)
212
+ // ============================================
213
+ /**
214
+ * Find the next actionable issue using depth-first selection
215
+ *
216
+ * Rules:
217
+ * 1. P0 in backlog can preempt active scope (emergency handling)
218
+ * 2. Select from work columns (not backlog, not done) - deepest eligible first
219
+ * 3. Backlog is storage only - issues must be manually moved to work columns
220
+ *
221
+ * Eligible = not Done AND no non-Done descendants
222
+ * Tie-breaker: priority, then created_at (FIFO)
223
+ */
224
+ export function findActionableIssueWithHierarchy(rootDir) {
225
+ const allIssues = listIssues(rootDir);
226
+ // 1. Check for P0 in backlog (preemption for emergencies)
227
+ const backlogP0 = allIssues.filter(t => t.parent_key === null &&
228
+ t.priority === 'P0' &&
229
+ isIssueInBacklog(t));
230
+ if (backlogP0.length > 0) {
231
+ return backlogP0.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime())[0];
232
+ }
233
+ // 2. Select from work columns (qualification, in-progress, testing, review, etc.)
234
+ // Backlog is storage - user must manually move issues to work columns
235
+ const workIssues = allIssues.filter(isIssueInProgress);
236
+ if (workIssues.length === 0) {
237
+ // No issues in work columns - nothing to do
238
+ // User must manually move issues from backlog to qualification
239
+ return null;
240
+ }
241
+ // Build active scope: work issues + all descendants
242
+ const activeScope = new Set();
243
+ for (const t of workIssues) {
244
+ activeScope.add(t.key);
245
+ getSubtree(rootDir, t.key).forEach(d => activeScope.add(d.key));
246
+ }
247
+ // Filter eligible: not Done AND no non-Done descendants
248
+ const eligible = allIssues.filter(t => {
249
+ if (!activeScope.has(t.key))
250
+ return false;
251
+ if (isIssueDone(t))
252
+ return false;
253
+ const subtree = getSubtree(rootDir, t.key);
254
+ return subtree.length === 0 || subtree.every(isIssueDone);
255
+ });
256
+ if (eligible.length === 0) {
257
+ // All work issues are done or waiting for children - nothing to do
258
+ return null;
259
+ }
260
+ return eligible.sort((a, b) => {
261
+ // Deepest first
262
+ const depthDiff = getDepth(rootDir, b.key) - getDepth(rootDir, a.key);
263
+ if (depthDiff !== 0)
264
+ return depthDiff;
265
+ // Priority
266
+ const prio = { P0: 0, P1: 1, P2: 2, P3: 3 };
267
+ const prioDiff = prio[a.priority] - prio[b.priority];
268
+ if (prioDiff !== 0)
269
+ return prioDiff;
270
+ // Created at (FIFO)
271
+ return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();
272
+ })[0];
273
+ }
274
+ //# sourceMappingURL=hierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/core/hierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Issue CRUD operations - Multi-file structure
3
+ */
4
+ import type { Issue, IssueCreateInput, IssueUpdateInput } from '../types/index.js';
5
+ /**
6
+ * Find an issue directory by its key
7
+ */
8
+ export declare function findIssueDir(rootDir: string, key: string): string | null;
9
+ /**
10
+ * Find an issue path by its key (for backwards compatibility)
11
+ * @deprecated Use findIssueDir instead
12
+ */
13
+ export declare function findIssuePath(rootDir: string, key: string): string | null;
14
+ /**
15
+ * Get an issue by its key
16
+ */
17
+ export declare function getIssue(rootDir: string, key: string): Issue | null;
18
+ /**
19
+ * Create a new issue
20
+ */
21
+ export declare function createIssue(rootDir: string, input: IssueCreateInput): Issue;
22
+ /**
23
+ * Update an issue
24
+ */
25
+ export declare function updateIssue(rootDir: string, key: string, updates: IssueUpdateInput): Issue | null;
26
+ /**
27
+ * Add a comment to an issue
28
+ */
29
+ export declare function addComment(rootDir: string, key: string, text: string, column?: string, source?: 'user' | 'claude'): Issue | null;
30
+ /**
31
+ * Move an issue to a new column
32
+ */
33
+ export declare function moveIssue(rootDir: string, key: string, toColumnSlug: string, force?: boolean): Issue | null;
34
+ /**
35
+ * Move an issue to the next column
36
+ */
37
+ export declare function nextIssue(rootDir: string, key: string): Issue | null;
38
+ /**
39
+ * List all issues
40
+ */
41
+ export declare function listIssues(rootDir: string): Issue[];
42
+ /**
43
+ * List issues in a specific column
44
+ */
45
+ export declare function listIssuesInColumn(rootDir: string, columnSlug: string): Issue[];
46
+ /**
47
+ * Find the first actionable issue (for Claude processing)
48
+ *
49
+ * Uses hierarchical depth-first selection:
50
+ * 1. P0 in backlog can preempt active scope
51
+ * 2. If active scope exists, select deepest eligible issue
52
+ * 3. If no active scope, select from backlog roots by priority
53
+ */
54
+ export declare function findActionableIssue(rootDir: string): Issue | null;
55
+ /**
56
+ * Delete an issue (blocked if has children)
57
+ */
58
+ export declare function deleteIssue(rootDir: string, key: string): {
59
+ success: boolean;
60
+ error?: string;
61
+ };
62
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../src/core/issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAY,MAAM,mBAAmB,CAAC;AAE7F;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAKnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,KAAK,CA2C3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,KAAK,GAAG,IAAI,CA0BjG;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,QAAiB,GAAG,KAAK,GAAG,IAAI,CAWxI;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,KAAK,UAAQ,GACZ,KAAK,GAAG,IAAI,CA8Bd;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAWpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAoBnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,CAiB/E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAa9F"}