@dtoolkit/dwork 0.2.1 → 0.3.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/README.md +1 -1
- package/dist/cli/connect.d.ts +2 -0
- package/dist/cli/connect.d.ts.map +1 -0
- package/dist/cli/connect.js +288 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +45 -13
- package/dist/core/indexer.js.map +1 -1
- package/dist/core/parser.d.ts +1 -0
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +6 -0
- package/dist/core/parser.js.map +1 -1
- package/dist/dashboard/index.html +14 -5
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/routes/health.d.ts.map +1 -1
- package/dist/server/routes/health.js +43 -0
- package/dist/server/routes/health.js.map +1 -1
- package/dist/server/routes/tasks.d.ts.map +1 -1
- package/dist/server/routes/tasks.js.map +1 -1
- package/dist/service/docs.d.ts +1 -0
- package/dist/service/docs.d.ts.map +1 -1
- package/dist/service/docs.js +10 -6
- package/dist/service/docs.js.map +1 -1
- package/dist/service/tasks.d.ts +5 -0
- package/dist/service/tasks.d.ts.map +1 -1
- package/dist/service/tasks.js +16 -6
- package/dist/service/tasks.js.map +1 -1
- package/dist/service/tasks.test.d.ts +2 -0
- package/dist/service/tasks.test.d.ts.map +1 -0
- package/dist/service/tasks.test.js +220 -0
- package/dist/service/tasks.test.js.map +1 -0
- package/dist/service/utils.d.ts +1 -0
- package/dist/service/utils.d.ts.map +1 -1
- package/dist/service/utils.js +9 -0
- package/dist/service/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { indexProject } from '../core/indexer.js';
|
|
7
|
+
import { scaffoldBacklog } from '../core/templates.js';
|
|
8
|
+
import { createDocFile } from './docs.js';
|
|
9
|
+
import { addTask, getTasks, updateTask } from './tasks.js';
|
|
10
|
+
const SCHEMA = `
|
|
11
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
12
|
+
slug TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT,
|
|
13
|
+
status TEXT DEFAULT 'active', path TEXT NOT NULL, source_path TEXT,
|
|
14
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
17
|
+
id TEXT PRIMARY KEY, project_slug TEXT NOT NULL REFERENCES projects(slug),
|
|
18
|
+
title TEXT NOT NULL, type TEXT DEFAULT 'task', status TEXT DEFAULT 'todo',
|
|
19
|
+
priority TEXT DEFAULT 'P2', estimate TEXT, deadline TEXT, source TEXT DEFAULT 'manual',
|
|
20
|
+
detail_path TEXT, tags TEXT DEFAULT '[]', line_number INTEGER,
|
|
21
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
22
|
+
);
|
|
23
|
+
CREATE TABLE IF NOT EXISTS docs (
|
|
24
|
+
id TEXT PRIMARY KEY, project_slug TEXT NOT NULL REFERENCES projects(slug),
|
|
25
|
+
title TEXT NOT NULL, type TEXT NOT NULL, file_path TEXT NOT NULL,
|
|
26
|
+
body_hash TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
27
|
+
);
|
|
28
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS docs_fts USING fts5(
|
|
29
|
+
title, body, project_slug, type, content='', contentless_delete=1
|
|
30
|
+
);
|
|
31
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS tasks_fts USING fts5(
|
|
32
|
+
title, description, project_slug, content='', contentless_delete=1
|
|
33
|
+
);
|
|
34
|
+
`;
|
|
35
|
+
let db;
|
|
36
|
+
let config;
|
|
37
|
+
let projectPath;
|
|
38
|
+
let tmpDir;
|
|
39
|
+
function setupProject(slug = 'test-project') {
|
|
40
|
+
projectPath = join(tmpDir, 'projects', slug);
|
|
41
|
+
mkdirSync(join(projectPath, 'docs'), { recursive: true });
|
|
42
|
+
const backlog = scaffoldBacklog(slug);
|
|
43
|
+
writeFileSync(join(projectPath, 'BACKLOG.md'), backlog);
|
|
44
|
+
const now = new Date().toISOString();
|
|
45
|
+
db.prepare('INSERT INTO projects (slug, name, description, status, path, source_path, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)').run(slug, 'Test Project', null, 'active', projectPath, null, now, now);
|
|
46
|
+
indexProject(db, slug, projectPath);
|
|
47
|
+
}
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
tmpDir = join(tmpdir(), `dwork-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
50
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
51
|
+
db = new Database(':memory:');
|
|
52
|
+
db.pragma('journal_mode = WAL');
|
|
53
|
+
db.pragma('foreign_keys = ON');
|
|
54
|
+
db.exec(SCHEMA);
|
|
55
|
+
config = {
|
|
56
|
+
dataPath: tmpDir,
|
|
57
|
+
port: 7881,
|
|
58
|
+
host: '0.0.0.0',
|
|
59
|
+
token: 'test-token',
|
|
60
|
+
};
|
|
61
|
+
setupProject();
|
|
62
|
+
});
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
db.close();
|
|
65
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
66
|
+
});
|
|
67
|
+
describe('addTask', () => {
|
|
68
|
+
it('creates a basic task', () => {
|
|
69
|
+
const task = addTask(db, config, 'test-project', 'My task');
|
|
70
|
+
expect(task.title).toBe('My task');
|
|
71
|
+
expect(task.status).toBe('todo');
|
|
72
|
+
expect(task.priority).toBe('P2');
|
|
73
|
+
expect(task.detail_path).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
it('creates a task with all options', () => {
|
|
76
|
+
const task = addTask(db, config, 'test-project', 'Full task', {
|
|
77
|
+
type: 'feature',
|
|
78
|
+
priority: 'P0',
|
|
79
|
+
status: 'doing',
|
|
80
|
+
estimate: '2d',
|
|
81
|
+
deadline: '2026-06-01',
|
|
82
|
+
});
|
|
83
|
+
expect(task.title).toBe('Full task');
|
|
84
|
+
expect(task.type).toBe('feature');
|
|
85
|
+
expect(task.priority).toBe('P0');
|
|
86
|
+
expect(task.status).toBe('doing');
|
|
87
|
+
expect(task.estimate).toBe('2d');
|
|
88
|
+
expect(task.deadline).toBe('2026-06-01');
|
|
89
|
+
});
|
|
90
|
+
it('creates a task with detail string (existing doc path)', () => {
|
|
91
|
+
const task = addTask(db, config, 'test-project', 'Task with detail', {
|
|
92
|
+
detail: 'docs/001_existing.md',
|
|
93
|
+
});
|
|
94
|
+
expect(task.detail_path).toBe('docs/001_existing.md');
|
|
95
|
+
});
|
|
96
|
+
it('creates a task with detail_doc atomically', () => {
|
|
97
|
+
const task = addTask(db, config, 'test-project', 'Atomic task', {
|
|
98
|
+
priority: 'P1',
|
|
99
|
+
type: 'feature',
|
|
100
|
+
detail_doc: {
|
|
101
|
+
title: 'Design for Atomic Task',
|
|
102
|
+
body: '## Context\n\nThis is the detail document.',
|
|
103
|
+
type: 'planning',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
expect(task.detail_path).toMatch(/^docs\/\d{3}_design-for-atomic-task\.md$/);
|
|
107
|
+
expect(task.detail_path).toBeTruthy();
|
|
108
|
+
const docFile = join(projectPath, task.detail_path);
|
|
109
|
+
expect(existsSync(docFile)).toBe(true);
|
|
110
|
+
const content = readFileSync(docFile, 'utf-8');
|
|
111
|
+
expect(content).toContain('title: Design for Atomic Task');
|
|
112
|
+
expect(content).toContain('type: planning');
|
|
113
|
+
expect(content).toContain('## Context');
|
|
114
|
+
const backlog = readFileSync(join(projectPath, 'BACKLOG.md'), 'utf-8');
|
|
115
|
+
expect(backlog).toContain('Atomic task');
|
|
116
|
+
expect(backlog).toContain(`detail: ${task.detail_path}`);
|
|
117
|
+
const docs = db
|
|
118
|
+
.prepare("SELECT * FROM docs WHERE project_slug = 'test-project' AND file_path = ?")
|
|
119
|
+
.get(task.detail_path);
|
|
120
|
+
expect(docs).toBeDefined();
|
|
121
|
+
expect(docs?.title).toBe('Design for Atomic Task');
|
|
122
|
+
expect(docs?.type).toBe('planning');
|
|
123
|
+
});
|
|
124
|
+
it('detail string takes precedence over detail_doc', () => {
|
|
125
|
+
const task = addTask(db, config, 'test-project', 'Precedence task', {
|
|
126
|
+
detail: 'docs/manual-path.md',
|
|
127
|
+
detail_doc: {
|
|
128
|
+
title: 'Should not create',
|
|
129
|
+
body: 'Ignored',
|
|
130
|
+
type: 'note',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
expect(task.detail_path).toBe('docs/manual-path.md');
|
|
134
|
+
const docs = db
|
|
135
|
+
.prepare("SELECT * FROM docs WHERE project_slug = 'test-project' AND title = 'Should not create'")
|
|
136
|
+
.all();
|
|
137
|
+
expect(docs).toHaveLength(0);
|
|
138
|
+
});
|
|
139
|
+
it('auto-increments doc number with detail_doc', () => {
|
|
140
|
+
createDocFile(db, 'test-project', projectPath, 'First doc', 'body', 'note');
|
|
141
|
+
indexProject(db, 'test-project', projectPath);
|
|
142
|
+
const task = addTask(db, config, 'test-project', 'Second doc task', {
|
|
143
|
+
detail_doc: {
|
|
144
|
+
title: 'Second doc',
|
|
145
|
+
body: 'body',
|
|
146
|
+
type: 'planning',
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
expect(task.detail_path).toBe('docs/002_second-doc.md');
|
|
150
|
+
});
|
|
151
|
+
it('throws on unknown project', () => {
|
|
152
|
+
expect(() => addTask(db, config, 'nope', 'Task')).toThrow("Project 'nope' not found");
|
|
153
|
+
});
|
|
154
|
+
it('task appears in getTasks after creation', () => {
|
|
155
|
+
addTask(db, config, 'test-project', 'Visible task', { status: 'doing' });
|
|
156
|
+
const tasks = getTasks(db, 'test-project', 'doing');
|
|
157
|
+
expect(tasks).toHaveLength(1);
|
|
158
|
+
expect(tasks[0].title).toBe('Visible task');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('updateTask', () => {
|
|
162
|
+
it('updates status', () => {
|
|
163
|
+
const task = addTask(db, config, 'test-project', 'Status task');
|
|
164
|
+
const ok = updateTask(db, config, task.id, { status: 'doing' });
|
|
165
|
+
expect(ok).toBe(true);
|
|
166
|
+
const tasks = getTasks(db, 'test-project', 'doing');
|
|
167
|
+
expect(tasks).toHaveLength(1);
|
|
168
|
+
expect(tasks[0].title).toBe('Status task');
|
|
169
|
+
});
|
|
170
|
+
it('links a detail doc via update', () => {
|
|
171
|
+
const task = addTask(db, config, 'test-project', 'Linkable task');
|
|
172
|
+
const ok = updateTask(db, config, task.id, { detail: 'docs/001_design.md' });
|
|
173
|
+
expect(ok).toBe(true);
|
|
174
|
+
const backlog = readFileSync(join(projectPath, 'BACKLOG.md'), 'utf-8');
|
|
175
|
+
expect(backlog).toContain('detail: docs/001_design.md');
|
|
176
|
+
const updated = getTasks(db, 'test-project');
|
|
177
|
+
const found = updated.find((t) => t.title === 'Linkable task');
|
|
178
|
+
expect(found?.detail_path).toBe('docs/001_design.md');
|
|
179
|
+
});
|
|
180
|
+
it('returns false for unknown task', () => {
|
|
181
|
+
const ok = updateTask(db, config, 'task_nonexistent', { status: 'done' });
|
|
182
|
+
expect(ok).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
it('updates multiple fields at once', () => {
|
|
185
|
+
const task = addTask(db, config, 'test-project', 'Multi update');
|
|
186
|
+
updateTask(db, config, task.id, {
|
|
187
|
+
title: 'Renamed',
|
|
188
|
+
priority: 'P0',
|
|
189
|
+
status: 'blocked',
|
|
190
|
+
type: 'bug',
|
|
191
|
+
});
|
|
192
|
+
const tasks = getTasks(db, 'test-project', 'blocked');
|
|
193
|
+
expect(tasks).toHaveLength(1);
|
|
194
|
+
expect(tasks[0].title).toBe('Renamed');
|
|
195
|
+
expect(tasks[0].priority).toBe('P0');
|
|
196
|
+
expect(tasks[0].type).toBe('bug');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('createDocFile', () => {
|
|
200
|
+
it('creates a numbered doc file', () => {
|
|
201
|
+
const relPath = createDocFile(db, 'test-project', projectPath, 'My Doc', '# Hello', 'note');
|
|
202
|
+
expect(relPath).toBe('docs/001_my-doc.md');
|
|
203
|
+
expect(existsSync(join(projectPath, relPath))).toBe(true);
|
|
204
|
+
const content = readFileSync(join(projectPath, relPath), 'utf-8');
|
|
205
|
+
expect(content).toContain('title: My Doc');
|
|
206
|
+
expect(content).toContain('type: note');
|
|
207
|
+
expect(content).toContain('# Hello');
|
|
208
|
+
});
|
|
209
|
+
it('increments number from existing docs', () => {
|
|
210
|
+
createDocFile(db, 'test-project', projectPath, 'First', 'a', 'note');
|
|
211
|
+
indexProject(db, 'test-project', projectPath);
|
|
212
|
+
const second = createDocFile(db, 'test-project', projectPath, 'Second', 'b', 'note');
|
|
213
|
+
expect(second).toBe('docs/002_second.md');
|
|
214
|
+
});
|
|
215
|
+
it('handles special characters in title', () => {
|
|
216
|
+
const relPath = createDocFile(db, 'test-project', projectPath, 'MCP: add_task — detail_doc (v2)', 'body', 'planning');
|
|
217
|
+
expect(relPath).toMatch(/^docs\/001_mcp-add-task-detail-doc-v2\.md$/);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=tasks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.test.js","sourceRoot":"","sources":["../../src/service/tasks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBd,CAAC;AAEF,IAAI,EAAqB,CAAC;AAC1B,IAAI,MAAc,CAAC;AACnB,IAAI,WAAmB,CAAC;AACxB,IAAI,MAAc,CAAC;AAEnB,SAAS,YAAY,CAAC,IAAI,GAAG,cAAc;IACzC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7C,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IAExD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,EAAE,CAAC,OAAO,CACR,mIAAmI,CACpI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzE,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3F,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,GAAG;QACP,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,YAAY;KACpB,CAAC;IAEF,YAAY,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE;YAC5D,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE;YACnE,MAAM,EAAE,sBAAsB;SAC/B,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE;YAC9D,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACV,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,4CAA4C;gBAClD,IAAI,EAAE,UAAU;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;QAE7E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAqB,CAAC,CAAC;QAC9D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,0EAA0E,CAAC;aACnF,GAAG,CAAC,IAAI,CAAC,WAAW,CAAgD,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE;YAClE,MAAM,EAAE,qBAAqB;YAC7B,UAAU,EAAE;gBACV,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,MAAM;aACb;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAErD,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN,wFAAwF,CACzF;aACA,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5E,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE;YAClE,UAAU,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAE7E,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACjE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YAC9B,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAE5F,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACrE,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,aAAa,CAC3B,EAAE,EACF,cAAc,EACd,WAAW,EACX,iCAAiC,EACjC,MAAM,EACN,UAAU,CACX,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/service/utils.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/service/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/service/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5C;AAID,wBAAgB,SAAS,IAAI,MAAM,CAOlC"}
|
package/dist/service/utils.js
CHANGED
|
@@ -2,4 +2,13 @@ import { randomBytes } from 'node:crypto';
|
|
|
2
2
|
export function genId(prefix) {
|
|
3
3
|
return `${prefix}_${randomBytes(12).toString('base64url')}`;
|
|
4
4
|
}
|
|
5
|
+
const TASK_ID_ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
6
|
+
export function genTaskId() {
|
|
7
|
+
const bytes = randomBytes(8);
|
|
8
|
+
let id = '';
|
|
9
|
+
for (let i = 0; i < 8; i++) {
|
|
10
|
+
id += TASK_ID_ALPHABET[bytes[i] % TASK_ID_ALPHABET.length];
|
|
11
|
+
}
|
|
12
|
+
return id;
|
|
13
|
+
}
|
|
5
14
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/service/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/service/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEhE,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,EAAE,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dtoolkit/dwork",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "AI-native, MD-driven project manager. Part of the dtoolkit suite.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"yaml": "^2.7.1",
|
|
45
45
|
"zod": "^4.4.2",
|
|
46
46
|
"@dtoolkit/core": "0.5.0",
|
|
47
|
-
"@dtoolkit/sdk": "0.5.
|
|
47
|
+
"@dtoolkit/sdk": "0.5.1"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/better-sqlite3": "^7.6.13",
|