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.
Files changed (226) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/harness/loop-runtime.ts +3 -0
  3. package/index.ts +130 -29
  4. package/package.json +2 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/package.json +1 -1
  42. package/packages/knowledge-graph/package.json +1 -1
  43. package/packages/knowledge-retrieval/package.json +1 -1
  44. package/packages/laravel-plugin/package.json +1 -1
  45. package/packages/learning-engine/package.json +1 -1
  46. package/packages/mcp-adapter/package.json +1 -1
  47. package/packages/memory-engine/package.json +1 -1
  48. package/packages/milestone-manager/package.json +1 -1
  49. package/packages/model-registry/package.json +1 -1
  50. package/packages/nextjs-plugin/package.json +1 -1
  51. package/packages/notification/package.json +1 -1
  52. package/packages/observability/package.json +1 -1
  53. package/packages/okf-indexer/package.json +1 -1
  54. package/packages/performance-optimizer/package.json +1 -1
  55. package/packages/privilege-broker/package.json +1 -1
  56. package/packages/project-analyzer/package.json +1 -1
  57. package/packages/project-bootstrap/package.json +1 -1
  58. package/packages/projection-engine/package.json +1 -1
  59. package/packages/prompt-compiler/package.json +1 -1
  60. package/packages/prompt-versioning/package.json +1 -1
  61. package/packages/provider-adapter-sdk/package.json +1 -1
  62. package/packages/provider-router/package.json +1 -1
  63. package/packages/provider-selector/package.json +1 -1
  64. package/packages/providers/package.json +1 -1
  65. package/packages/qdrant-skills/dist/client.d.ts +51 -0
  66. package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
  67. package/packages/qdrant-skills/dist/client.js +105 -0
  68. package/packages/qdrant-skills/dist/client.js.map +1 -0
  69. package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
  70. package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
  71. package/packages/qdrant-skills/dist/embedder.js +101 -0
  72. package/packages/qdrant-skills/dist/embedder.js.map +1 -0
  73. package/packages/qdrant-skills/dist/index.d.ts +25 -0
  74. package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
  75. package/packages/qdrant-skills/dist/index.js +25 -0
  76. package/packages/qdrant-skills/dist/index.js.map +1 -0
  77. package/packages/qdrant-skills/package.json +27 -0
  78. package/packages/qdrant-skills/src/client.ts +178 -0
  79. package/packages/qdrant-skills/src/embedder.ts +137 -0
  80. package/packages/qdrant-skills/src/index.ts +42 -0
  81. package/packages/quota-manager/package.json +1 -1
  82. package/packages/rate-limiter/package.json +1 -1
  83. package/packages/react-vite-plugin/package.json +1 -1
  84. package/packages/release-manager/package.json +1 -1
  85. package/packages/requirement-compiler/package.json +1 -1
  86. package/packages/runtime/package.json +1 -1
  87. package/packages/scheduler/package.json +1 -1
  88. package/packages/scheduler-adapter/package.json +1 -1
  89. package/packages/session/package.json +1 -1
  90. package/packages/session-api/package.json +1 -1
  91. package/packages/session-export/package.json +1 -1
  92. package/packages/shared-context/package.json +1 -1
  93. package/packages/skill-mcp-client/package.json +1 -1
  94. package/packages/skill-registry/package.json +1 -1
  95. package/packages/skills/dist/index.d.ts +40 -0
  96. package/packages/skills/dist/index.d.ts.map +1 -0
  97. package/packages/skills/dist/index.js +84 -0
  98. package/packages/skills/dist/index.js.map +1 -0
  99. package/packages/skills/dist/linter.d.ts +38 -0
  100. package/packages/skills/dist/linter.d.ts.map +1 -0
  101. package/packages/skills/dist/linter.js +323 -0
  102. package/packages/skills/dist/linter.js.map +1 -0
  103. package/packages/skills/dist/loader.d.ts +74 -0
  104. package/packages/skills/dist/loader.d.ts.map +1 -0
  105. package/packages/skills/dist/loader.js +280 -0
  106. package/packages/skills/dist/loader.js.map +1 -0
  107. package/packages/skills/dist/parser.d.ts +32 -0
  108. package/packages/skills/dist/parser.d.ts.map +1 -0
  109. package/packages/skills/dist/parser.js +459 -0
  110. package/packages/skills/dist/parser.js.map +1 -0
  111. package/packages/skills/dist/scanner.d.ts +33 -0
  112. package/packages/skills/dist/scanner.d.ts.map +1 -0
  113. package/packages/skills/dist/scanner.js +257 -0
  114. package/packages/skills/dist/scanner.js.map +1 -0
  115. package/packages/skills/dist/skill-commands.d.ts +33 -0
  116. package/packages/skills/dist/skill-commands.d.ts.map +1 -0
  117. package/packages/skills/dist/skill-commands.js +239 -0
  118. package/packages/skills/dist/skill-commands.js.map +1 -0
  119. package/packages/skills/dist/skill-tool.d.ts +120 -0
  120. package/packages/skills/dist/skill-tool.d.ts.map +1 -0
  121. package/packages/skills/dist/skill-tool.js +239 -0
  122. package/packages/skills/dist/skill-tool.js.map +1 -0
  123. package/packages/skills/dist/skill-versioning.d.ts +123 -0
  124. package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
  125. package/packages/skills/dist/skill-versioning.js +240 -0
  126. package/packages/skills/dist/skill-versioning.js.map +1 -0
  127. package/packages/skills/dist/types.d.ts +226 -0
  128. package/packages/skills/dist/types.d.ts.map +1 -0
  129. package/packages/skills/dist/types.js +21 -0
  130. package/packages/skills/dist/types.js.map +1 -0
  131. package/packages/skills/package.json +46 -0
  132. package/packages/skills/src/index.ts +95 -0
  133. package/packages/skills/src/linter.ts +371 -0
  134. package/packages/skills/src/loader.ts +335 -0
  135. package/packages/skills/src/parser.ts +548 -0
  136. package/packages/skills/src/scanner.ts +322 -0
  137. package/packages/skills/src/skill-commands.ts +318 -0
  138. package/packages/skills/src/skill-tool.ts +324 -0
  139. package/packages/skills/src/skill-versioning.ts +345 -0
  140. package/packages/skills/src/types.ts +259 -0
  141. package/packages/skills/test/init-skills.test.ts +118 -0
  142. package/packages/sprint-planner/package.json +1 -1
  143. package/packages/subscription-engine/package.json +1 -1
  144. package/packages/task-compiler/package.json +1 -1
  145. package/packages/tencentdb-memory/package.json +1 -1
  146. package/packages/tencentdb-sync/package.json +1 -1
  147. package/packages/test-data-generator/package.json +1 -1
  148. package/packages/test-generator/package.json +1 -1
  149. package/packages/todo-bd-sync/package.json +1 -1
  150. package/packages/token-estimation/package.json +1 -1
  151. package/packages/token-optimizer/package.json +1 -1
  152. package/packages/trajectory/dist/src/curator.d.ts +189 -0
  153. package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
  154. package/packages/trajectory/dist/src/curator.js +340 -0
  155. package/packages/trajectory/dist/src/curator.js.map +1 -0
  156. package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
  157. package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
  158. package/packages/trajectory/dist/src/journey-renderer.js +324 -0
  159. package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
  160. package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
  161. package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
  162. package/packages/trajectory/dist/src/learning-graph.js +258 -0
  163. package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
  164. package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
  165. package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
  166. package/packages/trajectory/dist/src/memory-store.js +472 -0
  167. package/packages/trajectory/dist/src/memory-store.js.map +1 -0
  168. package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
  169. package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/review-fork.js +332 -0
  171. package/packages/trajectory/dist/src/review-fork.js.map +1 -0
  172. package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
  173. package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/write-approval.js +281 -0
  175. package/packages/trajectory/dist/src/write-approval.js.map +1 -0
  176. package/packages/trajectory/package.json +1 -1
  177. package/packages/trajectory/src/curator.ts +485 -0
  178. package/packages/trajectory/src/journey-renderer.ts +399 -0
  179. package/packages/trajectory/src/learning-graph.ts +363 -0
  180. package/packages/trajectory/src/memory-store.ts +578 -0
  181. package/packages/trajectory/src/review-fork.ts +450 -0
  182. package/packages/trajectory/src/write-approval.ts +372 -0
  183. package/packages/tui/package.json +1 -1
  184. package/packages/types/package.json +1 -1
  185. package/packages/workflow-events/package.json +1 -1
  186. package/packages/workspace-scanner/package.json +1 -1
  187. package/packages/worktree/package.json +1 -1
  188. package/packages/write-review/dist/blackboard.d.ts +98 -0
  189. package/packages/write-review/dist/blackboard.d.ts.map +1 -0
  190. package/packages/write-review/dist/blackboard.js +289 -0
  191. package/packages/write-review/dist/blackboard.js.map +1 -0
  192. package/packages/write-review/dist/event-bus.d.ts +106 -0
  193. package/packages/write-review/dist/event-bus.d.ts.map +1 -0
  194. package/packages/write-review/dist/event-bus.js +294 -0
  195. package/packages/write-review/dist/event-bus.js.map +1 -0
  196. package/packages/write-review/dist/gate.d.ts +37 -0
  197. package/packages/write-review/dist/gate.d.ts.map +1 -0
  198. package/packages/write-review/dist/gate.js +138 -0
  199. package/packages/write-review/dist/gate.js.map +1 -0
  200. package/packages/write-review/dist/index.d.ts +22 -0
  201. package/packages/write-review/dist/index.d.ts.map +1 -0
  202. package/packages/write-review/dist/index.js +60 -0
  203. package/packages/write-review/dist/index.js.map +1 -0
  204. package/packages/write-review/dist/injection.d.ts +40 -0
  205. package/packages/write-review/dist/injection.d.ts.map +1 -0
  206. package/packages/write-review/dist/injection.js +179 -0
  207. package/packages/write-review/dist/injection.js.map +1 -0
  208. package/packages/write-review/dist/review.d.ts +54 -0
  209. package/packages/write-review/dist/review.d.ts.map +1 -0
  210. package/packages/write-review/dist/review.js +154 -0
  211. package/packages/write-review/dist/review.js.map +1 -0
  212. package/packages/write-review/dist/trigger.d.ts +39 -0
  213. package/packages/write-review/dist/trigger.d.ts.map +1 -0
  214. package/packages/write-review/dist/trigger.js +107 -0
  215. package/packages/write-review/dist/trigger.js.map +1 -0
  216. package/packages/write-review/dist/types.d.ts +78 -0
  217. package/packages/write-review/dist/types.d.ts.map +1 -0
  218. package/packages/write-review/dist/types.js +26 -0
  219. package/packages/write-review/dist/types.js.map +1 -0
  220. package/packages/write-review/package.json +1 -1
  221. package/packages/write-review/src/event-bus.ts +351 -0
  222. package/packages/write-review/src/index.ts +1 -0
  223. package/packages/write-review/src/injection.ts +25 -3
  224. package/proactive-compact.ts +51 -7
  225. package/scripts/sync-skills.ts +275 -0
  226. package/scripts/sync-to-qdrant.ts +398 -0
@@ -0,0 +1,259 @@
1
+ /**
2
+ * pi-harness-runtime Skills System Types
3
+ *
4
+ * Based on:
5
+ * - pi.dev Agent Skills specification (https://pi.dev/docs/latest/skills)
6
+ * - Hermes Agent skill system
7
+ */
8
+
9
+ // === pi.dev Standard Fields (Agent Skills Spec) ===
10
+
11
+ export interface SkillFrontmatter {
12
+ /** Command and display name (kebab-case, max 64 chars) */
13
+ name: string;
14
+ /** Routing description shown to the model (max 1024 chars) */
15
+ description: string;
16
+ /** Skill version in semver format */
17
+ version?: string;
18
+ /** License name or bundled license file */
19
+ license?: string;
20
+ /** Environment requirements (e.g., "unix", "windows") */
21
+ compatibility?: string;
22
+ /** Additional key-value metadata */
23
+ metadata?: Record<string, unknown>;
24
+ /** Experimental pre-approved tool list */
25
+ allowed_tools?: string[];
26
+ /** Hide from automatic model selection */
27
+ disable_model_invocation?: boolean;
28
+ }
29
+
30
+ // === Hermes Extensions ===
31
+
32
+ export interface HermesExtensions {
33
+ /** Who created: "agent" | "user" | "curator" */
34
+ author?: "agent" | "user" | "curator";
35
+ /** Confidence score (0.0 - 1.0) */
36
+ confidence?: number;
37
+ /** Number of times skill was used */
38
+ usage_count?: number;
39
+ /** ISO timestamp when created */
40
+ created_at?: string;
41
+ /** ISO timestamp when last updated */
42
+ updated_at?: string;
43
+ /** Patterns that trigger skill loading */
44
+ triggers?: string[];
45
+ /** Known pitfalls with explanations */
46
+ pitfalls?: SkillPitfall[];
47
+ /** Patterns to avoid */
48
+ anti_patterns?: string[];
49
+ /** Allow curator to auto-patch */
50
+ auto_update?: boolean;
51
+ }
52
+
53
+ export interface SkillPitfall {
54
+ name: string;
55
+ why: string;
56
+ affects?: string;
57
+ }
58
+
59
+ // === Complete Skill ===
60
+
61
+ export interface SkillMetadata extends Partial<SkillFrontmatter>, Partial<HermesExtensions> {}
62
+
63
+ export interface Skill {
64
+ /** Unique identifier (derived from directory name) */
65
+ id: string;
66
+ /** Full path to skill directory */
67
+ path: string;
68
+ /** Parsed frontmatter */
69
+ frontmatter: SkillFrontmatter;
70
+ /** Hermes extensions (merged into metadata) */
71
+ hermes?: HermesExtensions;
72
+ /** Raw body content after frontmatter */
73
+ body: string;
74
+ /** Supported reference files */
75
+ references: SkillReference[];
76
+ /** Example files */
77
+ examples: SkillExample[];
78
+ /** Full metadata (merged frontmatter + hermes) */
79
+ metadata: SkillMetadata;
80
+ /** Loading state */
81
+ loaded: boolean;
82
+ /** Last used timestamp */
83
+ lastUsed?: number;
84
+ /** Lint results (if linted) */
85
+ lintResults?: LintResult[];
86
+ }
87
+
88
+ export interface SkillReference {
89
+ name: string;
90
+ path: string;
91
+ relativePath: string;
92
+ }
93
+
94
+ export interface SkillExample {
95
+ name: string;
96
+ path: string;
97
+ relativePath: string;
98
+ }
99
+
100
+ // === Skill Index (Lightweight) ===
101
+
102
+ export interface SkillIndexEntry {
103
+ id: string;
104
+ name: string;
105
+ description: string;
106
+ path: string;
107
+ version?: string;
108
+ triggers?: string[];
109
+ loaded: boolean;
110
+ }
111
+
112
+ export interface SkillIndex {
113
+ entries: SkillIndexEntry[];
114
+ loadedAt: number;
115
+ }
116
+
117
+ // === Linter Types ===
118
+
119
+ export type LintSeverity = "error" | "warning" | "info";
120
+
121
+ export interface LintResult {
122
+ rule: string;
123
+ severity: LintSeverity;
124
+ message: string;
125
+ line?: number;
126
+ }
127
+
128
+ export interface LintRule {
129
+ name: string;
130
+ description: string;
131
+ severity: LintSeverity;
132
+ check: (skill: Skill) => LintResult | null;
133
+ }
134
+
135
+ // === Scanner Types ===
136
+
137
+ export interface ScanOptions {
138
+ /** Directories to scan */
139
+ directories: string[];
140
+ /** Recursive scan depth (0 = unlimited) */
141
+ maxDepth?: number;
142
+ /** Include hidden directories */
143
+ includeHidden?: boolean;
144
+ /** File patterns to include */
145
+ includePatterns?: string[];
146
+ /** File patterns to exclude */
147
+ excludePatterns?: string[];
148
+ }
149
+
150
+ export interface ScanResult {
151
+ skills: Skill[];
152
+ errors: ScanError[];
153
+ scannedPaths: string[];
154
+ durationMs: number;
155
+ }
156
+
157
+ export interface ScanError {
158
+ path: string;
159
+ error: string;
160
+ }
161
+
162
+ // === Registry Types ===
163
+
164
+ export interface MatchOptions {
165
+ /** Match threshold (0.0 - 1.0) */
166
+ threshold?: number;
167
+ /** Include disabled skills */
168
+ includeDisabled?: boolean;
169
+ /** Sort by score or usage */
170
+ sortBy?: "score" | "usage" | "name";
171
+ }
172
+
173
+ export interface MatchResult {
174
+ skill: Skill;
175
+ score: number;
176
+ matchedTriggers: string[];
177
+ }
178
+
179
+ // === Loader Types ===
180
+
181
+ export interface LoadOptions {
182
+ /** Load references content */
183
+ loadReferences?: boolean;
184
+ /** Load examples content */
185
+ loadExamples?: boolean;
186
+ /** Parse body markdown */
187
+ parseMarkdown?: boolean;
188
+ }
189
+
190
+ export interface LoadedSkill extends Skill {
191
+ /** Loaded reference content */
192
+ referencesContent?: Map<string, string>;
193
+ /** Loaded examples content */
194
+ examplesContent?: Map<string, string>;
195
+ /** Parsed markdown */
196
+ parsedBody?: ParsedMarkdown;
197
+ }
198
+
199
+ export interface ParsedMarkdown {
200
+ html?: string;
201
+ sections?: MarkdownSection[];
202
+ }
203
+
204
+ export interface MarkdownSection {
205
+ level: number;
206
+ title: string;
207
+ content: string;
208
+ }
209
+
210
+ // === Write Approval Types ===
211
+
212
+ export type PendingWriteAction =
213
+ | { action: "create"; skill: Partial<Skill> }
214
+ | { action: "patch"; skillId: string; diff: SkillDiff }
215
+ | { action: "delete"; skillId: string }
216
+ | { action: "write_file"; skillId: string; file: string; content: string }
217
+ | { action: "remove_file"; skillId: string; file: string };
218
+
219
+ export interface PendingWrite {
220
+ id: string;
221
+ action: PendingWriteAction;
222
+ timestamp: number;
223
+ author: "agent" | "user" | "curator";
224
+ status: "pending" | "approved" | "rejected";
225
+ metadata?: Record<string, unknown>;
226
+ }
227
+
228
+ export interface SkillDiff {
229
+ frontmatter?: Partial<SkillFrontmatter>;
230
+ body?: { old: string; new: string };
231
+ references?: { added?: string[]; removed?: string[] };
232
+ examples?: { added?: string[]; removed?: string[] };
233
+ }
234
+
235
+ // === Configuration Types ===
236
+
237
+ export interface SkillsConfig {
238
+ enabled: boolean;
239
+ locations: string[];
240
+ write_approval: boolean;
241
+ auto_create_threshold: number;
242
+ auto_patch_threshold: number;
243
+ progressive_disclosure: boolean;
244
+ default_author: "agent" | "user" | "curator";
245
+ }
246
+
247
+ export const DEFAULT_SKILLS_CONFIG: SkillsConfig = {
248
+ enabled: true,
249
+ locations: [
250
+ "~/.pi-harness/skills",
251
+ "skills",
252
+ ".agents/skills"
253
+ ],
254
+ write_approval: false,
255
+ auto_create_threshold: 3,
256
+ auto_patch_threshold: 1,
257
+ progressive_disclosure: true,
258
+ default_author: "agent"
259
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Skills Initialization E2E Test
3
+ *
4
+ * Tests the initSkills function to ensure:
5
+ * 1. initSkills() with no args uses default directories
6
+ * 2. initSkills({ locations }) with explicit locations works
7
+ * 3. initSkills({ locations: undefined }) falls back to defaults (the bug case)
8
+ *
9
+ * Bug: Previously, passing undefined for locations would override defaults
10
+ * with undefined, causing "directories is not iterable" error.
11
+ *
12
+ * Usage:
13
+ * bun packages/skills/test/init-skills.test.ts
14
+ */
15
+
16
+ import { initSkills } from "../src/index.js";
17
+
18
+ async function runTests() {
19
+ console.log("=== initSkills E2E Test ===\n");
20
+
21
+ let passed = 0;
22
+ let failed = 0;
23
+
24
+ // Test 1: no args
25
+ console.log("[Test 1] initSkills() with no arguments...");
26
+ try {
27
+ const result = initSkills();
28
+ if (!result || !Array.isArray(result.skills) || !Array.isArray(result.errors)) {
29
+ throw new Error("Invalid result structure");
30
+ }
31
+ console.log(` PASS: Returned ${result.skills.length} skills, ${result.errors.length} errors\n`);
32
+ passed++;
33
+ } catch (error) {
34
+ console.error(` FAIL: ${error}\n`);
35
+ failed++;
36
+ }
37
+
38
+ // Test 2: explicit locations
39
+ console.log("[Test 2] initSkills({ locations: [...] })...");
40
+ try {
41
+ const result = initSkills({ locations: ["/tmp/test"] });
42
+ if (!result) {
43
+ throw new Error("No result returned");
44
+ }
45
+ console.log(` PASS: Returned ${result.skills.length} skills\n`);
46
+ passed++;
47
+ } catch (error) {
48
+ console.error(` FAIL: ${error}\n`);
49
+ failed++;
50
+ }
51
+
52
+ // Test 3: undefined locations (the bug case)
53
+ console.log("[Test 3] initSkills({ locations: undefined }) - THE BUG CASE...");
54
+ try {
55
+ const result = initSkills({ locations: undefined });
56
+ if (!result || !Array.isArray(result.skills)) {
57
+ throw new Error("Invalid result structure");
58
+ }
59
+ console.log(` PASS: Returned ${result.skills.length} skills\n`);
60
+ passed++;
61
+ } catch (error) {
62
+ console.error(` FAIL: ${error}\n`);
63
+ failed++;
64
+ }
65
+
66
+ // Test 4: partial config with only maxDepth
67
+ console.log("[Test 4] initSkills({ maxDepth: 5 })...");
68
+ try {
69
+ const result = initSkills({ maxDepth: 5 });
70
+ if (!result || !Array.isArray(result.skills)) {
71
+ throw new Error("Invalid result structure");
72
+ }
73
+ console.log(` PASS: Returned ${result.skills.length} skills\n`);
74
+ passed++;
75
+ } catch (error) {
76
+ console.error(` FAIL: ${error}\n`);
77
+ failed++;
78
+ }
79
+
80
+ // Test 5: partial config with only includeHidden
81
+ console.log("[Test 5] initSkills({ includeHidden: true })...");
82
+ try {
83
+ const result = initSkills({ includeHidden: true });
84
+ if (!result || !Array.isArray(result.skills)) {
85
+ throw new Error("Invalid result structure");
86
+ }
87
+ console.log(` PASS: Returned ${result.skills.length} skills\n`);
88
+ passed++;
89
+ } catch (error) {
90
+ console.error(` FAIL: ${error}\n`);
91
+ failed++;
92
+ }
93
+
94
+ // Test 6: empty locations array
95
+ console.log("[Test 6] initSkills({ locations: [] })...");
96
+ try {
97
+ const result = initSkills({ locations: [] });
98
+ if (!result) {
99
+ throw new Error("No result returned");
100
+ }
101
+ console.log(` PASS: Returned ${result.skills.length} skills\n`);
102
+ passed++;
103
+ } catch (error) {
104
+ console.error(` FAIL: ${error}\n`);
105
+ failed++;
106
+ }
107
+
108
+ // Summary
109
+ console.log("=== Summary ===");
110
+ console.log(`Passed: ${passed}`);
111
+ console.log(`Failed: ${failed}`);
112
+
113
+ if (failed > 0) {
114
+ process.exit(1);
115
+ }
116
+ }
117
+
118
+ runTests();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/sprint-planner",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "type": "module",
5
5
  "description": "Sprint planning engine for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/subscription-engine",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/task-compiler",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Task Compiler for pi-harness-runtime — produces deterministic task DAG from CompiledRequirement",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/tencentdb-memory",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "TencentDB Agent Memory client - sync skills to centralized knowledge base",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/tencentdb-sync",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Sync SKILL.md skills to TencentDB-Agent-Memory server (RFC-0105/0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/test-data-generator",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Test data generation for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/test-generator",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Auto-Test Generator — generate unit and E2E tests from source code (RFC-0013)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/todo-bd-sync",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Two-way sync between rpiv-todo overlay and bd issue tracker",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/token-estimation",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "pi-harness-runtime — token-estimation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/token-optimizer",
3
- "version": "1.1.95",
3
+ "version": "1.1.97",
4
4
  "description": "Token Budget Optimizer — maximize prompt value within token limits (RFC-0011)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Curator - Consolidation and Quality Enforcement
3
+ *
4
+ * Periodic pass that:
5
+ * - Merges fragmented memory into skills
6
+ * - Extracts common patterns into skills
7
+ * - Prunes outdated items
8
+ * - Enforces quality standards
9
+ *
10
+ * Based on Hermes Agent's curator system.
11
+ */
12
+ import type { Trajectory } from "./types.js";
13
+ import type { MemoryEntry } from "./memory-store.js";
14
+ /**
15
+ * Local Skill type to avoid circular dependency
16
+ */
17
+ interface LocalSkill {
18
+ id: string;
19
+ frontmatter: {
20
+ name: string;
21
+ description: string;
22
+ };
23
+ hermes?: {
24
+ author?: string;
25
+ created_at?: string;
26
+ usage_count?: number;
27
+ };
28
+ }
29
+ /**
30
+ * Curator configuration
31
+ */
32
+ export interface CuratorConfig {
33
+ /** Enable curator */
34
+ enabled: boolean;
35
+ /** Days between consolidation passes */
36
+ consolidationIntervalDays: number;
37
+ /** Max memory entries before consolidation */
38
+ memoryThreshold: number;
39
+ /** Min similar entries to trigger merge */
40
+ similarityThreshold: number;
41
+ /** Archive skills older than this */
42
+ archiveAgeDays: number;
43
+ }
44
+ /**
45
+ * Default curator configuration
46
+ */
47
+ export declare const DEFAULT_CURATOR_CONFIG: CuratorConfig;
48
+ /**
49
+ * Curator action types
50
+ */
51
+ export type CuratorAction = {
52
+ type: "merge_memory";
53
+ entries: MemoryEntry[];
54
+ into: string;
55
+ } | {
56
+ type: "extract_skill";
57
+ pattern: string;
58
+ from: string[];
59
+ } | {
60
+ type: "archive_memory";
61
+ id: string;
62
+ } | {
63
+ type: "archive_skill";
64
+ id: string;
65
+ } | {
66
+ type: "patch_skill";
67
+ id: string;
68
+ patch: Partial<LocalSkill>;
69
+ } | {
70
+ type: "prune_low_confidence";
71
+ items: {
72
+ id: string;
73
+ type: "memory" | "skill";
74
+ confidence: number;
75
+ }[];
76
+ };
77
+ /**
78
+ * Curator event types
79
+ */
80
+ export type CuratorEvent = {
81
+ type: "curator.started";
82
+ } | {
83
+ type: "curator.completed";
84
+ actions: CuratorAction[];
85
+ } | {
86
+ type: "curator.action";
87
+ action: CuratorAction;
88
+ } | {
89
+ type: "curator.error";
90
+ error: string;
91
+ };
92
+ /**
93
+ * Curator event handler
94
+ */
95
+ export type CuratorEventHandler = (event: CuratorEvent) => void;
96
+ /**
97
+ * Similarity result
98
+ */
99
+ export interface SimilarityResult {
100
+ entries: MemoryEntry[];
101
+ similarity: number;
102
+ commonTheme: string;
103
+ }
104
+ /**
105
+ * Curator class
106
+ */
107
+ export declare class Curator {
108
+ private config;
109
+ private handlers;
110
+ private lastConsolidation;
111
+ constructor(config?: Partial<CuratorConfig>);
112
+ /**
113
+ * Register event handler
114
+ */
115
+ on(handler: CuratorEventHandler): () => void;
116
+ /**
117
+ * Emit event
118
+ */
119
+ private emit;
120
+ /**
121
+ * Check if consolidation should run
122
+ */
123
+ shouldConsolidate(): boolean;
124
+ /**
125
+ * Run consolidation pass
126
+ */
127
+ consolidate(memory: MemoryEntry[], skills: LocalSkill[], trajectories: Trajectory[]): Promise<CuratorAction[]>;
128
+ /**
129
+ * Find similar memory entries
130
+ */
131
+ findSimilarMemory(memory: MemoryEntry[]): SimilarityResult[];
132
+ /**
133
+ * Extract key terms from content
134
+ */
135
+ private extractTerms;
136
+ /**
137
+ * Suggest memory merge
138
+ */
139
+ private suggestMerge;
140
+ /**
141
+ * Extract patterns from trajectories
142
+ */
143
+ extractPatterns(trajectories: Trajectory[]): string[];
144
+ /**
145
+ * Categorize task from request
146
+ */
147
+ private categorizeTask;
148
+ /**
149
+ * Suggest skill extraction
150
+ */
151
+ private suggestSkillExtraction;
152
+ /**
153
+ * Find outdated items
154
+ */
155
+ findOutdatedItems(memory: MemoryEntry[], skills: LocalSkill[]): Array<{
156
+ id: string;
157
+ type: "memory" | "skill";
158
+ ageDays: number;
159
+ }>;
160
+ /**
161
+ * Suggest archive action
162
+ */
163
+ private suggestArchive;
164
+ /**
165
+ * Suggest skill patch
166
+ */
167
+ private suggestSkillPatch;
168
+ /**
169
+ * Get quality summary
170
+ */
171
+ getQualitySummary(skills: LocalSkill[]): {
172
+ total: number;
173
+ errors: number;
174
+ warnings: number;
175
+ byRule: Record<string, number>;
176
+ };
177
+ /**
178
+ * Update configuration
179
+ */
180
+ updateConfig(config: Partial<CuratorConfig>): void;
181
+ /**
182
+ * Get configuration
183
+ */
184
+ getConfig(): CuratorConfig;
185
+ }
186
+ export declare function getGlobalCurator(): Curator;
187
+ export declare function createCurator(config?: Partial<CuratorConfig>): Curator;
188
+ export {};
189
+ //# sourceMappingURL=curator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../src/curator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAWD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,yBAAyB,EAAE,MAAM,CAAC;IAClC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAMpC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAE5G;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,iBAAiB,CAAsB;IAE/C,YAAY,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAE1C;IAED;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAG3C;IAED;;OAEG;IACH,OAAO,CAAC,IAAI;IAUZ;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAO3B;IAED;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,UAAU,EAAE,EACpB,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO,CAAC,aAAa,EAAE,CAAC,CA6D1B;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAoC3D;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAiCpD;IAED;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,iBAAiB,CACf,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,UAAU,EAAE,GACnB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CA8BlE;IAED;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG;QACvC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAQA;IAED;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAEjD;IAED;;OAEG;IACH,SAAS,IAAI,aAAa,CAEzB;CACF;AAKD,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C;AAED,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAEtE"}