code-auditor-mcp 2.0.3 → 2.2.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.
- package/README.md +41 -3
- package/dist/applyDataDirEnv.d.ts +2 -0
- package/dist/applyDataDirEnv.d.ts.map +1 -0
- package/dist/applyDataDirEnv.js +21 -0
- package/dist/applyDataDirEnv.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +48 -13
- package/dist/auditRunner.js.map +1 -1
- package/dist/codeIndexDB-enhanced.d.ts +2 -3
- package/dist/codeIndexDB-enhanced.d.ts.map +1 -1
- package/dist/codeIndexDB-enhanced.js +41 -15
- package/dist/codeIndexDB-enhanced.js.map +1 -1
- package/dist/codeIndexDb.d.ts +30 -1
- package/dist/codeIndexDb.d.ts.map +1 -1
- package/dist/codeIndexDb.js +114 -15
- package/dist/codeIndexDb.js.map +1 -1
- package/dist/codeIndexService.d.ts +7 -3
- package/dist/codeIndexService.d.ts.map +1 -1
- package/dist/codeIndexService.js +14 -22
- package/dist/codeIndexService.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/dataPaths.d.ts +10 -0
- package/dist/dataPaths.d.ts.map +1 -0
- package/dist/dataPaths.js +19 -0
- package/dist/dataPaths.js.map +1 -0
- package/dist/mcp-index.d.ts +3 -1
- package/dist/mcp-index.d.ts.map +1 -1
- package/dist/mcp-index.js +30 -8
- package/dist/mcp-index.js.map +1 -1
- package/dist/mcp-standalone.d.ts +1 -1
- package/dist/mcp-standalone.d.ts.map +1 -1
- package/dist/mcp-standalone.js +163 -59
- package/dist/mcp-standalone.js.map +1 -1
- package/dist/mcp-tools/projectTasks.d.ts +69 -0
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -0
- package/dist/mcp-tools/projectTasks.js +129 -0
- package/dist/mcp-tools/projectTasks.js.map +1 -0
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +3 -3
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +3 -2
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.js +206 -65
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAutoIndex.d.ts +2 -0
- package/dist/mcpAutoIndex.d.ts.map +1 -0
- package/dist/mcpAutoIndex.js +71 -0
- package/dist/mcpAutoIndex.js.map +1 -0
- package/dist/mcpDiagnostics.d.ts +11 -0
- package/dist/mcpDiagnostics.d.ts.map +1 -0
- package/dist/mcpDiagnostics.js +54 -0
- package/dist/mcpDiagnostics.js.map +1 -0
- package/dist/mcpToolErrors.d.ts +21 -0
- package/dist/mcpToolErrors.d.ts.map +1 -0
- package/dist/mcpToolErrors.js +81 -0
- package/dist/mcpToolErrors.js.map +1 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +11 -12
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/ProjectTaskRepository.d.ts +20 -0
- package/dist/services/ProjectTaskRepository.d.ts.map +1 -0
- package/dist/services/ProjectTaskRepository.js +96 -0
- package/dist/services/ProjectTaskRepository.js.map +1 -0
- package/dist/services/projectTaskHelpers.d.ts +23 -0
- package/dist/services/projectTaskHelpers.d.ts.map +1 -0
- package/dist/services/projectTaskHelpers.js +232 -0
- package/dist/services/projectTaskHelpers.js.map +1 -0
- package/dist/types/projectTask.d.ts +64 -0
- package/dist/types/projectTask.d.ts.map +1 -0
- package/dist/types/projectTask.js +6 -0
- package/dist/types/projectTask.js.map +1 -0
- package/package.json +34 -27
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loki persistence for project tasks. Keeps CodeIndexDB from owning task CRUD logic.
|
|
3
|
+
*/
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { randomUUID } from 'crypto';
|
|
6
|
+
import { applyProjectTaskPatch, coerceSortOrder, normalizeStringList, normalizeTaskPriority, normalizeTaskSource, normalizeTaskStatus, sanitizeUpdatePatch, serializeProjectTask, storedSortOrder } from './projectTaskHelpers.js';
|
|
7
|
+
export class ProjectTaskRepository {
|
|
8
|
+
getTasksCollection;
|
|
9
|
+
persist;
|
|
10
|
+
constructor(getTasksCollection, persist) {
|
|
11
|
+
this.getTasksCollection = getTasksCollection;
|
|
12
|
+
this.persist = persist;
|
|
13
|
+
}
|
|
14
|
+
create(input) {
|
|
15
|
+
const projectPath = path.resolve(input.projectPath);
|
|
16
|
+
const now = new Date().toISOString();
|
|
17
|
+
const status = normalizeTaskStatus(input.status, 'pending');
|
|
18
|
+
const source = normalizeTaskSource(input.source, 'manual');
|
|
19
|
+
const sortOrder = coerceSortOrder(input.sortOrder);
|
|
20
|
+
const blockedBy = normalizeStringList(input.blockedBy);
|
|
21
|
+
const relatedFiles = normalizeStringList(input.relatedFiles);
|
|
22
|
+
const relatedSymbols = normalizeStringList(input.relatedSymbols);
|
|
23
|
+
const priority = normalizeTaskPriority(input.priority);
|
|
24
|
+
const doc = {
|
|
25
|
+
taskId: randomUUID(),
|
|
26
|
+
projectPath,
|
|
27
|
+
title: input.title.trim(),
|
|
28
|
+
...(input.description !== undefined && { description: input.description }),
|
|
29
|
+
status,
|
|
30
|
+
source,
|
|
31
|
+
sortOrder,
|
|
32
|
+
blockedBy,
|
|
33
|
+
...(input.dueAt !== undefined && {
|
|
34
|
+
dueAt: input.dueAt === null ? undefined : input.dueAt
|
|
35
|
+
}),
|
|
36
|
+
relatedFiles,
|
|
37
|
+
relatedSymbols,
|
|
38
|
+
...(priority !== undefined && { priority }),
|
|
39
|
+
...(input.labels !== undefined && { labels: input.labels }),
|
|
40
|
+
...(input.metadata !== undefined && { metadata: input.metadata }),
|
|
41
|
+
...(input.parentTaskId !== undefined && { parentTaskId: input.parentTaskId }),
|
|
42
|
+
createdAt: now,
|
|
43
|
+
updatedAt: now,
|
|
44
|
+
...(status === 'done' && { completedAt: now })
|
|
45
|
+
};
|
|
46
|
+
this.getTasksCollection().insert(doc);
|
|
47
|
+
this.persist();
|
|
48
|
+
return serializeProjectTask(doc);
|
|
49
|
+
}
|
|
50
|
+
getById(taskId) {
|
|
51
|
+
const found = this.getTasksCollection().findOne({ taskId });
|
|
52
|
+
return found ? serializeProjectTask(found) : null;
|
|
53
|
+
}
|
|
54
|
+
list(projectPath, options) {
|
|
55
|
+
const resolved = path.resolve(projectPath);
|
|
56
|
+
let rows = this.getTasksCollection().find({ projectPath: resolved });
|
|
57
|
+
if (options?.status) {
|
|
58
|
+
rows = rows.filter((r) => r.status === options.status);
|
|
59
|
+
}
|
|
60
|
+
if (options?.source) {
|
|
61
|
+
rows = rows.filter((r) => normalizeTaskSource(r.source, 'manual') === options.source);
|
|
62
|
+
}
|
|
63
|
+
rows.sort((a, b) => {
|
|
64
|
+
const ao = storedSortOrder(a);
|
|
65
|
+
const bo = storedSortOrder(b);
|
|
66
|
+
if (ao !== bo) {
|
|
67
|
+
return ao - bo;
|
|
68
|
+
}
|
|
69
|
+
return (new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
70
|
+
});
|
|
71
|
+
const cap = Math.min(Math.max(options?.limit ?? 500, 1), 1000);
|
|
72
|
+
return rows.slice(0, cap).map((r) => serializeProjectTask(r));
|
|
73
|
+
}
|
|
74
|
+
update(taskId, patch) {
|
|
75
|
+
const doc = this.getTasksCollection().findOne({ taskId });
|
|
76
|
+
if (!doc) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const now = new Date().toISOString();
|
|
80
|
+
const safe = sanitizeUpdatePatch(patch);
|
|
81
|
+
applyProjectTaskPatch(doc, safe, now);
|
|
82
|
+
this.getTasksCollection().update(doc);
|
|
83
|
+
this.persist();
|
|
84
|
+
return serializeProjectTask(doc);
|
|
85
|
+
}
|
|
86
|
+
delete(taskId) {
|
|
87
|
+
const doc = this.getTasksCollection().findOne({ taskId });
|
|
88
|
+
if (!doc) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
this.getTasksCollection().remove(doc);
|
|
92
|
+
this.persist();
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ProjectTaskRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectTaskRepository.js","sourceRoot":"","sources":["../../src/services/ProjectTaskRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for project tasks — normalization, serialization, patch application.
|
|
3
|
+
* Keeps CodeIndexDB and MCP handlers thin (Single Responsibility).
|
|
4
|
+
*/
|
|
5
|
+
import type { ProjectTask, ProjectTaskDocument, ProjectTaskPriority, ProjectTaskSource, ProjectTaskStatus, UpdateProjectTaskPatch } from '../types/projectTask.js';
|
|
6
|
+
export declare const PROJECT_TASK_STATUSES: readonly ProjectTaskStatus[];
|
|
7
|
+
export declare const PROJECT_TASK_SOURCES: readonly ProjectTaskSource[];
|
|
8
|
+
export declare function normalizeTaskStatus(value: unknown, fallback: ProjectTaskStatus): ProjectTaskStatus;
|
|
9
|
+
export declare function normalizeTaskSource(value: unknown, fallback: ProjectTaskSource): ProjectTaskSource;
|
|
10
|
+
export declare function normalizeTaskPriority(value: unknown): ProjectTaskPriority | undefined;
|
|
11
|
+
export declare function normalizeStringList(value: unknown): string[];
|
|
12
|
+
export declare function coerceSortOrder(value: unknown): number;
|
|
13
|
+
export declare function storedSortOrder(doc: ProjectTaskDocument): number;
|
|
14
|
+
/**
|
|
15
|
+
* API shape for stored rows (legacy docs may omit structured fields).
|
|
16
|
+
*/
|
|
17
|
+
export declare function serializeProjectTask(doc: ProjectTaskDocument): ProjectTask;
|
|
18
|
+
/**
|
|
19
|
+
* Builds a typed patch from MCP/JSON input — ignores unknown keys (no arbitrary spread onto DB).
|
|
20
|
+
*/
|
|
21
|
+
export declare function sanitizeUpdatePatch(raw: unknown): UpdateProjectTaskPatch;
|
|
22
|
+
export declare function applyProjectTaskPatch(doc: ProjectTaskDocument, patch: UpdateProjectTaskPatch, nowIso: string): void;
|
|
23
|
+
//# sourceMappingURL=projectTaskHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTaskHelpers.d.ts","sourceRoot":"","sources":["../../src/services/projectTaskHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,qBAAqB,EAAE,SAAS,iBAAiB,EAMpD,CAAC;AAEX,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAInD,CAAC;AAIX,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,iBAAiB,GAC1B,iBAAiB,CAQnB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,iBAAiB,GAC1B,iBAAiB,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,mBAAmB,GAAG,SAAS,CAQjC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAK5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,WAAW,CAU1E;AAkBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAkGxE;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,MAAM,GACb,IAAI,CAiDN"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for project tasks — normalization, serialization, patch application.
|
|
3
|
+
* Keeps CodeIndexDB and MCP handlers thin (Single Responsibility).
|
|
4
|
+
*/
|
|
5
|
+
export const PROJECT_TASK_STATUSES = [
|
|
6
|
+
'pending',
|
|
7
|
+
'in_progress',
|
|
8
|
+
'blocked',
|
|
9
|
+
'done',
|
|
10
|
+
'cancelled'
|
|
11
|
+
];
|
|
12
|
+
export const PROJECT_TASK_SOURCES = [
|
|
13
|
+
'manual',
|
|
14
|
+
'audit',
|
|
15
|
+
'mcp'
|
|
16
|
+
];
|
|
17
|
+
const PRIORITIES = ['low', 'medium', 'high'];
|
|
18
|
+
export function normalizeTaskStatus(value, fallback) {
|
|
19
|
+
if (typeof value === 'string' &&
|
|
20
|
+
PROJECT_TASK_STATUSES.includes(value)) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
export function normalizeTaskSource(value, fallback) {
|
|
26
|
+
if (typeof value === 'string' &&
|
|
27
|
+
PROJECT_TASK_SOURCES.includes(value)) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
return fallback;
|
|
31
|
+
}
|
|
32
|
+
export function normalizeTaskPriority(value) {
|
|
33
|
+
if (typeof value === 'string' &&
|
|
34
|
+
PRIORITIES.includes(value)) {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
export function normalizeStringList(value) {
|
|
40
|
+
if (!Array.isArray(value)) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return value.filter((x) => typeof x === 'string');
|
|
44
|
+
}
|
|
45
|
+
export function coerceSortOrder(value) {
|
|
46
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
export function storedSortOrder(doc) {
|
|
52
|
+
return coerceSortOrder(doc.sortOrder);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* API shape for stored rows (legacy docs may omit structured fields).
|
|
56
|
+
*/
|
|
57
|
+
export function serializeProjectTask(doc) {
|
|
58
|
+
const { $loki, meta, ...rest } = doc;
|
|
59
|
+
return {
|
|
60
|
+
...rest,
|
|
61
|
+
source: normalizeTaskSource(rest.source, 'manual'),
|
|
62
|
+
sortOrder: storedSortOrder(doc),
|
|
63
|
+
blockedBy: normalizeStringList(rest.blockedBy),
|
|
64
|
+
relatedFiles: normalizeStringList(rest.relatedFiles),
|
|
65
|
+
relatedSymbols: normalizeStringList(rest.relatedSymbols)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const UPDATE_PATCH_KEYS = [
|
|
69
|
+
'title',
|
|
70
|
+
'description',
|
|
71
|
+
'status',
|
|
72
|
+
'priority',
|
|
73
|
+
'labels',
|
|
74
|
+
'metadata',
|
|
75
|
+
'parentTaskId',
|
|
76
|
+
'source',
|
|
77
|
+
'blockedBy',
|
|
78
|
+
'dueAt',
|
|
79
|
+
'sortOrder',
|
|
80
|
+
'relatedFiles',
|
|
81
|
+
'relatedSymbols'
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Builds a typed patch from MCP/JSON input — ignores unknown keys (no arbitrary spread onto DB).
|
|
85
|
+
*/
|
|
86
|
+
export function sanitizeUpdatePatch(raw) {
|
|
87
|
+
if (raw === null || raw === undefined || typeof raw !== 'object') {
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
const src = raw;
|
|
91
|
+
const out = {};
|
|
92
|
+
for (const key of UPDATE_PATCH_KEYS) {
|
|
93
|
+
if (!Object.prototype.hasOwnProperty.call(src, key)) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const v = src[key];
|
|
97
|
+
switch (key) {
|
|
98
|
+
case 'title':
|
|
99
|
+
if (typeof v === 'string') {
|
|
100
|
+
out.title = v;
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
case 'description':
|
|
104
|
+
if (v === undefined || v === null || typeof v === 'string') {
|
|
105
|
+
out.description = v === null ? undefined : v;
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case 'status':
|
|
109
|
+
if (typeof v === 'string' &&
|
|
110
|
+
PROJECT_TASK_STATUSES.includes(v)) {
|
|
111
|
+
out.status = v;
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
case 'priority': {
|
|
115
|
+
const p = normalizeTaskPriority(v);
|
|
116
|
+
if (p !== undefined) {
|
|
117
|
+
out.priority = p;
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'labels':
|
|
122
|
+
if (v === undefined || v === null) {
|
|
123
|
+
out.labels = undefined;
|
|
124
|
+
}
|
|
125
|
+
else if (Array.isArray(v)) {
|
|
126
|
+
out.labels = normalizeStringList(v);
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
case 'metadata':
|
|
130
|
+
if (v !== undefined && typeof v === 'object' && v !== null && !Array.isArray(v)) {
|
|
131
|
+
out.metadata = v;
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case 'parentTaskId':
|
|
135
|
+
if (v === undefined || v === null) {
|
|
136
|
+
out.parentTaskId = null;
|
|
137
|
+
}
|
|
138
|
+
else if (typeof v === 'string') {
|
|
139
|
+
out.parentTaskId = v;
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
case 'source':
|
|
143
|
+
if (typeof v === 'string' &&
|
|
144
|
+
PROJECT_TASK_SOURCES.includes(v)) {
|
|
145
|
+
out.source = v;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'blockedBy':
|
|
149
|
+
if (Array.isArray(v)) {
|
|
150
|
+
out.blockedBy = normalizeStringList(v);
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
case 'dueAt':
|
|
154
|
+
if (v === undefined || v === null || v === '') {
|
|
155
|
+
out.dueAt = null;
|
|
156
|
+
}
|
|
157
|
+
else if (typeof v === 'string') {
|
|
158
|
+
out.dueAt = v;
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
case 'sortOrder':
|
|
162
|
+
if (typeof v === 'number' && Number.isFinite(v)) {
|
|
163
|
+
out.sortOrder = v;
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case 'relatedFiles':
|
|
167
|
+
if (Array.isArray(v)) {
|
|
168
|
+
out.relatedFiles = normalizeStringList(v);
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case 'relatedSymbols':
|
|
172
|
+
if (Array.isArray(v)) {
|
|
173
|
+
out.relatedSymbols = normalizeStringList(v);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
default:
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
export function applyProjectTaskPatch(doc, patch, nowIso) {
|
|
183
|
+
if (patch.title !== undefined) {
|
|
184
|
+
doc.title = String(patch.title).trim();
|
|
185
|
+
}
|
|
186
|
+
if (patch.description !== undefined) {
|
|
187
|
+
doc.description = patch.description;
|
|
188
|
+
}
|
|
189
|
+
if (patch.priority !== undefined) {
|
|
190
|
+
const p = normalizeTaskPriority(patch.priority);
|
|
191
|
+
if (p !== undefined) {
|
|
192
|
+
doc.priority = p;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (patch.labels !== undefined) {
|
|
196
|
+
doc.labels = patch.labels;
|
|
197
|
+
}
|
|
198
|
+
if (patch.metadata !== undefined) {
|
|
199
|
+
doc.metadata = patch.metadata;
|
|
200
|
+
}
|
|
201
|
+
if (patch.parentTaskId !== undefined) {
|
|
202
|
+
doc.parentTaskId = patch.parentTaskId;
|
|
203
|
+
}
|
|
204
|
+
if (patch.source !== undefined) {
|
|
205
|
+
doc.source = normalizeTaskSource(patch.source, doc.source ?? 'manual');
|
|
206
|
+
}
|
|
207
|
+
if (patch.blockedBy !== undefined) {
|
|
208
|
+
doc.blockedBy = normalizeStringList(patch.blockedBy);
|
|
209
|
+
}
|
|
210
|
+
if (patch.sortOrder !== undefined) {
|
|
211
|
+
doc.sortOrder = coerceSortOrder(patch.sortOrder);
|
|
212
|
+
}
|
|
213
|
+
if (patch.relatedFiles !== undefined) {
|
|
214
|
+
doc.relatedFiles = normalizeStringList(patch.relatedFiles);
|
|
215
|
+
}
|
|
216
|
+
if (patch.relatedSymbols !== undefined) {
|
|
217
|
+
doc.relatedSymbols = normalizeStringList(patch.relatedSymbols);
|
|
218
|
+
}
|
|
219
|
+
if (patch.dueAt !== undefined) {
|
|
220
|
+
doc.dueAt =
|
|
221
|
+
patch.dueAt === null || patch.dueAt === ''
|
|
222
|
+
? undefined
|
|
223
|
+
: String(patch.dueAt);
|
|
224
|
+
}
|
|
225
|
+
if (patch.status !== undefined) {
|
|
226
|
+
const newStatus = normalizeTaskStatus(patch.status, doc.status);
|
|
227
|
+
doc.status = newStatus;
|
|
228
|
+
doc.completedAt = newStatus === 'done' ? nowIso : undefined;
|
|
229
|
+
}
|
|
230
|
+
doc.updatedAt = nowIso;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=projectTaskHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTaskHelpers.js","sourceRoot":"","sources":["../../src/services/projectTaskHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent project tasks stored in LokiJS.
|
|
3
|
+
* Survives clearIndex (same DB file; clearIndex clears analysis-derived collections only).
|
|
4
|
+
*/
|
|
5
|
+
export type ProjectTaskStatus = 'pending' | 'in_progress' | 'blocked' | 'done' | 'cancelled';
|
|
6
|
+
export type ProjectTaskPriority = 'low' | 'medium' | 'high';
|
|
7
|
+
/** Who created or last logically "owns" the task row */
|
|
8
|
+
export type ProjectTaskSource = 'manual' | 'audit' | 'mcp';
|
|
9
|
+
/** Stored document (may include Loki fields) */
|
|
10
|
+
export interface ProjectTaskDocument {
|
|
11
|
+
taskId: string;
|
|
12
|
+
projectPath: string;
|
|
13
|
+
title: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
status: ProjectTaskStatus;
|
|
16
|
+
priority?: ProjectTaskPriority;
|
|
17
|
+
labels?: string[];
|
|
18
|
+
/** Free-form: related URLs, extra notes beyond structured fields */
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
parentTaskId?: string | null;
|
|
21
|
+
/** Default applied in API layer when missing (legacy rows). */
|
|
22
|
+
source?: ProjectTaskSource;
|
|
23
|
+
/** Task IDs that block this one (dependency / waiting-on). */
|
|
24
|
+
blockedBy?: string[];
|
|
25
|
+
/** ISO 8601 datetime; optional scheduling */
|
|
26
|
+
dueAt?: string | null;
|
|
27
|
+
/** Lower sorts earlier within the same list (default 0). */
|
|
28
|
+
sortOrder?: number;
|
|
29
|
+
/** Repo file paths tied to the task */
|
|
30
|
+
relatedFiles?: string[];
|
|
31
|
+
/** Symbols (function/class/component names) for cross-linking with the index */
|
|
32
|
+
relatedSymbols?: string[];
|
|
33
|
+
createdAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
completedAt?: string | null;
|
|
36
|
+
$loki?: number;
|
|
37
|
+
meta?: unknown;
|
|
38
|
+
}
|
|
39
|
+
/** API-facing task (no Loki internals); defaults applied for legacy stored rows */
|
|
40
|
+
export type ProjectTask = Omit<ProjectTaskDocument, '$loki' | 'meta'> & {
|
|
41
|
+
source: ProjectTaskSource;
|
|
42
|
+
sortOrder: number;
|
|
43
|
+
blockedBy: string[];
|
|
44
|
+
relatedFiles: string[];
|
|
45
|
+
relatedSymbols: string[];
|
|
46
|
+
};
|
|
47
|
+
export interface CreateProjectTaskInput {
|
|
48
|
+
projectPath: string;
|
|
49
|
+
title: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
status?: ProjectTaskStatus;
|
|
52
|
+
priority?: ProjectTaskPriority;
|
|
53
|
+
labels?: string[];
|
|
54
|
+
metadata?: Record<string, unknown>;
|
|
55
|
+
parentTaskId?: string | null;
|
|
56
|
+
source?: ProjectTaskSource;
|
|
57
|
+
blockedBy?: string[];
|
|
58
|
+
dueAt?: string | null;
|
|
59
|
+
sortOrder?: number;
|
|
60
|
+
relatedFiles?: string[];
|
|
61
|
+
relatedSymbols?: string[];
|
|
62
|
+
}
|
|
63
|
+
export type UpdateProjectTaskPatch = Partial<Pick<ProjectTaskDocument, 'title' | 'description' | 'status' | 'priority' | 'labels' | 'metadata' | 'parentTaskId' | 'source' | 'blockedBy' | 'dueAt' | 'sortOrder' | 'relatedFiles' | 'relatedSymbols'>>;
|
|
64
|
+
//# sourceMappingURL=projectTask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTask.d.ts","sourceRoot":"","sources":["../../src/types/projectTask.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,aAAa,GACb,SAAS,GACT,MAAM,GACN,WAAW,CAAC;AAEhB,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5D,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAE3D,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;IACtE,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC1C,IAAI,CACF,mBAAmB,EACjB,OAAO,GACP,aAAa,GACb,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,UAAU,GACV,cAAc,GACd,QAAQ,GACR,WAAW,GACX,OAAO,GACP,WAAW,GACX,cAAc,GACd,gBAAgB,CACnB,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTask.js","sourceRoot":"","sources":["../../src/types/projectTask.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "code-auditor-mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Multi-language code quality auditor with MCP server - Analyze TypeScript, JavaScript, and Go code for SOLID principles, DRY violations, security patterns, and more",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -23,9 +23,10 @@
|
|
|
23
23
|
"start:stdio": "node dist/mcp-index.js --stdio",
|
|
24
24
|
"start:rest": "node dist/cli.js start --rest-api",
|
|
25
25
|
"generate": "node dist/cli.js generate-config",
|
|
26
|
-
"prepublishOnly": "
|
|
27
|
-
"test": "vitest",
|
|
28
|
-
"test:watch": "vitest watch"
|
|
26
|
+
"prepublishOnly": "pnpm run build",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest watch",
|
|
29
|
+
"test:parity": "vitest run \"src/analyzers/universal/__tests__/*Parity.test.ts\""
|
|
29
30
|
},
|
|
30
31
|
"keywords": [
|
|
31
32
|
"audit",
|
|
@@ -49,36 +50,37 @@
|
|
|
49
50
|
],
|
|
50
51
|
"author": "benahammond",
|
|
51
52
|
"license": "MIT",
|
|
53
|
+
"packageManager": "pnpm@10.12.1",
|
|
52
54
|
"engines": {
|
|
53
|
-
"node": ">=
|
|
55
|
+
"node": ">=18.0.0"
|
|
54
56
|
},
|
|
55
57
|
"dependencies": {
|
|
56
|
-
"@mcp-ui/server": "^
|
|
57
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
58
|
-
"ajv": "^8.
|
|
59
|
-
"chalk": "^5.
|
|
60
|
-
"chokidar": "^
|
|
61
|
-
"commander": "^
|
|
62
|
-
"cors": "^2.8.
|
|
63
|
-
"express": "^
|
|
64
|
-
"express-rate-limit": "^
|
|
58
|
+
"@mcp-ui/server": "^6.1.0",
|
|
59
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
60
|
+
"ajv": "^8.18.0",
|
|
61
|
+
"chalk": "^5.6.2",
|
|
62
|
+
"chokidar": "^5.0.0",
|
|
63
|
+
"commander": "^14.0.3",
|
|
64
|
+
"cors": "^2.8.6",
|
|
65
|
+
"express": "^5.2.1",
|
|
66
|
+
"express-rate-limit": "^8.3.1",
|
|
65
67
|
"flexsearch": "^0.8.212",
|
|
66
|
-
"inquirer": "^
|
|
67
|
-
"js-yaml": "^4.1.
|
|
68
|
+
"inquirer": "^13.3.2",
|
|
69
|
+
"js-yaml": "^4.1.1",
|
|
68
70
|
"lokijs": "^1.5.12",
|
|
69
|
-
"pino": "^
|
|
70
|
-
"pino-pretty": "^
|
|
71
|
-
"typescript": "
|
|
71
|
+
"pino": "^10.3.1",
|
|
72
|
+
"pino-pretty": "^13.1.3",
|
|
73
|
+
"typescript": "5.9.2"
|
|
72
74
|
},
|
|
73
75
|
"devDependencies": {
|
|
74
|
-
"@types/cors": "^2.8.
|
|
75
|
-
"@types/express": "^
|
|
76
|
-
"@types/inquirer": "^9.0.
|
|
77
|
-
"@types/js-yaml": "^4.0.
|
|
76
|
+
"@types/cors": "^2.8.19",
|
|
77
|
+
"@types/express": "^5.0.6",
|
|
78
|
+
"@types/inquirer": "^9.0.9",
|
|
79
|
+
"@types/js-yaml": "^4.0.9",
|
|
78
80
|
"@types/lokijs": "^1.5.14",
|
|
79
|
-
"@types/node": "^20.
|
|
80
|
-
"tsx": "^4.
|
|
81
|
-
"vitest": "^1.
|
|
81
|
+
"@types/node": "^20.19.11",
|
|
82
|
+
"tsx": "^4.21.0",
|
|
83
|
+
"vitest": "^1.6.1"
|
|
82
84
|
},
|
|
83
85
|
"files": [
|
|
84
86
|
"dist/**/*",
|
|
@@ -94,5 +96,10 @@
|
|
|
94
96
|
"bugs": {
|
|
95
97
|
"url": "https://github.com/BenAHammond/code-auditor-mcp/issues"
|
|
96
98
|
},
|
|
97
|
-
"homepage": "https://www.codeauditormcp.com/"
|
|
99
|
+
"homepage": "https://www.codeauditormcp.com/",
|
|
100
|
+
"pnpm": {
|
|
101
|
+
"overrides": {
|
|
102
|
+
"esbuild": ">=0.25.0"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
98
105
|
}
|