@sascha384/tic 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +14 -0
- package/.claude-plugin/plugin.json +15 -0
- package/.mcp.json +6 -0
- package/README.md +15 -50
- package/dist/app.d.ts +3 -1
- package/dist/app.js +12 -1
- package/dist/app.js.map +1 -1
- package/dist/backends/ado/index.js +54 -64
- package/dist/backends/ado/index.js.map +1 -1
- package/dist/backends/cache.d.ts +11 -0
- package/dist/backends/cache.js +36 -0
- package/dist/backends/cache.js.map +1 -0
- package/dist/backends/factory.d.ts +1 -1
- package/dist/backends/factory.js +13 -1
- package/dist/backends/factory.js.map +1 -1
- package/dist/backends/github/index.d.ts +2 -2
- package/dist/backends/github/index.js +9 -9
- package/dist/backends/github/index.js.map +1 -1
- package/dist/backends/gitlab/index.d.ts +2 -0
- package/dist/backends/gitlab/index.js +9 -2
- package/dist/backends/gitlab/index.js.map +1 -1
- package/dist/backends/jira/acli.d.ts +2 -0
- package/dist/backends/jira/acli.js +17 -0
- package/dist/backends/jira/acli.js.map +1 -0
- package/dist/backends/jira/config.d.ts +6 -0
- package/dist/backends/jira/config.js +15 -0
- package/dist/backends/jira/config.js.map +1 -0
- package/dist/backends/jira/index.d.ts +29 -0
- package/dist/backends/jira/index.js +331 -0
- package/dist/backends/jira/index.js.map +1 -0
- package/dist/backends/jira/mappers.d.ts +62 -0
- package/dist/backends/jira/mappers.js +63 -0
- package/dist/backends/jira/mappers.js.map +1 -0
- package/dist/backends/local/config.d.ts +5 -0
- package/dist/backends/local/config.js.map +1 -1
- package/dist/backends/local/index.d.ts +0 -2
- package/dist/backends/local/index.js +13 -27
- package/dist/backends/local/index.js.map +1 -1
- package/dist/backends/types.d.ts +15 -2
- package/dist/backends/types.js +51 -0
- package/dist/backends/types.js.map +1 -1
- package/dist/cli/commands/item.js +3 -3
- package/dist/cli/commands/item.js.map +1 -1
- package/dist/components/BulkMenu.d.ts +10 -0
- package/dist/components/BulkMenu.js +49 -0
- package/dist/components/BulkMenu.js.map +1 -0
- package/dist/components/CardLayout.d.ts +2 -1
- package/dist/components/CardLayout.js +3 -2
- package/dist/components/CardLayout.js.map +1 -1
- package/dist/components/HelpScreen.d.ts +15 -0
- package/dist/components/HelpScreen.js +165 -0
- package/dist/components/HelpScreen.js.map +1 -0
- package/dist/components/IterationPicker.js +8 -3
- package/dist/components/IterationPicker.js.map +1 -1
- package/dist/components/PriorityPicker.d.ts +6 -0
- package/dist/components/PriorityPicker.js +18 -0
- package/dist/components/PriorityPicker.js.map +1 -0
- package/dist/components/SearchOverlay.d.ts +10 -0
- package/dist/components/SearchOverlay.js +63 -0
- package/dist/components/SearchOverlay.js.map +1 -0
- package/dist/components/Settings.js +113 -18
- package/dist/components/Settings.js.map +1 -1
- package/dist/components/StatusPicker.d.ts +7 -0
- package/dist/components/StatusPicker.js +16 -0
- package/dist/components/StatusPicker.js.map +1 -0
- package/dist/components/StatusScreen.js +6 -2
- package/dist/components/StatusScreen.js.map +1 -1
- package/dist/components/TableLayout.d.ts +2 -1
- package/dist/components/TableLayout.js +3 -2
- package/dist/components/TableLayout.js.map +1 -1
- package/dist/components/TypePicker.d.ts +7 -0
- package/dist/components/TypePicker.js +16 -0
- package/dist/components/TypePicker.js.map +1 -0
- package/dist/components/WorkItemForm.js +8 -12
- package/dist/components/WorkItemForm.js.map +1 -1
- package/dist/components/WorkItemList.d.ts +3 -0
- package/dist/components/WorkItemList.js +286 -53
- package/dist/components/WorkItemList.js.map +1 -1
- package/dist/components/fuzzyMatch.d.ts +6 -0
- package/dist/components/fuzzyMatch.js +36 -0
- package/dist/components/fuzzyMatch.js.map +1 -0
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/package.json +22 -2
- package/skills/tic-config/SKILL.md +59 -0
- package/skills/tic-items/SKILL.md +92 -0
- package/skills/tic-relationships/SKILL.md +76 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export function mapPriorityToTic(priority) {
|
|
2
|
+
switch (priority) {
|
|
3
|
+
case 'Highest':
|
|
4
|
+
case 'Critical':
|
|
5
|
+
return 'critical';
|
|
6
|
+
case 'High':
|
|
7
|
+
return 'high';
|
|
8
|
+
case 'Medium':
|
|
9
|
+
return 'medium';
|
|
10
|
+
case 'Low':
|
|
11
|
+
case 'Lowest':
|
|
12
|
+
return 'low';
|
|
13
|
+
default:
|
|
14
|
+
return 'medium';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function mapPriorityToJira(priority) {
|
|
18
|
+
switch (priority) {
|
|
19
|
+
case 'critical':
|
|
20
|
+
return 'Highest';
|
|
21
|
+
case 'high':
|
|
22
|
+
return 'High';
|
|
23
|
+
case 'medium':
|
|
24
|
+
return 'Medium';
|
|
25
|
+
case 'low':
|
|
26
|
+
return 'Low';
|
|
27
|
+
default:
|
|
28
|
+
return 'Medium';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function extractDependsOn(links) {
|
|
32
|
+
if (!links)
|
|
33
|
+
return [];
|
|
34
|
+
return links
|
|
35
|
+
.filter((link) => link.type.inward === 'is blocked by' && link.inwardIssue != null)
|
|
36
|
+
.map((link) => link.inwardIssue.key);
|
|
37
|
+
}
|
|
38
|
+
export function mapIssueToWorkItem(issue) {
|
|
39
|
+
return {
|
|
40
|
+
id: issue.key,
|
|
41
|
+
title: issue.fields.summary,
|
|
42
|
+
description: issue.fields.description ?? '',
|
|
43
|
+
status: issue.fields.status.name.toLowerCase(),
|
|
44
|
+
type: issue.fields.issuetype.name.toLowerCase(),
|
|
45
|
+
priority: mapPriorityToTic(issue.fields.priority?.name),
|
|
46
|
+
assignee: issue.fields.assignee?.emailAddress ?? '',
|
|
47
|
+
labels: issue.fields.labels,
|
|
48
|
+
iteration: issue.fields.sprint?.name ?? '',
|
|
49
|
+
created: issue.fields.created,
|
|
50
|
+
updated: issue.fields.updated,
|
|
51
|
+
parent: issue.fields.parent?.key ?? null,
|
|
52
|
+
dependsOn: extractDependsOn(issue.fields.issuelinks),
|
|
53
|
+
comments: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function mapCommentToComment(comment) {
|
|
57
|
+
return {
|
|
58
|
+
author: comment.author.emailAddress,
|
|
59
|
+
date: comment.created,
|
|
60
|
+
body: comment.body,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=mappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../../src/backends/jira/mappers.ts"],"names":[],"mappings":"AAsCA,MAAM,UAAU,gBAAgB,CAC9B,QAA4B;IAE5B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkC;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CACnE;SACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;QAC3B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE;QAC3C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;QAC9C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/C,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,IAAI,EAAE;QACnD,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC3B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;QAC1C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;QAC7B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;QAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI;QACxC,SAAS,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;QACpD,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;QACnC,IAAI,EAAE,OAAO,CAAC,OAAO;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -6,6 +6,11 @@ export interface Config {
|
|
|
6
6
|
iterations: string[];
|
|
7
7
|
next_id: number;
|
|
8
8
|
branchMode: 'worktree' | 'branch';
|
|
9
|
+
jira?: {
|
|
10
|
+
site: string;
|
|
11
|
+
project: string;
|
|
12
|
+
boardId?: number;
|
|
13
|
+
};
|
|
9
14
|
}
|
|
10
15
|
export declare const defaultConfig: Config;
|
|
11
16
|
export declare function readConfig(root: string): Promise<Config>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/backends/local/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/backends/local/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAiBxB,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC9D,iBAAiB,EAAE,SAAS;IAC5B,UAAU,EAAE,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,UAAU;CACvB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -32,8 +32,6 @@ export declare class LocalBackend extends BaseBackend {
|
|
|
32
32
|
updateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
|
|
33
33
|
deleteWorkItem(id: string): Promise<void>;
|
|
34
34
|
addComment(workItemId: string, comment: NewComment): Promise<Comment>;
|
|
35
|
-
getChildren(id: string): Promise<WorkItem[]>;
|
|
36
|
-
getDependents(id: string): Promise<WorkItem[]>;
|
|
37
35
|
getItemUrl(id: string): string;
|
|
38
36
|
openItem(id: string): Promise<void>;
|
|
39
37
|
}
|
|
@@ -9,7 +9,7 @@ export class LocalBackend extends BaseBackend {
|
|
|
9
9
|
config;
|
|
10
10
|
tempIds;
|
|
11
11
|
constructor(root, config, options) {
|
|
12
|
-
super();
|
|
12
|
+
super(0);
|
|
13
13
|
this.root = root;
|
|
14
14
|
this.config = config;
|
|
15
15
|
this.tempIds = options?.tempIds ?? false;
|
|
@@ -53,14 +53,7 @@ export class LocalBackend extends BaseBackend {
|
|
|
53
53
|
return this.config.types;
|
|
54
54
|
}
|
|
55
55
|
async getAssignees() {
|
|
56
|
-
|
|
57
|
-
const assignees = new Set();
|
|
58
|
-
for (const item of items) {
|
|
59
|
-
if (item.assignee) {
|
|
60
|
-
assignees.add(item.assignee);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return [...assignees].sort();
|
|
56
|
+
return this.getAssigneesFromCache();
|
|
64
57
|
}
|
|
65
58
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
66
59
|
async getCurrentIteration() {
|
|
@@ -81,9 +74,9 @@ export class LocalBackend extends BaseBackend {
|
|
|
81
74
|
await this.save();
|
|
82
75
|
}
|
|
83
76
|
async validateRelationships(id, parent, dependsOn) {
|
|
84
|
-
const all = await this.
|
|
85
|
-
const
|
|
86
|
-
|
|
77
|
+
const all = await this.getCachedItems();
|
|
78
|
+
const itemMap = new Map(all.map((item) => [item.id, item]));
|
|
79
|
+
const allIds = new Set(itemMap.keys());
|
|
87
80
|
if (parent !== null && parent !== undefined) {
|
|
88
81
|
if (parent === id) {
|
|
89
82
|
throw new Error(`Work item #${id} cannot be its own parent`);
|
|
@@ -91,7 +84,6 @@ export class LocalBackend extends BaseBackend {
|
|
|
91
84
|
if (!allIds.has(parent)) {
|
|
92
85
|
throw new Error(`Parent #${parent} does not exist`);
|
|
93
86
|
}
|
|
94
|
-
// Check for circular parent chain: walk up from proposed parent
|
|
95
87
|
let current = parent;
|
|
96
88
|
const visited = new Set();
|
|
97
89
|
while (current !== null) {
|
|
@@ -101,11 +93,10 @@ export class LocalBackend extends BaseBackend {
|
|
|
101
93
|
if (visited.has(current))
|
|
102
94
|
break;
|
|
103
95
|
visited.add(current);
|
|
104
|
-
const parentItem =
|
|
96
|
+
const parentItem = itemMap.get(current);
|
|
105
97
|
current = parentItem?.parent ?? null;
|
|
106
98
|
}
|
|
107
99
|
}
|
|
108
|
-
// Validate dependsOn
|
|
109
100
|
if (dependsOn !== undefined) {
|
|
110
101
|
for (const depId of dependsOn) {
|
|
111
102
|
if (depId === id) {
|
|
@@ -115,7 +106,6 @@ export class LocalBackend extends BaseBackend {
|
|
|
115
106
|
throw new Error(`Dependency #${depId} does not exist`);
|
|
116
107
|
}
|
|
117
108
|
}
|
|
118
|
-
// Check for circular dependency chain: DFS from each dependency
|
|
119
109
|
const hasCycle = (startId, targetId) => {
|
|
120
110
|
const visited = new Set();
|
|
121
111
|
const stack = [startId];
|
|
@@ -126,7 +116,7 @@ export class LocalBackend extends BaseBackend {
|
|
|
126
116
|
if (visited.has(current))
|
|
127
117
|
continue;
|
|
128
118
|
visited.add(current);
|
|
129
|
-
const item =
|
|
119
|
+
const item = itemMap.get(current);
|
|
130
120
|
if (item) {
|
|
131
121
|
for (const dep of item.dependsOn) {
|
|
132
122
|
stack.push(dep);
|
|
@@ -175,6 +165,7 @@ export class LocalBackend extends BaseBackend {
|
|
|
175
165
|
}
|
|
176
166
|
await this.save();
|
|
177
167
|
await writeWorkItem(this.root, item);
|
|
168
|
+
this.invalidateCache();
|
|
178
169
|
return item;
|
|
179
170
|
}
|
|
180
171
|
async updateWorkItem(id, data) {
|
|
@@ -188,12 +179,13 @@ export class LocalBackend extends BaseBackend {
|
|
|
188
179
|
updated: new Date().toISOString(),
|
|
189
180
|
};
|
|
190
181
|
await writeWorkItem(this.root, updated);
|
|
182
|
+
this.invalidateCache();
|
|
191
183
|
return updated;
|
|
192
184
|
}
|
|
193
185
|
async deleteWorkItem(id) {
|
|
194
186
|
await removeWorkItemFile(this.root, id);
|
|
195
|
-
// Clean up references in other items
|
|
196
187
|
const all = await this.listWorkItems();
|
|
188
|
+
const toWrite = [];
|
|
197
189
|
for (const item of all) {
|
|
198
190
|
let changed = false;
|
|
199
191
|
if (item.parent === id) {
|
|
@@ -205,9 +197,11 @@ export class LocalBackend extends BaseBackend {
|
|
|
205
197
|
changed = true;
|
|
206
198
|
}
|
|
207
199
|
if (changed) {
|
|
208
|
-
|
|
200
|
+
toWrite.push(item);
|
|
209
201
|
}
|
|
210
202
|
}
|
|
203
|
+
await Promise.all(toWrite.map((item) => writeWorkItem(this.root, item)));
|
|
204
|
+
this.invalidateCache();
|
|
211
205
|
}
|
|
212
206
|
async addComment(workItemId, comment) {
|
|
213
207
|
const item = await this.getWorkItem(workItemId);
|
|
@@ -221,14 +215,6 @@ export class LocalBackend extends BaseBackend {
|
|
|
221
215
|
await writeWorkItem(this.root, item);
|
|
222
216
|
return newComment;
|
|
223
217
|
}
|
|
224
|
-
async getChildren(id) {
|
|
225
|
-
const all = await this.listWorkItems();
|
|
226
|
-
return all.filter((item) => item.parent === id);
|
|
227
|
-
}
|
|
228
|
-
async getDependents(id) {
|
|
229
|
-
const all = await this.listWorkItems();
|
|
230
|
-
return all.filter((item) => item.dependsOn.includes(id));
|
|
231
|
-
}
|
|
232
218
|
getItemUrl(id) {
|
|
233
219
|
return path.resolve(this.root, '.tic', 'items', `${id}.md`);
|
|
234
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,IAAI,kBAAkB,EACpC,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,OAAO,YAAa,SAAQ,WAAW;IACnC,IAAI,CAAS;IACb,MAAM,CAAS;IACf,OAAO,CAAU;IAEzB,YACE,IAAY,EACZ,MAAc,EACd,OAA6B;QAE7B,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/local/index.ts"],"names":[],"mappings":"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"}
|
package/dist/backends/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WorkItem, NewWorkItem, NewComment, Comment } from '../types.js';
|
|
2
|
+
import { BackendCache } from './cache.js';
|
|
2
3
|
export interface BackendCapabilities {
|
|
3
4
|
relationships: boolean;
|
|
4
5
|
customTypes: boolean;
|
|
@@ -29,6 +30,9 @@ export interface Backend {
|
|
|
29
30
|
createWorkItem(data: NewWorkItem): Promise<WorkItem>;
|
|
30
31
|
updateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
|
|
31
32
|
deleteWorkItem(id: string): Promise<void>;
|
|
33
|
+
cachedCreateWorkItem(data: NewWorkItem): Promise<WorkItem>;
|
|
34
|
+
cachedUpdateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
|
|
35
|
+
cachedDeleteWorkItem(id: string): Promise<void>;
|
|
32
36
|
addComment(workItemId: string, comment: NewComment): Promise<Comment>;
|
|
33
37
|
getChildren(id: string): Promise<WorkItem[]>;
|
|
34
38
|
getDependents(id: string): Promise<WorkItem[]>;
|
|
@@ -36,6 +40,8 @@ export interface Backend {
|
|
|
36
40
|
openItem(id: string): Promise<void>;
|
|
37
41
|
}
|
|
38
42
|
export declare abstract class BaseBackend implements Backend {
|
|
43
|
+
protected cache: BackendCache;
|
|
44
|
+
constructor(ttl?: number);
|
|
39
45
|
abstract getCapabilities(): BackendCapabilities;
|
|
40
46
|
abstract getStatuses(): Promise<string[]>;
|
|
41
47
|
abstract getIterations(): Promise<string[]>;
|
|
@@ -49,10 +55,17 @@ export declare abstract class BaseBackend implements Backend {
|
|
|
49
55
|
abstract updateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
|
|
50
56
|
abstract deleteWorkItem(id: string): Promise<void>;
|
|
51
57
|
abstract addComment(workItemId: string, comment: NewComment): Promise<Comment>;
|
|
52
|
-
abstract getChildren(id: string): Promise<WorkItem[]>;
|
|
53
|
-
abstract getDependents(id: string): Promise<WorkItem[]>;
|
|
54
58
|
abstract getItemUrl(id: string): string;
|
|
55
59
|
abstract openItem(id: string): Promise<void>;
|
|
60
|
+
getChildren(id: string): Promise<WorkItem[]>;
|
|
61
|
+
getDependents(id: string): Promise<WorkItem[]>;
|
|
62
|
+
protected getCachedItems(iteration?: string): Promise<WorkItem[]>;
|
|
63
|
+
protected getAssigneesFromCache(): Promise<string[]>;
|
|
64
|
+
protected onCacheInvalidate(): void;
|
|
65
|
+
protected invalidateCache(): void;
|
|
66
|
+
cachedCreateWorkItem(data: NewWorkItem): Promise<WorkItem>;
|
|
67
|
+
cachedUpdateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
|
|
68
|
+
cachedDeleteWorkItem(id: string): Promise<void>;
|
|
56
69
|
protected validateFields(data: Partial<NewWorkItem>): void;
|
|
57
70
|
protected assertSupported(capability: boolean, operation: string): void;
|
|
58
71
|
}
|
package/dist/backends/types.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BackendCache } from './cache.js';
|
|
1
2
|
export class UnsupportedOperationError extends Error {
|
|
2
3
|
constructor(operation, backend) {
|
|
3
4
|
super(`${operation} is not supported by the ${backend} backend`);
|
|
@@ -5,6 +6,56 @@ export class UnsupportedOperationError extends Error {
|
|
|
5
6
|
}
|
|
6
7
|
}
|
|
7
8
|
export class BaseBackend {
|
|
9
|
+
cache;
|
|
10
|
+
constructor(ttl = 0) {
|
|
11
|
+
this.cache = new BackendCache(ttl);
|
|
12
|
+
}
|
|
13
|
+
async getChildren(id) {
|
|
14
|
+
const all = await this.getCachedItems();
|
|
15
|
+
return all.filter((item) => item.parent === id);
|
|
16
|
+
}
|
|
17
|
+
async getDependents(id) {
|
|
18
|
+
const all = await this.getCachedItems();
|
|
19
|
+
return all.filter((item) => item.dependsOn.includes(id));
|
|
20
|
+
}
|
|
21
|
+
async getCachedItems(iteration) {
|
|
22
|
+
const cached = this.cache.get(iteration);
|
|
23
|
+
if (cached)
|
|
24
|
+
return cached;
|
|
25
|
+
const items = await this.listWorkItems(iteration);
|
|
26
|
+
this.cache.set(items, iteration);
|
|
27
|
+
return items;
|
|
28
|
+
}
|
|
29
|
+
async getAssigneesFromCache() {
|
|
30
|
+
const items = await this.getCachedItems();
|
|
31
|
+
const assignees = new Set();
|
|
32
|
+
for (const item of items) {
|
|
33
|
+
if (item.assignee)
|
|
34
|
+
assignees.add(item.assignee);
|
|
35
|
+
}
|
|
36
|
+
return [...assignees].sort();
|
|
37
|
+
}
|
|
38
|
+
onCacheInvalidate() {
|
|
39
|
+
// Override in subclasses to clear secondary caches
|
|
40
|
+
}
|
|
41
|
+
invalidateCache() {
|
|
42
|
+
this.cache.invalidate();
|
|
43
|
+
this.onCacheInvalidate();
|
|
44
|
+
}
|
|
45
|
+
async cachedCreateWorkItem(data) {
|
|
46
|
+
const result = await this.createWorkItem(data);
|
|
47
|
+
this.invalidateCache();
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
async cachedUpdateWorkItem(id, data) {
|
|
51
|
+
const result = await this.updateWorkItem(id, data);
|
|
52
|
+
this.invalidateCache();
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
async cachedDeleteWorkItem(id) {
|
|
56
|
+
await this.deleteWorkItem(id);
|
|
57
|
+
this.invalidateCache();
|
|
58
|
+
}
|
|
8
59
|
validateFields(data) {
|
|
9
60
|
const caps = this.getCapabilities();
|
|
10
61
|
const backendName = this.constructor.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export async function runItemCreate(backend, title, opts) {
|
|
2
2
|
const statuses = await backend.getStatuses();
|
|
3
3
|
const types = await backend.getWorkItemTypes();
|
|
4
|
-
return backend.
|
|
4
|
+
return backend.cachedCreateWorkItem({
|
|
5
5
|
title,
|
|
6
6
|
type: opts.type ?? (types.includes('task') ? 'task' : types[0]),
|
|
7
7
|
status: opts.status ?? statuses[0],
|
|
@@ -63,10 +63,10 @@ export async function runItemUpdate(backend, id, opts) {
|
|
|
63
63
|
.filter((d) => d.length > 0);
|
|
64
64
|
if (opts.description !== undefined)
|
|
65
65
|
data.description = opts.description;
|
|
66
|
-
return backend.
|
|
66
|
+
return backend.cachedUpdateWorkItem(id, data);
|
|
67
67
|
}
|
|
68
68
|
export async function runItemDelete(backend, id) {
|
|
69
|
-
await backend.
|
|
69
|
+
await backend.cachedDeleteWorkItem(id);
|
|
70
70
|
}
|
|
71
71
|
export async function runItemOpen(backend, id) {
|
|
72
72
|
await backend.openItem(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.js","sourceRoot":"","sources":["../../../src/cli/commands/item.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAgB,EAChB,KAAa,EACb,IAAuB;IAEvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAC/C,OAAO,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"item.js","sourceRoot":"","sources":["../../../src/cli/commands/item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BackendCapabilities } from '../backends/types.js';
|
|
2
|
+
export type BulkAction = 'status' | 'iteration' | 'parent' | 'type' | 'priority' | 'assignee' | 'labels' | 'delete';
|
|
3
|
+
interface BulkMenuProps {
|
|
4
|
+
itemCount: number;
|
|
5
|
+
capabilities: BackendCapabilities;
|
|
6
|
+
onSelect: (action: BulkAction) => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function BulkMenu({ itemCount, capabilities, onSelect, onCancel, }: BulkMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import SelectInput from 'ink-select-input';
|
|
4
|
+
export function BulkMenu({ itemCount, capabilities, onSelect, onCancel, }) {
|
|
5
|
+
useInput((input, key) => {
|
|
6
|
+
if (key.escape) {
|
|
7
|
+
onCancel();
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Shortcut keys
|
|
11
|
+
const shortcuts = {
|
|
12
|
+
s: 'status',
|
|
13
|
+
i: 'iteration',
|
|
14
|
+
p: 'parent',
|
|
15
|
+
t: 'type',
|
|
16
|
+
P: 'priority',
|
|
17
|
+
a: 'assignee',
|
|
18
|
+
l: 'labels',
|
|
19
|
+
d: 'delete',
|
|
20
|
+
};
|
|
21
|
+
const action = shortcuts[input];
|
|
22
|
+
if (action) {
|
|
23
|
+
onSelect(action);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const items = [];
|
|
27
|
+
items.push({ label: 'Set status... (s)', value: 'status' });
|
|
28
|
+
if (capabilities.iterations) {
|
|
29
|
+
items.push({ label: 'Set iteration... (i)', value: 'iteration' });
|
|
30
|
+
}
|
|
31
|
+
if (capabilities.fields.parent) {
|
|
32
|
+
items.push({ label: 'Set parent... (p)', value: 'parent' });
|
|
33
|
+
}
|
|
34
|
+
if (capabilities.customTypes) {
|
|
35
|
+
items.push({ label: 'Set type... (t)', value: 'type' });
|
|
36
|
+
}
|
|
37
|
+
if (capabilities.fields.priority) {
|
|
38
|
+
items.push({ label: 'Set priority... (P)', value: 'priority' });
|
|
39
|
+
}
|
|
40
|
+
if (capabilities.fields.assignee) {
|
|
41
|
+
items.push({ label: 'Set assignee... (a)', value: 'assignee' });
|
|
42
|
+
}
|
|
43
|
+
if (capabilities.fields.labels) {
|
|
44
|
+
items.push({ label: 'Set labels... (l)', value: 'labels' });
|
|
45
|
+
}
|
|
46
|
+
items.push({ label: 'Delete (d)', value: 'delete' });
|
|
47
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: ["Bulk Actions (", itemCount, " ", itemCount === 1 ? 'item' : 'items', ")"] }) }), _jsx(SelectInput, { items: items, onSelect: (item) => onSelect(item.value) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: '↑↓ navigate enter select esc cancel' }) })] }));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=BulkMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkMenu.js","sourceRoot":"","sources":["../../src/components/BulkMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@ interface CardLayoutProps {
|
|
|
5
5
|
cursor: number;
|
|
6
6
|
capabilities: BackendCapabilities;
|
|
7
7
|
collapsedIds: Set<string>;
|
|
8
|
+
markedIds: Set<string>;
|
|
8
9
|
}
|
|
9
10
|
export declare function formatPriority(priority: string | undefined): string;
|
|
10
11
|
export declare function formatAssignee(assignee: string | undefined): string;
|
|
11
|
-
export declare function CardLayout({ treeItems, cursor, capabilities, collapsedIds, }: CardLayoutProps): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
export declare function CardLayout({ treeItems, cursor, capabilities, collapsedIds, markedIds, }: CardLayoutProps): import("react/jsx-runtime").JSX.Element | null;
|
|
12
13
|
export {};
|
|
@@ -27,12 +27,13 @@ function statusColor(status) {
|
|
|
27
27
|
return 'red';
|
|
28
28
|
return 'blue';
|
|
29
29
|
}
|
|
30
|
-
export function CardLayout({ treeItems, cursor, capabilities, collapsedIds, }) {
|
|
30
|
+
export function CardLayout({ treeItems, cursor, capabilities, collapsedIds, markedIds, }) {
|
|
31
31
|
if (treeItems.length === 0)
|
|
32
32
|
return null;
|
|
33
33
|
return (_jsx(Box, { flexDirection: "column", children: treeItems.map((treeItem, idx) => {
|
|
34
34
|
const { item, depth, isCrossType, hasChildren } = treeItem;
|
|
35
35
|
const selected = idx === cursor;
|
|
36
|
+
const marked = markedIds.has(item.id);
|
|
36
37
|
const indent = ' '.repeat(depth);
|
|
37
38
|
const marker = selected ? '>' : ' ';
|
|
38
39
|
const hasDeps = capabilities.fields.dependsOn && item.dependsOn.length > 0;
|
|
@@ -47,7 +48,7 @@ export function CardLayout({ treeItems, cursor, capabilities, collapsedIds, }) {
|
|
|
47
48
|
// Indent for meta line: align with title start
|
|
48
49
|
// marker(1) + indent + collapseIndicator(2) + '#'(1) + id + ' '(1) = offset
|
|
49
50
|
const metaIndent = ' ' + indent + ' ' + ' '.repeat(item.id.length + 2);
|
|
50
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: idx < treeItems.length - 1 ? 1 : 0, children: [_jsx(Box, { children: _jsxs(Text, { color: selected ? 'cyan' : undefined, bold: selected, dimColor: dimmed, children: [marker, indent, collapseIndicator, "#", item.id, " ", item.title, typeLabel, depIndicator] }) }), _jsxs(Box, { children: [_jsx(Text, { color: selected ? 'cyan' : undefined, dimColor: dimmed, children: metaIndent }), _jsx(Text, { color: statusColor(item.status), children: "\u25CF" }), _jsxs(Text, { color: selected ? 'cyan' : undefined, bold: selected, dimColor: dimmed, children: [' ', item.status, capabilities.fields.priority && formatPriority(item.priority)
|
|
51
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: idx < treeItems.length - 1 ? 1 : 0, ...(marked && !selected ? { backgroundColor: 'cyan' } : {}), children: [_jsx(Box, { children: _jsxs(Text, { color: selected ? 'cyan' : undefined, bold: selected, dimColor: dimmed, children: [marker, indent, collapseIndicator, "#", item.id, " ", item.title, typeLabel, depIndicator] }) }), _jsxs(Box, { children: [_jsx(Text, { color: selected ? 'cyan' : undefined, dimColor: dimmed, children: metaIndent }), _jsx(Text, { color: statusColor(item.status), children: "\u25CF" }), _jsxs(Text, { color: selected ? 'cyan' : undefined, bold: selected, dimColor: dimmed, children: [' ', item.status, capabilities.fields.priority && formatPriority(item.priority)
|
|
51
52
|
? ' ' + formatPriority(item.priority)
|
|
52
53
|
: '', capabilities.fields.assignee && formatAssignee(item.assignee)
|
|
53
54
|
? ' ' + formatAssignee(item.assignee)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardLayout.js","sourceRoot":"","sources":["../../src/components/CardLayout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"CardLayout.js","sourceRoot":"","sources":["../../src/components/CardLayout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Screen } from '../app.js';
|
|
2
|
+
import type { BackendCapabilities } from '../backends/types.js';
|
|
3
|
+
interface ShortcutEntry {
|
|
4
|
+
key: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
interface ShortcutGroup {
|
|
8
|
+
label: string;
|
|
9
|
+
shortcuts: ShortcutEntry[];
|
|
10
|
+
}
|
|
11
|
+
export declare function getShortcuts(screen: Screen, capabilities: BackendCapabilities, gitAvailable: boolean, hasSyncManager: boolean): ShortcutGroup[];
|
|
12
|
+
export declare function HelpScreen({ sourceScreen }: {
|
|
13
|
+
sourceScreen: Screen;
|
|
14
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|