@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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: multi-repo
|
|
3
|
+
*
|
|
4
|
+
* Allows reasoning across multiple repositories simultaneously.
|
|
5
|
+
* Aggregates file lists, package manifests and git status from each configured
|
|
6
|
+
* repo root and produces a unified cross-repo analysis report.
|
|
7
|
+
*
|
|
8
|
+
* Input (via SkillContext.graph):
|
|
9
|
+
* - `ctx.graph['repos']` — string[] — absolute paths to additional repo roots
|
|
10
|
+
* - `ctx.graph['repoData']` — RepoInfo[] — injectable repo snapshots for tests (bypasses FS)
|
|
11
|
+
* - `ctx.graph['mode']` — 'summary' | 'deps' | 'files' (default: 'summary')
|
|
12
|
+
*
|
|
13
|
+
* Output data:
|
|
14
|
+
* - MultiRepoResult
|
|
15
|
+
*/
|
|
16
|
+
import type { SkillModule } from '../types.js';
|
|
17
|
+
export interface RepoDependency {
|
|
18
|
+
name: string;
|
|
19
|
+
version: string;
|
|
20
|
+
kind: 'dep' | 'devDep' | 'peer';
|
|
21
|
+
}
|
|
22
|
+
export interface RepoInfo {
|
|
23
|
+
root: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
version: string;
|
|
27
|
+
dependencies: RepoDependency[];
|
|
28
|
+
fileCount: number;
|
|
29
|
+
topLevelEntries: string[];
|
|
30
|
+
hasTypeScript: boolean;
|
|
31
|
+
hasTests: boolean;
|
|
32
|
+
branch?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface CrossRepoDependency {
|
|
35
|
+
dep: string;
|
|
36
|
+
repos: string[];
|
|
37
|
+
versions: string[];
|
|
38
|
+
versionConflict: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface MultiRepoResult {
|
|
41
|
+
mode: 'summary' | 'deps' | 'files';
|
|
42
|
+
repos: RepoInfo[];
|
|
43
|
+
crossDeps: CrossRepoDependency[];
|
|
44
|
+
summary: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function scanRepoRoot(root: string): RepoInfo;
|
|
47
|
+
export declare function findCrossRepoDeps(repos: RepoInfo[]): CrossRepoDependency[];
|
|
48
|
+
export declare function buildSummary(repos: RepoInfo[], crossDeps: CrossRepoDependency[]): string;
|
|
49
|
+
export declare const multiRepoSkill: SkillModule;
|
|
50
|
+
//# sourceMappingURL=multi-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-repo.d.ts","sourceRoot":"","sources":["../../src/skills/multi-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA0DnD;AAqBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,mBAAmB,EAAE,CA8B1E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAQxF;AAMD,eAAO,MAAM,cAAc,EAAE,WAyC5B,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: multi-repo
|
|
3
|
+
*
|
|
4
|
+
* Allows reasoning across multiple repositories simultaneously.
|
|
5
|
+
* Aggregates file lists, package manifests and git status from each configured
|
|
6
|
+
* repo root and produces a unified cross-repo analysis report.
|
|
7
|
+
*
|
|
8
|
+
* Input (via SkillContext.graph):
|
|
9
|
+
* - `ctx.graph['repos']` — string[] — absolute paths to additional repo roots
|
|
10
|
+
* - `ctx.graph['repoData']` — RepoInfo[] — injectable repo snapshots for tests (bypasses FS)
|
|
11
|
+
* - `ctx.graph['mode']` — 'summary' | 'deps' | 'files' (default: 'summary')
|
|
12
|
+
*
|
|
13
|
+
* Output data:
|
|
14
|
+
* - MultiRepoResult
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { join, basename } from 'node:path';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export function scanRepoRoot(root) {
|
|
22
|
+
const name = basename(root);
|
|
23
|
+
let description = '';
|
|
24
|
+
let version = '0.0.0';
|
|
25
|
+
const dependencies = [];
|
|
26
|
+
// Read package.json
|
|
27
|
+
const pkgPath = join(root, 'package.json');
|
|
28
|
+
if (existsSync(pkgPath)) {
|
|
29
|
+
try {
|
|
30
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
31
|
+
description = pkg['description'] ?? '';
|
|
32
|
+
version = pkg['version'] ?? '0.0.0';
|
|
33
|
+
const addDeps = (obj, kind) => {
|
|
34
|
+
if (!obj)
|
|
35
|
+
return;
|
|
36
|
+
for (const [dep, ver] of Object.entries(obj)) {
|
|
37
|
+
dependencies.push({ name: dep, version: ver, kind });
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
addDeps(pkg['dependencies'], 'dep');
|
|
41
|
+
addDeps(pkg['devDependencies'], 'devDep');
|
|
42
|
+
addDeps(pkg['peerDependencies'], 'peer');
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// ignore
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Top-level entries
|
|
49
|
+
let topLevelEntries = [];
|
|
50
|
+
let fileCount = 0;
|
|
51
|
+
try {
|
|
52
|
+
topLevelEntries = readdirSync(root).filter((e) => !e.startsWith('.') && e !== 'node_modules');
|
|
53
|
+
// Count files recursively (limited scan)
|
|
54
|
+
fileCount = countFiles(root, 0, 3);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// ignore FS errors
|
|
58
|
+
}
|
|
59
|
+
const hasTypeScript = existsSync(join(root, 'tsconfig.json'));
|
|
60
|
+
const hasTests = existsSync(join(root, 'tests')) ||
|
|
61
|
+
existsSync(join(root, '__tests__')) ||
|
|
62
|
+
topLevelEntries.some((e) => e.endsWith('.test.ts') || e.endsWith('.spec.ts'));
|
|
63
|
+
return {
|
|
64
|
+
root,
|
|
65
|
+
name,
|
|
66
|
+
description,
|
|
67
|
+
version,
|
|
68
|
+
dependencies,
|
|
69
|
+
fileCount,
|
|
70
|
+
topLevelEntries,
|
|
71
|
+
hasTypeScript,
|
|
72
|
+
hasTests,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function countFiles(dir, depth, maxDepth) {
|
|
76
|
+
if (depth > maxDepth)
|
|
77
|
+
return 0;
|
|
78
|
+
let count = 0;
|
|
79
|
+
try {
|
|
80
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
81
|
+
for (const e of entries) {
|
|
82
|
+
if (e.name.startsWith('.') || e.name === 'node_modules' || e.name === 'dist')
|
|
83
|
+
continue;
|
|
84
|
+
if (e.isDirectory()) {
|
|
85
|
+
count += countFiles(join(dir, e.name), depth + 1, maxDepth);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
count++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// ignore
|
|
94
|
+
}
|
|
95
|
+
return count;
|
|
96
|
+
}
|
|
97
|
+
export function findCrossRepoDeps(repos) {
|
|
98
|
+
// Map dep → { repo, version }[]
|
|
99
|
+
const map = new Map();
|
|
100
|
+
for (const repo of repos) {
|
|
101
|
+
for (const dep of repo.dependencies) {
|
|
102
|
+
const arr = map.get(dep.name) ?? [];
|
|
103
|
+
arr.push({ repo: repo.name, version: dep.version });
|
|
104
|
+
map.set(dep.name, arr);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Only return deps that appear in ≥2 repos
|
|
108
|
+
const crossDeps = [];
|
|
109
|
+
for (const [dep, entries] of map) {
|
|
110
|
+
if (entries.length < 2)
|
|
111
|
+
continue;
|
|
112
|
+
const repos = entries.map((e) => e.repo);
|
|
113
|
+
const versions = [...new Set(entries.map((e) => e.version))];
|
|
114
|
+
crossDeps.push({
|
|
115
|
+
dep,
|
|
116
|
+
repos,
|
|
117
|
+
versions,
|
|
118
|
+
versionConflict: versions.length > 1,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return crossDeps.sort((a, b) => {
|
|
122
|
+
if (a.versionConflict !== b.versionConflict)
|
|
123
|
+
return a.versionConflict ? -1 : 1;
|
|
124
|
+
return b.repos.length - a.repos.length;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
export function buildSummary(repos, crossDeps) {
|
|
128
|
+
const conflicts = crossDeps.filter((d) => d.versionConflict).length;
|
|
129
|
+
const lines = [
|
|
130
|
+
`${repos.length} repositor${repos.length === 1 ? 'y' : 'ies'} analysed`,
|
|
131
|
+
`${crossDeps.length} shared dependencies (${conflicts} version conflict${conflicts === 1 ? '' : 's'})`,
|
|
132
|
+
...repos.map((r) => ` • ${r.name} v${r.version} — ${r.fileCount} files`),
|
|
133
|
+
];
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Skill
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
export const multiRepoSkill = {
|
|
140
|
+
id: 'multi-repo',
|
|
141
|
+
name: 'Multi-Repo Analyser',
|
|
142
|
+
description: 'Aggregates file lists, package manifests and dependency graphs across multiple repositories for cross-repo analysis.',
|
|
143
|
+
version: '1.0.0',
|
|
144
|
+
enabled: true,
|
|
145
|
+
tags: ['monorepo', 'dx', 'dependencies', 'analysis'],
|
|
146
|
+
async execute(ctx) {
|
|
147
|
+
const opts = (ctx.graph ?? {});
|
|
148
|
+
const mode = opts['mode'] ?? 'summary';
|
|
149
|
+
// --- Repo list ---
|
|
150
|
+
let repos;
|
|
151
|
+
if (Array.isArray(opts['repoData'])) {
|
|
152
|
+
// Injectable for tests
|
|
153
|
+
repos = opts['repoData'];
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const extraRoots = Array.isArray(opts['repos']) ? opts['repos'] : [];
|
|
157
|
+
const allRoots = [ctx.projectRoot, ...extraRoots].filter(Boolean);
|
|
158
|
+
repos = allRoots.map(scanRepoRoot);
|
|
159
|
+
}
|
|
160
|
+
const crossDeps = findCrossRepoDeps(repos);
|
|
161
|
+
const summary = buildSummary(repos, crossDeps);
|
|
162
|
+
const result = {
|
|
163
|
+
mode,
|
|
164
|
+
repos,
|
|
165
|
+
crossDeps: mode === 'files' ? [] : crossDeps,
|
|
166
|
+
summary,
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
success: true,
|
|
170
|
+
output: summary,
|
|
171
|
+
data: result,
|
|
172
|
+
};
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=multi-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-repo.js","sourceRoot":"","sources":["../../src/skills/multi-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: onboarding
|
|
3
|
+
*
|
|
4
|
+
* Generates an interactive onboarding tour for new developers:
|
|
5
|
+
* - Annotated project tree
|
|
6
|
+
* - Primary data-flow description
|
|
7
|
+
* - Startup commands (from package.json scripts)
|
|
8
|
+
* - Basic FAQ
|
|
9
|
+
*
|
|
10
|
+
* Input (via SkillContext.graph or ctx.files):
|
|
11
|
+
* - `ctx.graph['format']` — 'markdown' | 'text' (default: 'markdown')
|
|
12
|
+
* - `ctx.graph['pkgJson']` — parsed package.json object (injectable for tests)
|
|
13
|
+
* - `ctx.graph['readmeText']` — README.md content (injectable for tests)
|
|
14
|
+
* - `ctx.graph['fileTree']` — string[] of relative file paths (overrides ctx.files)
|
|
15
|
+
*
|
|
16
|
+
* Output data:
|
|
17
|
+
* - OnboardingReport
|
|
18
|
+
*/
|
|
19
|
+
import type { SkillModule } from '../types.js';
|
|
20
|
+
export interface TreeNode {
|
|
21
|
+
name: string;
|
|
22
|
+
isDir: boolean;
|
|
23
|
+
annotation?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface StartupCommand {
|
|
26
|
+
name: string;
|
|
27
|
+
command: string;
|
|
28
|
+
description: string;
|
|
29
|
+
}
|
|
30
|
+
export interface OnboardingReport {
|
|
31
|
+
projectName: string;
|
|
32
|
+
description: string;
|
|
33
|
+
tree: TreeNode[];
|
|
34
|
+
dataFlow: string[];
|
|
35
|
+
startupCommands: StartupCommand[];
|
|
36
|
+
faq: Array<{
|
|
37
|
+
q: string;
|
|
38
|
+
a: string;
|
|
39
|
+
}>;
|
|
40
|
+
format: 'markdown' | 'text';
|
|
41
|
+
}
|
|
42
|
+
export declare function buildTreeNodes(files: string[]): TreeNode[];
|
|
43
|
+
export declare function extractStartupCommands(scripts: Record<string, string>): StartupCommand[];
|
|
44
|
+
export declare function buildDataFlow(files: string[]): string[];
|
|
45
|
+
export declare function renderMarkdown(report: OnboardingReport): string;
|
|
46
|
+
export declare function renderText(report: OnboardingReport): string;
|
|
47
|
+
export declare const onboardingSkill: SkillModule;
|
|
48
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/skills/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,GAAG,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;CAC7B;AAiCD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAuB1D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,cAAc,EAAE,CAkBlB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAevD;AAqBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA4B/D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA0B3D;AAMD,eAAO,MAAM,eAAe,EAAE,WAuE7B,CAAC"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: onboarding
|
|
3
|
+
*
|
|
4
|
+
* Generates an interactive onboarding tour for new developers:
|
|
5
|
+
* - Annotated project tree
|
|
6
|
+
* - Primary data-flow description
|
|
7
|
+
* - Startup commands (from package.json scripts)
|
|
8
|
+
* - Basic FAQ
|
|
9
|
+
*
|
|
10
|
+
* Input (via SkillContext.graph or ctx.files):
|
|
11
|
+
* - `ctx.graph['format']` — 'markdown' | 'text' (default: 'markdown')
|
|
12
|
+
* - `ctx.graph['pkgJson']` — parsed package.json object (injectable for tests)
|
|
13
|
+
* - `ctx.graph['readmeText']` — README.md content (injectable for tests)
|
|
14
|
+
* - `ctx.graph['fileTree']` — string[] of relative file paths (overrides ctx.files)
|
|
15
|
+
*
|
|
16
|
+
* Output data:
|
|
17
|
+
* - OnboardingReport
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Helpers
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const DIR_ANNOTATIONS = {
|
|
25
|
+
'src': 'Source code',
|
|
26
|
+
'packages': 'Workspace packages (monorepo)',
|
|
27
|
+
'apps': 'Application entry points',
|
|
28
|
+
'docs': 'Documentation',
|
|
29
|
+
'scripts': 'Dev & deploy scripts',
|
|
30
|
+
'tests': 'Test suites',
|
|
31
|
+
'__tests__': 'Test suites',
|
|
32
|
+
'dist': 'Compiled output (generated)',
|
|
33
|
+
'node_modules': 'Dependencies (generated)',
|
|
34
|
+
'.github': 'CI/CD workflows',
|
|
35
|
+
'.weave': 'OpenWeave session data',
|
|
36
|
+
};
|
|
37
|
+
const FILE_ANNOTATIONS = {
|
|
38
|
+
'package.json': 'Project manifest & npm scripts',
|
|
39
|
+
'tsconfig.json': 'TypeScript compiler config',
|
|
40
|
+
'README.md': 'Project documentation',
|
|
41
|
+
'ROADMAP.md': 'Development roadmap',
|
|
42
|
+
'LICENSE': 'License terms',
|
|
43
|
+
'.env.example': 'Environment variable template',
|
|
44
|
+
'docker-compose.yml': 'Docker services config',
|
|
45
|
+
'Dockerfile': 'Container build instructions',
|
|
46
|
+
'vitest.config.ts': 'Vitest test runner config',
|
|
47
|
+
'pnpm-workspace.yaml': 'pnpm workspace definition',
|
|
48
|
+
};
|
|
49
|
+
export function buildTreeNodes(files) {
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
const nodes = [];
|
|
52
|
+
for (const f of files) {
|
|
53
|
+
const parts = f.split('/');
|
|
54
|
+
// Add top-level dirs & files
|
|
55
|
+
const top = parts[0];
|
|
56
|
+
if (!seen.has(top)) {
|
|
57
|
+
seen.add(top);
|
|
58
|
+
const isDir = parts.length > 1;
|
|
59
|
+
nodes.push({
|
|
60
|
+
name: top,
|
|
61
|
+
isDir,
|
|
62
|
+
annotation: isDir ? DIR_ANNOTATIONS[top] : FILE_ANNOTATIONS[top],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return nodes.sort((a, b) => {
|
|
67
|
+
if (a.isDir !== b.isDir)
|
|
68
|
+
return a.isDir ? -1 : 1;
|
|
69
|
+
return a.name.localeCompare(b.name);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function extractStartupCommands(scripts) {
|
|
73
|
+
const KNOWN = {
|
|
74
|
+
dev: 'Start development server with hot-reload',
|
|
75
|
+
start: 'Start production server',
|
|
76
|
+
build: 'Compile TypeScript / bundle assets',
|
|
77
|
+
test: 'Run test suite',
|
|
78
|
+
lint: 'Run linter (ESLint / tsc --noEmit)',
|
|
79
|
+
format: 'Format source files (Prettier)',
|
|
80
|
+
clean: 'Remove build artifacts',
|
|
81
|
+
};
|
|
82
|
+
return Object.entries(scripts)
|
|
83
|
+
.filter(([name]) => KNOWN[name] !== undefined)
|
|
84
|
+
.map(([name, _command]) => ({
|
|
85
|
+
name,
|
|
86
|
+
command: `pnpm ${name}`,
|
|
87
|
+
description: KNOWN[name],
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
export function buildDataFlow(files) {
|
|
91
|
+
const hasMcp = files.some((f) => f.includes('mcp-server') || f.includes('weave-link'));
|
|
92
|
+
const hasAgent = files.some((f) => f.includes('agent-core') || f.includes('AgentCore'));
|
|
93
|
+
const hasGraph = files.some((f) => f.includes('weave-graph') || f.includes('WeaveGraph'));
|
|
94
|
+
const hasEmbed = files.some((f) => f.includes('weave-embed'));
|
|
95
|
+
const hasDash = files.some((f) => f.includes('weave-dashboard') || f.includes('dashboard'));
|
|
96
|
+
const flow = [];
|
|
97
|
+
if (hasAgent)
|
|
98
|
+
flow.push('User input → AgentCore (ReAct loop)');
|
|
99
|
+
if (hasMcp)
|
|
100
|
+
flow.push('AgentCore → ToolRegistry → WeaveLink MCP Server');
|
|
101
|
+
if (hasGraph)
|
|
102
|
+
flow.push('Tool calls → WeaveGraph (knowledge persistence)');
|
|
103
|
+
if (hasEmbed)
|
|
104
|
+
flow.push('WeaveGraph ↔ EmbeddingService (semantic search)');
|
|
105
|
+
if (hasDash)
|
|
106
|
+
flow.push('WeaveGraph → Dashboard (REST API + SSE)');
|
|
107
|
+
if (flow.length === 0)
|
|
108
|
+
flow.push('See README.md for architecture overview');
|
|
109
|
+
return flow;
|
|
110
|
+
}
|
|
111
|
+
const DEFAULT_FAQ = [
|
|
112
|
+
{
|
|
113
|
+
q: 'How do I start the project?',
|
|
114
|
+
a: 'Run `pnpm install` then `pnpm dev` (or `pnpm start`) in the repo root.',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
q: 'How do I run tests?',
|
|
118
|
+
a: 'Run `pnpm test` in the repo root, or `pnpm --filter <package> test` for a single package.',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
q: 'Where is the configuration?',
|
|
122
|
+
a: 'Project config lives in `.weave.config.json` at the repo root. Copy `.env.example` to `.env` for secrets.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
q: 'How do I add a new skill?',
|
|
126
|
+
a: 'Create a new file in `packages/weave-skills/src/skills/`, export a `SkillModule`, and register it in the barrel index.',
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
export function renderMarkdown(report) {
|
|
130
|
+
const lines = [
|
|
131
|
+
`# 👋 Welcome to **${report.projectName}**`,
|
|
132
|
+
'',
|
|
133
|
+
`> ${report.description}`,
|
|
134
|
+
'',
|
|
135
|
+
'## 📁 Project Structure',
|
|
136
|
+
'',
|
|
137
|
+
...report.tree.map((n) => `- ${n.isDir ? '📂' : '📄'} \`${n.name}${n.isDir ? '/' : ''}\`${n.annotation ? ` — ${n.annotation}` : ''}`),
|
|
138
|
+
'',
|
|
139
|
+
'## 🔄 Data Flow',
|
|
140
|
+
'',
|
|
141
|
+
...report.dataFlow.map((line) => `1. ${line}`),
|
|
142
|
+
'',
|
|
143
|
+
'## 🚀 Getting Started',
|
|
144
|
+
'',
|
|
145
|
+
...report.startupCommands.map((cmd) => `- \`${cmd.command}\` — ${cmd.description}`),
|
|
146
|
+
'',
|
|
147
|
+
'## ❓ FAQ',
|
|
148
|
+
'',
|
|
149
|
+
...report.faq.flatMap((item) => [`**Q: ${item.q}**`, `A: ${item.a}`, '']),
|
|
150
|
+
];
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
export function renderText(report) {
|
|
154
|
+
const lines = [
|
|
155
|
+
`Welcome to ${report.projectName}`,
|
|
156
|
+
`${'='.repeat(report.projectName.length + 11)}`,
|
|
157
|
+
'',
|
|
158
|
+
report.description,
|
|
159
|
+
'',
|
|
160
|
+
'PROJECT STRUCTURE',
|
|
161
|
+
'-----------------',
|
|
162
|
+
...report.tree.map((n) => ` ${n.name}${n.isDir ? '/' : ''}${n.annotation ? ` (${n.annotation})` : ''}`),
|
|
163
|
+
'',
|
|
164
|
+
'DATA FLOW',
|
|
165
|
+
'---------',
|
|
166
|
+
...report.dataFlow.map((l, i) => ` ${i + 1}. ${l}`),
|
|
167
|
+
'',
|
|
168
|
+
'GETTING STARTED',
|
|
169
|
+
'---------------',
|
|
170
|
+
...report.startupCommands.map((cmd) => ` ${cmd.command} — ${cmd.description}`),
|
|
171
|
+
'',
|
|
172
|
+
'FAQ',
|
|
173
|
+
'---',
|
|
174
|
+
...report.faq.flatMap((item) => [`Q: ${item.q}`, `A: ${item.a}`, '']),
|
|
175
|
+
];
|
|
176
|
+
return lines.join('\n');
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Skill
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
export const onboardingSkill = {
|
|
182
|
+
id: 'onboarding',
|
|
183
|
+
name: 'Onboarding Tour Generator',
|
|
184
|
+
description: 'Generates an annotated project tree, data-flow overview, startup commands and FAQ for new developers.',
|
|
185
|
+
version: '1.0.0',
|
|
186
|
+
enabled: true,
|
|
187
|
+
tags: ['dx', 'documentation', 'onboarding'],
|
|
188
|
+
async execute(ctx) {
|
|
189
|
+
const graph = (ctx.graph ?? {});
|
|
190
|
+
const format = graph['format'] ?? 'markdown';
|
|
191
|
+
// --- Load package.json ---
|
|
192
|
+
let pkgName = 'Project';
|
|
193
|
+
let pkgDescription = 'No description provided.';
|
|
194
|
+
let scripts = {};
|
|
195
|
+
if (graph['pkgJson']) {
|
|
196
|
+
const pkg = graph['pkgJson'];
|
|
197
|
+
pkgName = pkg['name'] ?? pkgName;
|
|
198
|
+
pkgDescription = pkg['description'] ?? pkgDescription;
|
|
199
|
+
scripts = pkg['scripts'] ?? {};
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const pkgPath = join(ctx.projectRoot, 'package.json');
|
|
203
|
+
if (existsSync(pkgPath)) {
|
|
204
|
+
try {
|
|
205
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
206
|
+
pkgName = pkg['name'] ?? pkgName;
|
|
207
|
+
pkgDescription = pkg['description'] ?? pkgDescription;
|
|
208
|
+
scripts = pkg['scripts'] ?? {};
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// ignore parse errors
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Override description from README if available
|
|
216
|
+
if (!graph['pkgJson'] && graph['readmeText']) {
|
|
217
|
+
const firstLine = graph['readmeText'].split('\n').find((l) => l.trim() && !l.startsWith('#'));
|
|
218
|
+
if (firstLine)
|
|
219
|
+
pkgDescription = firstLine.trim();
|
|
220
|
+
}
|
|
221
|
+
// --- File tree ---
|
|
222
|
+
const rawFiles = Array.isArray(graph['fileTree'])
|
|
223
|
+
? graph['fileTree']
|
|
224
|
+
: ctx.files;
|
|
225
|
+
const tree = buildTreeNodes(rawFiles);
|
|
226
|
+
const dataFlow = buildDataFlow(rawFiles);
|
|
227
|
+
const startupCommands = extractStartupCommands(scripts);
|
|
228
|
+
const report = {
|
|
229
|
+
projectName: pkgName,
|
|
230
|
+
description: pkgDescription,
|
|
231
|
+
tree,
|
|
232
|
+
dataFlow,
|
|
233
|
+
startupCommands,
|
|
234
|
+
faq: DEFAULT_FAQ,
|
|
235
|
+
format,
|
|
236
|
+
};
|
|
237
|
+
const rendered = format === 'markdown' ? renderMarkdown(report) : renderText(report);
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
output: `Onboarding tour generated for "${pkgName}" — ${tree.length} tree nodes, ${startupCommands.length} startup commands`,
|
|
241
|
+
data: { report, rendered },
|
|
242
|
+
};
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/skills/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: perf-profile
|
|
3
|
+
*
|
|
4
|
+
* Analyses build, test and bundle timing data and produces a prioritised
|
|
5
|
+
* table of bottlenecks with actionable suggestions.
|
|
6
|
+
*
|
|
7
|
+
* Input options (ctx.graph):
|
|
8
|
+
* - `timings` {TimingEntry[]} — inject timing data directly (tests / CI JSON)
|
|
9
|
+
* - `ciLog` {string} — parse timing information from a raw CI log
|
|
10
|
+
* - `threshold` {number} — ms threshold to flag a step as slow (default: 10_000)
|
|
11
|
+
*/
|
|
12
|
+
import type { SkillModule } from '../types.js';
|
|
13
|
+
export interface TimingEntry {
|
|
14
|
+
label: string;
|
|
15
|
+
durationMs: number;
|
|
16
|
+
category: 'build' | 'test' | 'bundle' | 'lint' | 'install' | 'other';
|
|
17
|
+
package?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface Bottleneck {
|
|
20
|
+
label: string;
|
|
21
|
+
durationMs: number;
|
|
22
|
+
category: TimingEntry['category'];
|
|
23
|
+
severity: 'critical' | 'warning' | 'info';
|
|
24
|
+
suggestion: string;
|
|
25
|
+
}
|
|
26
|
+
export interface PerfReport {
|
|
27
|
+
entries: TimingEntry[];
|
|
28
|
+
bottlenecks: Bottleneck[];
|
|
29
|
+
totalMs: number;
|
|
30
|
+
slowestStep: TimingEntry | null;
|
|
31
|
+
summary: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function extractTimingsFromLog(log: string): TimingEntry[];
|
|
34
|
+
export declare function analyseTimings(entries: TimingEntry[], threshold?: number): PerfReport;
|
|
35
|
+
export declare const perfProfileSkill: SkillModule;
|
|
36
|
+
//# sourceMappingURL=perf-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-profile.d.ts","sourceRoot":"","sources":["../../src/skills/perf-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAwDD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAoChE;AAMD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,SAAS,GAAG,UAAU,CAqCrF;AAMD,eAAO,MAAM,gBAAgB,EAAE,WAiD9B,CAAC"}
|