pi-harness-runtime 1.1.95 → 1.1.97
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/CHANGELOG.md +33 -0
- package/harness/loop-runtime.ts +3 -0
- package/index.ts +130 -29
- package/package.json +2 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/dist/client.d.ts +51 -0
- package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/client.js +105 -0
- package/packages/qdrant-skills/dist/client.js.map +1 -0
- package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
- package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/embedder.js +101 -0
- package/packages/qdrant-skills/dist/embedder.js.map +1 -0
- package/packages/qdrant-skills/dist/index.d.ts +25 -0
- package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/index.js +25 -0
- package/packages/qdrant-skills/dist/index.js.map +1 -0
- package/packages/qdrant-skills/package.json +27 -0
- package/packages/qdrant-skills/src/client.ts +178 -0
- package/packages/qdrant-skills/src/embedder.ts +137 -0
- package/packages/qdrant-skills/src/index.ts +42 -0
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/dist/index.d.ts +40 -0
- package/packages/skills/dist/index.d.ts.map +1 -0
- package/packages/skills/dist/index.js +84 -0
- package/packages/skills/dist/index.js.map +1 -0
- package/packages/skills/dist/linter.d.ts +38 -0
- package/packages/skills/dist/linter.d.ts.map +1 -0
- package/packages/skills/dist/linter.js +323 -0
- package/packages/skills/dist/linter.js.map +1 -0
- package/packages/skills/dist/loader.d.ts +74 -0
- package/packages/skills/dist/loader.d.ts.map +1 -0
- package/packages/skills/dist/loader.js +280 -0
- package/packages/skills/dist/loader.js.map +1 -0
- package/packages/skills/dist/parser.d.ts +32 -0
- package/packages/skills/dist/parser.d.ts.map +1 -0
- package/packages/skills/dist/parser.js +459 -0
- package/packages/skills/dist/parser.js.map +1 -0
- package/packages/skills/dist/scanner.d.ts +33 -0
- package/packages/skills/dist/scanner.d.ts.map +1 -0
- package/packages/skills/dist/scanner.js +257 -0
- package/packages/skills/dist/scanner.js.map +1 -0
- package/packages/skills/dist/skill-commands.d.ts +33 -0
- package/packages/skills/dist/skill-commands.d.ts.map +1 -0
- package/packages/skills/dist/skill-commands.js +239 -0
- package/packages/skills/dist/skill-commands.js.map +1 -0
- package/packages/skills/dist/skill-tool.d.ts +120 -0
- package/packages/skills/dist/skill-tool.d.ts.map +1 -0
- package/packages/skills/dist/skill-tool.js +239 -0
- package/packages/skills/dist/skill-tool.js.map +1 -0
- package/packages/skills/dist/skill-versioning.d.ts +123 -0
- package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
- package/packages/skills/dist/skill-versioning.js +240 -0
- package/packages/skills/dist/skill-versioning.js.map +1 -0
- package/packages/skills/dist/types.d.ts +226 -0
- package/packages/skills/dist/types.d.ts.map +1 -0
- package/packages/skills/dist/types.js +21 -0
- package/packages/skills/dist/types.js.map +1 -0
- package/packages/skills/package.json +46 -0
- package/packages/skills/src/index.ts +95 -0
- package/packages/skills/src/linter.ts +371 -0
- package/packages/skills/src/loader.ts +335 -0
- package/packages/skills/src/parser.ts +548 -0
- package/packages/skills/src/scanner.ts +322 -0
- package/packages/skills/src/skill-commands.ts +318 -0
- package/packages/skills/src/skill-tool.ts +324 -0
- package/packages/skills/src/skill-versioning.ts +345 -0
- package/packages/skills/src/types.ts +259 -0
- package/packages/skills/test/init-skills.test.ts +118 -0
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/dist/src/curator.d.ts +189 -0
- package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
- package/packages/trajectory/dist/src/curator.js +340 -0
- package/packages/trajectory/dist/src/curator.js.map +1 -0
- package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
- package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
- package/packages/trajectory/dist/src/journey-renderer.js +324 -0
- package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
- package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
- package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
- package/packages/trajectory/dist/src/learning-graph.js +258 -0
- package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
- package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
- package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
- package/packages/trajectory/dist/src/memory-store.js +472 -0
- package/packages/trajectory/dist/src/memory-store.js.map +1 -0
- package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
- package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
- package/packages/trajectory/dist/src/review-fork.js +332 -0
- package/packages/trajectory/dist/src/review-fork.js.map +1 -0
- package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
- package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
- package/packages/trajectory/dist/src/write-approval.js +281 -0
- package/packages/trajectory/dist/src/write-approval.js.map +1 -0
- package/packages/trajectory/package.json +1 -1
- package/packages/trajectory/src/curator.ts +485 -0
- package/packages/trajectory/src/journey-renderer.ts +399 -0
- package/packages/trajectory/src/learning-graph.ts +363 -0
- package/packages/trajectory/src/memory-store.ts +578 -0
- package/packages/trajectory/src/review-fork.ts +450 -0
- package/packages/trajectory/src/write-approval.ts +372 -0
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/dist/blackboard.d.ts +98 -0
- package/packages/write-review/dist/blackboard.d.ts.map +1 -0
- package/packages/write-review/dist/blackboard.js +289 -0
- package/packages/write-review/dist/blackboard.js.map +1 -0
- package/packages/write-review/dist/event-bus.d.ts +106 -0
- package/packages/write-review/dist/event-bus.d.ts.map +1 -0
- package/packages/write-review/dist/event-bus.js +294 -0
- package/packages/write-review/dist/event-bus.js.map +1 -0
- package/packages/write-review/dist/gate.d.ts +37 -0
- package/packages/write-review/dist/gate.d.ts.map +1 -0
- package/packages/write-review/dist/gate.js +138 -0
- package/packages/write-review/dist/gate.js.map +1 -0
- package/packages/write-review/dist/index.d.ts +22 -0
- package/packages/write-review/dist/index.d.ts.map +1 -0
- package/packages/write-review/dist/index.js +60 -0
- package/packages/write-review/dist/index.js.map +1 -0
- package/packages/write-review/dist/injection.d.ts +40 -0
- package/packages/write-review/dist/injection.d.ts.map +1 -0
- package/packages/write-review/dist/injection.js +179 -0
- package/packages/write-review/dist/injection.js.map +1 -0
- package/packages/write-review/dist/review.d.ts +54 -0
- package/packages/write-review/dist/review.d.ts.map +1 -0
- package/packages/write-review/dist/review.js +154 -0
- package/packages/write-review/dist/review.js.map +1 -0
- package/packages/write-review/dist/trigger.d.ts +39 -0
- package/packages/write-review/dist/trigger.d.ts.map +1 -0
- package/packages/write-review/dist/trigger.js +107 -0
- package/packages/write-review/dist/trigger.js.map +1 -0
- package/packages/write-review/dist/types.d.ts +78 -0
- package/packages/write-review/dist/types.d.ts.map +1 -0
- package/packages/write-review/dist/types.js +26 -0
- package/packages/write-review/dist/types.js.map +1 -0
- package/packages/write-review/package.json +1 -1
- package/packages/write-review/src/event-bus.ts +351 -0
- package/packages/write-review/src/index.ts +1 -0
- package/packages/write-review/src/injection.ts +25 -3
- package/proactive-compact.ts +51 -7
- package/scripts/sync-skills.ts +275 -0
- package/scripts/sync-to-qdrant.ts +398 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Directory Scanner
|
|
3
|
+
*
|
|
4
|
+
* Recursively scans directories for skills (directories containing SKILL.md).
|
|
5
|
+
* Supports pi.dev Agent Skills locations:
|
|
6
|
+
* - ~/.pi-harness/skills
|
|
7
|
+
* - skills/ (relative to cwd)
|
|
8
|
+
* - .agents/skills/ (pi.dev compatible)
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
11
|
+
import { join, normalize } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { parseSkillFile, scanSkillDirectory } from "./parser.js";
|
|
14
|
+
/**
|
|
15
|
+
* Default scan options
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_SCAN_OPTIONS = {
|
|
18
|
+
directories: [
|
|
19
|
+
"~/.pi-harness/skills",
|
|
20
|
+
"skills",
|
|
21
|
+
".agents/skills",
|
|
22
|
+
],
|
|
23
|
+
maxDepth: 10,
|
|
24
|
+
includeHidden: false,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Expand ~ in paths to home directory
|
|
28
|
+
*/
|
|
29
|
+
function expandPath(path) {
|
|
30
|
+
if (path.startsWith("~/")) {
|
|
31
|
+
return join(homedir(), path.slice(2));
|
|
32
|
+
}
|
|
33
|
+
return path;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if a path should be included based on patterns
|
|
37
|
+
*/
|
|
38
|
+
function matchesPattern(path, patterns) {
|
|
39
|
+
if (!patterns || patterns.length === 0) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
for (const pattern of patterns) {
|
|
43
|
+
if (path.includes(pattern)) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recursively scan a directory for skills
|
|
51
|
+
*/
|
|
52
|
+
function scanDirectory(dir, options, scannedPaths, errors, depth = 0) {
|
|
53
|
+
const skillDirs = [];
|
|
54
|
+
// Skip if max depth exceeded
|
|
55
|
+
if (options.maxDepth !== undefined && depth > options.maxDepth) {
|
|
56
|
+
return skillDirs;
|
|
57
|
+
}
|
|
58
|
+
// Normalize and resolve path
|
|
59
|
+
const normalizedPath = normalize(expandPath(dir));
|
|
60
|
+
// Skip if already scanned
|
|
61
|
+
if (scannedPaths.has(normalizedPath)) {
|
|
62
|
+
return skillDirs;
|
|
63
|
+
}
|
|
64
|
+
scannedPaths.add(normalizedPath);
|
|
65
|
+
// Skip if doesn't exist
|
|
66
|
+
if (!existsSync(normalizedPath)) {
|
|
67
|
+
return skillDirs;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const entries = readdirSync(normalizedPath);
|
|
71
|
+
for (const entry of entries) {
|
|
72
|
+
// Skip hidden directories if not included
|
|
73
|
+
if (entry.startsWith(".") && !options.includeHidden) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const fullPath = join(normalizedPath, entry);
|
|
77
|
+
try {
|
|
78
|
+
const stat = statSync(fullPath);
|
|
79
|
+
if (stat.isDirectory()) {
|
|
80
|
+
// Check if this directory contains a SKILL.md
|
|
81
|
+
const skillMdPath = join(fullPath, "SKILL.md");
|
|
82
|
+
if (existsSync(skillMdPath)) {
|
|
83
|
+
// Found a skill!
|
|
84
|
+
skillDirs.push(fullPath);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Recurse into subdirectory
|
|
88
|
+
const subSkills = scanDirectory(fullPath, options, scannedPaths, errors, depth + 1);
|
|
89
|
+
skillDirs.push(...subSkills);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
errors.push({
|
|
95
|
+
path: fullPath,
|
|
96
|
+
error: err instanceof Error ? err.message : String(err),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
errors.push({
|
|
103
|
+
path: normalizedPath,
|
|
104
|
+
error: err instanceof Error ? err.message : String(err),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return skillDirs;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Scan multiple directories for skills
|
|
111
|
+
*/
|
|
112
|
+
export async function scanForSkills(options) {
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
const mergedOptions = {
|
|
115
|
+
...DEFAULT_SCAN_OPTIONS,
|
|
116
|
+
...options,
|
|
117
|
+
};
|
|
118
|
+
const scannedPaths = new Set();
|
|
119
|
+
const errors = [];
|
|
120
|
+
const skillDirs = [];
|
|
121
|
+
for (const dir of mergedOptions.directories) {
|
|
122
|
+
const dirs = scanDirectory(dir, mergedOptions, scannedPaths, errors, 0);
|
|
123
|
+
skillDirs.push(...dirs);
|
|
124
|
+
}
|
|
125
|
+
// Parse each skill directory
|
|
126
|
+
const skills = [];
|
|
127
|
+
for (const skillDir of skillDirs) {
|
|
128
|
+
try {
|
|
129
|
+
const skillMdPath = join(skillDir, "SKILL.md");
|
|
130
|
+
const skill = parseSkillFile(skillMdPath);
|
|
131
|
+
// Scan for references and examples
|
|
132
|
+
const { references, examples } = scanSkillDirectory(skillDir);
|
|
133
|
+
skill.references = references;
|
|
134
|
+
skill.examples = examples;
|
|
135
|
+
skills.push(skill);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
errors.push({
|
|
139
|
+
path: skillDir,
|
|
140
|
+
error: err instanceof Error ? err.message : String(err),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
skills,
|
|
146
|
+
errors,
|
|
147
|
+
scannedPaths: Array.from(scannedPaths),
|
|
148
|
+
durationMs: Date.now() - startTime,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Scan for skills synchronously (for use at startup)
|
|
153
|
+
*/
|
|
154
|
+
export function scanForSkillsSync(options) {
|
|
155
|
+
const startTime = Date.now();
|
|
156
|
+
const mergedOptions = {
|
|
157
|
+
...DEFAULT_SCAN_OPTIONS,
|
|
158
|
+
...options,
|
|
159
|
+
};
|
|
160
|
+
const scannedPaths = new Set();
|
|
161
|
+
const errors = [];
|
|
162
|
+
const skillDirs = [];
|
|
163
|
+
for (const dir of mergedOptions.directories) {
|
|
164
|
+
const dirs = scanDirectory(dir, mergedOptions, scannedPaths, errors, 0);
|
|
165
|
+
skillDirs.push(...dirs);
|
|
166
|
+
}
|
|
167
|
+
// Parse each skill directory
|
|
168
|
+
const skills = [];
|
|
169
|
+
for (const skillDir of skillDirs) {
|
|
170
|
+
try {
|
|
171
|
+
const skillMdPath = join(skillDir, "SKILL.md");
|
|
172
|
+
const skill = parseSkillFile(skillMdPath);
|
|
173
|
+
// Scan for references and examples
|
|
174
|
+
const { references, examples } = scanSkillDirectory(skillDir);
|
|
175
|
+
skill.references = references;
|
|
176
|
+
skill.examples = examples;
|
|
177
|
+
skills.push(skill);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
errors.push({
|
|
181
|
+
path: skillDir,
|
|
182
|
+
error: err instanceof Error ? err.message : String(err),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
skills,
|
|
188
|
+
errors,
|
|
189
|
+
scannedPaths: Array.from(scannedPaths),
|
|
190
|
+
durationMs: Date.now() - startTime,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Resolve skill locations from options
|
|
195
|
+
*/
|
|
196
|
+
export function resolveSkillLocations(locations) {
|
|
197
|
+
const defaults = DEFAULT_SCAN_OPTIONS.directories;
|
|
198
|
+
if (!locations || locations.length === 0) {
|
|
199
|
+
return defaults.map(expandPath);
|
|
200
|
+
}
|
|
201
|
+
return locations.map(expandPath);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if a path is a valid skill directory
|
|
205
|
+
*/
|
|
206
|
+
export function isSkillDirectory(path) {
|
|
207
|
+
const skillMdPath = join(expandPath(path), "SKILL.md");
|
|
208
|
+
return existsSync(skillMdPath);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Watch directories for skill changes
|
|
212
|
+
*/
|
|
213
|
+
export function watchSkillDirectories(directories, onChange, options) {
|
|
214
|
+
const pollInterval = options?.pollInterval ?? 5000;
|
|
215
|
+
const lastModified = new Map();
|
|
216
|
+
const check = () => {
|
|
217
|
+
for (const dir of directories) {
|
|
218
|
+
const expandedDir = expandPath(dir);
|
|
219
|
+
if (!existsSync(expandedDir))
|
|
220
|
+
continue;
|
|
221
|
+
try {
|
|
222
|
+
const entries = readdirSync(expandedDir, { withFileTypes: true });
|
|
223
|
+
for (const entry of entries) {
|
|
224
|
+
if (!entry.isDirectory() || entry.name.startsWith("."))
|
|
225
|
+
continue;
|
|
226
|
+
const skillPath = join(expandedDir, entry.name);
|
|
227
|
+
const skillMdPath = join(skillPath, "SKILL.md");
|
|
228
|
+
if (!existsSync(skillMdPath))
|
|
229
|
+
continue;
|
|
230
|
+
try {
|
|
231
|
+
const stat = statSync(skillMdPath);
|
|
232
|
+
const mtime = stat.mtimeMs;
|
|
233
|
+
const lastMtime = lastModified.get(skillPath);
|
|
234
|
+
if (!lastMtime) {
|
|
235
|
+
lastModified.set(skillPath, mtime);
|
|
236
|
+
onChange("add", skillPath);
|
|
237
|
+
}
|
|
238
|
+
else if (mtime > lastMtime) {
|
|
239
|
+
lastModified.set(skillPath, mtime);
|
|
240
|
+
onChange("change", skillPath);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// File might have been deleted
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Directory might not exist
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const interval = setInterval(check, pollInterval);
|
|
254
|
+
// Return cleanup function
|
|
255
|
+
return () => clearInterval(interval);
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Commands - /skill:name slash command handler
|
|
3
|
+
*
|
|
4
|
+
* Registers /skill:name commands for explicit skill invocation.
|
|
5
|
+
* Based on pi.dev skill command specification.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
8
|
+
/**
|
|
9
|
+
* Skill command configuration
|
|
10
|
+
*/
|
|
11
|
+
export interface SkillCommandConfig {
|
|
12
|
+
/** Enable skill commands */
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** Prefix for skill commands (default: "skill:") */
|
|
15
|
+
prefix: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Default configuration
|
|
19
|
+
*/
|
|
20
|
+
export declare const DEFAULT_COMMAND_CONFIG: SkillCommandConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize skill commands with ExtensionAPI
|
|
23
|
+
*/
|
|
24
|
+
export declare function initSkillCommands(pi: ExtensionAPI, config?: Partial<SkillCommandConfig>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get skill index for system prompt injection
|
|
27
|
+
*/
|
|
28
|
+
export declare function getSkillIndexForSystemPrompt(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Refresh skill commands (re-register after skills change)
|
|
31
|
+
*/
|
|
32
|
+
export declare function refreshSkillCommands(pi: ExtensionAPI, prefix?: string): void;
|
|
33
|
+
//# sourceMappingURL=skill-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../src/skill-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,iCAAiC,CAAC;AAI/G;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,kBAGpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,YAAY,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAoCN;AA4MD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAuBrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAQN"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Commands - /skill:name slash command handler
|
|
3
|
+
*
|
|
4
|
+
* Registers /skill:name commands for explicit skill invocation.
|
|
5
|
+
* Based on pi.dev skill command specification.
|
|
6
|
+
*/
|
|
7
|
+
import { getGlobalSkillRegistry } from "./loader.js";
|
|
8
|
+
import { scanForSkillsSync } from "./scanner.js";
|
|
9
|
+
/**
|
|
10
|
+
* Default configuration
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_COMMAND_CONFIG = {
|
|
13
|
+
enabled: true,
|
|
14
|
+
prefix: "skill:",
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Initialize skill commands with ExtensionAPI
|
|
18
|
+
*/
|
|
19
|
+
export function initSkillCommands(pi, config) {
|
|
20
|
+
const cfg = { ...DEFAULT_COMMAND_CONFIG, ...config };
|
|
21
|
+
if (!cfg.enabled)
|
|
22
|
+
return;
|
|
23
|
+
const registry = getGlobalSkillRegistry();
|
|
24
|
+
// Initialize registry with existing skills
|
|
25
|
+
const result = scanForSkillsSync();
|
|
26
|
+
for (const skill of result.skills) {
|
|
27
|
+
registry.register(skill);
|
|
28
|
+
}
|
|
29
|
+
// Register /skill command for listing
|
|
30
|
+
pi.registerCommand("skill", {
|
|
31
|
+
description: "Interact with skills. Usage: /skill [list|search <query>|info <name>]",
|
|
32
|
+
handler: async (args, ctx) => {
|
|
33
|
+
const parts = args.trim().split(/\s+/);
|
|
34
|
+
const subcommand = parts[0] || "list";
|
|
35
|
+
const query = parts.slice(1).join(" ");
|
|
36
|
+
switch (subcommand) {
|
|
37
|
+
case "list":
|
|
38
|
+
return handleSkillList(registry, ctx);
|
|
39
|
+
case "search":
|
|
40
|
+
return handleSkillSearch(registry, query, ctx);
|
|
41
|
+
case "info":
|
|
42
|
+
return handleSkillInfo(registry, query, ctx);
|
|
43
|
+
default:
|
|
44
|
+
ctx.ui.notify(`Unknown subcommand: ${subcommand}. Use: /skill [list|search|info]`, "warning");
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
// Register individual skill commands dynamically
|
|
49
|
+
registerSkillCommands(pi, registry, cfg.prefix);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Register individual skill commands
|
|
53
|
+
*/
|
|
54
|
+
function registerSkillCommands(pi, registry, prefix) {
|
|
55
|
+
// Get all registered skills
|
|
56
|
+
const skills = registry.list();
|
|
57
|
+
for (const skill of skills) {
|
|
58
|
+
const commandName = `${prefix}${skill.id}`;
|
|
59
|
+
// Skip if command name is too long or conflicts
|
|
60
|
+
if (commandName.length > 50)
|
|
61
|
+
continue;
|
|
62
|
+
// Register the command
|
|
63
|
+
try {
|
|
64
|
+
pi.registerCommand(commandName, {
|
|
65
|
+
description: skill.frontmatter.description,
|
|
66
|
+
handler: async (_skillArgs, ctx) => {
|
|
67
|
+
// Load the full skill content
|
|
68
|
+
const loaded = await registry.load(skill.id, {
|
|
69
|
+
loadReferences: true,
|
|
70
|
+
loadExamples: true,
|
|
71
|
+
});
|
|
72
|
+
if (!loaded) {
|
|
73
|
+
ctx.ui.notify(`Skill not found: ${skill.id}`, "error");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Build response with skill content
|
|
77
|
+
const response = [];
|
|
78
|
+
response.push(`# ${loaded.frontmatter.name}`);
|
|
79
|
+
response.push(`**${loaded.frontmatter.description}**`);
|
|
80
|
+
response.push("");
|
|
81
|
+
response.push("---");
|
|
82
|
+
response.push(loaded.body);
|
|
83
|
+
// Append references
|
|
84
|
+
if (loaded.references.length > 0) {
|
|
85
|
+
response.push("");
|
|
86
|
+
response.push("## References");
|
|
87
|
+
for (const ref of loaded.references) {
|
|
88
|
+
response.push(`- ${ref.relativePath}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Show skill details
|
|
92
|
+
ctx.ui.notify(`Skill '${loaded.frontmatter.name}' - ${loaded.body.length} chars. ` +
|
|
93
|
+
`Use /skill info ${loaded.id} for full details.`, "info");
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
// Skip if command registration fails (e.g., name conflict)
|
|
99
|
+
console.debug(`[SkillCommands] Skipped registering ${commandName}:`, err);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle /skill list
|
|
105
|
+
*/
|
|
106
|
+
async function handleSkillList(registry, ctx) {
|
|
107
|
+
const skills = registry.list();
|
|
108
|
+
if (skills.length === 0) {
|
|
109
|
+
ctx.ui.notify("No skills registered. Skills are loaded from ~/.pi-harness/skills/, skills/, or .agents/skills/", "info");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const lines = ["# Available Skills", ""];
|
|
113
|
+
for (const skill of skills) {
|
|
114
|
+
const author = skill.hermes?.author ?? "unknown";
|
|
115
|
+
const usage = skill.hermes?.usage_count ?? 0;
|
|
116
|
+
lines.push(`## ${skill.frontmatter.name} ${author === "agent" ? "(agent)" : author === "curator" ? "(curator)" : ""}`);
|
|
117
|
+
lines.push(skill.frontmatter.description);
|
|
118
|
+
lines.push(`- Usage: ${usage}x`);
|
|
119
|
+
if (skill.hermes?.triggers?.length) {
|
|
120
|
+
lines.push(`- Triggers: ${skill.hermes.triggers.join(", ")}`);
|
|
121
|
+
}
|
|
122
|
+
lines.push("");
|
|
123
|
+
}
|
|
124
|
+
// Send as a message using the context's session if available
|
|
125
|
+
ctx.ui.notify(`Found ${skills.length} skills. Use /skill info <name> for details.`, "info");
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Handle /skill search
|
|
129
|
+
*/
|
|
130
|
+
async function handleSkillSearch(registry, query, ctx) {
|
|
131
|
+
if (!query) {
|
|
132
|
+
ctx.ui.notify("Usage: /skill search <query>", "warning");
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const results = registry.find(query, { threshold: 0.2 });
|
|
136
|
+
if (results.length === 0) {
|
|
137
|
+
ctx.ui.notify(`No skills found matching: ${query}`, "info");
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const lines = [`# Skills matching: ${query}`, ""];
|
|
141
|
+
for (const result of results.slice(0, 10)) {
|
|
142
|
+
lines.push(`## ${result.skill.frontmatter.name} (${Math.round(result.score * 100)}% match)`);
|
|
143
|
+
lines.push(result.skill.frontmatter.description);
|
|
144
|
+
if (result.matchedTriggers.length > 0) {
|
|
145
|
+
lines.push(`Matched: ${result.matchedTriggers.join(", ")}`);
|
|
146
|
+
}
|
|
147
|
+
lines.push("");
|
|
148
|
+
}
|
|
149
|
+
ctx.ui.notify(`Found ${results.length} matching skills. Use /skill info <name> for details.`, "info");
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Handle /skill info
|
|
153
|
+
*/
|
|
154
|
+
async function handleSkillInfo(registry, skillName, ctx) {
|
|
155
|
+
if (!skillName) {
|
|
156
|
+
ctx.ui.notify("Usage: /skill info <name>", "warning");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const skill = registry.get(skillName);
|
|
160
|
+
if (!skill) {
|
|
161
|
+
ctx.ui.notify(`Skill not found: ${skillName}`, "error");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Load full content
|
|
165
|
+
const loaded = await registry.load(skill.id, { loadReferences: true });
|
|
166
|
+
if (!loaded) {
|
|
167
|
+
ctx.ui.notify(`Failed to load skill: ${skillName}`, "error");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const lines = [];
|
|
171
|
+
lines.push(`# ${loaded.frontmatter.name}`);
|
|
172
|
+
lines.push("");
|
|
173
|
+
lines.push("**Description:** " + loaded.frontmatter.description);
|
|
174
|
+
if (loaded.frontmatter.version) {
|
|
175
|
+
lines.push("**Version:** " + loaded.frontmatter.version);
|
|
176
|
+
}
|
|
177
|
+
if (loaded.hermes?.author) {
|
|
178
|
+
lines.push("**Author:** " + loaded.hermes.author);
|
|
179
|
+
}
|
|
180
|
+
if (loaded.hermes?.confidence !== undefined) {
|
|
181
|
+
lines.push("**Confidence:** " + Math.round(loaded.hermes.confidence * 100) + "%");
|
|
182
|
+
}
|
|
183
|
+
if (loaded.hermes?.usage_count !== undefined) {
|
|
184
|
+
lines.push("**Used:** " + loaded.hermes.usage_count + " times");
|
|
185
|
+
}
|
|
186
|
+
lines.push("");
|
|
187
|
+
lines.push("## Content");
|
|
188
|
+
lines.push(loaded.body);
|
|
189
|
+
if (loaded.references.length > 0) {
|
|
190
|
+
lines.push("");
|
|
191
|
+
lines.push("## References");
|
|
192
|
+
for (const ref of loaded.references) {
|
|
193
|
+
lines.push(`- ${ref.relativePath}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (loaded.hermes?.pitfalls?.length) {
|
|
197
|
+
lines.push("");
|
|
198
|
+
lines.push("## Pitfalls");
|
|
199
|
+
for (const pitfall of loaded.hermes.pitfalls) {
|
|
200
|
+
lines.push(`- **${pitfall.name}**: ${pitfall.why}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Show skill content via notification (simplified approach)
|
|
204
|
+
ctx.ui.notify(`Skill '${loaded.frontmatter.name}' loaded with ${loaded.body.length} chars. Use /skill:${skill.id} to activate.`, "info");
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get skill index for system prompt injection
|
|
208
|
+
*/
|
|
209
|
+
export function getSkillIndexForSystemPrompt() {
|
|
210
|
+
const registry = getGlobalSkillRegistry();
|
|
211
|
+
const skills = registry.list();
|
|
212
|
+
if (skills.length === 0) {
|
|
213
|
+
return "";
|
|
214
|
+
}
|
|
215
|
+
const lines = [];
|
|
216
|
+
lines.push("## Available Skills");
|
|
217
|
+
lines.push("");
|
|
218
|
+
for (const skill of skills) {
|
|
219
|
+
lines.push(`- **${skill.frontmatter.name}**: ${skill.frontmatter.description}`);
|
|
220
|
+
if (skill.hermes?.triggers?.length) {
|
|
221
|
+
lines.push(` Triggers: ${skill.hermes.triggers.join(", ")}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
lines.push("");
|
|
225
|
+
lines.push("Use `/skill:name` to activate a skill.");
|
|
226
|
+
return lines.join("\n");
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Refresh skill commands (re-register after skills change)
|
|
230
|
+
*/
|
|
231
|
+
export function refreshSkillCommands(pi, prefix) {
|
|
232
|
+
const cfg = {
|
|
233
|
+
enabled: true,
|
|
234
|
+
prefix: prefix ?? DEFAULT_COMMAND_CONFIG.prefix,
|
|
235
|
+
};
|
|
236
|
+
const registry = getGlobalSkillRegistry();
|
|
237
|
+
registerSkillCommands(pi, registry, cfg.prefix);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=skill-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../src/skill-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tool - Agent-accessible skill management
|
|
3
|
+
*
|
|
4
|
+
* Tool for agent to create, update, delete skills autonomously.
|
|
5
|
+
* Implements Hermes-style skill management with write_approval gate.
|
|
6
|
+
*
|
|
7
|
+
* Note: Full tool integration requires matching handler registration.
|
|
8
|
+
*/
|
|
9
|
+
import { getGlobalSkillRegistry } from "./loader.js";
|
|
10
|
+
/**
|
|
11
|
+
* Skill tool configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface SkillToolConfig {
|
|
14
|
+
/** Enable skill tool */
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
/** Require approval for writes */
|
|
17
|
+
writeApproval: boolean;
|
|
18
|
+
/** Auto-create directory if missing */
|
|
19
|
+
autoCreateDir: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Default configuration
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT_TOOL_CONFIG: SkillToolConfig;
|
|
25
|
+
/**
|
|
26
|
+
* Skill manage tool parameters
|
|
27
|
+
*/
|
|
28
|
+
export interface SkillManageParams {
|
|
29
|
+
action: "create" | "patch" | "delete" | "list" | "info" | "search" | "lint" | "write_file" | "remove_file";
|
|
30
|
+
name?: string;
|
|
31
|
+
body?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
content?: string;
|
|
34
|
+
file?: string;
|
|
35
|
+
old_text?: string;
|
|
36
|
+
author?: "agent" | "user" | "curator";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Skill manage result
|
|
40
|
+
*/
|
|
41
|
+
export interface SkillManageResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
message: string;
|
|
44
|
+
skillId?: string;
|
|
45
|
+
details?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create skill tool definition (for registration with ExtensionAPI)
|
|
49
|
+
*/
|
|
50
|
+
export declare function createSkillToolDefinition(handler: (params: SkillManageParams) => Promise<SkillManageResult>): {
|
|
51
|
+
name: string;
|
|
52
|
+
label: string;
|
|
53
|
+
description: string;
|
|
54
|
+
parameters: {
|
|
55
|
+
type: "object";
|
|
56
|
+
properties: {
|
|
57
|
+
action: {
|
|
58
|
+
type: "string";
|
|
59
|
+
enum: readonly ["create", "patch", "delete", "list", "info", "search", "lint", "write_file", "remove_file"];
|
|
60
|
+
description: string;
|
|
61
|
+
};
|
|
62
|
+
name: {
|
|
63
|
+
type: "string";
|
|
64
|
+
description: string;
|
|
65
|
+
};
|
|
66
|
+
body: {
|
|
67
|
+
type: "string";
|
|
68
|
+
description: string;
|
|
69
|
+
};
|
|
70
|
+
description: {
|
|
71
|
+
type: "string";
|
|
72
|
+
description: string;
|
|
73
|
+
};
|
|
74
|
+
content: {
|
|
75
|
+
type: "string";
|
|
76
|
+
description: string;
|
|
77
|
+
};
|
|
78
|
+
file: {
|
|
79
|
+
type: "string";
|
|
80
|
+
description: string;
|
|
81
|
+
};
|
|
82
|
+
old_text: {
|
|
83
|
+
type: "string";
|
|
84
|
+
description: string;
|
|
85
|
+
};
|
|
86
|
+
author: {
|
|
87
|
+
type: "string";
|
|
88
|
+
enum: readonly ["agent", "user", "curator"];
|
|
89
|
+
description: string;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
required: readonly ["action"];
|
|
93
|
+
};
|
|
94
|
+
handler: (params: SkillManageParams) => Promise<SkillManageResult>;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Handle skill creation
|
|
98
|
+
*/
|
|
99
|
+
export declare function handleSkillCreate(registry: ReturnType<typeof getGlobalSkillRegistry>, name: string, body?: string, description?: string, author?: "agent" | "user" | "curator"): SkillManageResult;
|
|
100
|
+
/**
|
|
101
|
+
* Handle skill listing
|
|
102
|
+
*/
|
|
103
|
+
export declare function handleSkillList(registry: ReturnType<typeof getGlobalSkillRegistry>): SkillManageResult;
|
|
104
|
+
/**
|
|
105
|
+
* Handle skill info
|
|
106
|
+
*/
|
|
107
|
+
export declare function handleSkillInfo(registry: ReturnType<typeof getGlobalSkillRegistry>, name: string): SkillManageResult;
|
|
108
|
+
/**
|
|
109
|
+
* Handle skill search
|
|
110
|
+
*/
|
|
111
|
+
export declare function handleSkillSearch(registry: ReturnType<typeof getGlobalSkillRegistry>, query: string): SkillManageResult;
|
|
112
|
+
/**
|
|
113
|
+
* Handle skill linting
|
|
114
|
+
*/
|
|
115
|
+
export declare function handleSkillLint(registry: ReturnType<typeof getGlobalSkillRegistry>, name: string): SkillManageResult;
|
|
116
|
+
/**
|
|
117
|
+
* Process skill manage action
|
|
118
|
+
*/
|
|
119
|
+
export declare function processSkillManage(params: SkillManageParams, registry?: ReturnType<typeof getGlobalSkillRegistry>): Promise<SkillManageResult>;
|
|
120
|
+
//# sourceMappingURL=skill-tool.d.ts.map
|