pi-harness-runtime 1.1.95 → 1.1.96
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 +82 -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 +93 -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/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,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Linter
|
|
3
|
+
*
|
|
4
|
+
* Hermes-style quality checks for skills.
|
|
5
|
+
* Ensures skills capture "lessons, not logs".
|
|
6
|
+
*/
|
|
7
|
+
import type { Skill, LintResult, LintRule, LintSeverity } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Hermes-style linter rules
|
|
10
|
+
*/
|
|
11
|
+
export declare const LINTER_RULES: LintRule[];
|
|
12
|
+
/**
|
|
13
|
+
* Lint a skill
|
|
14
|
+
*/
|
|
15
|
+
export declare function lintSkill(skill: Skill, rules?: LintRule[]): LintResult[];
|
|
16
|
+
/**
|
|
17
|
+
* Lint a skill and return formatted output
|
|
18
|
+
*/
|
|
19
|
+
export declare function lintSkillFormatted(skill: Skill, rules?: LintRule[]): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get lint summary for multiple skills
|
|
22
|
+
*/
|
|
23
|
+
export declare function lintSkillsSummary(skills: Skill[]): {
|
|
24
|
+
total: number;
|
|
25
|
+
passed: number;
|
|
26
|
+
failed: number;
|
|
27
|
+
bySeverity: Record<LintSeverity, number>;
|
|
28
|
+
byRule: Record<string, number>;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Create custom lint rule
|
|
32
|
+
*/
|
|
33
|
+
export declare function createLintRule(name: string, description: string, severity: LintSeverity, check: (skill: Skill) => LintResult | null): LintRule;
|
|
34
|
+
/**
|
|
35
|
+
* Filter lint results by severity
|
|
36
|
+
*/
|
|
37
|
+
export declare function filterLintResults(results: LintResult[], minSeverity: LintSeverity): LintResult[];
|
|
38
|
+
//# sourceMappingURL=linter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,EA0PlC,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAoBxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,CAe3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,CAwBA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,UAAU,GAAG,IAAI,GACzC,QAAQ,CAEV;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EAAE,EACrB,WAAW,EAAE,YAAY,GACxB,UAAU,EAAE,CAQd"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Linter
|
|
3
|
+
*
|
|
4
|
+
* Hermes-style quality checks for skills.
|
|
5
|
+
* Ensures skills capture "lessons, not logs".
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Hermes-style linter rules
|
|
9
|
+
*/
|
|
10
|
+
export const LINTER_RULES = [
|
|
11
|
+
// === Quality Rules ===
|
|
12
|
+
{
|
|
13
|
+
name: "incident-log-shape",
|
|
14
|
+
description: "Body contains too many PR/issue references (looks like incident log)",
|
|
15
|
+
severity: "warning",
|
|
16
|
+
check: (skill) => {
|
|
17
|
+
// Count PR/issue references like #123, PR #456, issue #789
|
|
18
|
+
const prIssueRefs = skill.body.match(/(?:PR|issue|#)\s*\d+/gi) ?? [];
|
|
19
|
+
if (prIssueRefs.length > 5) {
|
|
20
|
+
return {
|
|
21
|
+
rule: "incident-log-shape",
|
|
22
|
+
severity: "warning",
|
|
23
|
+
message: `Found ${prIssueRefs.length} PR/issue references. Skills should capture rules, not incident logs.`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "references-sprawl",
|
|
31
|
+
description: "Too many reference files (>60)",
|
|
32
|
+
severity: "error",
|
|
33
|
+
check: (skill) => {
|
|
34
|
+
if (skill.references.length > 60) {
|
|
35
|
+
return {
|
|
36
|
+
rule: "references-sprawl",
|
|
37
|
+
severity: "error",
|
|
38
|
+
message: `Found ${skill.references.length} reference files. Skills should consolidate references.`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "oversized-body",
|
|
46
|
+
description: "SKILL.md exceeds 24k characters",
|
|
47
|
+
severity: "warning",
|
|
48
|
+
check: (skill) => {
|
|
49
|
+
if (skill.body.length > 24000) {
|
|
50
|
+
return {
|
|
51
|
+
rule: "oversized-body",
|
|
52
|
+
severity: "warning",
|
|
53
|
+
message: `SKILL.md body is ${skill.body.length} chars (exceeds 24k). Consider splitting into references.`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "missing-pitfalls",
|
|
61
|
+
description: "No pitfalls with 'why' explanations",
|
|
62
|
+
severity: "info",
|
|
63
|
+
check: (skill) => {
|
|
64
|
+
const hasPitfalls = skill.hermes?.pitfalls && skill.hermes.pitfalls.length > 0;
|
|
65
|
+
const hasWhy = skill.body.toLowerCase().includes("why");
|
|
66
|
+
if (!hasPitfalls && !hasWhy) {
|
|
67
|
+
return {
|
|
68
|
+
rule: "missing-pitfalls",
|
|
69
|
+
severity: "info",
|
|
70
|
+
message: "No pitfalls found. Consider documenting common mistakes and why they happen.",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "missing-examples",
|
|
78
|
+
description: "No examples provided",
|
|
79
|
+
severity: "info",
|
|
80
|
+
check: (skill) => {
|
|
81
|
+
if (skill.examples.length === 0) {
|
|
82
|
+
return {
|
|
83
|
+
rule: "missing-examples",
|
|
84
|
+
severity: "info",
|
|
85
|
+
message: "No examples found. Consider adding example files to demonstrate the skill.",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
// === pi.dev Compatibility Rules ===
|
|
92
|
+
{
|
|
93
|
+
name: "missing-description",
|
|
94
|
+
description: "No description in frontmatter",
|
|
95
|
+
severity: "error",
|
|
96
|
+
check: (skill) => {
|
|
97
|
+
if (!skill.frontmatter.description || skill.frontmatter.description.length < 10) {
|
|
98
|
+
return {
|
|
99
|
+
rule: "missing-description",
|
|
100
|
+
severity: "error",
|
|
101
|
+
message: "Missing or too short description. The description determines when the model considers loading the skill.",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "invalid-name",
|
|
109
|
+
description: "Name contains invalid characters",
|
|
110
|
+
severity: "error",
|
|
111
|
+
check: (skill) => {
|
|
112
|
+
const nameRegex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
113
|
+
if (!nameRegex.test(skill.frontmatter.name)) {
|
|
114
|
+
return {
|
|
115
|
+
rule: "invalid-name",
|
|
116
|
+
severity: "error",
|
|
117
|
+
message: `Invalid skill name '${skill.frontmatter.name}'. Must be kebab-case (e.g., 'code-review').`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "name-mismatch",
|
|
125
|
+
description: "Directory name doesn't match skill name",
|
|
126
|
+
severity: "warning",
|
|
127
|
+
check: (skill) => {
|
|
128
|
+
const dirName = skill.path.split("/").pop() ?? "";
|
|
129
|
+
if (dirName !== skill.frontmatter.name && dirName !== "") {
|
|
130
|
+
return {
|
|
131
|
+
rule: "name-mismatch",
|
|
132
|
+
severity: "warning",
|
|
133
|
+
message: `Directory name '${dirName}' differs from skill name '${skill.frontmatter.name}'. Consider matching them for portability.`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
// === Hermes-Specific Rules ===
|
|
140
|
+
{
|
|
141
|
+
name: "missing-triggers",
|
|
142
|
+
description: "No triggers defined for auto-matching",
|
|
143
|
+
severity: "info",
|
|
144
|
+
check: (skill) => {
|
|
145
|
+
const hasTriggers = skill.hermes?.triggers && skill.hermes.triggers.length > 0;
|
|
146
|
+
if (!hasTriggers) {
|
|
147
|
+
return {
|
|
148
|
+
rule: "missing-triggers",
|
|
149
|
+
severity: "info",
|
|
150
|
+
message: "No triggers defined. The skill relies only on description matching.",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: "low-confidence",
|
|
158
|
+
description: "Skill has low confidence score",
|
|
159
|
+
severity: "info",
|
|
160
|
+
check: (skill) => {
|
|
161
|
+
const confidence = skill.hermes?.confidence;
|
|
162
|
+
if (confidence !== undefined && confidence < 0.5) {
|
|
163
|
+
return {
|
|
164
|
+
rule: "low-confidence",
|
|
165
|
+
severity: "info",
|
|
166
|
+
message: `Low confidence score (${confidence}). Consider validating this skill pattern.`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "unused-skill",
|
|
174
|
+
description: "Skill has never been used",
|
|
175
|
+
severity: "info",
|
|
176
|
+
check: (skill) => {
|
|
177
|
+
const usageCount = skill.hermes?.usage_count ?? 0;
|
|
178
|
+
if (usageCount === 0 && skill.hermes?.created_at) {
|
|
179
|
+
return {
|
|
180
|
+
rule: "unused-skill",
|
|
181
|
+
severity: "info",
|
|
182
|
+
message: "This skill has never been used. Consider testing or archiving it.",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: "generic-description",
|
|
190
|
+
description: "Description is too generic",
|
|
191
|
+
severity: "warning",
|
|
192
|
+
check: (skill) => {
|
|
193
|
+
const genericPhrases = [
|
|
194
|
+
"helps with",
|
|
195
|
+
"useful for",
|
|
196
|
+
"does things",
|
|
197
|
+
"stuff",
|
|
198
|
+
"things",
|
|
199
|
+
];
|
|
200
|
+
const descLower = skill.frontmatter.description.toLowerCase();
|
|
201
|
+
for (const phrase of genericPhrases) {
|
|
202
|
+
if (descLower.includes(phrase)) {
|
|
203
|
+
return {
|
|
204
|
+
rule: "generic-description",
|
|
205
|
+
severity: "warning",
|
|
206
|
+
message: `Description contains generic phrase '${phrase}'. Be specific about what the skill does and when to use it.`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: "log-like-content",
|
|
215
|
+
description: "Body contains log-like content (timestamps, repeated patterns)",
|
|
216
|
+
severity: "warning",
|
|
217
|
+
check: (skill) => {
|
|
218
|
+
// Check for log patterns
|
|
219
|
+
const logPatterns = [
|
|
220
|
+
/\d{4}-\d{2}-\d{2}/, // dates
|
|
221
|
+
/\d{2}:\d{2}:\d{2}/, // timestamps
|
|
222
|
+
/^(?:INFO|ERROR|WARN|DEBUG)/m, // log levels
|
|
223
|
+
/^\d+\.\s/m, // numbered lists (too detailed)
|
|
224
|
+
];
|
|
225
|
+
let matchCount = 0;
|
|
226
|
+
for (const pattern of logPatterns) {
|
|
227
|
+
if (pattern.test(skill.body)) {
|
|
228
|
+
matchCount++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (matchCount >= 2) {
|
|
232
|
+
return {
|
|
233
|
+
rule: "log-like-content",
|
|
234
|
+
severity: "warning",
|
|
235
|
+
message: "Body contains log-like patterns. Skills should capture procedures and rules, not logs.",
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
/**
|
|
243
|
+
* Lint a skill
|
|
244
|
+
*/
|
|
245
|
+
export function lintSkill(skill, rules) {
|
|
246
|
+
const rulesToUse = rules ?? LINTER_RULES;
|
|
247
|
+
const results = [];
|
|
248
|
+
for (const rule of rulesToUse) {
|
|
249
|
+
try {
|
|
250
|
+
const result = rule.check(skill);
|
|
251
|
+
if (result) {
|
|
252
|
+
results.push(result);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
results.push({
|
|
257
|
+
rule: rule.name,
|
|
258
|
+
severity: "error",
|
|
259
|
+
message: `Linter error: ${err instanceof Error ? err.message : String(err)}`,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return results;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Lint a skill and return formatted output
|
|
267
|
+
*/
|
|
268
|
+
export function lintSkillFormatted(skill, rules) {
|
|
269
|
+
const results = lintSkill(skill, rules);
|
|
270
|
+
if (results.length === 0) {
|
|
271
|
+
return `✓ ${skill.id}: No issues found`;
|
|
272
|
+
}
|
|
273
|
+
const lines = [`✗ ${skill.id}:`];
|
|
274
|
+
for (const result of results) {
|
|
275
|
+
const icon = result.severity === "error" ? "✗" : result.severity === "warning" ? "⚠" : "ℹ";
|
|
276
|
+
lines.push(` ${icon} [${result.severity}] ${result.rule}: ${result.message}`);
|
|
277
|
+
}
|
|
278
|
+
return lines.join("\n");
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get lint summary for multiple skills
|
|
282
|
+
*/
|
|
283
|
+
export function lintSkillsSummary(skills) {
|
|
284
|
+
const summary = {
|
|
285
|
+
total: skills.length,
|
|
286
|
+
passed: 0,
|
|
287
|
+
failed: 0,
|
|
288
|
+
bySeverity: { error: 0, warning: 0, info: 0 },
|
|
289
|
+
byRule: {},
|
|
290
|
+
};
|
|
291
|
+
for (const skill of skills) {
|
|
292
|
+
const results = lintSkill(skill);
|
|
293
|
+
if (results.length === 0) {
|
|
294
|
+
summary.passed++;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
summary.failed++;
|
|
298
|
+
for (const result of results) {
|
|
299
|
+
summary.bySeverity[result.severity]++;
|
|
300
|
+
summary.byRule[result.rule] = (summary.byRule[result.rule] ?? 0) + 1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return summary;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Create custom lint rule
|
|
308
|
+
*/
|
|
309
|
+
export function createLintRule(name, description, severity, check) {
|
|
310
|
+
return { name, description, severity, check };
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Filter lint results by severity
|
|
314
|
+
*/
|
|
315
|
+
export function filterLintResults(results, minSeverity) {
|
|
316
|
+
const severityOrder = ["info", "warning", "error"];
|
|
317
|
+
const minIndex = severityOrder.indexOf(minSeverity);
|
|
318
|
+
return results.filter((result) => {
|
|
319
|
+
const resultIndex = severityOrder.indexOf(result.severity);
|
|
320
|
+
return resultIndex >= minIndex;
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=linter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Registry
|
|
3
|
+
*
|
|
4
|
+
* Stores and manages skills with progressive disclosure.
|
|
5
|
+
* Based on pi.dev Agent Skills specification.
|
|
6
|
+
*/
|
|
7
|
+
import type { Skill, SkillIndex, MatchOptions, MatchResult, LoadOptions, LoadedSkill } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Skill Registry - manages loaded and indexed skills
|
|
10
|
+
*/
|
|
11
|
+
export declare class SkillRegistry {
|
|
12
|
+
private skills;
|
|
13
|
+
private index;
|
|
14
|
+
private loading;
|
|
15
|
+
/**
|
|
16
|
+
* Register a skill
|
|
17
|
+
*/
|
|
18
|
+
register(skill: Skill): void;
|
|
19
|
+
/**
|
|
20
|
+
* Unregister a skill by ID
|
|
21
|
+
*/
|
|
22
|
+
unregister(skillId: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get a skill by ID
|
|
25
|
+
*/
|
|
26
|
+
get(skillId: string): Skill | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* List all registered skills
|
|
29
|
+
*/
|
|
30
|
+
list(): Skill[];
|
|
31
|
+
/**
|
|
32
|
+
* Get skill index (lightweight)
|
|
33
|
+
*/
|
|
34
|
+
getIndex(): SkillIndex;
|
|
35
|
+
/**
|
|
36
|
+
* Find skills matching a trigger/query
|
|
37
|
+
*/
|
|
38
|
+
find(query: string, options?: MatchOptions): MatchResult[];
|
|
39
|
+
/**
|
|
40
|
+
* Find best matching skill for a query
|
|
41
|
+
*/
|
|
42
|
+
findBestMatch(query: string, options?: MatchOptions): MatchResult | null;
|
|
43
|
+
/**
|
|
44
|
+
* Load a skill's full content (progressive disclosure)
|
|
45
|
+
*/
|
|
46
|
+
load(skillId: string, options?: LoadOptions): Promise<LoadedSkill | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Load skill content from disk
|
|
49
|
+
*/
|
|
50
|
+
private loadSkill;
|
|
51
|
+
/**
|
|
52
|
+
* Update skill index entry
|
|
53
|
+
*/
|
|
54
|
+
private updateIndex;
|
|
55
|
+
/**
|
|
56
|
+
* Clear all skills
|
|
57
|
+
*/
|
|
58
|
+
clear(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get count of registered skills
|
|
61
|
+
*/
|
|
62
|
+
get size(): number;
|
|
63
|
+
/**
|
|
64
|
+
* Check if skill exists
|
|
65
|
+
*/
|
|
66
|
+
has(skillId: string): boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a new skill registry
|
|
70
|
+
*/
|
|
71
|
+
export declare function createSkillRegistry(): SkillRegistry;
|
|
72
|
+
export declare function getGlobalSkillRegistry(): SkillRegistry;
|
|
73
|
+
export declare function setGlobalSkillRegistry(registry: SkillRegistry): void;
|
|
74
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EAEV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EAEZ,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAA0C;IAEzD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAG3B;IAED;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUnC;IAED;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEtC;IAED;;OAEG;IACH,IAAI,IAAI,KAAK,EAAE,CAEd;IAED;;OAEG;IACH,QAAQ,IAAI,UAAU,CAErB;IAED;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,EAAE,CAkFzD;IAED;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAGvE;IAED;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA4B9E;IAED;;OAEG;YACW,SAAS;IA6DvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,KAAK,IAAI,IAAI,CAIZ;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5B;CACF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAOD,wBAAgB,sBAAsB,IAAI,aAAa,CAKtD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAEpE"}
|