@sascha384/tic 1.35.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +17 -63
  3. package/dist/backends/availability.js +4 -2
  4. package/dist/backends/availability.js.map +1 -1
  5. package/dist/backends/factory.d.ts +5 -3
  6. package/dist/backends/factory.js +28 -43
  7. package/dist/backends/factory.js.map +1 -1
  8. package/dist/backends/files/hash.d.ts +1 -0
  9. package/dist/backends/files/hash.js +5 -0
  10. package/dist/backends/files/hash.js.map +1 -0
  11. package/dist/backends/files/index.d.ts +48 -0
  12. package/dist/backends/files/index.js +174 -0
  13. package/dist/backends/files/index.js.map +1 -0
  14. package/dist/backends/files/sync.d.ts +13 -0
  15. package/dist/backends/files/sync.js +69 -0
  16. package/dist/backends/files/sync.js.map +1 -0
  17. package/dist/backends/jira/config.d.ts +1 -1
  18. package/dist/backends/jira/config.js +6 -9
  19. package/dist/backends/jira/config.js.map +1 -1
  20. package/dist/backends/types.d.ts +12 -0
  21. package/dist/backends/types.js +5 -1
  22. package/dist/backends/types.js.map +1 -1
  23. package/dist/cli/commands/config.js +27 -14
  24. package/dist/cli/commands/config.js.map +1 -1
  25. package/dist/cli/commands/init.js +10 -3
  26. package/dist/cli/commands/init.js.map +1 -1
  27. package/dist/cli/commands/mcp.d.ts +4 -4
  28. package/dist/cli/commands/mcp.js +16 -25
  29. package/dist/cli/commands/mcp.js.map +1 -1
  30. package/dist/cli/index.js +16 -19
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/commands.js +0 -6
  33. package/dist/commands.js.map +1 -1
  34. package/dist/components/Header.js +3 -2
  35. package/dist/components/Header.js.map +1 -1
  36. package/dist/components/OverlayPanel.d.ts +2 -1
  37. package/dist/components/OverlayPanel.js +8 -1
  38. package/dist/components/OverlayPanel.js.map +1 -1
  39. package/dist/components/Settings.js +6 -11
  40. package/dist/components/Settings.js.map +1 -1
  41. package/dist/components/StatusScreen.js +1 -1
  42. package/dist/components/StatusScreen.js.map +1 -1
  43. package/dist/components/WorkItemForm.js +6 -9
  44. package/dist/components/WorkItemForm.js.map +1 -1
  45. package/dist/components/WorkItemList.js +102 -51
  46. package/dist/components/WorkItemList.js.map +1 -1
  47. package/dist/index.js +20 -8
  48. package/dist/index.js.map +1 -1
  49. package/dist/storage/config.d.ts +61 -0
  50. package/dist/storage/config.js +309 -0
  51. package/dist/storage/config.js.map +1 -0
  52. package/dist/storage/db.d.ts +11 -0
  53. package/dist/storage/db.js +34 -0
  54. package/dist/storage/db.js.map +1 -0
  55. package/dist/storage/index.d.ts +73 -0
  56. package/dist/storage/index.js +966 -0
  57. package/dist/storage/index.js.map +1 -0
  58. package/dist/storage/mappers.d.ts +35 -0
  59. package/dist/storage/mappers.js +70 -0
  60. package/dist/storage/mappers.js.map +1 -0
  61. package/dist/storage/schema.d.ts +1844 -0
  62. package/dist/storage/schema.js +197 -0
  63. package/dist/storage/schema.js.map +1 -0
  64. package/dist/storage/syncQueue.d.ts +13 -0
  65. package/dist/storage/syncQueue.js +98 -0
  66. package/dist/storage/syncQueue.js.map +1 -0
  67. package/dist/storage/undo.d.ts +22 -0
  68. package/dist/storage/undo.js +129 -0
  69. package/dist/storage/undo.js.map +1 -0
  70. package/dist/stores/backendDataStore.d.ts +4 -1
  71. package/dist/stores/backendDataStore.js +61 -40
  72. package/dist/stores/backendDataStore.js.map +1 -1
  73. package/dist/stores/configStore.d.ts +3 -1
  74. package/dist/stores/configStore.js +25 -65
  75. package/dist/stores/configStore.js.map +1 -1
  76. package/dist/stores/filterStore.d.ts +2 -0
  77. package/dist/stores/filterStore.js +7 -2
  78. package/dist/stores/filterStore.js.map +1 -1
  79. package/dist/stores/uiStore.d.ts +0 -2
  80. package/dist/stores/uiStore.js.map +1 -1
  81. package/dist/stores/undoStore.d.ts +4 -0
  82. package/dist/stores/undoStore.js +32 -0
  83. package/dist/stores/undoStore.js.map +1 -1
  84. package/dist/sync/SyncManager.d.ts +3 -4
  85. package/dist/sync/SyncManager.js +78 -37
  86. package/dist/sync/SyncManager.js.map +1 -1
  87. package/dist/sync/types.d.ts +10 -1
  88. package/drizzle/0000_next_vance_astro.sql +183 -0
  89. package/drizzle/meta/0000_snapshot.json +1188 -0
  90. package/drizzle/meta/_journal.json +13 -0
  91. package/package.json +6 -1
  92. package/skills/config/SKILL.md +2 -2
  93. package/dist/backends/local/config.d.ts +0 -38
  94. package/dist/backends/local/config.js +0 -42
  95. package/dist/backends/local/config.js.map +0 -1
  96. package/dist/backends/local/index.d.ts +0 -45
  97. package/dist/backends/local/index.js +0 -291
  98. package/dist/backends/local/index.js.map +0 -1
  99. package/dist/sync/queue.d.ts +0 -12
  100. package/dist/sync/queue.js +0 -56
  101. package/dist/sync/queue.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1770789518767,
9
+ "tag": "0000_next_vance_astro",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sascha384/tic",
3
- "version": "1.35.0",
3
+ "version": "2.0.1",
4
4
  "description": "Terminal UI for issue tracking",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,6 +8,7 @@
8
8
  },
9
9
  "files": [
10
10
  "dist",
11
+ "drizzle",
11
12
  "README.md",
12
13
  ".claude-plugin",
13
14
  ".mcp.json",
@@ -35,7 +36,9 @@
35
36
  },
36
37
  "dependencies": {
37
38
  "@modelcontextprotocol/sdk": "^1.25.3",
39
+ "better-sqlite3": "^12.6.2",
38
40
  "commander": "^14.0.3",
41
+ "drizzle-orm": "^0.45.1",
39
42
  "ink": "^6.6.0",
40
43
  "ink-select-input": "^6.2.0",
41
44
  "ink-spinner": "^5.0.0",
@@ -52,10 +55,12 @@
52
55
  "@semantic-release/exec": "^7.1.0",
53
56
  "@semantic-release/git": "^10.0.1",
54
57
  "@sindresorhus/tsconfig": "^8.1.0",
58
+ "@types/better-sqlite3": "^7.6.13",
55
59
  "@types/node": "^25.1.0",
56
60
  "@types/react": "^19.2.10",
57
61
  "@types/semver": "^7.7.1",
58
62
  "@types/turndown": "^5.0.6",
63
+ "drizzle-kit": "^0.31.9",
59
64
  "eslint": "^9.39.2",
60
65
  "eslint-config-prettier": "^10.1.8",
61
66
  "husky": "^9.1.7",
@@ -16,7 +16,7 @@ Creates a `.tic/` directory in the current project. Call this first if other too
16
16
  ### get_config
17
17
 
18
18
  Returns project configuration:
19
- - `backend` — current backend type (local, github, gitlab, azure, jira)
19
+ - `backend` — current backend type (none, github, gitlab, azure, jira)
20
20
  - `statuses` — available status values
21
21
  - `types` — available work item types
22
22
  - `iterations` — configured iterations
@@ -27,7 +27,7 @@ Returns project configuration:
27
27
 
28
28
  ### set_backend
29
29
 
30
- Switch between backends: `local`, `github`, `gitlab`, `azure`, `jira`.
30
+ Switch between backends: `none`, `github`, `gitlab`, `azure`, `jira`.
31
31
 
32
32
  The backend is auto-detected from git remotes, but can be overridden.
33
33
 
@@ -1,38 +0,0 @@
1
- export interface Config {
2
- backend: string;
3
- types: string[];
4
- statuses: string[];
5
- current_iteration: string;
6
- iterations: string[];
7
- next_id: number;
8
- branchMode: 'worktree' | 'branch';
9
- autoUpdate: boolean;
10
- defaultType?: string;
11
- showDetailPanel?: boolean;
12
- branchCommand?: string;
13
- copyToClipboard?: boolean;
14
- jira?: {
15
- site: string;
16
- project: string;
17
- boardId?: number;
18
- };
19
- views?: Array<{
20
- name: string;
21
- filters: {
22
- statuses?: string[];
23
- types?: string[];
24
- priorities?: string[];
25
- assignees?: string[];
26
- labels?: string[];
27
- };
28
- sort?: Array<{
29
- column: string;
30
- direction: string;
31
- }>;
32
- }>;
33
- defaultView?: string;
34
- }
35
- export declare const defaultConfig: Config;
36
- export declare function readConfig(root: string): Promise<Config>;
37
- export declare function readConfigSync(root: string): Config;
38
- export declare function writeConfig(root: string, config: Config): Promise<void>;
@@ -1,42 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import fsSync from 'node:fs';
3
- import path from 'node:path';
4
- import yaml from 'yaml';
5
- export const defaultConfig = {
6
- backend: 'local',
7
- types: ['epic', 'issue', 'task'],
8
- statuses: ['backlog', 'todo', 'in-progress', 'review', 'done'],
9
- current_iteration: 'default',
10
- iterations: ['default'],
11
- next_id: 1,
12
- branchMode: 'worktree',
13
- autoUpdate: true,
14
- branchCommand: `claude "Brainstorm the implementation of issue #$TIC_ITEM_ID: $TIC_ITEM_TITLE. $TIC_ITEM_DESCRIPTION"`,
15
- copyToClipboard: true,
16
- };
17
- function configPath(root) {
18
- return path.join(root, '.tic', 'config.yml');
19
- }
20
- export async function readConfig(root) {
21
- const p = configPath(root);
22
- try {
23
- const raw = await fs.readFile(p, 'utf-8');
24
- return yaml.parse(raw);
25
- }
26
- catch {
27
- return { ...defaultConfig };
28
- }
29
- }
30
- export function readConfigSync(root) {
31
- const p = configPath(root);
32
- if (!fsSync.existsSync(p))
33
- return { ...defaultConfig };
34
- const raw = fsSync.readFileSync(p, 'utf-8');
35
- return yaml.parse(raw);
36
- }
37
- export async function writeConfig(root, config) {
38
- const dir = path.join(root, '.tic');
39
- await fs.mkdir(dir, { recursive: true });
40
- await fs.writeFile(configPath(root), yaml.stringify(config));
41
- }
42
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
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;AAkCxB,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;IACtB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,uGAAuG;IACtH,eAAe,EAAE,IAAI;CACtB,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"}
@@ -1,45 +0,0 @@
1
- import { BaseBackend } from '../types.js';
2
- import type { BackendCapabilities } from '../types.js';
3
- import type { WorkItem, NewWorkItem, NewComment, Comment, Template } from '../../types.js';
4
- export interface LocalBackendOptions {
5
- tempIds?: boolean;
6
- }
7
- export declare class LocalBackend extends BaseBackend {
8
- private root;
9
- private tempIds;
10
- private constructor();
11
- static create(root: string, options?: LocalBackendOptions): Promise<LocalBackend>;
12
- getRoot(): string;
13
- getCapabilities(): BackendCapabilities;
14
- getStatuses(): Promise<string[]>;
15
- getIterations(): Promise<string[]>;
16
- getWorkItemTypes(): Promise<string[]>;
17
- getAssignees(): Promise<string[]>;
18
- getLabels(): Promise<string[]>;
19
- getCurrentIteration(): Promise<string>;
20
- setCurrentIteration(name: string): Promise<void>;
21
- syncConfigFromRemote(remote: {
22
- iterations: string[];
23
- currentIteration: string;
24
- statuses: string[];
25
- types: string[];
26
- }): Promise<void>;
27
- private validateRelationships;
28
- listWorkItems(iteration?: string): Promise<WorkItem[]>;
29
- getWorkItem(id: string): Promise<WorkItem>;
30
- createWorkItem(data: NewWorkItem): Promise<WorkItem>;
31
- updateWorkItem(id: string, data: Partial<WorkItem>): Promise<WorkItem>;
32
- deleteWorkItem(id: string): Promise<void>;
33
- softDeleteWorkItem(id: string): Promise<void>;
34
- restoreWorkItem(id: string): Promise<void>;
35
- permanentlyDeleteWorkItem(id: string): Promise<void>;
36
- cleanupTrash(): Promise<void>;
37
- addComment(workItemId: string, comment: NewComment): Promise<Comment>;
38
- getItemUrl(id: string): string;
39
- openItem(id: string): Promise<void>;
40
- listTemplates(): Promise<Template[]>;
41
- getTemplate(slug: string): Promise<Template>;
42
- createTemplate(template: Template): Promise<Template>;
43
- updateTemplate(oldSlug: string, template: Template): Promise<Template>;
44
- deleteTemplate(slug: string): Promise<void>;
45
- }
@@ -1,291 +0,0 @@
1
- import { BaseBackend } from '../types.js';
2
- import { configStore } from '../../stores/configStore.js';
3
- import { readWorkItem, writeWorkItem, deleteWorkItem as removeWorkItemFile, listItemFiles, parseWorkItemFile, softDeleteWorkItem as softDeleteItem, restoreWorkItem as restoreItem, permanentlyDeleteWorkItem as permanentlyDeleteItem, cleanupTrash as cleanupTrashDir, } from './items.js';
4
- import { listTemplates as listTemplateFiles, readTemplate, writeTemplate, deleteTemplate as removeTemplateFile, slugifyTemplateName, } from './templates.js';
5
- import { spawn } from 'node:child_process';
6
- import fs from 'node:fs/promises';
7
- import path from 'node:path';
8
- export class LocalBackend extends BaseBackend {
9
- root;
10
- tempIds;
11
- constructor(root, options) {
12
- super(0);
13
- this.root = root;
14
- this.tempIds = options?.tempIds ?? false;
15
- }
16
- static async create(root, options) {
17
- if (!configStore.getState().loaded) {
18
- await configStore.getState().init(root);
19
- }
20
- return new LocalBackend(root, options);
21
- }
22
- getRoot() {
23
- return this.root;
24
- }
25
- getCapabilities() {
26
- return {
27
- relationships: true,
28
- customTypes: true,
29
- customStatuses: true,
30
- iterations: true,
31
- comments: true,
32
- fields: {
33
- priority: true,
34
- assignee: true,
35
- labels: true,
36
- parent: true,
37
- dependsOn: true,
38
- },
39
- templates: true,
40
- templateFields: {
41
- type: true,
42
- status: true,
43
- priority: true,
44
- assignee: true,
45
- labels: true,
46
- iteration: true,
47
- parent: true,
48
- dependsOn: true,
49
- description: true,
50
- },
51
- };
52
- }
53
- // eslint-disable-next-line @typescript-eslint/require-await
54
- async getStatuses() {
55
- return configStore.getState().config.statuses;
56
- }
57
- // eslint-disable-next-line @typescript-eslint/require-await
58
- async getIterations() {
59
- return configStore.getState().config.iterations;
60
- }
61
- // eslint-disable-next-line @typescript-eslint/require-await
62
- async getWorkItemTypes() {
63
- return configStore.getState().config.types;
64
- }
65
- async getAssignees() {
66
- return this.getAssigneesFromCache();
67
- }
68
- async getLabels() {
69
- return this.getLabelsFromCache();
70
- }
71
- // eslint-disable-next-line @typescript-eslint/require-await
72
- async getCurrentIteration() {
73
- return configStore.getState().config.current_iteration;
74
- }
75
- async setCurrentIteration(name) {
76
- const config = configStore.getState().config;
77
- const iterations = config.iterations.includes(name)
78
- ? config.iterations
79
- : [...config.iterations, name];
80
- await configStore
81
- .getState()
82
- .update({ current_iteration: name, iterations });
83
- }
84
- async syncConfigFromRemote(remote) {
85
- await configStore.getState().update({
86
- iterations: remote.iterations,
87
- current_iteration: remote.currentIteration,
88
- statuses: remote.statuses,
89
- types: remote.types,
90
- });
91
- }
92
- async validateRelationships(id, parent, dependsOn) {
93
- const all = await this.getCachedItems();
94
- const itemMap = new Map(all.map((item) => [item.id, item]));
95
- const allIds = new Set(itemMap.keys());
96
- if (parent !== null && parent !== undefined) {
97
- if (parent === id) {
98
- throw new Error(`Work item #${id} cannot be its own parent`);
99
- }
100
- if (!allIds.has(parent)) {
101
- throw new Error(`Parent #${parent} does not exist`);
102
- }
103
- let current = parent;
104
- const visited = new Set();
105
- while (current !== null) {
106
- if (current === id) {
107
- throw new Error(`Circular parent chain detected for #${id}`);
108
- }
109
- if (visited.has(current))
110
- break;
111
- visited.add(current);
112
- const parentItem = itemMap.get(current);
113
- current = parentItem?.parent ?? null;
114
- }
115
- }
116
- if (dependsOn !== undefined) {
117
- for (const depId of dependsOn) {
118
- if (depId === id) {
119
- throw new Error(`Work item #${id} cannot depend on itself`);
120
- }
121
- if (!allIds.has(depId)) {
122
- throw new Error(`Dependency #${depId} does not exist`);
123
- }
124
- }
125
- const hasCycle = (startId, targetId) => {
126
- const visited = new Set();
127
- const stack = [startId];
128
- while (stack.length > 0) {
129
- const current = stack.pop();
130
- if (current === targetId)
131
- return true;
132
- if (visited.has(current))
133
- continue;
134
- visited.add(current);
135
- const item = itemMap.get(current);
136
- if (item) {
137
- for (const dep of item.dependsOn) {
138
- stack.push(dep);
139
- }
140
- }
141
- }
142
- return false;
143
- };
144
- for (const depId of dependsOn) {
145
- if (hasCycle(depId, id)) {
146
- throw new Error(`Circular dependency chain detected for #${id}`);
147
- }
148
- }
149
- }
150
- }
151
- async listWorkItems(iteration) {
152
- const files = await listItemFiles(this.root);
153
- const items = await Promise.all(files.map(async (f) => {
154
- const raw = await fs.readFile(f, 'utf-8');
155
- return parseWorkItemFile(raw);
156
- }));
157
- if (iteration)
158
- return items.filter((i) => i.iteration === iteration);
159
- return items;
160
- }
161
- async getWorkItem(id) {
162
- return await readWorkItem(this.root, id);
163
- }
164
- async createWorkItem(data) {
165
- this.validateFields(data);
166
- const now = new Date().toISOString();
167
- const { next_id, iterations } = configStore.getState().config;
168
- const id = this.tempIds ? `local-${next_id}` : String(next_id);
169
- await this.validateRelationships(id, data.parent, data.dependsOn);
170
- const item = {
171
- ...data,
172
- id,
173
- created: now,
174
- updated: now,
175
- comments: [],
176
- };
177
- const newIterations = data.iteration && !iterations.includes(data.iteration)
178
- ? [...iterations, data.iteration]
179
- : iterations;
180
- await configStore
181
- .getState()
182
- .update({ next_id: next_id + 1, iterations: newIterations });
183
- await writeWorkItem(this.root, item);
184
- this.invalidateCache();
185
- return item;
186
- }
187
- async updateWorkItem(id, data) {
188
- this.validateFields(data);
189
- const item = await this.getWorkItem(id);
190
- await this.validateRelationships(id, data.parent, data.dependsOn);
191
- const updated = {
192
- ...item,
193
- ...data,
194
- id,
195
- updated: new Date().toISOString(),
196
- };
197
- await writeWorkItem(this.root, updated);
198
- this.invalidateCache();
199
- return updated;
200
- }
201
- async deleteWorkItem(id) {
202
- await removeWorkItemFile(this.root, id);
203
- const all = await this.listWorkItems();
204
- const toWrite = [];
205
- for (const item of all) {
206
- let changed = false;
207
- if (item.parent === id) {
208
- item.parent = null;
209
- changed = true;
210
- }
211
- if (item.dependsOn.includes(id)) {
212
- item.dependsOn = item.dependsOn.filter((d) => d !== id);
213
- changed = true;
214
- }
215
- if (changed) {
216
- toWrite.push(item);
217
- }
218
- }
219
- await Promise.all(toWrite.map((item) => writeWorkItem(this.root, item)));
220
- this.invalidateCache();
221
- }
222
- async softDeleteWorkItem(id) {
223
- await softDeleteItem(this.root, id);
224
- this.invalidateCache();
225
- }
226
- async restoreWorkItem(id) {
227
- await restoreItem(this.root, id);
228
- this.invalidateCache();
229
- }
230
- async permanentlyDeleteWorkItem(id) {
231
- await permanentlyDeleteItem(this.root, id);
232
- }
233
- async cleanupTrash() {
234
- await cleanupTrashDir(this.root);
235
- }
236
- async addComment(workItemId, comment) {
237
- const item = await this.getWorkItem(workItemId);
238
- const newComment = {
239
- author: comment.author,
240
- date: new Date().toISOString(),
241
- body: comment.body,
242
- };
243
- item.comments.push(newComment);
244
- item.updated = new Date().toISOString();
245
- await writeWorkItem(this.root, item);
246
- return newComment;
247
- }
248
- getItemUrl(id) {
249
- return path.resolve(this.root, '.tic', 'items', `${id}.md`);
250
- }
251
- async openItem(id) {
252
- const filePath = this.getItemUrl(id);
253
- await fs.access(filePath);
254
- const editor = process.env['VISUAL'] || process.env['EDITOR'] || 'vi';
255
- return new Promise((resolve, reject) => {
256
- const child = spawn(editor, [filePath], { stdio: 'inherit' });
257
- child.on('close', (code) => {
258
- if (code === 0)
259
- resolve();
260
- else
261
- reject(new Error(`Editor exited with code ${code}`));
262
- });
263
- child.on('error', reject);
264
- });
265
- }
266
- async listTemplates() {
267
- return listTemplateFiles(this.root);
268
- }
269
- async getTemplate(slug) {
270
- return readTemplate(this.root, slug);
271
- }
272
- async createTemplate(template) {
273
- const slug = slugifyTemplateName(template.name);
274
- const t = { ...template, slug };
275
- await writeTemplate(this.root, t);
276
- return t;
277
- }
278
- async updateTemplate(oldSlug, template) {
279
- const newSlug = slugifyTemplateName(template.name);
280
- if (oldSlug !== newSlug) {
281
- await removeTemplateFile(this.root, oldSlug);
282
- }
283
- const t = { ...template, slug: newSlug };
284
- await writeTemplate(this.root, t);
285
- return t;
286
- }
287
- async deleteTemplate(slug) {
288
- await removeTemplateFile(this.root, slug);
289
- }
290
- }
291
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/local/index.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { QueueAction, QueueEntry, SyncQueue } from './types.js';
2
- export declare class SyncQueueStore {
3
- private filePath;
4
- constructor(root: string);
5
- read(): Promise<SyncQueue>;
6
- private write;
7
- append(entry: QueueEntry): Promise<void>;
8
- remove(itemId: string, action: QueueAction): Promise<void>;
9
- removeByIds(itemIds: string[], action: QueueAction): Promise<void>;
10
- clear(): Promise<void>;
11
- renameItem(oldId: string, newId: string): Promise<void>;
12
- }
@@ -1,56 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- export class SyncQueueStore {
4
- filePath;
5
- constructor(root) {
6
- this.filePath = path.join(root, '.tic', 'sync-queue.json');
7
- }
8
- async read() {
9
- try {
10
- const raw = await fs.readFile(this.filePath, 'utf-8');
11
- const data = JSON.parse(raw);
12
- if (!Array.isArray(data.pending))
13
- return { pending: [] };
14
- return data;
15
- }
16
- catch {
17
- return { pending: [] };
18
- }
19
- }
20
- async write(queue) {
21
- const dir = path.dirname(this.filePath);
22
- await fs.mkdir(dir, { recursive: true });
23
- await fs.writeFile(this.filePath, JSON.stringify(queue, null, 2));
24
- }
25
- async append(entry) {
26
- const queue = await this.read();
27
- // Collapse: remove existing entry with same itemId + action
28
- queue.pending = queue.pending.filter((e) => !(e.itemId === entry.itemId && e.action === entry.action));
29
- queue.pending.push(entry);
30
- await this.write(queue);
31
- }
32
- async remove(itemId, action) {
33
- const queue = await this.read();
34
- queue.pending = queue.pending.filter((e) => !(e.itemId === itemId && e.action === action));
35
- await this.write(queue);
36
- }
37
- async removeByIds(itemIds, action) {
38
- const queue = await this.read();
39
- const idSet = new Set(itemIds);
40
- queue.pending = queue.pending.filter((e) => !(idSet.has(e.itemId) && e.action === action));
41
- await this.write(queue);
42
- }
43
- async clear() {
44
- await this.write({ pending: [] });
45
- }
46
- async renameItem(oldId, newId) {
47
- const queue = await this.read();
48
- for (const entry of queue.pending) {
49
- if (entry.itemId === oldId) {
50
- entry.itemId = newId;
51
- }
52
- }
53
- await this.write(queue);
54
- }
55
- }
56
- //# sourceMappingURL=queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/sync/queue.ts"],"names":[],"mappings":"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"}