@dtoolkit/dwork 0.1.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.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/cli/configure.d.ts +2 -0
  4. package/dist/cli/configure.d.ts.map +1 -0
  5. package/dist/cli/configure.js +83 -0
  6. package/dist/cli/configure.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +76 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/init.d.ts +4 -0
  12. package/dist/cli/init.d.ts.map +1 -0
  13. package/dist/cli/init.js +143 -0
  14. package/dist/cli/init.js.map +1 -0
  15. package/dist/cli/keys.d.ts +11 -0
  16. package/dist/cli/keys.d.ts.map +1 -0
  17. package/dist/cli/keys.js +85 -0
  18. package/dist/cli/keys.js.map +1 -0
  19. package/dist/cli/start.d.ts +2 -0
  20. package/dist/cli/start.d.ts.map +1 -0
  21. package/dist/cli/start.js +53 -0
  22. package/dist/cli/start.js.map +1 -0
  23. package/dist/cli/status.d.ts +2 -0
  24. package/dist/cli/status.d.ts.map +1 -0
  25. package/dist/cli/status.js +36 -0
  26. package/dist/cli/status.js.map +1 -0
  27. package/dist/cli/sync.d.ts +4 -0
  28. package/dist/cli/sync.d.ts.map +1 -0
  29. package/dist/cli/sync.js +38 -0
  30. package/dist/cli/sync.js.map +1 -0
  31. package/dist/core/config.d.ts +21 -0
  32. package/dist/core/config.d.ts.map +1 -0
  33. package/dist/core/config.js +31 -0
  34. package/dist/core/config.js.map +1 -0
  35. package/dist/core/db.d.ts +4 -0
  36. package/dist/core/db.d.ts.map +1 -0
  37. package/dist/core/db.js +90 -0
  38. package/dist/core/db.js.map +1 -0
  39. package/dist/core/indexer.d.ts +9 -0
  40. package/dist/core/indexer.d.ts.map +1 -0
  41. package/dist/core/indexer.js +145 -0
  42. package/dist/core/indexer.js.map +1 -0
  43. package/dist/core/models.d.ts +113 -0
  44. package/dist/core/models.d.ts.map +1 -0
  45. package/dist/core/models.js +53 -0
  46. package/dist/core/models.js.map +1 -0
  47. package/dist/core/parser.d.ts +20 -0
  48. package/dist/core/parser.d.ts.map +1 -0
  49. package/dist/core/parser.js +126 -0
  50. package/dist/core/parser.js.map +1 -0
  51. package/dist/core/templates.d.ts +5 -0
  52. package/dist/core/templates.d.ts.map +1 -0
  53. package/dist/core/templates.js +84 -0
  54. package/dist/core/templates.js.map +1 -0
  55. package/dist/dashboard/index.html +1127 -0
  56. package/dist/dashboard/logo-dwork-complete.png +0 -0
  57. package/dist/dashboard/logo-dwork.png +0 -0
  58. package/dist/dashboard/server.d.ts +2 -0
  59. package/dist/dashboard/server.d.ts.map +1 -0
  60. package/dist/dashboard/server.js +27 -0
  61. package/dist/dashboard/server.js.map +1 -0
  62. package/dist/mcp/server.d.ts +5 -0
  63. package/dist/mcp/server.d.ts.map +1 -0
  64. package/dist/mcp/server.js +242 -0
  65. package/dist/mcp/server.js.map +1 -0
  66. package/dist/server/index.d.ts +7 -0
  67. package/dist/server/index.d.ts.map +1 -0
  68. package/dist/server/index.js +63 -0
  69. package/dist/server/index.js.map +1 -0
  70. package/dist/server/routes/docs.d.ts +3 -0
  71. package/dist/server/routes/docs.d.ts.map +1 -0
  72. package/dist/server/routes/docs.js +53 -0
  73. package/dist/server/routes/docs.js.map +1 -0
  74. package/dist/server/routes/health.d.ts +3 -0
  75. package/dist/server/routes/health.d.ts.map +1 -0
  76. package/dist/server/routes/health.js +27 -0
  77. package/dist/server/routes/health.js.map +1 -0
  78. package/dist/server/routes/keys.d.ts +3 -0
  79. package/dist/server/routes/keys.d.ts.map +1 -0
  80. package/dist/server/routes/keys.js +58 -0
  81. package/dist/server/routes/keys.js.map +1 -0
  82. package/dist/server/routes/overview.d.ts +3 -0
  83. package/dist/server/routes/overview.d.ts.map +1 -0
  84. package/dist/server/routes/overview.js +12 -0
  85. package/dist/server/routes/overview.js.map +1 -0
  86. package/dist/server/routes/permissions.d.ts +3 -0
  87. package/dist/server/routes/permissions.d.ts.map +1 -0
  88. package/dist/server/routes/permissions.js +9 -0
  89. package/dist/server/routes/permissions.js.map +1 -0
  90. package/dist/server/routes/projects.d.ts +3 -0
  91. package/dist/server/routes/projects.d.ts.map +1 -0
  92. package/dist/server/routes/projects.js +50 -0
  93. package/dist/server/routes/projects.js.map +1 -0
  94. package/dist/server/routes/search.d.ts +3 -0
  95. package/dist/server/routes/search.d.ts.map +1 -0
  96. package/dist/server/routes/search.js +10 -0
  97. package/dist/server/routes/search.js.map +1 -0
  98. package/dist/server/routes/sync.d.ts +3 -0
  99. package/dist/server/routes/sync.d.ts.map +1 -0
  100. package/dist/server/routes/sync.js +11 -0
  101. package/dist/server/routes/sync.js.map +1 -0
  102. package/dist/server/routes/tasks.d.ts +3 -0
  103. package/dist/server/routes/tasks.d.ts.map +1 -0
  104. package/dist/server/routes/tasks.js +45 -0
  105. package/dist/server/routes/tasks.js.map +1 -0
  106. package/dist/service/docs.d.ts +26 -0
  107. package/dist/service/docs.d.ts.map +1 -0
  108. package/dist/service/docs.js +137 -0
  109. package/dist/service/docs.js.map +1 -0
  110. package/dist/service/overview.d.ts +18 -0
  111. package/dist/service/overview.d.ts.map +1 -0
  112. package/dist/service/overview.js +46 -0
  113. package/dist/service/overview.js.map +1 -0
  114. package/dist/service/projects.d.ts +34 -0
  115. package/dist/service/projects.d.ts.map +1 -0
  116. package/dist/service/projects.js +99 -0
  117. package/dist/service/projects.js.map +1 -0
  118. package/dist/service/search.d.ts +13 -0
  119. package/dist/service/search.d.ts.map +1 -0
  120. package/dist/service/search.js +59 -0
  121. package/dist/service/search.js.map +1 -0
  122. package/dist/service/sync.d.ts +9 -0
  123. package/dist/service/sync.d.ts.map +1 -0
  124. package/dist/service/sync.js +95 -0
  125. package/dist/service/sync.js.map +1 -0
  126. package/dist/service/tasks.d.ts +40 -0
  127. package/dist/service/tasks.d.ts.map +1 -0
  128. package/dist/service/tasks.js +156 -0
  129. package/dist/service/tasks.js.map +1 -0
  130. package/dist/service/utils.d.ts +2 -0
  131. package/dist/service/utils.d.ts.map +1 -0
  132. package/dist/service/utils.js +5 -0
  133. package/dist/service/utils.js.map +1 -0
  134. package/package.json +62 -0
@@ -0,0 +1,59 @@
1
+ export function search(db, query, project, limit = 20) {
2
+ const words = query.split(/\s+/).filter(Boolean);
3
+ if (words.length === 0)
4
+ return [];
5
+ const ftsQuery = words.join(' OR ');
6
+ const results = [];
7
+ let docSql = `
8
+ SELECT d.id, d.title, d.project_slug, d.type, fts.rank
9
+ FROM docs_fts fts
10
+ JOIN docs d ON d.rowid = fts.rowid
11
+ WHERE docs_fts MATCH ?
12
+ `;
13
+ const docParams = [ftsQuery];
14
+ if (project) {
15
+ docSql += ' AND d.project_slug = ?';
16
+ docParams.push(project);
17
+ }
18
+ docSql += ' ORDER BY rank LIMIT ?';
19
+ docParams.push(limit);
20
+ const docRows = db.prepare(docSql).all(...docParams);
21
+ for (const row of docRows) {
22
+ results.push({
23
+ type: 'doc',
24
+ id: row.id,
25
+ title: row.title,
26
+ projectSlug: row.project_slug,
27
+ docType: row.type,
28
+ score: -row.rank,
29
+ });
30
+ }
31
+ let taskSql = `
32
+ SELECT t.id, t.title, t.project_slug, t.status, t.priority, fts.rank
33
+ FROM tasks_fts fts
34
+ JOIN tasks t ON t.rowid = fts.rowid
35
+ WHERE tasks_fts MATCH ?
36
+ `;
37
+ const taskParams = [ftsQuery];
38
+ if (project) {
39
+ taskSql += ' AND t.project_slug = ?';
40
+ taskParams.push(project);
41
+ }
42
+ taskSql += ' ORDER BY rank LIMIT ?';
43
+ taskParams.push(limit);
44
+ const taskRows = db.prepare(taskSql).all(...taskParams);
45
+ for (const row of taskRows) {
46
+ results.push({
47
+ type: 'task',
48
+ id: row.id,
49
+ title: row.title,
50
+ projectSlug: row.project_slug,
51
+ taskStatus: row.status,
52
+ taskPriority: row.priority,
53
+ score: -row.rank,
54
+ });
55
+ }
56
+ results.sort((a, b) => b.score - a.score);
57
+ return results.slice(0, limit);
58
+ }
59
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/service/search.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,MAAM,CACpB,EAAqB,EACrB,KAAa,EACb,OAAgB,EAChB,KAAK,GAAG,EAAE;IAEV,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,IAAI,MAAM,GAAG;;;;;GAKZ,CAAC;IACF,MAAM,SAAS,GAAwB,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,yBAAyB,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,wBAAwB,CAAC;IACnC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAMhD,CAAC;IAEJ,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,OAAO,EAAE,GAAG,CAAC,IAAI;YACjB,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,GAAG;;;;;GAKb,CAAC;IACF,MAAM,UAAU,GAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,yBAAyB,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,wBAAwB,CAAC;IACpC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAOnD,CAAC;IAEJ,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,YAAY,EAAE,GAAG,CAAC,QAAQ;YAC1B,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { Config } from '../core/config.js';
3
+ export interface SyncResult {
4
+ success: boolean;
5
+ message: string;
6
+ updatedFiles?: string[];
7
+ }
8
+ export declare function syncProject(db: Database.Database, config: Config, slug: string): Promise<SyncResult>;
9
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/service/sync.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAqGrB"}
@@ -0,0 +1,95 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { DProxyClient } from '@dtoolkit/sdk';
4
+ import { indexProject } from '../core/indexer.js';
5
+ export async function syncProject(db, config, slug) {
6
+ if (!config.dproxy) {
7
+ return {
8
+ success: false,
9
+ message: 'dproxy not configured. Add dproxy settings to config.json or run dwork configure.',
10
+ };
11
+ }
12
+ const project = db.prepare('SELECT * FROM projects WHERE slug = ?').get(slug);
13
+ if (!project) {
14
+ return { success: false, message: `Project '${slug}' not found` };
15
+ }
16
+ if (!project.source_path) {
17
+ return {
18
+ success: false,
19
+ message: `Project '${slug}' has no source_path configured. Set it via update_project or dwork configure.`,
20
+ };
21
+ }
22
+ let sourceContext = '';
23
+ try {
24
+ const pkgPath = join(project.source_path, 'package.json');
25
+ const pkg = readFileSync(pkgPath, 'utf-8');
26
+ sourceContext += `package.json:\n${pkg}\n\n`;
27
+ }
28
+ catch {
29
+ // no package.json
30
+ }
31
+ try {
32
+ const readmePath = join(project.source_path, 'README.md');
33
+ const readme = readFileSync(readmePath, 'utf-8');
34
+ sourceContext += `README.md:\n${readme}\n\n`;
35
+ }
36
+ catch {
37
+ // no README
38
+ }
39
+ if (!sourceContext) {
40
+ return {
41
+ success: false,
42
+ message: `No readable source files found at ${project.source_path}`,
43
+ };
44
+ }
45
+ const client = new DProxyClient(config.dproxy.url, config.dproxy.token);
46
+ const prompt = `Analyze this project and generate updated documentation in markdown.
47
+
48
+ Project: ${project.name} (${slug})
49
+ Source path: ${project.source_path}
50
+
51
+ Source context:
52
+ ${sourceContext}
53
+
54
+ Generate a concise TECH.md with:
55
+ - Stack section (table with Layer | Technology)
56
+ - Architecture section (brief description)
57
+ - Development section (build/test/run commands)
58
+
59
+ Respond ONLY with the markdown content, no explanation.`;
60
+ try {
61
+ const response = await client.ask(prompt, {
62
+ provider: config.dproxy.provider,
63
+ });
64
+ const content = response.text || '';
65
+ if (content) {
66
+ const techPath = join(project.path, 'TECH.md');
67
+ const existingTech = readFileSync(techPath, 'utf-8');
68
+ const hasFrontmatter = existingTech.startsWith('---');
69
+ let newTech;
70
+ if (hasFrontmatter) {
71
+ const fmEnd = existingTech.indexOf('---', 4);
72
+ const frontmatter = existingTech.slice(0, fmEnd + 3);
73
+ newTech = `${frontmatter}\n\n${content}\n`;
74
+ }
75
+ else {
76
+ newTech = content;
77
+ }
78
+ writeFileSync(techPath, newTech);
79
+ indexProject(db, slug, project.path);
80
+ return {
81
+ success: true,
82
+ message: `Synced TECH.md for ${slug} from source at ${project.source_path}`,
83
+ updatedFiles: ['TECH.md'],
84
+ };
85
+ }
86
+ return { success: false, message: 'dproxy returned empty response' };
87
+ }
88
+ catch (err) {
89
+ return {
90
+ success: false,
91
+ message: `Sync failed: ${err.message}`,
92
+ };
93
+ }
94
+ }
95
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/service/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { Config } from '../core/config.js';
3
+ export interface TaskRow {
4
+ id: string;
5
+ project_slug: string;
6
+ title: string;
7
+ type: string;
8
+ status: string;
9
+ priority: string;
10
+ estimate: string | null;
11
+ deadline: string | null;
12
+ source: string;
13
+ detail_path: string | null;
14
+ tags: string;
15
+ line_number: number | null;
16
+ created_at: string;
17
+ updated_at: string;
18
+ }
19
+ export declare function getTasks(db: Database.Database, project: string, status?: string, priority?: string): TaskRow[];
20
+ export declare function addTask(db: Database.Database, config: Config, project: string, title: string, opts?: {
21
+ type?: string;
22
+ priority?: string;
23
+ status?: string;
24
+ estimate?: string;
25
+ deadline?: string;
26
+ detail?: string;
27
+ source?: string;
28
+ }): TaskRow;
29
+ export declare function updateTask(db: Database.Database, config: Config, taskId: string, changes: {
30
+ title?: string;
31
+ status?: string;
32
+ priority?: string;
33
+ type?: string;
34
+ estimate?: string;
35
+ deadline?: string;
36
+ detail?: string;
37
+ }): boolean;
38
+ export declare function deleteTask(db: Database.Database, config: Config, taskId: string): boolean;
39
+ export declare function whatToDoNext(db: Database.Database, project?: string): TaskRow[];
40
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/service/tasks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAMhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,EAAE,CAiBX;AAED,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,OAAO,CA0DT;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAsCT;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAsBzF;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAqB/E"}
@@ -0,0 +1,156 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { indexProject } from '../core/indexer.js';
4
+ import { parseBacklog, parseFrontmatter, serializeBacklog } from '../core/parser.js';
5
+ import { genId } from './utils.js';
6
+ export function getTasks(db, project, status, priority) {
7
+ let sql = 'SELECT * FROM tasks WHERE project_slug = ?';
8
+ const params = [project];
9
+ if (status) {
10
+ sql += ' AND status = ?';
11
+ params.push(status);
12
+ }
13
+ if (priority) {
14
+ sql += ' AND priority = ?';
15
+ params.push(priority);
16
+ }
17
+ sql +=
18
+ " ORDER BY CASE priority WHEN 'P0' THEN 0 WHEN 'P1' THEN 1 WHEN 'P2' THEN 2 WHEN 'P3' THEN 3 END, deadline ASC NULLS LAST";
19
+ return db.prepare(sql).all(...params);
20
+ }
21
+ export function addTask(db, config, project, title, opts = {}) {
22
+ const projectRow = db.prepare('SELECT path FROM projects WHERE slug = ?').get(project);
23
+ if (!projectRow)
24
+ throw new Error(`Project '${project}' not found`);
25
+ const backlogPath = join(projectRow.path, 'BACKLOG.md');
26
+ const content = readFileSync(backlogPath, 'utf-8');
27
+ const { frontmatter } = parseFrontmatter(content);
28
+ const tasks = parseBacklog(content, project);
29
+ const priority = opts.priority || 'P2';
30
+ const status = opts.status || 'todo';
31
+ const metadata = {};
32
+ if (opts.type)
33
+ metadata.type = opts.type;
34
+ if (opts.estimate)
35
+ metadata.estimate = opts.estimate;
36
+ if (opts.deadline)
37
+ metadata.deadline = opts.deadline;
38
+ if (opts.detail)
39
+ metadata.detail = opts.detail;
40
+ if (status !== 'todo')
41
+ metadata.status = status;
42
+ tasks.push({
43
+ title,
44
+ done: false,
45
+ status,
46
+ priority,
47
+ metadata,
48
+ lineNumber: 0,
49
+ });
50
+ const serialized = serializeBacklog(tasks, frontmatter);
51
+ writeFileSync(backlogPath, serialized);
52
+ indexProject(db, project, projectRow.path);
53
+ const inserted = db
54
+ .prepare('SELECT * FROM tasks WHERE project_slug = ? AND title = ? ORDER BY created_at DESC LIMIT 1')
55
+ .get(project, title);
56
+ return (inserted || {
57
+ id: genId('task'),
58
+ project_slug: project,
59
+ title,
60
+ type: opts.type || 'task',
61
+ status,
62
+ priority,
63
+ estimate: opts.estimate || null,
64
+ deadline: opts.deadline || null,
65
+ source: opts.source || 'manual',
66
+ detail_path: opts.detail || null,
67
+ tags: '[]',
68
+ line_number: null,
69
+ created_at: new Date().toISOString(),
70
+ updated_at: new Date().toISOString(),
71
+ });
72
+ }
73
+ export function updateTask(db, config, taskId, changes) {
74
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId);
75
+ if (!task)
76
+ return false;
77
+ const projectRow = db
78
+ .prepare('SELECT path FROM projects WHERE slug = ?')
79
+ .get(task.project_slug);
80
+ if (!projectRow)
81
+ return false;
82
+ const backlogPath = join(projectRow.path, 'BACKLOG.md');
83
+ const content = readFileSync(backlogPath, 'utf-8');
84
+ const { frontmatter } = parseFrontmatter(content);
85
+ const tasks = parseBacklog(content, task.project_slug);
86
+ const target = tasks.find((t) => t.title === task.title);
87
+ if (!target)
88
+ return false;
89
+ if (changes.title)
90
+ target.title = changes.title;
91
+ if (changes.status) {
92
+ target.status = changes.status;
93
+ target.done = changes.status === 'done';
94
+ if (changes.status !== 'todo' && changes.status !== 'done') {
95
+ target.metadata.status = changes.status;
96
+ }
97
+ else {
98
+ delete target.metadata.status;
99
+ }
100
+ }
101
+ if (changes.priority)
102
+ target.priority = changes.priority;
103
+ if (changes.type)
104
+ target.metadata.type = changes.type;
105
+ if (changes.estimate)
106
+ target.metadata.estimate = changes.estimate;
107
+ if (changes.deadline)
108
+ target.metadata.deadline = changes.deadline;
109
+ if (changes.detail)
110
+ target.metadata.detail = changes.detail;
111
+ const serialized = serializeBacklog(tasks, frontmatter);
112
+ writeFileSync(backlogPath, serialized);
113
+ indexProject(db, task.project_slug, projectRow.path);
114
+ return true;
115
+ }
116
+ export function deleteTask(db, config, taskId) {
117
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ?').get(taskId);
118
+ if (!task)
119
+ return false;
120
+ const projectRow = db
121
+ .prepare('SELECT path FROM projects WHERE slug = ?')
122
+ .get(task.project_slug);
123
+ if (!projectRow)
124
+ return false;
125
+ const backlogPath = join(projectRow.path, 'BACKLOG.md');
126
+ const content = readFileSync(backlogPath, 'utf-8');
127
+ const { frontmatter } = parseFrontmatter(content);
128
+ const tasks = parseBacklog(content, task.project_slug);
129
+ const filtered = tasks.filter((t) => t.title !== task.title);
130
+ if (filtered.length === tasks.length)
131
+ return false;
132
+ const serialized = serializeBacklog(filtered, frontmatter);
133
+ writeFileSync(backlogPath, serialized);
134
+ indexProject(db, task.project_slug, projectRow.path);
135
+ return true;
136
+ }
137
+ export function whatToDoNext(db, project) {
138
+ let sql = `SELECT * FROM tasks WHERE status = 'todo'`;
139
+ const params = [];
140
+ if (project) {
141
+ sql += ' AND project_slug = ?';
142
+ params.push(project);
143
+ }
144
+ sql += ` ORDER BY
145
+ CASE priority WHEN 'P0' THEN 0 WHEN 'P1' THEN 1 WHEN 'P2' THEN 2 WHEN 'P3' THEN 3 END,
146
+ deadline ASC NULLS LAST,
147
+ CASE estimate
148
+ WHEN '1h' THEN 1 WHEN '2h' THEN 2 WHEN '4h' THEN 4
149
+ WHEN '1d' THEN 8 WHEN '2d' THEN 16 WHEN '3d' THEN 24
150
+ WHEN '1w' THEN 40 WHEN '2w' THEN 80
151
+ ELSE 999
152
+ END
153
+ LIMIT 5`;
154
+ return db.prepare(sql).all(...params);
155
+ }
156
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/service/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function genId(prefix: string): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ export function genId(prefix) {
3
+ return `${prefix}_${randomBytes(12).toString('base64url')}`;
4
+ }
5
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@dtoolkit/dwork",
3
+ "version": "0.1.0",
4
+ "description": "AI-native, MD-driven project manager. Part of the dtoolkit suite.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Iván Campillo <ivncmp@gmail.com>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/ivncmp/dtoolkit.git",
11
+ "directory": "packages/dwork"
12
+ },
13
+ "homepage": "https://github.com/ivncmp/dtoolkit/tree/main/packages/dwork",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "bin": {
18
+ "dwork": "./dist/cli/index.js"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "engines": {
24
+ "node": ">=22"
25
+ },
26
+ "keywords": [
27
+ "ai",
28
+ "project-manager",
29
+ "mcp",
30
+ "markdown",
31
+ "tasks",
32
+ "backlog",
33
+ "sqlite",
34
+ "claude",
35
+ "llm"
36
+ ],
37
+ "dependencies": {
38
+ "@clack/prompts": "^1.3.0",
39
+ "@modelcontextprotocol/sdk": "^1.29.0",
40
+ "better-sqlite3": "^12.9.0",
41
+ "commander": "^13.1.0",
42
+ "fastify": "^5.8.5",
43
+ "picocolors": "^1.1.1",
44
+ "yaml": "^2.7.1",
45
+ "zod": "^4.4.2",
46
+ "@dtoolkit/sdk": "0.4.1",
47
+ "@dtoolkit/core": "0.5.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/better-sqlite3": "^7.6.13",
51
+ "@types/node": "^25.6.0",
52
+ "tsx": "^4.21.0",
53
+ "vitest": "^4.1.5"
54
+ },
55
+ "scripts": {
56
+ "dev": "tsx watch src/cli/index.ts start",
57
+ "cli": "tsx src/cli/index.ts",
58
+ "build": "tsc && mkdir -p dist/dashboard && cp src/dashboard/index.html src/dashboard/logo*.png dist/dashboard/ && chmod +x dist/cli/index.js",
59
+ "start": "node dist/cli/index.js start",
60
+ "test": "vitest run --passWithNoTests"
61
+ }
62
+ }