@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,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue CRUD operations - Multi-file structure
|
|
3
|
+
*/
|
|
4
|
+
import { join, dirname, basename } from 'node:path';
|
|
5
|
+
import { ensureDir, listDirs, pathExists, generateIssueKey, slugify, getTimestamp, moveDir, } from '../utils/fs.js';
|
|
6
|
+
import { loadIssue, updateMetadata, updateDescription, addCommentFile, addHistoryEntry, createIssueStructure, } from '../services/issue-io.js';
|
|
7
|
+
import { getColumns, getColumnBySlug } from './column.js';
|
|
8
|
+
import { findActionableIssueWithHierarchy, canDeleteIssue } from './hierarchy.js';
|
|
9
|
+
import { removeDir } from '../utils/fs.js';
|
|
10
|
+
/**
|
|
11
|
+
* Find an issue directory by its key
|
|
12
|
+
*/
|
|
13
|
+
export function findIssueDir(rootDir, key) {
|
|
14
|
+
const columns = getColumns();
|
|
15
|
+
for (const column of columns) {
|
|
16
|
+
// Issues are stored in column/issues/ subfolder
|
|
17
|
+
const issuesDir = join(rootDir, column.slug, 'issues');
|
|
18
|
+
if (!pathExists(issuesDir))
|
|
19
|
+
continue;
|
|
20
|
+
const issueDirs = listDirs(issuesDir);
|
|
21
|
+
for (const issueDir of issueDirs) {
|
|
22
|
+
if (issueDir.startsWith(`${key}__`)) {
|
|
23
|
+
return join(issuesDir, issueDir);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find an issue path by its key (for backwards compatibility)
|
|
31
|
+
* @deprecated Use findIssueDir instead
|
|
32
|
+
*/
|
|
33
|
+
export function findIssuePath(rootDir, key) {
|
|
34
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
35
|
+
if (!issueDir)
|
|
36
|
+
return null;
|
|
37
|
+
return join(issueDir, 'metadata.json');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get an issue by its key
|
|
41
|
+
*/
|
|
42
|
+
export function getIssue(rootDir, key) {
|
|
43
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
44
|
+
if (!issueDir)
|
|
45
|
+
return null;
|
|
46
|
+
return loadIssue(issueDir);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a new issue
|
|
50
|
+
*/
|
|
51
|
+
export function createIssue(rootDir, input) {
|
|
52
|
+
// Validate parent if provided
|
|
53
|
+
if (input.parent_key) {
|
|
54
|
+
const parent = getIssue(rootDir, input.parent_key);
|
|
55
|
+
if (!parent) {
|
|
56
|
+
throw new Error(`Parent issue '${input.parent_key}' not found`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const key = generateIssueKey(rootDir);
|
|
60
|
+
const timestamp = getTimestamp();
|
|
61
|
+
const titleSlug = slugify(input.title);
|
|
62
|
+
// Default to backlog
|
|
63
|
+
const column = getColumnBySlug('00_backlog');
|
|
64
|
+
// Issues are stored in column/issues/ subfolder
|
|
65
|
+
const issueDir = join(rootDir, column.slug, 'issues', `${key}__${titleSlug}`);
|
|
66
|
+
const metadata = {
|
|
67
|
+
key,
|
|
68
|
+
title: input.title,
|
|
69
|
+
priority: input.priority || 'P2',
|
|
70
|
+
labels: input.labels || [],
|
|
71
|
+
acceptance_criteria: input.acceptance_criteria || [],
|
|
72
|
+
semver: input.semver || 'patch',
|
|
73
|
+
history: [
|
|
74
|
+
{
|
|
75
|
+
at: timestamp,
|
|
76
|
+
action: 'created',
|
|
77
|
+
from: null,
|
|
78
|
+
to: column.slug,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
created_at: timestamp,
|
|
82
|
+
updated_at: timestamp,
|
|
83
|
+
parent_key: input.parent_key || null,
|
|
84
|
+
};
|
|
85
|
+
const description = input.description || '';
|
|
86
|
+
createIssueStructure(issueDir, metadata, description);
|
|
87
|
+
return loadIssue(issueDir);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Update an issue
|
|
91
|
+
*/
|
|
92
|
+
export function updateIssue(rootDir, key, updates) {
|
|
93
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
94
|
+
if (!issueDir)
|
|
95
|
+
return null;
|
|
96
|
+
const issue = loadIssue(issueDir);
|
|
97
|
+
if (!issue)
|
|
98
|
+
return null;
|
|
99
|
+
// Build metadata updates
|
|
100
|
+
const metadataUpdates = {};
|
|
101
|
+
if (updates.title !== undefined)
|
|
102
|
+
metadataUpdates.title = updates.title;
|
|
103
|
+
if (updates.priority !== undefined)
|
|
104
|
+
metadataUpdates.priority = updates.priority;
|
|
105
|
+
if (updates.labels !== undefined)
|
|
106
|
+
metadataUpdates.labels = updates.labels;
|
|
107
|
+
if (updates.acceptance_criteria !== undefined)
|
|
108
|
+
metadataUpdates.acceptance_criteria = updates.acceptance_criteria;
|
|
109
|
+
if (updates.semver !== undefined)
|
|
110
|
+
metadataUpdates.semver = updates.semver;
|
|
111
|
+
// Update metadata if any changes
|
|
112
|
+
if (Object.keys(metadataUpdates).length > 0) {
|
|
113
|
+
updateMetadata(issueDir, metadataUpdates);
|
|
114
|
+
}
|
|
115
|
+
// Update description if changed
|
|
116
|
+
if (updates.description !== undefined) {
|
|
117
|
+
updateDescription(issueDir, updates.description);
|
|
118
|
+
}
|
|
119
|
+
return loadIssue(issueDir);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Add a comment to an issue
|
|
123
|
+
*/
|
|
124
|
+
export function addComment(rootDir, key, text, column, source = 'user') {
|
|
125
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
126
|
+
if (!issueDir)
|
|
127
|
+
return null;
|
|
128
|
+
const issue = loadIssue(issueDir);
|
|
129
|
+
if (!issue)
|
|
130
|
+
return null;
|
|
131
|
+
const commentColumn = column || issue.status || 'N/A';
|
|
132
|
+
addCommentFile(issueDir, text, commentColumn, source);
|
|
133
|
+
return loadIssue(issueDir);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Move an issue to a new column
|
|
137
|
+
*/
|
|
138
|
+
export function moveIssue(rootDir, key, toColumnSlug, force = false) {
|
|
139
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
140
|
+
if (!issueDir)
|
|
141
|
+
return null;
|
|
142
|
+
const issue = loadIssue(issueDir);
|
|
143
|
+
if (!issue)
|
|
144
|
+
return null;
|
|
145
|
+
const toColumn = getColumnBySlug(toColumnSlug);
|
|
146
|
+
if (!toColumn)
|
|
147
|
+
return null;
|
|
148
|
+
const fromColumn = getColumnBySlug(issue.column_slug);
|
|
149
|
+
if (!fromColumn)
|
|
150
|
+
return null;
|
|
151
|
+
// Determine action
|
|
152
|
+
const action = force ? 'forced' : 'moved';
|
|
153
|
+
// Add history entry
|
|
154
|
+
addHistoryEntry(issueDir, action, fromColumn.slug, toColumn.slug);
|
|
155
|
+
// Move directory
|
|
156
|
+
const issueDirName = basename(issueDir);
|
|
157
|
+
// Issues are stored in column/issues/ subfolder
|
|
158
|
+
const newIssueDir = join(rootDir, toColumn.slug, 'issues', issueDirName);
|
|
159
|
+
if (issueDir !== newIssueDir) {
|
|
160
|
+
ensureDir(dirname(newIssueDir));
|
|
161
|
+
moveDir(issueDir, newIssueDir);
|
|
162
|
+
}
|
|
163
|
+
return loadIssue(newIssueDir);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Move an issue to the next column
|
|
167
|
+
*/
|
|
168
|
+
export function nextIssue(rootDir, key) {
|
|
169
|
+
const issue = getIssue(rootDir, key);
|
|
170
|
+
if (!issue)
|
|
171
|
+
return null;
|
|
172
|
+
const currentColumn = getColumnBySlug(issue.column_slug);
|
|
173
|
+
if (!currentColumn)
|
|
174
|
+
return null;
|
|
175
|
+
const nextColumn = getColumns().find(c => c.index === currentColumn.index + 1);
|
|
176
|
+
if (!nextColumn)
|
|
177
|
+
return null;
|
|
178
|
+
return moveIssue(rootDir, key, nextColumn.slug);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* List all issues
|
|
182
|
+
*/
|
|
183
|
+
export function listIssues(rootDir) {
|
|
184
|
+
const issues = [];
|
|
185
|
+
const columns = getColumns();
|
|
186
|
+
for (const column of columns) {
|
|
187
|
+
// Issues are stored in column/issues/ subfolder
|
|
188
|
+
const issuesDir = join(rootDir, column.slug, 'issues');
|
|
189
|
+
if (!pathExists(issuesDir))
|
|
190
|
+
continue;
|
|
191
|
+
const issueDirs = listDirs(issuesDir);
|
|
192
|
+
for (const issueDirName of issueDirs) {
|
|
193
|
+
const issueDir = join(issuesDir, issueDirName);
|
|
194
|
+
const issue = loadIssue(issueDir);
|
|
195
|
+
if (issue) {
|
|
196
|
+
issues.push(issue);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return issues;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* List issues in a specific column
|
|
204
|
+
*/
|
|
205
|
+
export function listIssuesInColumn(rootDir, columnSlug) {
|
|
206
|
+
// Issues are stored in column/issues/ subfolder
|
|
207
|
+
const issuesDir = join(rootDir, columnSlug, 'issues');
|
|
208
|
+
if (!pathExists(issuesDir))
|
|
209
|
+
return [];
|
|
210
|
+
const issues = [];
|
|
211
|
+
const issueDirs = listDirs(issuesDir);
|
|
212
|
+
for (const issueDirName of issueDirs) {
|
|
213
|
+
const issueDir = join(issuesDir, issueDirName);
|
|
214
|
+
const issue = loadIssue(issueDir);
|
|
215
|
+
if (issue) {
|
|
216
|
+
issues.push(issue);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return issues;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Find the first actionable issue (for Claude processing)
|
|
223
|
+
*
|
|
224
|
+
* Uses hierarchical depth-first selection:
|
|
225
|
+
* 1. P0 in backlog can preempt active scope
|
|
226
|
+
* 2. If active scope exists, select deepest eligible issue
|
|
227
|
+
* 3. If no active scope, select from backlog roots by priority
|
|
228
|
+
*/
|
|
229
|
+
export function findActionableIssue(rootDir) {
|
|
230
|
+
return findActionableIssueWithHierarchy(rootDir);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Delete an issue (blocked if has children)
|
|
234
|
+
*/
|
|
235
|
+
export function deleteIssue(rootDir, key) {
|
|
236
|
+
const { canDelete, reason } = canDeleteIssue(rootDir, key);
|
|
237
|
+
if (!canDelete) {
|
|
238
|
+
return { success: false, error: reason };
|
|
239
|
+
}
|
|
240
|
+
const issueDir = findIssueDir(rootDir, key);
|
|
241
|
+
if (!issueDir) {
|
|
242
|
+
return { success: false, error: `Issue '${key}' not found` };
|
|
243
|
+
}
|
|
244
|
+
removeDir(issueDir);
|
|
245
|
+
return { success: true };
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/core/issue.ts"],"names":[],"mappings":"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"}
|
package/dist/core/sync.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Pipeline synchronization
|
|
3
3
|
* Handles syncing pipeline configuration with folder structure
|
|
4
4
|
*/
|
|
5
|
-
import type { SyncResult,
|
|
5
|
+
import type { SyncResult, Issue } from '../types/index.js';
|
|
6
6
|
/**
|
|
7
7
|
* Detect changes between pipeline and folder structure
|
|
8
8
|
*/
|
|
@@ -16,21 +16,21 @@ export declare function previewSync(rootDir: string): SyncResult;
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function applySync(rootDir: string): SyncResult;
|
|
18
18
|
/**
|
|
19
|
-
* Check if there are
|
|
19
|
+
* Check if there are issues in transition
|
|
20
20
|
*/
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function hasTransitionIssues(rootDir: string): boolean;
|
|
22
22
|
/**
|
|
23
|
-
* Get
|
|
23
|
+
* Get issues in transition
|
|
24
24
|
*/
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function getTransitionIssues(rootDir: string): Issue[];
|
|
26
26
|
/**
|
|
27
|
-
* Resolve a transition
|
|
27
|
+
* Resolve a transition issue by moving it to a target column
|
|
28
28
|
*/
|
|
29
|
-
export declare function
|
|
29
|
+
export declare function resolveTransitionIssue(rootDir: string, issueKey: string, targetSlug: string): boolean;
|
|
30
30
|
/**
|
|
31
|
-
* Resolve multiple transition
|
|
31
|
+
* Resolve multiple transition issues
|
|
32
32
|
*/
|
|
33
|
-
export declare function
|
|
33
|
+
export declare function resolveTransitionIssues(rootDir: string, actions: Record<string, string>): {
|
|
34
34
|
success: string[];
|
|
35
35
|
failed: string[];
|
|
36
36
|
};
|
package/dist/core/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAoB3D;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAuDzD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAEvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA6DrD;AAgED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAE5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAqCrG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAYjI;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
package/dist/core/sync.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { existsSync, renameSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
7
|
import { getActiveColumns } from './pipeline.js';
|
|
8
|
-
import {
|
|
8
|
+
import { listIssuesInColumn } from './issue.js';
|
|
9
9
|
import { ensureDir, listDirs, moveDir } from '../utils/fs.js';
|
|
10
10
|
const TRANSITION_SLUG = '_transition';
|
|
11
11
|
/**
|
|
@@ -61,10 +61,10 @@ export function detectChanges(rootDir) {
|
|
|
61
61
|
for (const dir of existingDirs) {
|
|
62
62
|
if (!matchedDirs.has(dir) && !expectedSlugs.has(dir)) {
|
|
63
63
|
result.removed.push(dir);
|
|
64
|
-
// Find
|
|
65
|
-
const
|
|
66
|
-
for (const
|
|
67
|
-
result.transitioned.push(
|
|
64
|
+
// Find issues that will be orphaned
|
|
65
|
+
const issues = listIssuesInColumn(rootDir, dir);
|
|
66
|
+
for (const issue of issues) {
|
|
67
|
+
result.transitioned.push(issue.key);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -84,17 +84,17 @@ export function applySync(rootDir) {
|
|
|
84
84
|
// 1. Create _transition folder if needed
|
|
85
85
|
if (changes.transitioned.length > 0) {
|
|
86
86
|
const transitionDir = join(rootDir, TRANSITION_SLUG);
|
|
87
|
-
const
|
|
87
|
+
const transitionIssuesDir = join(transitionDir, 'issues');
|
|
88
88
|
ensureDir(transitionDir);
|
|
89
|
-
ensureDir(
|
|
89
|
+
ensureDir(transitionIssuesDir);
|
|
90
90
|
}
|
|
91
|
-
// 2. Move orphan
|
|
92
|
-
for (const
|
|
91
|
+
// 2. Move orphan issues to _transition
|
|
92
|
+
for (const issueKey of changes.transitioned) {
|
|
93
93
|
try {
|
|
94
|
-
|
|
94
|
+
moveIssueToTransition(rootDir, issueKey);
|
|
95
95
|
}
|
|
96
96
|
catch (error) {
|
|
97
|
-
changes.errors.push(`Failed to move ${
|
|
97
|
+
changes.errors.push(`Failed to move ${issueKey}: ${error}`);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
// 3. Rename folders
|
|
@@ -104,7 +104,7 @@ export function applySync(rootDir) {
|
|
|
104
104
|
const toPath = join(rootDir, rename.to);
|
|
105
105
|
if (existsSync(fromPath)) {
|
|
106
106
|
renameSync(fromPath, toPath);
|
|
107
|
-
|
|
107
|
+
updateIssuesColumnSlug(rootDir, rename.from, rename.to);
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
catch (error) {
|
|
@@ -115,15 +115,15 @@ export function applySync(rootDir) {
|
|
|
115
115
|
for (const slug of changes.added) {
|
|
116
116
|
try {
|
|
117
117
|
const columnDir = join(rootDir, slug);
|
|
118
|
-
const
|
|
118
|
+
const issuesDir = join(columnDir, 'issues');
|
|
119
119
|
ensureDir(columnDir);
|
|
120
|
-
ensureDir(
|
|
120
|
+
ensureDir(issuesDir);
|
|
121
121
|
}
|
|
122
122
|
catch (error) {
|
|
123
123
|
changes.errors.push(`Failed to create ${slug}: ${error}`);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
// 5. Archive removed folders (after moving
|
|
126
|
+
// 5. Archive removed folders (after moving issues)
|
|
127
127
|
for (const slug of changes.removed) {
|
|
128
128
|
try {
|
|
129
129
|
const columnDir = join(rootDir, slug);
|
|
@@ -140,21 +140,21 @@ export function applySync(rootDir) {
|
|
|
140
140
|
return changes;
|
|
141
141
|
}
|
|
142
142
|
/**
|
|
143
|
-
* Move
|
|
143
|
+
* Move an issue to _transition
|
|
144
144
|
*/
|
|
145
|
-
function
|
|
146
|
-
// Find the
|
|
145
|
+
function moveIssueToTransition(rootDir, issueKey) {
|
|
146
|
+
// Find the issue directory (filesystem uses 'issues' folder)
|
|
147
147
|
const columns = listColumnDirs(rootDir);
|
|
148
148
|
for (const columnSlug of columns) {
|
|
149
|
-
const
|
|
150
|
-
if (!existsSync(
|
|
149
|
+
const issuesDir = join(rootDir, columnSlug, 'issues');
|
|
150
|
+
if (!existsSync(issuesDir))
|
|
151
151
|
continue;
|
|
152
|
-
const
|
|
153
|
-
for (const
|
|
154
|
-
if (
|
|
155
|
-
const oldPath = join(
|
|
156
|
-
const newPath = join(rootDir, TRANSITION_SLUG, '
|
|
157
|
-
ensureDir(join(rootDir, TRANSITION_SLUG, '
|
|
152
|
+
const issueDirs = listDirs(issuesDir);
|
|
153
|
+
for (const issueDirName of issueDirs) {
|
|
154
|
+
if (issueDirName.startsWith(`${issueKey}__`)) {
|
|
155
|
+
const oldPath = join(issuesDir, issueDirName);
|
|
156
|
+
const newPath = join(rootDir, TRANSITION_SLUG, 'issues', issueDirName);
|
|
157
|
+
ensureDir(join(rootDir, TRANSITION_SLUG, 'issues'));
|
|
158
158
|
moveDir(oldPath, newPath);
|
|
159
159
|
// Update metadata
|
|
160
160
|
const metadataPath = join(newPath, 'metadata.json');
|
|
@@ -177,15 +177,16 @@ function moveTicketToTransition(rootDir, ticketKey) {
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
/**
|
|
180
|
-
* Update column_slug for all
|
|
180
|
+
* Update column_slug for all issues in a renamed column
|
|
181
181
|
*/
|
|
182
|
-
function
|
|
183
|
-
|
|
184
|
-
|
|
182
|
+
function updateIssuesColumnSlug(rootDir, oldSlug, newSlug) {
|
|
183
|
+
// Issues are stored in the 'issues' subfolder
|
|
184
|
+
const issuesDir = join(rootDir, newSlug, 'issues');
|
|
185
|
+
if (!existsSync(issuesDir))
|
|
185
186
|
return;
|
|
186
|
-
const
|
|
187
|
-
for (const
|
|
188
|
-
const metadataPath = join(
|
|
187
|
+
const issueDirs = listDirs(issuesDir);
|
|
188
|
+
for (const issueDirName of issueDirs) {
|
|
189
|
+
const metadataPath = join(issuesDir, issueDirName, 'metadata.json');
|
|
189
190
|
if (existsSync(metadataPath)) {
|
|
190
191
|
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
191
192
|
metadata.column_slug = newSlug;
|
|
@@ -195,35 +196,37 @@ function updateTicketsColumnSlug(rootDir, oldSlug, newSlug) {
|
|
|
195
196
|
}
|
|
196
197
|
}
|
|
197
198
|
/**
|
|
198
|
-
* Check if there are
|
|
199
|
+
* Check if there are issues in transition
|
|
199
200
|
*/
|
|
200
|
-
export function
|
|
201
|
-
|
|
201
|
+
export function hasTransitionIssues(rootDir) {
|
|
202
|
+
// Issues are stored in the 'issues' subfolder
|
|
203
|
+
const transitionDir = join(rootDir, TRANSITION_SLUG, 'issues');
|
|
202
204
|
if (!existsSync(transitionDir))
|
|
203
205
|
return false;
|
|
204
|
-
const
|
|
205
|
-
return
|
|
206
|
+
const issueDirs = listDirs(transitionDir);
|
|
207
|
+
return issueDirs.length > 0;
|
|
206
208
|
}
|
|
207
209
|
/**
|
|
208
|
-
* Get
|
|
210
|
+
* Get issues in transition
|
|
209
211
|
*/
|
|
210
|
-
export function
|
|
211
|
-
return
|
|
212
|
+
export function getTransitionIssues(rootDir) {
|
|
213
|
+
return listIssuesInColumn(rootDir, TRANSITION_SLUG);
|
|
212
214
|
}
|
|
213
215
|
/**
|
|
214
|
-
* Resolve a transition
|
|
216
|
+
* Resolve a transition issue by moving it to a target column
|
|
215
217
|
*/
|
|
216
|
-
export function
|
|
217
|
-
|
|
218
|
-
|
|
218
|
+
export function resolveTransitionIssue(rootDir, issueKey, targetSlug) {
|
|
219
|
+
// Issues are stored in the 'issues' subfolder
|
|
220
|
+
const transitionIssuesDir = join(rootDir, TRANSITION_SLUG, 'issues');
|
|
221
|
+
if (!existsSync(transitionIssuesDir))
|
|
219
222
|
return false;
|
|
220
|
-
const
|
|
221
|
-
for (const
|
|
222
|
-
if (
|
|
223
|
-
const oldPath = join(
|
|
224
|
-
const
|
|
225
|
-
ensureDir(
|
|
226
|
-
const newPath = join(
|
|
223
|
+
const issueDirs = listDirs(transitionIssuesDir);
|
|
224
|
+
for (const issueDirName of issueDirs) {
|
|
225
|
+
if (issueDirName.startsWith(`${issueKey}__`)) {
|
|
226
|
+
const oldPath = join(transitionIssuesDir, issueDirName);
|
|
227
|
+
const targetIssuesDir = join(rootDir, targetSlug, 'issues');
|
|
228
|
+
ensureDir(targetIssuesDir);
|
|
229
|
+
const newPath = join(targetIssuesDir, issueDirName);
|
|
227
230
|
moveDir(oldPath, newPath);
|
|
228
231
|
// Update metadata
|
|
229
232
|
const metadataPath = join(newPath, 'metadata.json');
|
|
@@ -246,16 +249,16 @@ export function resolveTransitionTicket(rootDir, ticketKey, targetSlug) {
|
|
|
246
249
|
return false;
|
|
247
250
|
}
|
|
248
251
|
/**
|
|
249
|
-
* Resolve multiple transition
|
|
252
|
+
* Resolve multiple transition issues
|
|
250
253
|
*/
|
|
251
|
-
export function
|
|
254
|
+
export function resolveTransitionIssues(rootDir, actions) {
|
|
252
255
|
const results = { success: [], failed: [] };
|
|
253
|
-
for (const [
|
|
254
|
-
if (
|
|
255
|
-
results.success.push(
|
|
256
|
+
for (const [issueKey, targetSlug] of Object.entries(actions)) {
|
|
257
|
+
if (resolveTransitionIssue(rootDir, issueKey, targetSlug)) {
|
|
258
|
+
results.success.push(issueKey);
|
|
256
259
|
}
|
|
257
260
|
else {
|
|
258
|
-
results.failed.push(
|
|
261
|
+
results.failed.push(issueKey);
|
|
259
262
|
}
|
|
260
263
|
}
|
|
261
264
|
return results;
|
package/dist/core/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAY,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAA0B,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/core/workflow.d.ts
CHANGED
|
@@ -1,43 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workflow transitions logic
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
4
|
+
import type { Issue, Column, WorkflowValidation } from '../types/index.js';
|
|
5
5
|
/**
|
|
6
6
|
* Validate a workflow transition
|
|
7
7
|
*/
|
|
8
|
-
export declare function validateTransition(fromSlug: string, toSlug: string, force?: boolean): WorkflowValidation;
|
|
8
|
+
export declare function validateTransition(fromSlug: string, toSlug: string, force?: boolean, issue?: Issue): WorkflowValidation;
|
|
9
9
|
/**
|
|
10
|
-
* Get available transitions for
|
|
10
|
+
* Get available transitions for an issue
|
|
11
11
|
*/
|
|
12
|
-
export declare function getAvailableTransitions(
|
|
12
|
+
export declare function getAvailableTransitions(issue: Issue): Column[];
|
|
13
13
|
/**
|
|
14
14
|
* Get all possible transitions (including forced)
|
|
15
15
|
*/
|
|
16
|
-
export declare function getAllPossibleTransitions(
|
|
16
|
+
export declare function getAllPossibleTransitions(issue: Issue): Column[];
|
|
17
17
|
/**
|
|
18
|
-
* Check if
|
|
18
|
+
* Check if issue can advance to next column
|
|
19
19
|
*/
|
|
20
|
-
export declare function canAdvance(
|
|
20
|
+
export declare function canAdvance(issue: Issue): boolean;
|
|
21
21
|
/**
|
|
22
|
-
* Check if
|
|
22
|
+
* Check if issue is in final column (done)
|
|
23
|
+
* Uses name-based detection: column name is exactly "done"
|
|
23
24
|
*/
|
|
24
|
-
export declare function isComplete(
|
|
25
|
+
export declare function isComplete(issue: Issue): boolean;
|
|
25
26
|
/**
|
|
26
|
-
* Check if
|
|
27
|
+
* Check if issue is in backlog
|
|
28
|
+
* Uses name-based detection: column name contains "backlog"
|
|
27
29
|
*/
|
|
28
|
-
export declare function isInBacklog(
|
|
30
|
+
export declare function isInBacklog(issue: Issue): boolean;
|
|
29
31
|
/**
|
|
30
32
|
* Get workflow progress percentage
|
|
31
33
|
*/
|
|
32
|
-
export declare function getProgress(
|
|
34
|
+
export declare function getProgress(issue: Issue): number;
|
|
33
35
|
/**
|
|
34
36
|
* Get column statistics
|
|
35
37
|
*/
|
|
36
|
-
export declare function getColumnStats(
|
|
38
|
+
export declare function getColumnStats(issues: Issue[]): Map<string, number>;
|
|
37
39
|
/**
|
|
38
40
|
* Get workflow summary
|
|
39
41
|
*/
|
|
40
|
-
export declare function getWorkflowSummary(
|
|
42
|
+
export declare function getWorkflowSummary(issues: Issue[]): {
|
|
41
43
|
total: number;
|
|
42
44
|
byColumn: {
|
|
43
45
|
column: Column;
|
|
@@ -48,19 +50,19 @@ export declare function getWorkflowSummary(tickets: Ticket[]): {
|
|
|
48
50
|
backlog: number;
|
|
49
51
|
};
|
|
50
52
|
/**
|
|
51
|
-
* Transition
|
|
53
|
+
* Transition an issue to the next column
|
|
52
54
|
*/
|
|
53
|
-
export declare function
|
|
55
|
+
export declare function advanceIssue(rootDir: string, key: string): {
|
|
54
56
|
success: boolean;
|
|
55
|
-
|
|
57
|
+
issue?: Issue;
|
|
56
58
|
error?: string;
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
|
-
* Force transition
|
|
61
|
+
* Force transition an issue to any column
|
|
60
62
|
*/
|
|
61
|
-
export declare function
|
|
63
|
+
export declare function forceTransitionIssue(rootDir: string, key: string, toColumnSlug: string): {
|
|
62
64
|
success: boolean;
|
|
63
|
-
|
|
65
|
+
issue?: Issue;
|
|
64
66
|
error?: string;
|
|
65
67
|
};
|
|
66
68
|
//# sourceMappingURL=workflow.d.ts.map
|