@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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/config-loader.d.ts +52 -0
  4. package/dist/config-loader.d.ts.map +1 -0
  5. package/dist/config-loader.js +123 -0
  6. package/dist/config-loader.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +14 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/skill-registry.d.ts +96 -0
  12. package/dist/skill-registry.d.ts.map +1 -0
  13. package/dist/skill-registry.js +218 -0
  14. package/dist/skill-registry.js.map +1 -0
  15. package/dist/skills/auto-fix.d.ts +35 -0
  16. package/dist/skills/auto-fix.d.ts.map +1 -0
  17. package/dist/skills/auto-fix.js +121 -0
  18. package/dist/skills/auto-fix.js.map +1 -0
  19. package/dist/skills/cli-interactive.d.ts +60 -0
  20. package/dist/skills/cli-interactive.d.ts.map +1 -0
  21. package/dist/skills/cli-interactive.js +264 -0
  22. package/dist/skills/cli-interactive.js.map +1 -0
  23. package/dist/skills/code-review.d.ts +39 -0
  24. package/dist/skills/code-review.d.ts.map +1 -0
  25. package/dist/skills/code-review.js +204 -0
  26. package/dist/skills/code-review.js.map +1 -0
  27. package/dist/skills/commit-composer.d.ts +51 -0
  28. package/dist/skills/commit-composer.d.ts.map +1 -0
  29. package/dist/skills/commit-composer.js +223 -0
  30. package/dist/skills/commit-composer.js.map +1 -0
  31. package/dist/skills/container-advisor.d.ts +43 -0
  32. package/dist/skills/container-advisor.d.ts.map +1 -0
  33. package/dist/skills/container-advisor.js +274 -0
  34. package/dist/skills/container-advisor.js.map +1 -0
  35. package/dist/skills/context-memory.d.ts +44 -0
  36. package/dist/skills/context-memory.d.ts.map +1 -0
  37. package/dist/skills/context-memory.js +160 -0
  38. package/dist/skills/context-memory.js.map +1 -0
  39. package/dist/skills/dep-audit.d.ts +55 -0
  40. package/dist/skills/dep-audit.d.ts.map +1 -0
  41. package/dist/skills/dep-audit.js +248 -0
  42. package/dist/skills/dep-audit.js.map +1 -0
  43. package/dist/skills/deploy-provision.d.ts +47 -0
  44. package/dist/skills/deploy-provision.d.ts.map +1 -0
  45. package/dist/skills/deploy-provision.js +270 -0
  46. package/dist/skills/deploy-provision.js.map +1 -0
  47. package/dist/skills/docs-gen.d.ts +36 -0
  48. package/dist/skills/docs-gen.d.ts.map +1 -0
  49. package/dist/skills/docs-gen.js +187 -0
  50. package/dist/skills/docs-gen.js.map +1 -0
  51. package/dist/skills/index.d.ts +19 -0
  52. package/dist/skills/index.d.ts.map +1 -0
  53. package/dist/skills/index.js +55 -0
  54. package/dist/skills/index.js.map +1 -0
  55. package/dist/skills/multi-repo.d.ts +50 -0
  56. package/dist/skills/multi-repo.d.ts.map +1 -0
  57. package/dist/skills/multi-repo.js +175 -0
  58. package/dist/skills/multi-repo.js.map +1 -0
  59. package/dist/skills/onboarding.d.ts +48 -0
  60. package/dist/skills/onboarding.d.ts.map +1 -0
  61. package/dist/skills/onboarding.js +245 -0
  62. package/dist/skills/onboarding.js.map +1 -0
  63. package/dist/skills/perf-profile.d.ts +36 -0
  64. package/dist/skills/perf-profile.d.ts.map +1 -0
  65. package/dist/skills/perf-profile.js +179 -0
  66. package/dist/skills/perf-profile.js.map +1 -0
  67. package/dist/skills/pipeline-aware.d.ts +33 -0
  68. package/dist/skills/pipeline-aware.d.ts.map +1 -0
  69. package/dist/skills/pipeline-aware.js +226 -0
  70. package/dist/skills/pipeline-aware.js.map +1 -0
  71. package/dist/skills/refactor.d.ts +33 -0
  72. package/dist/skills/refactor.d.ts.map +1 -0
  73. package/dist/skills/refactor.js +210 -0
  74. package/dist/skills/refactor.js.map +1 -0
  75. package/dist/skills/test-gen.d.ts +36 -0
  76. package/dist/skills/test-gen.d.ts.map +1 -0
  77. package/dist/skills/test-gen.js +154 -0
  78. package/dist/skills/test-gen.js.map +1 -0
  79. package/dist/types.d.ts +133 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +8 -0
  82. package/dist/types.js.map +1 -0
  83. 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":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkCH,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,yEAAyE;AACzE,MAAM,cAAc,GAA6B,IAAI,GAAG,EAAE,CAAC;AAE3D,MAAM,UAAU,UAAU,CAAC,KAA8B;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK;SACrB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAkB,EAAE,KAAa;IAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAA+B,EAC/B,GAAyB,EACzB,SAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,MAAM;QACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,UAAU;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;QAC1B,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC7C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;QAC/B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;KACtC,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAA+B,EAC/B,KAAc,EACd,IAAsB;IAEtB,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI;QAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3D,IAAI,KAAK;QAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACxE,CAAC;AAWD,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC1D,OAAO,KAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,0BAA0B;IAChC,WAAW,EACT,0HAA0H;IAC5H,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;IAE9C,KAAK,CAAC,OAAO,CAAC,GAAiB;QAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;QAC1D,MAAM,MAAM,GAAI,IAAI,CAAC,QAAQ,CAA8B,IAAI,MAAM,CAAC;QAEtE,0EAA0E;QAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAA+B,CAAC;QACpC,IAAI,aAAa,IAAI,aAAa,YAAY,GAAG,EAAE,CAAC;YAClD,KAAK,GAAG,aAAyC,CAAC;QACpD,CAAC;aAAM,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC9D,+CAA+C;YAC/C,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAA4C,CAAC,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,cAAc,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAElC,0EAA0E;QAC1E,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAqC,CAAC;YAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,uEAAuE;oBAC/E,KAAK,EAAE,eAAe;iBACvB,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YAE/C,+DAA+D;YAC/D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACtD,IAAI,UAAU,EAAE,IAAI,EAAE,CAAC;gBACrB,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,GAAwB;gBAClC,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,OAAO,EAAE,CAAC,KAAK,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC,IAAI;aAClB,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,wBAAwB,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,EAAE,GAAG;gBAC5D,IAAI,EAAE,MAAM;aACb,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,KAAK,GAAI,IAAI,CAAC,OAAO,CAAwB,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAgC,CAAC;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAwB;gBAClC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,KAAK;aACN,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,SAAS,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxH,IAAI,EAAE,MAAM;aACb,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAgC,CAAC;QACzD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAwB;YAClC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,WAAW;YACrF,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -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"}