ai-dev-analytics 1.1.12 → 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 (192) hide show
  1. package/README.en.md +51 -57
  2. package/README.md +68 -485
  3. package/dist/cli/commands/doctor.d.ts +2 -0
  4. package/dist/cli/commands/doctor.d.ts.map +1 -0
  5. package/dist/cli/commands/doctor.js +125 -0
  6. package/dist/cli/commands/doctor.js.map +1 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +19 -176
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/memory.d.ts.map +1 -1
  11. package/dist/cli/commands/memory.js +3 -13
  12. package/dist/cli/commands/memory.js.map +1 -1
  13. package/dist/cli/commands/rules.d.ts +0 -10
  14. package/dist/cli/commands/rules.d.ts.map +1 -1
  15. package/dist/cli/commands/rules.js +9 -34
  16. package/dist/cli/commands/rules.js.map +1 -1
  17. package/dist/cli/commands/skills.d.ts +0 -5
  18. package/dist/cli/commands/skills.d.ts.map +1 -1
  19. package/dist/cli/commands/skills.js +5 -24
  20. package/dist/cli/commands/skills.js.map +1 -1
  21. package/dist/cli/commands/sync.d.ts +2 -0
  22. package/dist/cli/commands/sync.d.ts.map +1 -0
  23. package/dist/cli/commands/sync.js +28 -0
  24. package/dist/cli/commands/sync.js.map +1 -0
  25. package/dist/cli/index.js +26 -85
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/{schemas/run-json.d.ts → internal/runtime/schema.d.ts} +4 -18
  28. package/dist/internal/runtime/schema.d.ts.map +1 -0
  29. package/dist/{schemas/run-json.js → internal/runtime/schema.js} +5 -9
  30. package/dist/internal/runtime/schema.js.map +1 -0
  31. package/dist/{utils/run-data.d.ts → internal/runtime/state.d.ts} +7 -8
  32. package/dist/internal/runtime/state.d.ts.map +1 -0
  33. package/dist/{utils/run-data.js → internal/runtime/state.js} +11 -12
  34. package/dist/internal/runtime/state.js.map +1 -0
  35. package/dist/internal/runtime/summary.d.ts +8 -0
  36. package/dist/internal/runtime/summary.d.ts.map +1 -0
  37. package/dist/internal/runtime/summary.js +260 -0
  38. package/dist/internal/runtime/summary.js.map +1 -0
  39. package/dist/internal/runtime/tokens.d.ts.map +1 -0
  40. package/dist/internal/runtime/tokens.js.map +1 -0
  41. package/dist/mcp/server.js +9 -8
  42. package/dist/mcp/server.js.map +1 -1
  43. package/dist/schemas/aida-project.d.ts +27 -1
  44. package/dist/schemas/aida-project.d.ts.map +1 -1
  45. package/dist/schemas/rules.d.ts +15 -0
  46. package/dist/schemas/rules.d.ts.map +1 -0
  47. package/dist/schemas/rules.js +5 -0
  48. package/dist/schemas/rules.js.map +1 -0
  49. package/dist/services/project-build.d.ts +44 -0
  50. package/dist/services/project-build.d.ts.map +1 -0
  51. package/dist/services/project-build.js +32 -0
  52. package/dist/services/project-build.js.map +1 -0
  53. package/dist/services/project-health.d.ts +14 -0
  54. package/dist/services/project-health.d.ts.map +1 -0
  55. package/dist/services/project-health.js +19 -0
  56. package/dist/services/project-health.js.map +1 -0
  57. package/dist/services/security-audit.d.ts +59 -0
  58. package/dist/services/security-audit.d.ts.map +1 -0
  59. package/dist/services/security-audit.js +638 -0
  60. package/dist/services/security-audit.js.map +1 -0
  61. package/dist/utils/ai-build.d.ts +3 -8
  62. package/dist/utils/ai-build.d.ts.map +1 -1
  63. package/dist/utils/ai-build.js +31 -117
  64. package/dist/utils/ai-build.js.map +1 -1
  65. package/dist/utils/guide.d.ts +3 -3
  66. package/dist/utils/guide.d.ts.map +1 -1
  67. package/dist/utils/guide.js +91 -68
  68. package/dist/utils/guide.js.map +1 -1
  69. package/dist/utils/import.d.ts.map +1 -1
  70. package/dist/utils/import.js +4 -15
  71. package/dist/utils/import.js.map +1 -1
  72. package/dist/utils/memory.d.ts +2 -0
  73. package/dist/utils/memory.d.ts.map +1 -1
  74. package/dist/utils/memory.js +440 -95
  75. package/dist/utils/memory.js.map +1 -1
  76. package/dist/utils/paths.d.ts +2 -10
  77. package/dist/utils/paths.d.ts.map +1 -1
  78. package/dist/utils/paths.js +5 -17
  79. package/dist/utils/paths.js.map +1 -1
  80. package/dist/utils/project-health.d.ts +39 -0
  81. package/dist/utils/project-health.d.ts.map +1 -0
  82. package/dist/utils/project-health.js +286 -0
  83. package/dist/utils/project-health.js.map +1 -0
  84. package/dist/utils/registry.d.ts +11 -0
  85. package/dist/utils/registry.d.ts.map +1 -0
  86. package/dist/utils/registry.js +65 -0
  87. package/dist/utils/registry.js.map +1 -0
  88. package/dist/utils/rules.d.ts +11 -1
  89. package/dist/utils/rules.d.ts.map +1 -1
  90. package/dist/utils/rules.js +76 -8
  91. package/dist/utils/rules.js.map +1 -1
  92. package/dist/utils/skills.d.ts +6 -9
  93. package/dist/utils/skills.d.ts.map +1 -1
  94. package/dist/utils/skills.js +26 -54
  95. package/dist/utils/skills.js.map +1 -1
  96. package/package.json +12 -14
  97. package/dist/cli/commands/build.d.ts +0 -2
  98. package/dist/cli/commands/build.d.ts.map +0 -1
  99. package/dist/cli/commands/build.js +0 -56
  100. package/dist/cli/commands/build.js.map +0 -1
  101. package/dist/cli/commands/dashboard.d.ts +0 -2
  102. package/dist/cli/commands/dashboard.d.ts.map +0 -1
  103. package/dist/cli/commands/dashboard.js +0 -70
  104. package/dist/cli/commands/dashboard.js.map +0 -1
  105. package/dist/cli/commands/import.d.ts +0 -2
  106. package/dist/cli/commands/import.d.ts.map +0 -1
  107. package/dist/cli/commands/import.js +0 -71
  108. package/dist/cli/commands/import.js.map +0 -1
  109. package/dist/cli/commands/log.d.ts +0 -2
  110. package/dist/cli/commands/log.d.ts.map +0 -1
  111. package/dist/cli/commands/log.js +0 -440
  112. package/dist/cli/commands/log.js.map +0 -1
  113. package/dist/cli/commands/merge-data.d.ts +0 -20
  114. package/dist/cli/commands/merge-data.d.ts.map +0 -1
  115. package/dist/cli/commands/merge-data.js +0 -574
  116. package/dist/cli/commands/merge-data.js.map +0 -1
  117. package/dist/cli/commands/merge.d.ts +0 -2
  118. package/dist/cli/commands/merge.d.ts.map +0 -1
  119. package/dist/cli/commands/merge.js +0 -82
  120. package/dist/cli/commands/merge.js.map +0 -1
  121. package/dist/cli/commands/migrate-dir.d.ts +0 -6
  122. package/dist/cli/commands/migrate-dir.d.ts.map +0 -1
  123. package/dist/cli/commands/migrate-dir.js +0 -125
  124. package/dist/cli/commands/migrate-dir.js.map +0 -1
  125. package/dist/cli/commands/migrate-legacy.d.ts +0 -2
  126. package/dist/cli/commands/migrate-legacy.d.ts.map +0 -1
  127. package/dist/cli/commands/migrate-legacy.js +0 -143
  128. package/dist/cli/commands/migrate-legacy.js.map +0 -1
  129. package/dist/cli/commands/migrate.d.ts +0 -2
  130. package/dist/cli/commands/migrate.d.ts.map +0 -1
  131. package/dist/cli/commands/migrate.js +0 -300
  132. package/dist/cli/commands/migrate.js.map +0 -1
  133. package/dist/cli/commands/reindex.d.ts +0 -14
  134. package/dist/cli/commands/reindex.d.ts.map +0 -1
  135. package/dist/cli/commands/reindex.js +0 -139
  136. package/dist/cli/commands/reindex.js.map +0 -1
  137. package/dist/cli/commands/report.d.ts +0 -2
  138. package/dist/cli/commands/report.d.ts.map +0 -1
  139. package/dist/cli/commands/report.js +0 -219
  140. package/dist/cli/commands/report.js.map +0 -1
  141. package/dist/cli/commands/start.d.ts +0 -2
  142. package/dist/cli/commands/start.d.ts.map +0 -1
  143. package/dist/cli/commands/start.js +0 -155
  144. package/dist/cli/commands/start.js.map +0 -1
  145. package/dist/cli/commands/status.d.ts +0 -2
  146. package/dist/cli/commands/status.d.ts.map +0 -1
  147. package/dist/cli/commands/status.js +0 -70
  148. package/dist/cli/commands/status.js.map +0 -1
  149. package/dist/cli/commands/update.d.ts +0 -2
  150. package/dist/cli/commands/update.d.ts.map +0 -1
  151. package/dist/cli/commands/update.js +0 -73
  152. package/dist/cli/commands/update.js.map +0 -1
  153. package/dist/schemas/run-json.d.ts.map +0 -1
  154. package/dist/schemas/run-json.js.map +0 -1
  155. package/dist/server/api.d.ts +0 -30
  156. package/dist/server/api.d.ts.map +0 -1
  157. package/dist/server/api.js +0 -239
  158. package/dist/server/api.js.map +0 -1
  159. package/dist/server/index.d.ts +0 -2
  160. package/dist/server/index.d.ts.map +0 -1
  161. package/dist/server/index.js +0 -228
  162. package/dist/server/index.js.map +0 -1
  163. package/dist/utils/run-data.d.ts.map +0 -1
  164. package/dist/utils/run-data.js.map +0 -1
  165. package/dist/utils/tokens.d.ts.map +0 -1
  166. package/dist/utils/tokens.js.map +0 -1
  167. package/src/assets/skills/audit.md +0 -98
  168. package/src/assets/skills/bug-fixer.md +0 -43
  169. package/src/assets/skills/code-generator.md +0 -71
  170. package/src/assets/skills/commit-code.md +0 -67
  171. package/src/assets/skills/dashboard-generator.md +0 -65
  172. package/src/assets/skills/dev-flower.md +0 -85
  173. package/src/assets/skills/deviation-recorder.md +0 -83
  174. package/src/assets/skills/docx-to-markdown.md +0 -69
  175. package/src/assets/skills/mcp-reviewer.md +0 -38
  176. package/src/assets/skills/requirement-analyzer.md +0 -103
  177. package/src/assets/skills/rules-evolver.md +0 -47
  178. package/src/assets/skills/self-reviewer.md +0 -49
  179. package/src/assets/skills/task-splitter.md +0 -60
  180. package/src/assets/skills/workflow-orchestrator.md +0 -209
  181. package/src/assets/templates/demo-run.json +0 -910
  182. package/src/assets/templates/run.json +0 -63
  183. package/src/dashboard/assets/index-B8QcPcg7.css +0 -1
  184. package/src/dashboard/assets/index-DcAl6lhS.js +0 -111
  185. package/src/dashboard/demo/overview.json +0 -71
  186. package/src/dashboard/demo/run.en.json +0 -1169
  187. package/src/dashboard/demo/run.json +0 -2667
  188. package/src/dashboard/demo/run.zh.json +0 -1169
  189. package/src/dashboard/demo/runs.json +0 -19
  190. package/src/dashboard/index.html +0 -13
  191. /package/dist/{utils → internal/runtime}/tokens.d.ts +0 -0
  192. /package/dist/{utils → internal/runtime}/tokens.js +0 -0
@@ -0,0 +1,638 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { readdirSync, statSync } from 'node:fs';
3
+ import { resolve, relative } from 'node:path';
4
+ import { configPath } from '../utils/paths.js';
5
+ import { fileExists, readJson, readText } from '../utils/fs.js';
6
+ import { loadSkillRegistry } from '../utils/skills.js';
7
+ const DEFAULT_SKILL_SCAN_PATHS = [
8
+ '.aida/skills',
9
+ '.cursor/skills',
10
+ '.claude/skills',
11
+ '.codex/skills',
12
+ '.kiro/skills',
13
+ '.agent/skills',
14
+ '.agents/skills',
15
+ ];
16
+ export function defaultSkillScanPaths() {
17
+ return [...DEFAULT_SKILL_SCAN_PATHS];
18
+ }
19
+ const SCRIPT_FILE_PATTERN = /\.(?:sh|bash|zsh|py|js|cjs|mjs|ts)$/i;
20
+ const AUDITABLE_SKILL_FILE_PATTERN = /\.(?:md|txt|py|sh|bash|zsh|js|cjs|mjs|ts|json|yaml|yml|toml)$/i;
21
+ const NETWORK_PATTERNS = [
22
+ { pattern: /\bcurl\b/i, signal: 'curl' },
23
+ { pattern: /\bwget\b/i, signal: 'wget' },
24
+ { pattern: /\bfetch\s*\(/i, signal: 'fetch()' },
25
+ { pattern: /\baxios\./i, signal: 'axios' },
26
+ { pattern: /\brequests\.(get|post|put|delete|request)\b/i, signal: 'requests' },
27
+ { pattern: /\bhttpx\.(get|post|put|delete|request)\b/i, signal: 'httpx' },
28
+ { pattern: /\burllib\.request\b/i, signal: 'urllib.request' },
29
+ { pattern: /\bhttps?\.request\s*\(/i, signal: 'http(s).request()' },
30
+ { pattern: /\bXMLHttpRequest\b/i, signal: 'XMLHttpRequest' },
31
+ ];
32
+ const EXEC_PATTERNS = [
33
+ { pattern: /\bexec(File)?\s*\(/i, signal: 'exec()/execFile()' },
34
+ { pattern: /\bspawn\s*\(/i, signal: 'spawn()' },
35
+ { pattern: /\bsubprocess\.(run|Popen|call|check_output|check_call)\b/i, signal: 'subprocess' },
36
+ { pattern: /\bos\.system\s*\(/i, signal: 'os.system()' },
37
+ { pattern: /\bchild_process\b/i, signal: 'child_process' },
38
+ { pattern: /\bProcessBuilder\b/i, signal: 'ProcessBuilder' },
39
+ { pattern: /\bbash\b/i, signal: 'bash' },
40
+ { pattern: /\bsh\b/i, signal: 'sh' },
41
+ ];
42
+ const DOWNLOAD_PATTERNS = [
43
+ { pattern: /\bdownload(File|String)?\b/i, signal: 'download' },
44
+ { pattern: /\bgit\s+clone\b/i, signal: 'git clone' },
45
+ { pattern: /\bnpm\s+install\b/i, signal: 'npm install' },
46
+ { pattern: /\bpnpm\s+add\b/i, signal: 'pnpm add' },
47
+ { pattern: /\byarn\s+add\b/i, signal: 'yarn add' },
48
+ { pattern: /\bpip\s+install\b/i, signal: 'pip install' },
49
+ ];
50
+ const DIRECTORY_SKIP_NAMES = new Set([
51
+ '.git',
52
+ '.aida',
53
+ '.cursor',
54
+ '.claude',
55
+ '.codex',
56
+ '.agent',
57
+ '.agents',
58
+ '.kiro',
59
+ '.lingma',
60
+ '.vscode',
61
+ 'node_modules',
62
+ 'dist',
63
+ 'dist-test',
64
+ 'build',
65
+ 'coverage',
66
+ ]);
67
+ function defaultCommandRunner(command, args, cwd) {
68
+ const result = spawnSync(command, args, {
69
+ cwd,
70
+ encoding: 'utf-8',
71
+ stdio: 'pipe',
72
+ });
73
+ return {
74
+ stdout: result.stdout || '',
75
+ stderr: result.stderr || '',
76
+ status: result.status ?? 1,
77
+ error: result.error?.message,
78
+ };
79
+ }
80
+ function loadConfig(projectRoot) {
81
+ if (!fileExists(configPath(projectRoot)))
82
+ return {};
83
+ try {
84
+ return readJson(configPath(projectRoot));
85
+ }
86
+ catch {
87
+ return {};
88
+ }
89
+ }
90
+ function parseJsonLoose(raw) {
91
+ const trimmed = raw.trim();
92
+ if (!trimmed)
93
+ return null;
94
+ try {
95
+ return JSON.parse(trimmed);
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ function parseNdjson(raw) {
102
+ return raw
103
+ .split('\n')
104
+ .map((line) => line.trim())
105
+ .filter(Boolean)
106
+ .map((line) => parseJsonLoose(line))
107
+ .filter((line) => line !== null);
108
+ }
109
+ function normalizeSeverity(value) {
110
+ const normalized = (value || 'unknown').toLowerCase();
111
+ if (['critical', 'high', 'moderate', 'medium', 'low', 'info'].includes(normalized)) {
112
+ return normalized === 'medium' ? 'moderate' : normalized;
113
+ }
114
+ return 'unknown';
115
+ }
116
+ function severityFromCvssScore(score) {
117
+ if (!score || Number.isNaN(score))
118
+ return 'unknown';
119
+ if (score >= 9)
120
+ return 'critical';
121
+ if (score >= 7)
122
+ return 'high';
123
+ if (score >= 4)
124
+ return 'moderate';
125
+ if (score > 0)
126
+ return 'low';
127
+ return 'unknown';
128
+ }
129
+ function safeRelative(projectRoot, targetPath) {
130
+ const rel = relative(projectRoot, targetPath).replace(/\\/g, '/');
131
+ return rel || '.';
132
+ }
133
+ function discoverAuditTargets(projectRoot) {
134
+ const found = new Map();
135
+ const packageJsonDirs = new Set();
136
+ const lockfileHits = new Map();
137
+ const stack = [projectRoot];
138
+ while (stack.length > 0) {
139
+ const current = stack.pop();
140
+ for (const name of readdirSync(current)) {
141
+ if (DIRECTORY_SKIP_NAMES.has(name))
142
+ continue;
143
+ const fullPath = resolve(current, name);
144
+ const stat = statSync(fullPath);
145
+ if (stat.isDirectory()) {
146
+ stack.push(fullPath);
147
+ continue;
148
+ }
149
+ if (name === 'package.json') {
150
+ packageJsonDirs.add(current);
151
+ }
152
+ let packageManager = null;
153
+ if (name === 'package-lock.json' || name === 'npm-shrinkwrap.json')
154
+ packageManager = 'npm';
155
+ if (name === 'pnpm-lock.yaml')
156
+ packageManager = 'pnpm';
157
+ if (name === 'yarn.lock')
158
+ packageManager = 'yarn';
159
+ if (!packageManager)
160
+ continue;
161
+ const workspacePath = safeRelative(projectRoot, current);
162
+ const key = `${packageManager}:${workspacePath}`;
163
+ found.set(key, { packageManager, workspacePath, fullPath: current });
164
+ const existing = lockfileHits.get(workspacePath) || [];
165
+ existing.push(name);
166
+ lockfileHits.set(workspacePath, existing);
167
+ }
168
+ }
169
+ const warnings = [];
170
+ if (found.size === 0) {
171
+ if (packageJsonDirs.size > 0) {
172
+ warnings.push({
173
+ type: 'missing-lockfile',
174
+ message: 'No supported lockfile found. Add package-lock.json, pnpm-lock.yaml, or yarn.lock for higher-confidence dependency auditing.',
175
+ });
176
+ }
177
+ else {
178
+ warnings.push({
179
+ type: 'empty-project',
180
+ message: 'No package.json or supported lockfile found. Skipping package security audit.',
181
+ });
182
+ }
183
+ }
184
+ for (const [workspacePath, names] of lockfileHits) {
185
+ if (names.length > 1) {
186
+ warnings.push({
187
+ type: 'multiple-lockfiles',
188
+ workspacePath,
189
+ message: `Multiple lockfiles detected in ${workspacePath}: ${names.join(', ')}. Review each package manager result separately.`,
190
+ });
191
+ }
192
+ }
193
+ return {
194
+ targets: [...found.values()].sort((a, b) => a.workspacePath.localeCompare(b.workspacePath) || a.packageManager.localeCompare(b.packageManager)),
195
+ warnings,
196
+ };
197
+ }
198
+ function normalizeAuditPayload(raw) {
199
+ const parsed = parseJsonLoose(raw);
200
+ if (parsed)
201
+ return parsed;
202
+ const lines = parseNdjson(raw);
203
+ if (lines.length === 0)
204
+ return null;
205
+ const advisories = lines
206
+ .filter((entry) => entry?.type === 'auditAdvisory' && entry?.data?.advisory)
207
+ .map((entry) => entry.data.advisory);
208
+ if (advisories.length > 0) {
209
+ return { advisories };
210
+ }
211
+ return lines[lines.length - 1];
212
+ }
213
+ function parseNativeAuditFindings(payload, source, packageManager, workspacePath) {
214
+ const findings = [];
215
+ const seen = new Set();
216
+ const advisories = payload?.advisories && typeof payload.advisories === 'object'
217
+ ? Object.values(payload.advisories)
218
+ : [];
219
+ for (const advisory of advisories) {
220
+ const pkg = advisory?.module_name || advisory?.name || 'unknown-package';
221
+ const id = String(advisory?.id || advisory?.url || `${pkg}:advisory`);
222
+ const key = `${workspacePath}:${pkg}:${id}`;
223
+ if (seen.has(key))
224
+ continue;
225
+ seen.add(key);
226
+ findings.push({
227
+ source,
228
+ packageManager,
229
+ packageName: pkg,
230
+ severity: normalizeSeverity(advisory?.severity),
231
+ title: advisory?.title || advisory?.overview || 'Known vulnerability',
232
+ id,
233
+ dependencyPath: Array.isArray(advisory?.findings) ? advisory.findings[0]?.paths?.[0] : undefined,
234
+ fixAvailable: Boolean(advisory?.recommendation || advisory?.fix_available),
235
+ direct: false,
236
+ workspacePath,
237
+ });
238
+ }
239
+ const vulnerabilities = payload?.vulnerabilities && typeof payload.vulnerabilities === 'object'
240
+ ? Object.entries(payload.vulnerabilities)
241
+ : [];
242
+ for (const [pkg, vulnerability] of vulnerabilities) {
243
+ const viaObjects = Array.isArray(vulnerability?.via)
244
+ ? vulnerability.via.filter((item) => item && typeof item === 'object')
245
+ : [];
246
+ if (viaObjects.length === 0) {
247
+ const id = String(vulnerability?.name || `${pkg}:vulnerability`);
248
+ const key = `${workspacePath}:${pkg}:${id}`;
249
+ if (seen.has(key))
250
+ continue;
251
+ seen.add(key);
252
+ findings.push({
253
+ source,
254
+ packageManager,
255
+ packageName: pkg,
256
+ severity: normalizeSeverity(vulnerability?.severity),
257
+ title: vulnerability?.title || `Known vulnerability in ${pkg}`,
258
+ id,
259
+ dependencyPath: vulnerability?.nodes?.[0],
260
+ fixAvailable: Boolean(vulnerability?.fixAvailable),
261
+ direct: Boolean(vulnerability?.isDirect),
262
+ workspacePath,
263
+ });
264
+ continue;
265
+ }
266
+ for (const item of viaObjects) {
267
+ const id = String(item?.source || item?.name || `${pkg}:via`);
268
+ const key = `${workspacePath}:${pkg}:${id}`;
269
+ if (seen.has(key))
270
+ continue;
271
+ seen.add(key);
272
+ findings.push({
273
+ source,
274
+ packageManager,
275
+ packageName: pkg,
276
+ severity: normalizeSeverity(item?.severity || vulnerability?.severity),
277
+ title: item?.title || item?.name || `Known vulnerability in ${pkg}`,
278
+ id,
279
+ dependencyPath: vulnerability?.nodes?.[0],
280
+ fixAvailable: Boolean(vulnerability?.fixAvailable),
281
+ direct: Boolean(vulnerability?.isDirect),
282
+ workspacePath,
283
+ });
284
+ }
285
+ }
286
+ return findings;
287
+ }
288
+ function parseOsvFindings(payload, projectRoot) {
289
+ const findings = [];
290
+ const seen = new Set();
291
+ for (const result of Array.isArray(payload?.results) ? payload.results : []) {
292
+ const workspacePath = result?.source?.path
293
+ ? safeRelative(projectRoot, resolve(projectRoot, result.source.path))
294
+ : '.';
295
+ for (const pkgEntry of Array.isArray(result?.packages) ? result.packages : []) {
296
+ const pkg = pkgEntry?.package?.name || 'unknown-package';
297
+ for (const vuln of Array.isArray(pkgEntry?.vulnerabilities) ? pkgEntry.vulnerabilities : []) {
298
+ const id = String(vuln?.id || `${pkg}:osv`);
299
+ const key = `${workspacePath}:${pkg}:${id}`;
300
+ if (seen.has(key))
301
+ continue;
302
+ seen.add(key);
303
+ const score = Array.isArray(vuln?.severity)
304
+ ? Number.parseFloat(String(vuln.severity[0]?.score || ''))
305
+ : Number.NaN;
306
+ findings.push({
307
+ source: 'osv',
308
+ packageManager: 'osv',
309
+ packageName: pkg,
310
+ severity: severityFromCvssScore(score),
311
+ title: vuln?.summary || vuln?.details || `Known vulnerability in ${pkg}`,
312
+ id,
313
+ dependencyPath: result?.source?.path ? safeRelative(projectRoot, resolve(result.source.path)) : undefined,
314
+ fixAvailable: Array.isArray(vuln?.affected)
315
+ ? vuln.affected.some((affected) => Array.isArray(affected?.ranges) && affected.ranges.length > 0)
316
+ : false,
317
+ direct: false,
318
+ workspacePath,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ return findings;
324
+ }
325
+ function dedupePackageFindings(findings) {
326
+ const seen = new Set();
327
+ return findings.filter((finding) => {
328
+ const key = [
329
+ finding.source,
330
+ finding.workspacePath,
331
+ finding.packageName,
332
+ finding.id,
333
+ ].join(':');
334
+ if (seen.has(key))
335
+ return false;
336
+ seen.add(key);
337
+ return true;
338
+ });
339
+ }
340
+ export function auditPackageSecurity(projectRoot, runner = defaultCommandRunner) {
341
+ const { targets, warnings } = discoverAuditTargets(projectRoot);
342
+ const findings = [];
343
+ for (const target of targets) {
344
+ const commandSets = [];
345
+ if (target.packageManager === 'npm') {
346
+ commandSets.push({ source: 'npm-audit', packageManager: 'npm', command: 'npm', args: ['audit', '--json'] });
347
+ }
348
+ else if (target.packageManager === 'pnpm') {
349
+ commandSets.push({ source: 'pnpm-audit', packageManager: 'pnpm', command: 'pnpm', args: ['audit', '--json'] });
350
+ }
351
+ else if (target.packageManager === 'yarn') {
352
+ commandSets.push({ source: 'yarn-audit', packageManager: 'yarn', command: 'yarn', args: ['npm', 'audit', '--all', '--recursive', '--json'] });
353
+ commandSets.push({ source: 'yarn-audit', packageManager: 'yarn', command: 'yarn', args: ['audit', '--json'] });
354
+ }
355
+ let handled = false;
356
+ for (const commandSet of commandSets) {
357
+ const result = runner(commandSet.command, commandSet.args, target.fullPath);
358
+ if (result.error && /ENOENT/i.test(result.error)) {
359
+ warnings.push({
360
+ type: 'command-missing',
361
+ workspacePath: target.workspacePath,
362
+ message: `Could not run ${commandSet.command} for ${target.workspacePath}. Install the package manager locally to enable native audit output.`,
363
+ });
364
+ handled = true;
365
+ break;
366
+ }
367
+ const payload = normalizeAuditPayload(result.stdout || result.stderr);
368
+ if (!payload) {
369
+ if (commandSet.packageManager === 'yarn' && commandSet.args[0] === 'npm') {
370
+ continue;
371
+ }
372
+ warnings.push({
373
+ type: 'command-failed',
374
+ workspacePath: target.workspacePath,
375
+ message: `${commandSet.command} ${commandSet.args.join(' ')} did not return parseable audit output for ${target.workspacePath}.`,
376
+ });
377
+ handled = true;
378
+ break;
379
+ }
380
+ findings.push(...parseNativeAuditFindings(payload, commandSet.source, commandSet.packageManager, target.workspacePath));
381
+ handled = true;
382
+ break;
383
+ }
384
+ if (!handled) {
385
+ warnings.push({
386
+ type: 'command-failed',
387
+ workspacePath: target.workspacePath,
388
+ message: `No usable native audit command succeeded for ${target.workspacePath}.`,
389
+ });
390
+ }
391
+ }
392
+ let osvScanned = false;
393
+ const osvVersion = runner('osv-scanner', ['--version'], projectRoot);
394
+ if (!osvVersion.error || osvVersion.status === 0 || osvVersion.stdout.trim() || osvVersion.stderr.trim()) {
395
+ const osvResult = runner('osv-scanner', ['scan', '--format', 'json', '-r', projectRoot], projectRoot);
396
+ const payload = normalizeAuditPayload(osvResult.stdout);
397
+ if (payload) {
398
+ findings.push(...parseOsvFindings(payload, projectRoot));
399
+ osvScanned = true;
400
+ }
401
+ else {
402
+ warnings.push({
403
+ type: 'command-failed',
404
+ message: 'osv-scanner was detected but did not return parseable JSON output.',
405
+ });
406
+ }
407
+ }
408
+ else {
409
+ warnings.push({
410
+ type: 'osv-unavailable',
411
+ message: 'OSV enhanced scanning is not enabled because osv-scanner is not installed locally.',
412
+ });
413
+ }
414
+ return {
415
+ findings: dedupePackageFindings(findings),
416
+ warnings,
417
+ scannedTargets: targets.map((target) => ({
418
+ packageManager: target.packageManager,
419
+ workspacePath: target.workspacePath,
420
+ })),
421
+ osvScanned,
422
+ };
423
+ }
424
+ function firstMatchingSample(content, pattern) {
425
+ for (const line of content.split('\n')) {
426
+ if (pattern.test(line))
427
+ return line.trim().slice(0, 200);
428
+ }
429
+ return undefined;
430
+ }
431
+ function analyzeSkillFile(filePath, content, issueTypeForMarkdown = 'tool-instruction') {
432
+ const issues = [];
433
+ if (SCRIPT_FILE_PATTERN.test(filePath)) {
434
+ issues.push({
435
+ type: 'script-file',
436
+ filePath,
437
+ signal: 'script file detected',
438
+ });
439
+ }
440
+ for (const candidate of NETWORK_PATTERNS) {
441
+ if (candidate.pattern.test(content)) {
442
+ issues.push({
443
+ type: filePath.endsWith('SKILL.md') || filePath.toLowerCase().endsWith('.md') ? issueTypeForMarkdown : 'network-request',
444
+ filePath,
445
+ signal: candidate.signal,
446
+ sample: firstMatchingSample(content, candidate.pattern),
447
+ });
448
+ }
449
+ }
450
+ for (const candidate of EXEC_PATTERNS) {
451
+ if (candidate.pattern.test(content)) {
452
+ issues.push({
453
+ type: filePath.endsWith('SKILL.md') || filePath.toLowerCase().endsWith('.md') ? issueTypeForMarkdown : 'command-exec',
454
+ filePath,
455
+ signal: candidate.signal,
456
+ sample: firstMatchingSample(content, candidate.pattern),
457
+ });
458
+ }
459
+ }
460
+ for (const candidate of DOWNLOAD_PATTERNS) {
461
+ if (candidate.pattern.test(content)) {
462
+ issues.push({
463
+ type: filePath.endsWith('SKILL.md') || filePath.toLowerCase().endsWith('.md') ? issueTypeForMarkdown : 'download-remote',
464
+ filePath,
465
+ signal: candidate.signal,
466
+ sample: firstMatchingSample(content, candidate.pattern),
467
+ });
468
+ }
469
+ }
470
+ const deduped = new Map();
471
+ for (const issue of issues) {
472
+ deduped.set(`${issue.type}:${issue.filePath}:${issue.signal}`, issue);
473
+ }
474
+ return [...deduped.values()];
475
+ }
476
+ function collectSkillDirectoryFiles(rootDir) {
477
+ const files = [];
478
+ const stack = [rootDir];
479
+ while (stack.length > 0) {
480
+ const current = stack.pop();
481
+ for (const name of readdirSync(current)) {
482
+ const fullPath = resolve(current, name);
483
+ const stat = statSync(fullPath);
484
+ if (stat.isDirectory()) {
485
+ stack.push(fullPath);
486
+ continue;
487
+ }
488
+ const relPath = relative(rootDir, fullPath).replace(/\\/g, '/');
489
+ if (!AUDITABLE_SKILL_FILE_PATTERN.test(relPath) && relPath !== 'SKILL.md')
490
+ continue;
491
+ files.push({
492
+ path: relPath,
493
+ content: readText(fullPath),
494
+ });
495
+ }
496
+ }
497
+ return files;
498
+ }
499
+ function discoverSkillPackages(skillRoot) {
500
+ if (!fileExists(skillRoot))
501
+ return [];
502
+ const packages = [];
503
+ const seen = new Set();
504
+ const stack = [skillRoot];
505
+ while (stack.length > 0) {
506
+ const current = stack.pop();
507
+ const entries = readdirSync(current);
508
+ if (entries.includes('SKILL.md')) {
509
+ const sourcePath = resolve(current, 'SKILL.md');
510
+ if (!seen.has(sourcePath)) {
511
+ seen.add(sourcePath);
512
+ packages.push({
513
+ name: relative(skillRoot, current).replace(/\\/g, '/') || current.split('/').pop() || 'unnamed-skill',
514
+ sourcePath,
515
+ content: readText(sourcePath),
516
+ files: collectSkillDirectoryFiles(current).filter((file) => file.path !== 'SKILL.md'),
517
+ });
518
+ }
519
+ continue;
520
+ }
521
+ for (const name of entries) {
522
+ const fullPath = resolve(current, name);
523
+ const stat = statSync(fullPath);
524
+ if (stat.isDirectory()) {
525
+ stack.push(fullPath);
526
+ continue;
527
+ }
528
+ if (!AUDITABLE_SKILL_FILE_PATTERN.test(name))
529
+ continue;
530
+ if (seen.has(fullPath))
531
+ continue;
532
+ seen.add(fullPath);
533
+ packages.push({
534
+ name: name.replace(/\.md$/, ''),
535
+ sourcePath: fullPath,
536
+ content: readText(fullPath),
537
+ files: [],
538
+ });
539
+ }
540
+ }
541
+ return packages;
542
+ }
543
+ function sameStringArray(a, b) {
544
+ return a.length === b.length && a.every((item, index) => item === b[index]);
545
+ }
546
+ function configuredSkillScanPaths(projectRoot) {
547
+ const config = loadConfig(projectRoot);
548
+ const explicit = config.security?.skillScanPaths;
549
+ if (Array.isArray(explicit)) {
550
+ const normalized = [...new Set(explicit.map((item) => String(item).trim()).filter(Boolean))];
551
+ return {
552
+ paths: normalized,
553
+ mode: sameStringArray(normalized, DEFAULT_SKILL_SCAN_PATHS) ? 'default' : 'custom',
554
+ };
555
+ }
556
+ return {
557
+ paths: DEFAULT_SKILL_SCAN_PATHS,
558
+ mode: 'default',
559
+ };
560
+ }
561
+ export function auditSkillSecurity(projectRoot) {
562
+ const { paths: configuredPaths, mode } = configuredSkillScanPaths(projectRoot);
563
+ const warnings = [];
564
+ if (configuredPaths.length === 0) {
565
+ warnings.push({
566
+ type: 'empty-scan-paths',
567
+ message: 'Skill scan paths are empty. Configure .aida/config.json > security.skillScanPaths before running skill security audit.',
568
+ });
569
+ return {
570
+ configuredPaths,
571
+ scannedPaths: [],
572
+ warnings,
573
+ findings: [],
574
+ scannedSkills: 0,
575
+ };
576
+ }
577
+ const findings = [];
578
+ const scannedSkillKeys = new Set();
579
+ const registryEntries = loadSkillRegistry(projectRoot);
580
+ const registrySourcePaths = new Set(registryEntries
581
+ .map((entry) => entry.source.path)
582
+ .filter((path) => Boolean(path))
583
+ .map((path) => path.replace(/\\/g, '/')));
584
+ for (const entry of registryEntries) {
585
+ scannedSkillKeys.add(`registry:${entry.source.path || entry.name}`);
586
+ const issues = [
587
+ ...analyzeSkillFile(entry.source.path || `${entry.name}/SKILL.md`, entry.content),
588
+ ...(entry.files || []).flatMap((file) => analyzeSkillFile(file.path, file.content)),
589
+ ];
590
+ if (issues.length > 0) {
591
+ findings.push({
592
+ skillName: entry.name,
593
+ sourcePath: entry.source.path || `.aida/skills.json#${entry.id}`,
594
+ issues,
595
+ });
596
+ }
597
+ }
598
+ const scannedPaths = [];
599
+ for (const skillPath of configuredPaths) {
600
+ const fullPath = resolve(projectRoot, skillPath);
601
+ if (!fileExists(fullPath)) {
602
+ if (mode === 'custom') {
603
+ warnings.push({
604
+ type: 'missing-path',
605
+ path: skillPath,
606
+ message: `Configured skill scan path does not exist: ${skillPath}`,
607
+ });
608
+ }
609
+ continue;
610
+ }
611
+ scannedPaths.push(skillPath);
612
+ for (const discovered of discoverSkillPackages(fullPath)) {
613
+ const relSourcePath = safeRelative(projectRoot, discovered.sourcePath);
614
+ if (registrySourcePaths.has(relSourcePath))
615
+ continue;
616
+ scannedSkillKeys.add(`path:${relSourcePath}`);
617
+ const issues = [
618
+ ...analyzeSkillFile(relSourcePath, discovered.content),
619
+ ...discovered.files.flatMap((file) => analyzeSkillFile(`${relSourcePath.replace(/SKILL\.md$/u, '')}${file.path}`, file.content)),
620
+ ];
621
+ if (issues.length === 0)
622
+ continue;
623
+ findings.push({
624
+ skillName: discovered.name,
625
+ sourcePath: relSourcePath,
626
+ issues,
627
+ });
628
+ }
629
+ }
630
+ return {
631
+ configuredPaths,
632
+ scannedPaths,
633
+ warnings,
634
+ findings,
635
+ scannedSkills: scannedSkillKeys.size,
636
+ };
637
+ }
638
+ //# sourceMappingURL=security-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-audit.js","sourceRoot":"","sources":["../../src/services/security-audit.ts"],"names":[],"mappings":"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"}