depguard-cli 1.1.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 (47) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +213 -0
  3. package/dist/advisor.d.ts +13 -0
  4. package/dist/advisor.d.ts.map +1 -0
  5. package/dist/advisor.js +68 -0
  6. package/dist/advisor.js.map +1 -0
  7. package/dist/audit.d.ts +7 -0
  8. package/dist/audit.d.ts.map +1 -0
  9. package/dist/audit.js +86 -0
  10. package/dist/audit.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +148 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +8 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/license.d.ts +11 -0
  20. package/dist/license.d.ts.map +1 -0
  21. package/dist/license.js +133 -0
  22. package/dist/license.js.map +1 -0
  23. package/dist/mcp.d.ts +11 -0
  24. package/dist/mcp.d.ts.map +1 -0
  25. package/dist/mcp.js +179 -0
  26. package/dist/mcp.js.map +1 -0
  27. package/dist/registry.d.ts +12 -0
  28. package/dist/registry.d.ts.map +1 -0
  29. package/dist/registry.js +109 -0
  30. package/dist/registry.js.map +1 -0
  31. package/dist/scorer.d.ts +11 -0
  32. package/dist/scorer.d.ts.map +1 -0
  33. package/dist/scorer.js +92 -0
  34. package/dist/scorer.js.map +1 -0
  35. package/dist/search.d.ts +7 -0
  36. package/dist/search.d.ts.map +1 -0
  37. package/dist/search.js +22 -0
  38. package/dist/search.js.map +1 -0
  39. package/dist/tokens.d.ts +34 -0
  40. package/dist/tokens.d.ts.map +1 -0
  41. package/dist/tokens.js +105 -0
  42. package/dist/tokens.js.map +1 -0
  43. package/dist/types.d.ts +168 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +57 -0
@@ -0,0 +1,109 @@
1
+ const REGISTRY_URL = 'https://registry.npmjs.org';
2
+ const DOWNLOADS_URL = 'https://api.npmjs.org/downloads/point/last-week';
3
+ const SEARCH_URL = 'https://registry.npmjs.org/-/v1/search';
4
+ const ADVISORIES_URL = 'https://registry.npmjs.org/-/npm/v1/security/advisories/bulk';
5
+ const DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes
6
+ const cache = new Map();
7
+ function getCached(key) {
8
+ const entry = cache.get(key);
9
+ if (!entry)
10
+ return null;
11
+ if (Date.now() > entry.expiresAt) {
12
+ cache.delete(key);
13
+ return null;
14
+ }
15
+ return entry.data;
16
+ }
17
+ function setCache(key, data, ttl = DEFAULT_TTL) {
18
+ cache.set(key, { data, expiresAt: Date.now() + ttl });
19
+ }
20
+ /** Clear the in-memory cache */
21
+ export function clearCache() {
22
+ cache.clear();
23
+ }
24
+ /** Fetch package metadata from npm registry */
25
+ export async function fetchPackage(name, fetcher = globalThis.fetch) {
26
+ const key = `pkg:${name}`;
27
+ const cached = getCached(key);
28
+ if (cached)
29
+ return cached;
30
+ try {
31
+ const res = await fetcher(`${REGISTRY_URL}/${encodeURIComponent(name)}`, {
32
+ headers: { 'Accept': 'application/json' },
33
+ });
34
+ if (!res.ok)
35
+ return null;
36
+ const data = (await res.json());
37
+ setCache(key, data);
38
+ return data;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /** Fetch weekly download count */
45
+ export async function fetchDownloads(name, fetcher = globalThis.fetch) {
46
+ const key = `dl:${name}`;
47
+ const cached = getCached(key);
48
+ if (cached !== null)
49
+ return cached;
50
+ try {
51
+ const res = await fetcher(`${DOWNLOADS_URL}/${encodeURIComponent(name)}`, {
52
+ headers: { 'Accept': 'application/json' },
53
+ });
54
+ if (!res.ok)
55
+ return 0;
56
+ const data = (await res.json());
57
+ setCache(key, data.downloads);
58
+ return data.downloads;
59
+ }
60
+ catch {
61
+ return 0;
62
+ }
63
+ }
64
+ /** Search npm registry */
65
+ export async function searchPackages(keywords, limit = 10, fetcher = globalThis.fetch) {
66
+ const key = `search:${keywords}:${limit}`;
67
+ const cached = getCached(key);
68
+ if (cached)
69
+ return cached;
70
+ const empty = { objects: [], total: 0 };
71
+ try {
72
+ const params = new URLSearchParams({ text: keywords, size: String(limit) });
73
+ const res = await fetcher(`${SEARCH_URL}?${params}`, {
74
+ headers: { 'Accept': 'application/json' },
75
+ });
76
+ if (!res.ok)
77
+ return empty;
78
+ const data = (await res.json());
79
+ setCache(key, data);
80
+ return data;
81
+ }
82
+ catch {
83
+ return empty;
84
+ }
85
+ }
86
+ /** Fetch security advisories for a package via the bulk endpoint */
87
+ export async function fetchAdvisories(name, version, fetcher = globalThis.fetch) {
88
+ const key = `adv:${name}@${version}`;
89
+ const cached = getCached(key);
90
+ if (cached)
91
+ return cached;
92
+ try {
93
+ const res = await fetcher(ADVISORIES_URL, {
94
+ method: 'POST',
95
+ headers: { 'Content-Type': 'application/json' },
96
+ body: JSON.stringify({ [name]: [version] }),
97
+ });
98
+ if (!res.ok)
99
+ return [];
100
+ const data = (await res.json());
101
+ const advisories = data[name] ?? [];
102
+ setCache(key, advisories);
103
+ return advisories;
104
+ }
105
+ catch {
106
+ return [];
107
+ }
108
+ }
109
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { FetchFn, ScoreResult, ScoreWeights } from './types.js';
2
+ /**
3
+ * Score a package from 0-100 based on security, maintenance, popularity,
4
+ * license compatibility, and dependency health.
5
+ */
6
+ export declare function score(name: string, options?: {
7
+ targetLicense?: string;
8
+ weights?: Partial<ScoreWeights>;
9
+ fetcher?: FetchFn;
10
+ }): Promise<ScoreResult>;
11
+ //# sourceMappingURL=scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWjF;;;GAGG;AACH,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;CACb,GACL,OAAO,CAAC,WAAW,CAAC,CAmCtB"}
package/dist/scorer.js ADDED
@@ -0,0 +1,92 @@
1
+ import { audit } from './audit.js';
2
+ const DEFAULT_WEIGHTS = {
3
+ security: 30,
4
+ maintenance: 25,
5
+ popularity: 20,
6
+ license: 15,
7
+ dependencies: 10,
8
+ };
9
+ /**
10
+ * Score a package from 0-100 based on security, maintenance, popularity,
11
+ * license compatibility, and dependency health.
12
+ */
13
+ export async function score(name, options = {}) {
14
+ const { targetLicense = 'MIT', weights: customWeights, fetcher = globalThis.fetch, } = options;
15
+ const weights = { ...DEFAULT_WEIGHTS, ...customWeights };
16
+ const report = await audit(name, targetLicense, fetcher);
17
+ const breakdown = {
18
+ security: computeSecurityScore(report),
19
+ maintenance: computeMaintenanceScore(report),
20
+ popularity: computePopularityScore(report),
21
+ license: computeLicenseScore(report),
22
+ dependencies: computeDependencyScore(report),
23
+ };
24
+ const totalWeight = weights.security + weights.maintenance + weights.popularity +
25
+ weights.license + weights.dependencies;
26
+ const total = Math.round((breakdown.security * weights.security +
27
+ breakdown.maintenance * weights.maintenance +
28
+ breakdown.popularity * weights.popularity +
29
+ breakdown.license * weights.license +
30
+ breakdown.dependencies * weights.dependencies) / totalWeight);
31
+ return {
32
+ name,
33
+ total,
34
+ breakdown,
35
+ warnings: report.warnings,
36
+ };
37
+ }
38
+ /** Security: 100 = no vulns, deduct for each severity level */
39
+ function computeSecurityScore(report) {
40
+ const v = report.vulnerabilities;
41
+ let s = 100;
42
+ s -= v.critical * 40;
43
+ s -= v.high * 20;
44
+ s -= v.moderate * 10;
45
+ s -= v.low * 5;
46
+ return Math.max(0, s);
47
+ }
48
+ /** Maintenance: based on recency of last publish and version count */
49
+ function computeMaintenanceScore(report) {
50
+ if (!report.lastPublish)
51
+ return 0;
52
+ const daysSincePublish = Math.floor((Date.now() - new Date(report.lastPublish).getTime()) / (1000 * 60 * 60 * 24));
53
+ // Recency score: 100 if published today, 0 if >2 years ago
54
+ let recency = 100 - Math.min(100, Math.floor(daysSincePublish / 7.3));
55
+ // Bonus for having multiple versions (active development)
56
+ if (report.versionCount >= 10)
57
+ recency = Math.min(100, recency + 10);
58
+ if (report.versionCount >= 50)
59
+ recency = Math.min(100, recency + 10);
60
+ // Penalty for deprecation
61
+ if (report.deprecated)
62
+ recency = Math.floor(recency * 0.3);
63
+ return Math.max(0, recency);
64
+ }
65
+ /** Popularity: logarithmic scale based on weekly downloads */
66
+ function computePopularityScore(report) {
67
+ if (report.weeklyDownloads <= 0)
68
+ return 0;
69
+ // log10 scale: 100 downloads = ~20, 10k = ~40, 1M = ~60, 100M = ~80, 1B = ~100
70
+ const logDownloads = Math.log10(report.weeklyDownloads);
71
+ return Math.min(100, Math.round(logDownloads * 10));
72
+ }
73
+ /** License: 100 if compatible, 0 if not */
74
+ function computeLicenseScore(report) {
75
+ return report.licenseCompatibility.compatible ? 100 : 0;
76
+ }
77
+ /** Dependencies: fewer deps = better, install scripts are a big red flag */
78
+ function computeDependencyScore(report) {
79
+ let s = 100;
80
+ // Deduct for dependency count
81
+ if (report.dependencyCount > 5)
82
+ s -= 10;
83
+ if (report.dependencyCount > 15)
84
+ s -= 15;
85
+ if (report.dependencyCount > 30)
86
+ s -= 25;
87
+ // Major penalty for install scripts
88
+ if (report.hasInstallScripts)
89
+ s -= 30;
90
+ return Math.max(0, s);
91
+ }
92
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SearchEntry, SearchOptions } from './types.js';
2
+ /**
3
+ * Search npm for packages matching keywords, sorted by quality score.
4
+ * Results can be filtered by minimum score and license compatibility.
5
+ */
6
+ export declare function search(keywords: string, options?: SearchOptions): Promise<SearchEntry[]>;
7
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG5D;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAsBxB"}
package/dist/search.js ADDED
@@ -0,0 +1,22 @@
1
+ import { searchPackages } from './registry.js';
2
+ /**
3
+ * Search npm for packages matching keywords, sorted by quality score.
4
+ * Results can be filtered by minimum score and license compatibility.
5
+ */
6
+ export async function search(keywords, options = {}) {
7
+ const { limit = 10, minScore = 0, fetcher = globalThis.fetch, } = options;
8
+ const result = await searchPackages(keywords, Math.min(limit * 2, 50), fetcher);
9
+ const entries = result.objects.map(obj => ({
10
+ name: obj.package.name,
11
+ version: obj.package.version,
12
+ description: obj.package.description ?? '',
13
+ score: Math.round(obj.score.final * 100),
14
+ keywords: obj.package.keywords ?? [],
15
+ date: obj.package.date,
16
+ }));
17
+ return entries
18
+ .filter(e => e.score >= minScore)
19
+ .sort((a, b) => b.score - a.score)
20
+ .slice(0, limit);
21
+ }
22
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAgB,EAChB,UAAyB,EAAE;IAE3B,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,CAAC,EACZ,OAAO,GAAG,UAAU,CAAC,KAAK,GAC3B,GAAG,OAAO,CAAA;IAEX,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IAE/E,MAAM,OAAO,GAAkB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;QAC5B,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;QACxC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE;QACpC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;KACvB,CAAC,CAAC,CAAA;IAEH,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AACpB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Token savings estimator for depguard MCP tools.
3
+ *
4
+ * Estimates how many tokens an LLM agent would spend doing the equivalent
5
+ * research manually (WebSearch, WebFetch, reasoning) vs the compact JSON
6
+ * that depguard returns.
7
+ *
8
+ * Estimates are conservative and based on typical Claude Code tool-call patterns.
9
+ */
10
+ export interface TokenSavings {
11
+ /** Tokens in the depguard response */
12
+ responseTokens: number;
13
+ /** Estimated tokens for the equivalent manual approach */
14
+ manualEstimate: number;
15
+ /** Tokens saved (manualEstimate - responseTokens) */
16
+ saved: number;
17
+ /** Percentage saved */
18
+ percentSaved: number;
19
+ /** Breakdown of what the manual approach would involve */
20
+ manualSteps: string[];
21
+ }
22
+ /**
23
+ * Rough token count: ~1 token per 4 characters for JSON/English text.
24
+ */
25
+ export declare function estimateTokens(text: string): number;
26
+ /**
27
+ * Calculate token savings for a depguard tool call.
28
+ *
29
+ * @param tool - The tool name (e.g. "depguard_audit")
30
+ * @param responseJson - The JSON string of the response
31
+ * @param argCount - Number of items processed (for should_use: candidate count)
32
+ */
33
+ export declare function calculateSavings(tool: string, responseJson: string, argCount?: number): TokenSavings;
34
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAA;IACtB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAA;IACtB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,uBAAuB;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,SAAI,GACX,YAAY,CAed"}
package/dist/tokens.js ADDED
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Token savings estimator for depguard MCP tools.
3
+ *
4
+ * Estimates how many tokens an LLM agent would spend doing the equivalent
5
+ * research manually (WebSearch, WebFetch, reasoning) vs the compact JSON
6
+ * that depguard returns.
7
+ *
8
+ * Estimates are conservative and based on typical Claude Code tool-call patterns.
9
+ */
10
+ /**
11
+ * Rough token count: ~1 token per 4 characters for JSON/English text.
12
+ */
13
+ export function estimateTokens(text) {
14
+ return Math.ceil(text.length / 4);
15
+ }
16
+ /** Average tokens per manual step, based on observed Claude Code patterns */
17
+ const MANUAL_COST = {
18
+ webSearch: 800, // search query + parsing results page
19
+ webFetch: 3000, // fetching and reading a full web page (README, npm page)
20
+ webFetchLarge: 5000, // fetching a large page (GitHub issues, changelogs)
21
+ reasoning: 500, // agent reasoning/comparison between steps
22
+ };
23
+ /**
24
+ * Estimate the manual cost for each depguard tool.
25
+ */
26
+ function manualProfileFor(tool, argCount) {
27
+ switch (tool) {
28
+ case 'depguard_audit':
29
+ return {
30
+ steps: [
31
+ `WebSearch: "npm {package} vulnerabilities security" (~${MANUAL_COST.webSearch} tokens)`,
32
+ `WebFetch: npm registry page for package metadata (~${MANUAL_COST.webFetch} tokens)`,
33
+ `WebFetch: GitHub advisories page (~${MANUAL_COST.webFetch} tokens)`,
34
+ `WebSearch: "{package} npm license" (~${MANUAL_COST.webSearch} tokens)`,
35
+ `WebFetch: package.json or npm page for dependency list (~${MANUAL_COST.webFetch} tokens)`,
36
+ `Reasoning: analyze and summarize findings (~${MANUAL_COST.reasoning} tokens)`,
37
+ ],
38
+ tokens: MANUAL_COST.webSearch * 2 + MANUAL_COST.webFetch * 3 + MANUAL_COST.reasoning,
39
+ };
40
+ case 'depguard_score':
41
+ // Score requires an internal audit + scoring computation
42
+ return {
43
+ steps: [
44
+ `WebSearch: "{package} npm quality maintenance" (~${MANUAL_COST.webSearch} tokens)`,
45
+ `WebFetch: npm registry page (~${MANUAL_COST.webFetch} tokens)`,
46
+ `WebFetch: GitHub repo for activity/stars (~${MANUAL_COST.webFetch} tokens)`,
47
+ `WebSearch: "{package} vulnerabilities" (~${MANUAL_COST.webSearch} tokens)`,
48
+ `WebFetch: advisories page (~${MANUAL_COST.webFetch} tokens)`,
49
+ `Reasoning: compute weighted score across dimensions (~${MANUAL_COST.reasoning} tokens)`,
50
+ ],
51
+ tokens: MANUAL_COST.webSearch * 2 + MANUAL_COST.webFetch * 3 + MANUAL_COST.reasoning,
52
+ };
53
+ case 'depguard_search':
54
+ return {
55
+ steps: [
56
+ `WebSearch: "best npm packages for {keywords}" (~${MANUAL_COST.webSearch} tokens)`,
57
+ `WebFetch: blog post or comparison article (~${MANUAL_COST.webFetchLarge} tokens)`,
58
+ `WebSearch: "npm {keywords} most downloaded" (~${MANUAL_COST.webSearch} tokens)`,
59
+ `Reasoning: filter and rank results (~${MANUAL_COST.reasoning} tokens)`,
60
+ ],
61
+ tokens: MANUAL_COST.webSearch * 2 + MANUAL_COST.webFetchLarge + MANUAL_COST.reasoning,
62
+ };
63
+ case 'depguard_should_use': {
64
+ // shouldUse = search + score N packages + reasoning
65
+ const candidateCount = argCount || 5;
66
+ const perCandidate = MANUAL_COST.webSearch + MANUAL_COST.webFetch * 2 + MANUAL_COST.reasoning;
67
+ return {
68
+ steps: [
69
+ `WebSearch: "best npm packages for {intent}" (~${MANUAL_COST.webSearch} tokens)`,
70
+ `WebFetch: comparison article (~${MANUAL_COST.webFetchLarge} tokens)`,
71
+ `${candidateCount}x audit per candidate: WebSearch + 2x WebFetch + reasoning each (~${perCandidate * candidateCount} tokens)`,
72
+ `Reasoning: compare all candidates and decide install vs write-from-scratch (~${MANUAL_COST.reasoning * 2} tokens)`,
73
+ ],
74
+ tokens: MANUAL_COST.webSearch + MANUAL_COST.webFetchLarge +
75
+ perCandidate * candidateCount +
76
+ MANUAL_COST.reasoning * 2,
77
+ };
78
+ }
79
+ default:
80
+ return { steps: ['Unknown tool'], tokens: MANUAL_COST.webSearch };
81
+ }
82
+ }
83
+ /**
84
+ * Calculate token savings for a depguard tool call.
85
+ *
86
+ * @param tool - The tool name (e.g. "depguard_audit")
87
+ * @param responseJson - The JSON string of the response
88
+ * @param argCount - Number of items processed (for should_use: candidate count)
89
+ */
90
+ export function calculateSavings(tool, responseJson, argCount = 5) {
91
+ const responseTokens = estimateTokens(responseJson);
92
+ const profile = manualProfileFor(tool, argCount);
93
+ const saved = Math.max(0, profile.tokens - responseTokens);
94
+ const percentSaved = profile.tokens > 0
95
+ ? Math.round((saved / profile.tokens) * 100)
96
+ : 0;
97
+ return {
98
+ responseTokens,
99
+ manualEstimate: profile.tokens,
100
+ saved,
101
+ percentSaved,
102
+ manualSteps: profile.steps,
103
+ };
104
+ }
105
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ /** Fetch function signature, injectable for testing */
2
+ export type FetchFn = typeof globalThis.fetch;
3
+ /** npm registry package metadata (abbreviated) */
4
+ export interface NpmPackageData {
5
+ name: string;
6
+ description: string;
7
+ 'dist-tags': Record<string, string>;
8
+ time: Record<string, string>;
9
+ license?: string;
10
+ versions: Record<string, NpmVersionData>;
11
+ keywords?: string[];
12
+ homepage?: string;
13
+ repository?: {
14
+ type: string;
15
+ url: string;
16
+ };
17
+ maintainers?: Array<{
18
+ name: string;
19
+ email?: string;
20
+ }>;
21
+ }
22
+ export interface NpmVersionData {
23
+ name: string;
24
+ version: string;
25
+ license?: string;
26
+ dependencies?: Record<string, string>;
27
+ devDependencies?: Record<string, string>;
28
+ scripts?: Record<string, string>;
29
+ deprecated?: string;
30
+ }
31
+ /** npm registry search result */
32
+ export interface NpmSearchResult {
33
+ objects: Array<{
34
+ package: {
35
+ name: string;
36
+ version: string;
37
+ description: string;
38
+ keywords?: string[];
39
+ date: string;
40
+ links: {
41
+ npm?: string;
42
+ homepage?: string;
43
+ repository?: string;
44
+ };
45
+ publisher: {
46
+ username: string;
47
+ };
48
+ };
49
+ score: {
50
+ final: number;
51
+ detail: {
52
+ quality: number;
53
+ popularity: number;
54
+ maintenance: number;
55
+ };
56
+ };
57
+ }>;
58
+ total: number;
59
+ }
60
+ /** npm audit advisory */
61
+ export interface NpmAdvisory {
62
+ id: number;
63
+ title: string;
64
+ severity: 'info' | 'low' | 'moderate' | 'high' | 'critical';
65
+ url: string;
66
+ vulnerable_versions: string;
67
+ patched_versions: string | null;
68
+ }
69
+ /** npm downloads response */
70
+ export interface NpmDownloadsResponse {
71
+ downloads: number;
72
+ package: string;
73
+ start: string;
74
+ end: string;
75
+ }
76
+ /** Audit report for a package */
77
+ export interface AuditReport {
78
+ name: string;
79
+ version: string;
80
+ license: string | null;
81
+ description: string;
82
+ lastPublish: string | null;
83
+ weeklyDownloads: number;
84
+ versionCount: number;
85
+ dependencyCount: number;
86
+ hasInstallScripts: boolean;
87
+ deprecated: boolean;
88
+ vulnerabilities: VulnerabilitySummary;
89
+ licenseCompatibility: LicenseCompatibility;
90
+ warnings: string[];
91
+ }
92
+ export interface VulnerabilitySummary {
93
+ total: number;
94
+ critical: number;
95
+ high: number;
96
+ moderate: number;
97
+ low: number;
98
+ advisories: NpmAdvisory[];
99
+ }
100
+ export interface LicenseCompatibility {
101
+ compatible: boolean;
102
+ license: string | null;
103
+ targetLicense: string;
104
+ reason: string;
105
+ }
106
+ /** Score breakdown */
107
+ export interface ScoreResult {
108
+ name: string;
109
+ total: number;
110
+ breakdown: {
111
+ security: number;
112
+ maintenance: number;
113
+ popularity: number;
114
+ license: number;
115
+ dependencies: number;
116
+ };
117
+ warnings: string[];
118
+ }
119
+ /** Weight configuration for scoring */
120
+ export interface ScoreWeights {
121
+ security: number;
122
+ maintenance: number;
123
+ popularity: number;
124
+ license: number;
125
+ dependencies: number;
126
+ }
127
+ /** Search result entry */
128
+ export interface SearchEntry {
129
+ name: string;
130
+ version: string;
131
+ description: string;
132
+ score: number;
133
+ keywords: string[];
134
+ date: string;
135
+ }
136
+ /** Search options */
137
+ export interface SearchOptions {
138
+ limit?: number;
139
+ targetLicense?: string;
140
+ minScore?: number;
141
+ fetcher?: FetchFn;
142
+ }
143
+ /** Advisor recommendation */
144
+ export interface Recommendation {
145
+ intent: string;
146
+ action: 'install' | 'caution' | 'write-from-scratch';
147
+ package: string | null;
148
+ score: number | null;
149
+ alternatives: Array<{
150
+ name: string;
151
+ score: number;
152
+ }>;
153
+ reasoning: string;
154
+ warnings: string[];
155
+ }
156
+ /** Advisor options */
157
+ export interface AdvisorOptions {
158
+ threshold?: number;
159
+ targetLicense?: string;
160
+ limit?: number;
161
+ fetcher?: FetchFn;
162
+ }
163
+ /** Cache entry with TTL */
164
+ export interface CacheEntry<T> {
165
+ data: T;
166
+ expiresAt: number;
167
+ }
168
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}