@openweave/weave-skills 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/config-loader.d.ts +52 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +123 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/skill-registry.d.ts +96 -0
- package/dist/skill-registry.d.ts.map +1 -0
- package/dist/skill-registry.js +218 -0
- package/dist/skill-registry.js.map +1 -0
- package/dist/skills/auto-fix.d.ts +35 -0
- package/dist/skills/auto-fix.d.ts.map +1 -0
- package/dist/skills/auto-fix.js +121 -0
- package/dist/skills/auto-fix.js.map +1 -0
- package/dist/skills/cli-interactive.d.ts +60 -0
- package/dist/skills/cli-interactive.d.ts.map +1 -0
- package/dist/skills/cli-interactive.js +264 -0
- package/dist/skills/cli-interactive.js.map +1 -0
- package/dist/skills/code-review.d.ts +39 -0
- package/dist/skills/code-review.d.ts.map +1 -0
- package/dist/skills/code-review.js +204 -0
- package/dist/skills/code-review.js.map +1 -0
- package/dist/skills/commit-composer.d.ts +51 -0
- package/dist/skills/commit-composer.d.ts.map +1 -0
- package/dist/skills/commit-composer.js +223 -0
- package/dist/skills/commit-composer.js.map +1 -0
- package/dist/skills/container-advisor.d.ts +43 -0
- package/dist/skills/container-advisor.d.ts.map +1 -0
- package/dist/skills/container-advisor.js +274 -0
- package/dist/skills/container-advisor.js.map +1 -0
- package/dist/skills/context-memory.d.ts +44 -0
- package/dist/skills/context-memory.d.ts.map +1 -0
- package/dist/skills/context-memory.js +160 -0
- package/dist/skills/context-memory.js.map +1 -0
- package/dist/skills/dep-audit.d.ts +55 -0
- package/dist/skills/dep-audit.d.ts.map +1 -0
- package/dist/skills/dep-audit.js +248 -0
- package/dist/skills/dep-audit.js.map +1 -0
- package/dist/skills/deploy-provision.d.ts +47 -0
- package/dist/skills/deploy-provision.d.ts.map +1 -0
- package/dist/skills/deploy-provision.js +270 -0
- package/dist/skills/deploy-provision.js.map +1 -0
- package/dist/skills/docs-gen.d.ts +36 -0
- package/dist/skills/docs-gen.d.ts.map +1 -0
- package/dist/skills/docs-gen.js +187 -0
- package/dist/skills/docs-gen.js.map +1 -0
- package/dist/skills/index.d.ts +19 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +55 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/multi-repo.d.ts +50 -0
- package/dist/skills/multi-repo.d.ts.map +1 -0
- package/dist/skills/multi-repo.js +175 -0
- package/dist/skills/multi-repo.js.map +1 -0
- package/dist/skills/onboarding.d.ts +48 -0
- package/dist/skills/onboarding.d.ts.map +1 -0
- package/dist/skills/onboarding.js +245 -0
- package/dist/skills/onboarding.js.map +1 -0
- package/dist/skills/perf-profile.d.ts +36 -0
- package/dist/skills/perf-profile.d.ts.map +1 -0
- package/dist/skills/perf-profile.js +179 -0
- package/dist/skills/perf-profile.js.map +1 -0
- package/dist/skills/pipeline-aware.d.ts +33 -0
- package/dist/skills/pipeline-aware.d.ts.map +1 -0
- package/dist/skills/pipeline-aware.js +226 -0
- package/dist/skills/pipeline-aware.js.map +1 -0
- package/dist/skills/refactor.d.ts +33 -0
- package/dist/skills/refactor.d.ts.map +1 -0
- package/dist/skills/refactor.js +210 -0
- package/dist/skills/refactor.js.map +1 -0
- package/dist/skills/test-gen.d.ts +36 -0
- package/dist/skills/test-gen.d.ts.map +1 -0
- package/dist/skills/test-gen.js +154 -0
- package/dist/skills/test-gen.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: context-memory
|
|
3
|
+
*
|
|
4
|
+
* Persists architectural decisions, team agreements and agent reasoning sessions
|
|
5
|
+
* into the WeaveGraph knowledge graph for long-term cross-session memory.
|
|
6
|
+
*
|
|
7
|
+
* Actions:
|
|
8
|
+
* - save โ persist a new memory entry as a graph node
|
|
9
|
+
* - load โ retrieve entries by id or tag
|
|
10
|
+
* - list โ list all persisted memory entries (optionally filtered by type/tag)
|
|
11
|
+
*
|
|
12
|
+
* Input (via SkillContext.graph):
|
|
13
|
+
* - `ctx.graph['action']` โ 'save' | 'load' | 'list' (default: 'list')
|
|
14
|
+
* - `ctx.graph['entry']` โ MemoryEntry (required for 'save')
|
|
15
|
+
* - `ctx.graph['query']` โ string keyword for 'load'
|
|
16
|
+
* - `ctx.graph['store']` โ Record<string,MemoryEntry> injectable in-memory store for tests
|
|
17
|
+
*
|
|
18
|
+
* Output data:
|
|
19
|
+
* - ContextMemoryResult
|
|
20
|
+
*/
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// In-process store (used when no WeaveGraph is available)
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Module-level fallback store โ shared across calls in a single process.
|
|
25
|
+
const _fallbackStore = new Map();
|
|
26
|
+
export function generateId(entry) {
|
|
27
|
+
const slug = entry.title
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
30
|
+
.slice(0, 40);
|
|
31
|
+
const ts = entry.createdAt.replace(/\D/g, '').slice(0, 12);
|
|
32
|
+
return `mem-${entry.type}-${slug}-${ts}`;
|
|
33
|
+
}
|
|
34
|
+
export function matchesQuery(entry, query) {
|
|
35
|
+
const q = query.toLowerCase();
|
|
36
|
+
return (entry.title.toLowerCase().includes(q) ||
|
|
37
|
+
entry.content.toLowerCase().includes(q) ||
|
|
38
|
+
entry.tags.some((t) => t.toLowerCase().includes(q)) ||
|
|
39
|
+
entry.type.toLowerCase().includes(q));
|
|
40
|
+
}
|
|
41
|
+
export function saveEntry(store, raw, sessionId) {
|
|
42
|
+
const now = new Date().toISOString();
|
|
43
|
+
const entry = {
|
|
44
|
+
id: raw.id ?? '',
|
|
45
|
+
type: raw.type ?? 'note',
|
|
46
|
+
title: raw.title ?? 'Untitled',
|
|
47
|
+
content: raw.content ?? '',
|
|
48
|
+
tags: Array.isArray(raw.tags) ? raw.tags : [],
|
|
49
|
+
createdAt: raw.createdAt ?? now,
|
|
50
|
+
sessionId: raw.sessionId ?? sessionId,
|
|
51
|
+
};
|
|
52
|
+
if (!entry.id) {
|
|
53
|
+
entry.id = generateId(entry);
|
|
54
|
+
}
|
|
55
|
+
store.set(entry.id, entry);
|
|
56
|
+
return entry;
|
|
57
|
+
}
|
|
58
|
+
export function listEntries(store, query, type) {
|
|
59
|
+
let entries = Array.from(store.values());
|
|
60
|
+
if (type)
|
|
61
|
+
entries = entries.filter((e) => e.type === type);
|
|
62
|
+
if (query)
|
|
63
|
+
entries = entries.filter((e) => matchesQuery(e, query));
|
|
64
|
+
return entries.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
65
|
+
}
|
|
66
|
+
function getGraphStore(graph) {
|
|
67
|
+
if (graph && typeof graph === 'object' && 'save' in graph) {
|
|
68
|
+
return graph;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Skill
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
export const contextMemorySkill = {
|
|
76
|
+
id: 'context-memory',
|
|
77
|
+
name: 'Context Memory Persister',
|
|
78
|
+
description: 'Saves architectural decisions, team agreements and session reasoning to WeaveGraph for long-term memory across sessions.',
|
|
79
|
+
version: '1.0.0',
|
|
80
|
+
enabled: true,
|
|
81
|
+
tags: ['memory', 'dx', 'graph', 'persistence'],
|
|
82
|
+
async execute(ctx) {
|
|
83
|
+
const opts = (ctx.graph ?? {});
|
|
84
|
+
const action = opts['action'] ?? 'list';
|
|
85
|
+
// Determine the store to use (injectable in tests via ctx.graph['store'])
|
|
86
|
+
const injectedStore = opts['store'];
|
|
87
|
+
let store;
|
|
88
|
+
if (injectedStore && injectedStore instanceof Map) {
|
|
89
|
+
store = injectedStore;
|
|
90
|
+
}
|
|
91
|
+
else if (injectedStore && typeof injectedStore === 'object') {
|
|
92
|
+
// Support plain object store (easier in tests)
|
|
93
|
+
store = new Map(Object.entries(injectedStore));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
store = _fallbackStore;
|
|
97
|
+
}
|
|
98
|
+
const sessionId = ctx.session?.id;
|
|
99
|
+
// -----------------------------------------------------------------------
|
|
100
|
+
if (action === 'save') {
|
|
101
|
+
const raw = opts['entry'];
|
|
102
|
+
if (!raw || !raw.content) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
output: 'save action requires ctx.graph["entry"] with at least a content field',
|
|
106
|
+
error: 'missing entry',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const saved = saveEntry(store, raw, sessionId);
|
|
110
|
+
// If a WeaveGraph-like object is available, also persist there
|
|
111
|
+
const graphStore = getGraphStore(opts['graphHandle']);
|
|
112
|
+
if (graphStore?.save) {
|
|
113
|
+
await graphStore.save(saved);
|
|
114
|
+
}
|
|
115
|
+
const result = {
|
|
116
|
+
action: 'save',
|
|
117
|
+
saved,
|
|
118
|
+
entries: [saved],
|
|
119
|
+
total: store.size,
|
|
120
|
+
};
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
output: `Memory entry saved: "${saved.title}" (${saved.id})`,
|
|
124
|
+
data: result,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// -----------------------------------------------------------------------
|
|
128
|
+
if (action === 'load') {
|
|
129
|
+
const query = opts['query'] ?? '';
|
|
130
|
+
const type = opts['type'];
|
|
131
|
+
const entries = listEntries(store, query || undefined, type);
|
|
132
|
+
const result = {
|
|
133
|
+
action: 'load',
|
|
134
|
+
entries,
|
|
135
|
+
total: entries.length,
|
|
136
|
+
query,
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
success: true,
|
|
140
|
+
output: `Found ${entries.length} memory entr${entries.length === 1 ? 'y' : 'ies'}${query ? ` matching "${query}"` : ''}`,
|
|
141
|
+
data: result,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// -----------------------------------------------------------------------
|
|
145
|
+
// action === 'list'
|
|
146
|
+
const type = opts['type'];
|
|
147
|
+
const entries = listEntries(store, undefined, type);
|
|
148
|
+
const result = {
|
|
149
|
+
action: 'list',
|
|
150
|
+
entries,
|
|
151
|
+
total: entries.length,
|
|
152
|
+
};
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
output: `${entries.length} memory entr${entries.length === 1 ? 'y' : 'ies'} in store`,
|
|
156
|
+
data: result,
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=context-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-memory.js","sourceRoot":"","sources":["../../src/skills/context-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: dep-audit
|
|
3
|
+
*
|
|
4
|
+
* Scans every package.json in the workspace, parses semver ranges, and:
|
|
5
|
+
* 1. Detects dependencies pinned to old major versions vs. latest in registry
|
|
6
|
+
* 2. Optionally runs `npm audit --json` to surface CVE advisories
|
|
7
|
+
*
|
|
8
|
+
* Input options (ctx.graph):
|
|
9
|
+
* - `packages` {Record<string, string>[]} โ inject package.json deps for tests
|
|
10
|
+
* - `auditJson` {string} โ inject raw `npm audit --json` output
|
|
11
|
+
* - `skipAudit` {boolean} โ skip npm audit subprocess (default: false)
|
|
12
|
+
* - `workspace` {string} โ root dir scan override
|
|
13
|
+
*
|
|
14
|
+
* Note: version comparison is intentionally lightweight (major-only) โ no semver lib.
|
|
15
|
+
*/
|
|
16
|
+
import type { SkillModule } from '../types.js';
|
|
17
|
+
export interface PackageRef {
|
|
18
|
+
pkg: string;
|
|
19
|
+
source: string;
|
|
20
|
+
current: string;
|
|
21
|
+
kind: 'dep' | 'devDep' | 'peer';
|
|
22
|
+
}
|
|
23
|
+
export type VulnSeverity = 'critical' | 'high' | 'moderate' | 'low' | 'info';
|
|
24
|
+
export interface VulnAdvisory {
|
|
25
|
+
pkg: string;
|
|
26
|
+
severity: VulnSeverity;
|
|
27
|
+
title: string;
|
|
28
|
+
url: string;
|
|
29
|
+
fixAvailable: boolean;
|
|
30
|
+
fixVersion?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface OutdatedEntry {
|
|
33
|
+
pkg: string;
|
|
34
|
+
source: string;
|
|
35
|
+
current: string;
|
|
36
|
+
latestMajor: number;
|
|
37
|
+
suggestion: string;
|
|
38
|
+
}
|
|
39
|
+
export interface DepAuditResult {
|
|
40
|
+
scannedFiles: string[];
|
|
41
|
+
totalDeps: number;
|
|
42
|
+
advisories: VulnAdvisory[];
|
|
43
|
+
outdated: OutdatedEntry[];
|
|
44
|
+
criticalCount: number;
|
|
45
|
+
highCount: number;
|
|
46
|
+
}
|
|
47
|
+
/** Extract the major version number from a semver range string */
|
|
48
|
+
export declare function parseMajor(range: string): number;
|
|
49
|
+
/** Find all package.json files under a directory (non-recursive for perf) */
|
|
50
|
+
export declare function findPackageJsons(root: string): string[];
|
|
51
|
+
export declare function collectDeps(pkgJsonPath: string): PackageRef[];
|
|
52
|
+
/** Parse npm audit --json output into VulnAdvisory[] */
|
|
53
|
+
export declare function parseNpmAudit(json: string): VulnAdvisory[];
|
|
54
|
+
export declare const depAuditSkill: SkillModule;
|
|
55
|
+
//# sourceMappingURL=dep-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-audit.d.ts","sourceRoot":"","sources":["../../src/skills/dep-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvD;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAiB7D;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAiD1D;AAMD,eAAO,MAAM,aAAa,EAAE,WA0H3B,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: dep-audit
|
|
3
|
+
*
|
|
4
|
+
* Scans every package.json in the workspace, parses semver ranges, and:
|
|
5
|
+
* 1. Detects dependencies pinned to old major versions vs. latest in registry
|
|
6
|
+
* 2. Optionally runs `npm audit --json` to surface CVE advisories
|
|
7
|
+
*
|
|
8
|
+
* Input options (ctx.graph):
|
|
9
|
+
* - `packages` {Record<string, string>[]} โ inject package.json deps for tests
|
|
10
|
+
* - `auditJson` {string} โ inject raw `npm audit --json` output
|
|
11
|
+
* - `skipAudit` {boolean} โ skip npm audit subprocess (default: false)
|
|
12
|
+
* - `workspace` {string} โ root dir scan override
|
|
13
|
+
*
|
|
14
|
+
* Note: version comparison is intentionally lightweight (major-only) โ no semver lib.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { execSync } from 'node:child_process';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** Extract the major version number from a semver range string */
|
|
23
|
+
export function parseMajor(range) {
|
|
24
|
+
const cleaned = range.replace(/^[\^~>=<\s]+/, '').trim();
|
|
25
|
+
const m = /^(\d+)/.exec(cleaned);
|
|
26
|
+
return m ? parseInt(m[1], 10) : -1;
|
|
27
|
+
}
|
|
28
|
+
/** Find all package.json files under a directory (non-recursive for perf) */
|
|
29
|
+
export function findPackageJsons(root) {
|
|
30
|
+
const found = [];
|
|
31
|
+
const candidates = [
|
|
32
|
+
join(root, 'package.json'),
|
|
33
|
+
];
|
|
34
|
+
// Check common monorepo layouts
|
|
35
|
+
for (const subdir of ['packages', 'apps', 'libs', 'services']) {
|
|
36
|
+
const base = join(root, subdir);
|
|
37
|
+
if (!existsSync(base))
|
|
38
|
+
continue;
|
|
39
|
+
try {
|
|
40
|
+
for (const entry of readdirSync(base, { withFileTypes: true })) {
|
|
41
|
+
if (entry.isDirectory()) {
|
|
42
|
+
const candidate = join(base, entry.name, 'package.json');
|
|
43
|
+
if (existsSync(candidate))
|
|
44
|
+
candidates.push(candidate);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* ignore */ }
|
|
49
|
+
}
|
|
50
|
+
for (const c of candidates) {
|
|
51
|
+
if (existsSync(c))
|
|
52
|
+
found.push(c);
|
|
53
|
+
}
|
|
54
|
+
return found;
|
|
55
|
+
}
|
|
56
|
+
export function collectDeps(pkgJsonPath) {
|
|
57
|
+
try {
|
|
58
|
+
const raw = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
59
|
+
const refs = [];
|
|
60
|
+
const add = (deps, kind) => {
|
|
61
|
+
if (!deps || typeof deps !== 'object')
|
|
62
|
+
return;
|
|
63
|
+
for (const [pkg, ver] of Object.entries(deps)) {
|
|
64
|
+
refs.push({ pkg, source: pkgJsonPath, current: String(ver), kind });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
add(raw['dependencies'], 'dep');
|
|
68
|
+
add(raw['devDependencies'], 'devDep');
|
|
69
|
+
add(raw['peerDependencies'], 'peer');
|
|
70
|
+
return refs;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Parse npm audit --json output into VulnAdvisory[] */
|
|
77
|
+
export function parseNpmAudit(json) {
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(json);
|
|
80
|
+
const advisories = [];
|
|
81
|
+
// npm audit v7+ format: `vulnerabilities` map
|
|
82
|
+
const vulns = parsed['vulnerabilities'];
|
|
83
|
+
if (vulns) {
|
|
84
|
+
for (const [pkg, raw] of Object.entries(vulns)) {
|
|
85
|
+
const v = raw;
|
|
86
|
+
const via = Array.isArray(v['via']) ? v['via'] : [];
|
|
87
|
+
for (const entry of via) {
|
|
88
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
89
|
+
const e = entry;
|
|
90
|
+
advisories.push({
|
|
91
|
+
pkg,
|
|
92
|
+
severity: String(e['severity'] ?? 'low'),
|
|
93
|
+
title: String(e['title'] ?? `Vulnerability in ${pkg}`),
|
|
94
|
+
url: String(e['url'] ?? ''),
|
|
95
|
+
fixAvailable: Boolean(v['fixAvailable']),
|
|
96
|
+
fixVersion: v['fixAvailable'] && typeof v['fixAvailable'] === 'object'
|
|
97
|
+
? String(v['fixAvailable']['version'] ?? '')
|
|
98
|
+
: undefined,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// npm audit v6 format: `advisories` map
|
|
105
|
+
const legacyAdvisories = parsed['advisories'];
|
|
106
|
+
if (legacyAdvisories && advisories.length === 0) {
|
|
107
|
+
for (const [, raw] of Object.entries(legacyAdvisories)) {
|
|
108
|
+
const a = raw;
|
|
109
|
+
advisories.push({
|
|
110
|
+
pkg: String(a['module_name'] ?? 'unknown'),
|
|
111
|
+
severity: String(a['severity'] ?? 'low'),
|
|
112
|
+
title: String(a['title'] ?? ''),
|
|
113
|
+
url: String(a['url'] ?? ''),
|
|
114
|
+
fixAvailable: Boolean(a['patched_versions']?.length),
|
|
115
|
+
fixVersion: String(a['patched_versions'] ?? ''),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return advisories;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Skill
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
export const depAuditSkill = {
|
|
129
|
+
id: 'dep-audit',
|
|
130
|
+
name: 'Dependency Auditor',
|
|
131
|
+
description: 'Scans workspace package.json files for outdated versions and runs npm audit to surface CVE advisories',
|
|
132
|
+
version: '1.0.0',
|
|
133
|
+
enabled: false,
|
|
134
|
+
tags: ['devops', 'security'],
|
|
135
|
+
async execute(ctx) {
|
|
136
|
+
const opts = ctx.graph ?? {};
|
|
137
|
+
const skipAudit = Boolean(opts['skipAudit'] ?? false);
|
|
138
|
+
const workspaceRoot = typeof opts['workspace'] === 'string' ? opts['workspace'] : ctx.projectRoot;
|
|
139
|
+
// Collect all package refs
|
|
140
|
+
let allRefs = [];
|
|
141
|
+
let scannedFiles = [];
|
|
142
|
+
if (Array.isArray(opts['packages'])) {
|
|
143
|
+
// Injected for testing: array of {source, dep, devDep}
|
|
144
|
+
for (const p of opts['packages']) {
|
|
145
|
+
const src = String(p['source'] ?? 'injected');
|
|
146
|
+
scannedFiles.push(src);
|
|
147
|
+
const add = (deps, kind) => {
|
|
148
|
+
if (!deps || typeof deps !== 'object')
|
|
149
|
+
return;
|
|
150
|
+
for (const [pkg, ver] of Object.entries(deps)) {
|
|
151
|
+
allRefs.push({ pkg, source: src, current: String(ver), kind });
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
add(p['dependencies'], 'dep');
|
|
155
|
+
add(p['devDependencies'], 'devDep');
|
|
156
|
+
add(p['peerDependencies'], 'peer');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
scannedFiles = findPackageJsons(workspaceRoot);
|
|
161
|
+
for (const f of scannedFiles) {
|
|
162
|
+
allRefs = allRefs.concat(collectDeps(f));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Detect obviously outdated (major โฅ 2 years behind heuristic via major number)
|
|
166
|
+
// In a real implementation we'd call the registry. Here we flag anything with
|
|
167
|
+
// a pinned exact old major vs. a ^ or ~ range as a "check this" suggestion.
|
|
168
|
+
const outdated = [];
|
|
169
|
+
const seenPinned = new Set();
|
|
170
|
+
for (const ref of allRefs) {
|
|
171
|
+
// Exact version pins without ^ or ~ are worth flagging as worth reviewing
|
|
172
|
+
if (/^\d+\.\d+\.\d+$/.test(ref.current.trim()) && !seenPinned.has(ref.pkg)) {
|
|
173
|
+
seenPinned.add(ref.pkg);
|
|
174
|
+
outdated.push({
|
|
175
|
+
pkg: ref.pkg,
|
|
176
|
+
source: ref.source,
|
|
177
|
+
current: ref.current,
|
|
178
|
+
latestMajor: parseMajor(ref.current),
|
|
179
|
+
suggestion: `Pinned to exact version ${ref.current} โ consider using ^${ref.current} to receive patches`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// CVE audit
|
|
184
|
+
let advisories = [];
|
|
185
|
+
if (typeof opts['auditJson'] === 'string') {
|
|
186
|
+
advisories = parseNpmAudit(opts['auditJson']);
|
|
187
|
+
}
|
|
188
|
+
else if (!skipAudit) {
|
|
189
|
+
try {
|
|
190
|
+
const auditOut = execSync('npm audit --json', {
|
|
191
|
+
cwd: workspaceRoot,
|
|
192
|
+
stdio: 'pipe',
|
|
193
|
+
encoding: 'utf-8',
|
|
194
|
+
});
|
|
195
|
+
advisories = parseNpmAudit(auditOut);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
// npm audit exits with non-zero when vulns found โ stdout still has JSON
|
|
199
|
+
const output = err.stdout ?? '';
|
|
200
|
+
if (output)
|
|
201
|
+
advisories = parseNpmAudit(output);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const criticalCount = advisories.filter((a) => a.severity === 'critical').length;
|
|
205
|
+
const highCount = advisories.filter((a) => a.severity === 'high').length;
|
|
206
|
+
const lines = [
|
|
207
|
+
`๐ Dep Audit โ ${scannedFiles.length} package.json file(s) ยท ${allRefs.length} total deps`,
|
|
208
|
+
` CVE advisories: ${advisories.length} (${criticalCount} critical, ${highCount} high)`,
|
|
209
|
+
` Pinned versions to review: ${outdated.length}`,
|
|
210
|
+
'',
|
|
211
|
+
];
|
|
212
|
+
if (advisories.length > 0) {
|
|
213
|
+
lines.push(' ๐ ADVISORIES:');
|
|
214
|
+
for (const a of advisories.slice(0, 10)) {
|
|
215
|
+
const icon = a.severity === 'critical' ? 'โ' : a.severity === 'high' ? 'โ ๏ธ ' : 'โน๏ธ ';
|
|
216
|
+
lines.push(` ${icon} [${a.severity}] ${a.pkg} โ ${a.title}`);
|
|
217
|
+
if (a.fixAvailable)
|
|
218
|
+
lines.push(` Fix: upgrade to ${a.fixVersion ?? 'latest'}`);
|
|
219
|
+
if (a.url)
|
|
220
|
+
lines.push(` ${a.url}`);
|
|
221
|
+
}
|
|
222
|
+
if (advisories.length > 10)
|
|
223
|
+
lines.push(` โฆ and ${advisories.length - 10} more`);
|
|
224
|
+
lines.push('');
|
|
225
|
+
}
|
|
226
|
+
if (outdated.length > 0) {
|
|
227
|
+
lines.push(' ๐ฆ PINNED VERSIONS:');
|
|
228
|
+
for (const o of outdated.slice(0, 8)) {
|
|
229
|
+
lines.push(` โ ๏ธ ${o.pkg}@${o.current} (${o.source})`);
|
|
230
|
+
lines.push(` ${o.suggestion}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const result = {
|
|
234
|
+
scannedFiles,
|
|
235
|
+
totalDeps: allRefs.length,
|
|
236
|
+
advisories,
|
|
237
|
+
outdated,
|
|
238
|
+
criticalCount,
|
|
239
|
+
highCount,
|
|
240
|
+
};
|
|
241
|
+
return {
|
|
242
|
+
success: criticalCount === 0,
|
|
243
|
+
output: lines.join('\n'),
|
|
244
|
+
data: result,
|
|
245
|
+
};
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=dep-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-audit.js","sourceRoot":"","sources":["../../src/skills/dep-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: deploy-provision
|
|
3
|
+
*
|
|
4
|
+
* Interactive production provisioning guide. Validates prerequisites
|
|
5
|
+
* (DNS resolution, open ports, Docker availability, required env vars)
|
|
6
|
+
* and optionally invokes `scripts/deploy/setup.sh` step by step.
|
|
7
|
+
*
|
|
8
|
+
* Integrates with M23 โ the deploy scripts live in `scripts/deploy/`.
|
|
9
|
+
*
|
|
10
|
+
* Modes (ctx.graph['mode']):
|
|
11
|
+
* - 'validate' โ check prerequisites only (default, safe)
|
|
12
|
+
* - 'provision' โ run setup.sh steps (requires confirmRun: true)
|
|
13
|
+
*
|
|
14
|
+
* Input options (ctx.graph):
|
|
15
|
+
* - `domain` {string} โ FQDN to check DNS for
|
|
16
|
+
* - `apiKey` {string} โ WEAVE_API_KEY value to validate
|
|
17
|
+
* - `ports` {number[]} โ ports to check (default: [80, 443, 3001])
|
|
18
|
+
* - `dryRun` {boolean} โ simulate without executing shell commands
|
|
19
|
+
* - `confirmRun` {boolean} โ must be true to allow mode='provision'
|
|
20
|
+
* - `env` {Record<string,string>} โ inject env for testing
|
|
21
|
+
*/
|
|
22
|
+
import type { SkillModule } from '../types.js';
|
|
23
|
+
export type PrereqStatus = 'ok' | 'fail' | 'warn' | 'skip';
|
|
24
|
+
export interface PrereqCheck {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
status: PrereqStatus;
|
|
28
|
+
message: string;
|
|
29
|
+
fix?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ProvisionStep {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
script: string;
|
|
35
|
+
status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';
|
|
36
|
+
output?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ProvisionReport {
|
|
40
|
+
domain: string;
|
|
41
|
+
prereqs: PrereqCheck[];
|
|
42
|
+
steps: ProvisionStep[];
|
|
43
|
+
ready: boolean;
|
|
44
|
+
summary: string;
|
|
45
|
+
}
|
|
46
|
+
export declare const deployProvisionSkill: SkillModule;
|
|
47
|
+
//# sourceMappingURL=deploy-provision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-provision.d.ts","sourceRoot":"","sources":["../../src/skills/deploy-provision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AA6KD,eAAO,MAAM,oBAAoB,EAAE,WA4FlC,CAAC"}
|