@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.
- package/README.md +38 -38
- package/dist/cli/commands/comment.d.ts +1 -1
- package/dist/cli/commands/comment.js +11 -11
- package/dist/cli/commands/comment.js.map +1 -1
- package/dist/cli/commands/init.js +1 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list.d.ts +1 -1
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +65 -22
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/move.d.ts +1 -1
- package/dist/cli/commands/move.js +12 -12
- package/dist/cli/commands/move.js.map +1 -1
- package/dist/cli/commands/new.d.ts +1 -1
- package/dist/cli/commands/new.d.ts.map +1 -1
- package/dist/cli/commands/new.js +26 -13
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/commands/next.d.ts +1 -1
- package/dist/cli/commands/next.js +15 -15
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/parent.d.ts +9 -0
- package/dist/cli/commands/parent.d.ts.map +1 -0
- package/dist/cli/commands/parent.js +94 -0
- package/dist/cli/commands/parent.js.map +1 -0
- package/dist/cli/commands/serve.js +8 -8
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/show.d.ts +1 -1
- package/dist/cli/commands/show.d.ts.map +1 -1
- package/dist/cli/commands/show.js +51 -31
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/stats.js +2 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +5 -3
- package/dist/cli/parser.js.map +1 -1
- package/dist/core/column.js +2 -2
- package/dist/core/column.js.map +1 -1
- package/dist/core/hierarchy.d.ts +97 -0
- package/dist/core/hierarchy.d.ts.map +1 -0
- package/dist/core/hierarchy.js +274 -0
- package/dist/core/hierarchy.js.map +1 -0
- package/dist/core/issue.d.ts +62 -0
- package/dist/core/issue.d.ts.map +1 -0
- package/dist/core/issue.js +247 -0
- package/dist/core/issue.js.map +1 -0
- package/dist/core/sync.d.ts +9 -9
- package/dist/core/sync.d.ts.map +1 -1
- package/dist/core/sync.js +61 -58
- package/dist/core/sync.js.map +1 -1
- package/dist/core/workflow.d.ts +22 -20
- package/dist/core/workflow.d.ts.map +1 -1
- package/dist/core/workflow.js +68 -51
- package/dist/core/workflow.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/server/api-autocomplete.test.d.ts +6 -0
- package/dist/server/api-autocomplete.test.d.ts.map +1 -0
- package/dist/server/api-autocomplete.test.js +249 -0
- package/dist/server/api-autocomplete.test.js.map +1 -0
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +216 -106
- package/dist/server/api.js.map +1 -1
- package/dist/server/dashboard/pages/column-prompt.d.ts +1 -1
- package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -1
- package/dist/server/dashboard/pages/column-prompt.js +11 -11
- package/dist/server/dashboard/pages/column-prompt.js.map +1 -1
- package/dist/server/dashboard/pages/column-terminal.d.ts +1 -1
- package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -1
- package/dist/server/dashboard/pages/column-terminal.js +14 -14
- package/dist/server/dashboard/pages/column-terminal.js.map +1 -1
- package/dist/server/dashboard/pages/index.d.ts +3 -1
- package/dist/server/dashboard/pages/index.d.ts.map +1 -1
- package/dist/server/dashboard/pages/index.js +3 -1
- package/dist/server/dashboard/pages/index.js.map +1 -1
- package/dist/server/dashboard/pages/issue-graph.d.ts +9 -0
- package/dist/server/dashboard/pages/issue-graph.d.ts.map +1 -0
- package/dist/server/dashboard/pages/issue-graph.js +581 -0
- package/dist/server/dashboard/pages/issue-graph.js.map +1 -0
- package/dist/server/dashboard/pages/issue-view.d.ts +8 -0
- package/dist/server/dashboard/pages/issue-view.d.ts.map +1 -0
- package/dist/server/dashboard/pages/{ticket-view.js → issue-view.js} +128 -128
- package/dist/server/dashboard/pages/issue-view.js.map +1 -0
- package/dist/server/dashboard/pages/main-dashboard.js +21 -21
- package/dist/server/dashboard/pages/main-dashboard.js.map +1 -1
- package/dist/server/dashboard/pages/new-issue.d.ts +8 -0
- package/dist/server/dashboard/pages/new-issue.d.ts.map +1 -0
- package/dist/server/dashboard/pages/new-issue.js +648 -0
- package/dist/server/dashboard/pages/new-issue.js.map +1 -0
- package/dist/server/dashboard/pages/new-issue.test.d.ts +6 -0
- package/dist/server/dashboard/pages/new-issue.test.d.ts.map +1 -0
- package/dist/server/dashboard/pages/new-issue.test.js +349 -0
- package/dist/server/dashboard/pages/new-issue.test.js.map +1 -0
- package/dist/server/dashboard/pages/pipeline-configurator.js +1 -1
- package/dist/server/dashboard/pages/shared.d.ts +2 -2
- package/dist/server/dashboard/pages/shared.d.ts.map +1 -1
- package/dist/server/dashboard/pages/shared.js +5 -5
- package/dist/server/dashboard/pages/shared.js.map +1 -1
- package/dist/server/dashboard/pages/stats-page.js +11 -11
- package/dist/server/dashboard/scripts/index.js +134 -134
- package/dist/server/dashboard/styles/board.d.ts +1 -1
- package/dist/server/dashboard/styles/board.js +10 -10
- package/dist/server/dashboard.d.ts +1 -1
- package/dist/server/dashboard.d.ts.map +1 -1
- package/dist/server/dashboard.js +1 -1
- package/dist/server/dashboard.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +40 -24
- package/dist/server/index.js.map +1 -1
- package/dist/server/websocket.d.ts +6 -6
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +10 -10
- package/dist/server/websocket.js.map +1 -1
- package/dist/services/claude.d.ts +13 -13
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +98 -98
- package/dist/services/claude.js.map +1 -1
- package/dist/services/issue-io.d.ts +81 -0
- package/dist/services/issue-io.d.ts.map +1 -0
- package/dist/services/{ticket-io.js → issue-io.js} +54 -53
- package/dist/services/issue-io.js.map +1 -0
- package/dist/services/stats.d.ts +2 -0
- package/dist/services/stats.d.ts.map +1 -1
- package/dist/services/stats.js.map +1 -1
- package/dist/types/index.d.ts +6 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/fs.d.ts +2 -2
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +2 -2
- package/dist/utils/fs.js.map +1 -1
- package/package.json +3 -3
- package/templates/catalog.yaml +2 -2
- package/templates/prompts/api-endpoints-test.en.md +2 -2
- package/templates/prompts/api-endpoints-test.fr.md +2 -2
- package/templates/prompts/backlog.en.md +6 -6
- package/templates/prompts/backlog.fr.md +1 -1
- package/templates/prompts/changelog.en.md +6 -6
- package/templates/prompts/changelog.fr.md +3 -3
- package/templates/prompts/dashboard-responsive.en.md +1 -1
- package/templates/prompts/deploy-prod.en.md +3 -3
- package/templates/prompts/deploy-prod.fr.md +3 -3
- package/templates/prompts/deploy-staging.en.md +3 -3
- package/templates/prompts/deploy-staging.fr.md +3 -3
- package/templates/prompts/design.en.md +5 -5
- package/templates/prompts/design.fr.md +3 -3
- package/templates/prompts/dev.en.md +4 -4
- package/templates/prompts/dev.fr.md +3 -3
- package/templates/prompts/done.en.md +5 -5
- package/templates/prompts/done.fr.md +2 -2
- package/templates/prompts/error-handling-review.en.md +1 -1
- package/templates/prompts/error-handling-review.fr.md +1 -1
- package/templates/prompts/file-watcher-test.en.md +4 -4
- package/templates/prompts/file-watcher-test.fr.md +1 -1
- package/templates/prompts/git-commit.en.md +5 -5
- package/templates/prompts/git-commit.fr.md +3 -3
- package/templates/prompts/git-push.en.md +3 -3
- package/templates/prompts/git-push.fr.md +3 -3
- package/templates/prompts/git-tag.en.md +3 -3
- package/templates/prompts/git-tag.fr.md +3 -3
- package/templates/prompts/in-progress.en.md +6 -6
- package/templates/prompts/in-progress.fr.md +3 -3
- package/templates/prompts/qualification.en.md +8 -8
- package/templates/prompts/qualification.fr.md +3 -3
- package/templates/prompts/retest-cypress.en.md +3 -3
- package/templates/prompts/retest-cypress.fr.md +3 -3
- package/templates/prompts/retest-playwright.en.md +4 -4
- package/templates/prompts/retest-playwright.fr.md +3 -3
- package/templates/prompts/retest.en.md +4 -4
- package/templates/prompts/retest.fr.md +3 -3
- package/templates/prompts/review-best-practices.en.md +3 -3
- package/templates/prompts/review-best-practices.fr.md +3 -3
- package/templates/prompts/review-code.en.md +4 -4
- package/templates/prompts/review-code.fr.md +3 -3
- package/templates/prompts/review-consistency.en.md +3 -3
- package/templates/prompts/review-consistency.fr.md +3 -3
- package/templates/prompts/review-no-duplication.en.md +3 -3
- package/templates/prompts/review-no-duplication.fr.md +3 -3
- package/templates/prompts/review-security.en.md +4 -4
- package/templates/prompts/review-security.fr.md +3 -3
- package/templates/prompts/specification.en.md +5 -5
- package/templates/prompts/specification.fr.md +3 -3
- package/templates/prompts/splitter.en.md +13 -13
- package/templates/prompts/splitter.fr.md +3 -3
- package/templates/prompts/template-validation.en.md +1 -1
- package/templates/prompts/template-validation.fr.md +1 -1
- package/templates/prompts/testing-coverage.en.md +1 -1
- package/templates/prompts/testing-coverage.fr.md +1 -1
- package/templates/prompts/testing-cypress.en.md +4 -4
- package/templates/prompts/testing-cypress.fr.md +3 -3
- package/templates/prompts/testing-integration.en.md +4 -4
- package/templates/prompts/testing-integration.fr.md +3 -3
- package/templates/prompts/testing-playwright.en.md +4 -4
- package/templates/prompts/testing-playwright.fr.md +3 -3
- package/templates/prompts/testing-unit.en.md +4 -4
- package/templates/prompts/testing-unit.fr.md +3 -3
- package/templates/prompts/update-docs.en.md +3 -3
- package/templates/prompts/update-docs.fr.md +3 -3
- package/templates/prompts/validate-staging.en.md +3 -3
- package/templates/prompts/validate-staging.fr.md +3 -3
- package/templates/prompts/websocket-test.en.md +1 -1
- package/dist/core/ticket.d.ts +0 -50
- package/dist/core/ticket.d.ts.map +0 -1
- package/dist/core/ticket.js +0 -224
- package/dist/core/ticket.js.map +0 -1
- package/dist/server/dashboard/pages/ticket-view.d.ts +0 -8
- package/dist/server/dashboard/pages/ticket-view.d.ts.map +0 -1
- package/dist/server/dashboard/pages/ticket-view.js.map +0 -1
- package/dist/services/ticket-io.d.ts +0 -80
- package/dist/services/ticket-io.d.ts.map +0 -1
- 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"}
|