@actrun_ai/tastekit-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist/compiler/compiler.d.ts +24 -0
  2. package/dist/compiler/compiler.d.ts.map +1 -0
  3. package/dist/compiler/compiler.js +153 -0
  4. package/dist/compiler/compiler.js.map +1 -0
  5. package/dist/compiler/constitution-compiler.d.ts +11 -0
  6. package/dist/compiler/constitution-compiler.d.ts.map +1 -0
  7. package/dist/compiler/constitution-compiler.js +154 -0
  8. package/dist/compiler/constitution-compiler.js.map +1 -0
  9. package/dist/compiler/derivation.d.ts +125 -0
  10. package/dist/compiler/derivation.d.ts.map +1 -0
  11. package/dist/compiler/derivation.js +109 -0
  12. package/dist/compiler/derivation.js.map +1 -0
  13. package/dist/compiler/guardrails-compiler.d.ts +11 -0
  14. package/dist/compiler/guardrails-compiler.d.ts.map +1 -0
  15. package/dist/compiler/guardrails-compiler.js +362 -0
  16. package/dist/compiler/guardrails-compiler.js.map +1 -0
  17. package/dist/compiler/index.d.ts +13 -0
  18. package/dist/compiler/index.d.ts.map +1 -0
  19. package/dist/compiler/index.js +13 -0
  20. package/dist/compiler/index.js.map +1 -0
  21. package/dist/compiler/memory-compiler.d.ts +12 -0
  22. package/dist/compiler/memory-compiler.d.ts.map +1 -0
  23. package/dist/compiler/memory-compiler.js +293 -0
  24. package/dist/compiler/memory-compiler.js.map +1 -0
  25. package/dist/compiler/playbook-compiler.d.ts +15 -0
  26. package/dist/compiler/playbook-compiler.d.ts.map +1 -0
  27. package/dist/compiler/playbook-compiler.js +1143 -0
  28. package/dist/compiler/playbook-compiler.js.map +1 -0
  29. package/dist/compiler/skills-compiler.d.ts +15 -0
  30. package/dist/compiler/skills-compiler.d.ts.map +1 -0
  31. package/dist/compiler/skills-compiler.js +203 -0
  32. package/dist/compiler/skills-compiler.js.map +1 -0
  33. package/dist/domains/development-agent/domain.d.ts +8 -0
  34. package/dist/domains/development-agent/domain.d.ts.map +1 -0
  35. package/dist/domains/development-agent/domain.js +35 -0
  36. package/dist/domains/development-agent/domain.js.map +1 -0
  37. package/dist/domains/development-agent/index.d.ts +3 -0
  38. package/dist/domains/development-agent/index.d.ts.map +1 -0
  39. package/dist/domains/development-agent/index.js +3 -0
  40. package/dist/domains/development-agent/index.js.map +1 -0
  41. package/dist/domains/development-agent/rubric.d.ts +13 -0
  42. package/dist/domains/development-agent/rubric.d.ts.map +1 -0
  43. package/dist/domains/development-agent/rubric.js +451 -0
  44. package/dist/domains/development-agent/rubric.js.map +1 -0
  45. package/dist/domains/development-agent/skills/code-review.d.ts +25 -0
  46. package/dist/domains/development-agent/skills/code-review.d.ts.map +1 -0
  47. package/dist/domains/development-agent/skills/code-review.js +146 -0
  48. package/dist/domains/development-agent/skills/code-review.js.map +1 -0
  49. package/dist/domains/development-agent/skills/debugging-issues.d.ts +25 -0
  50. package/dist/domains/development-agent/skills/debugging-issues.d.ts.map +1 -0
  51. package/dist/domains/development-agent/skills/debugging-issues.js +155 -0
  52. package/dist/domains/development-agent/skills/debugging-issues.js.map +1 -0
  53. package/dist/domains/development-agent/skills/documenting-code.d.ts +19 -0
  54. package/dist/domains/development-agent/skills/documenting-code.d.ts.map +1 -0
  55. package/dist/domains/development-agent/skills/documenting-code.js +92 -0
  56. package/dist/domains/development-agent/skills/documenting-code.js.map +1 -0
  57. package/dist/domains/development-agent/skills/index.d.ts +55 -0
  58. package/dist/domains/development-agent/skills/index.d.ts.map +1 -0
  59. package/dist/domains/development-agent/skills/index.js +19 -0
  60. package/dist/domains/development-agent/skills/index.js.map +1 -0
  61. package/dist/domains/development-agent/skills/refactor-plan.d.ts +19 -0
  62. package/dist/domains/development-agent/skills/refactor-plan.d.ts.map +1 -0
  63. package/dist/domains/development-agent/skills/refactor-plan.js +117 -0
  64. package/dist/domains/development-agent/skills/refactor-plan.js.map +1 -0
  65. package/dist/domains/development-agent/skills/writing-tests.d.ts +20 -0
  66. package/dist/domains/development-agent/skills/writing-tests.d.ts.map +1 -0
  67. package/dist/domains/development-agent/skills/writing-tests.js +93 -0
  68. package/dist/domains/development-agent/skills/writing-tests.js.map +1 -0
  69. package/dist/domains/general-agent/domain.d.ts +9 -0
  70. package/dist/domains/general-agent/domain.d.ts.map +1 -0
  71. package/dist/domains/general-agent/domain.js +36 -0
  72. package/dist/domains/general-agent/domain.js.map +1 -0
  73. package/dist/domains/general-agent/index.d.ts +4 -0
  74. package/dist/domains/general-agent/index.d.ts.map +1 -0
  75. package/dist/domains/general-agent/index.js +4 -0
  76. package/dist/domains/general-agent/index.js.map +1 -0
  77. package/dist/domains/general-agent/rubric.d.ts +8 -0
  78. package/dist/domains/general-agent/rubric.d.ts.map +1 -0
  79. package/dist/domains/general-agent/rubric.js +332 -0
  80. package/dist/domains/general-agent/rubric.js.map +1 -0
  81. package/dist/domains/general-agent/skills/context-synthesis.d.ts +19 -0
  82. package/dist/domains/general-agent/skills/context-synthesis.d.ts.map +1 -0
  83. package/dist/domains/general-agent/skills/context-synthesis.js +94 -0
  84. package/dist/domains/general-agent/skills/context-synthesis.js.map +1 -0
  85. package/dist/domains/general-agent/skills/index.d.ts +32 -0
  86. package/dist/domains/general-agent/skills/index.d.ts.map +1 -0
  87. package/dist/domains/general-agent/skills/index.js +11 -0
  88. package/dist/domains/general-agent/skills/index.js.map +1 -0
  89. package/dist/domains/general-agent/skills/task-orchestration.d.ts +19 -0
  90. package/dist/domains/general-agent/skills/task-orchestration.d.ts.map +1 -0
  91. package/dist/domains/general-agent/skills/task-orchestration.js +101 -0
  92. package/dist/domains/general-agent/skills/task-orchestration.js.map +1 -0
  93. package/dist/domains/index.d.ts +21 -0
  94. package/dist/domains/index.d.ts.map +1 -0
  95. package/dist/domains/index.js +37 -0
  96. package/dist/domains/index.js.map +1 -0
  97. package/dist/domains/types.d.ts +22 -0
  98. package/dist/domains/types.d.ts.map +1 -0
  99. package/dist/domains/types.js +2 -0
  100. package/dist/domains/types.js.map +1 -0
  101. package/dist/drift/consolidator.d.ts +47 -0
  102. package/dist/drift/consolidator.d.ts.map +1 -0
  103. package/dist/drift/consolidator.js +116 -0
  104. package/dist/drift/consolidator.js.map +1 -0
  105. package/dist/drift/detector.d.ts +79 -0
  106. package/dist/drift/detector.d.ts.map +1 -0
  107. package/dist/drift/detector.js +424 -0
  108. package/dist/drift/detector.js.map +1 -0
  109. package/dist/drift/index.d.ts +9 -0
  110. package/dist/drift/index.d.ts.map +1 -0
  111. package/dist/drift/index.js +9 -0
  112. package/dist/drift/index.js.map +1 -0
  113. package/dist/drift/proposal.d.ts +108 -0
  114. package/dist/drift/proposal.d.ts.map +1 -0
  115. package/dist/drift/proposal.js +2 -0
  116. package/dist/drift/proposal.js.map +1 -0
  117. package/dist/eval/index.d.ts +9 -0
  118. package/dist/eval/index.d.ts.map +1 -0
  119. package/dist/eval/index.js +9 -0
  120. package/dist/eval/index.js.map +1 -0
  121. package/dist/eval/judge.d.ts +33 -0
  122. package/dist/eval/judge.d.ts.map +1 -0
  123. package/dist/eval/judge.js +209 -0
  124. package/dist/eval/judge.js.map +1 -0
  125. package/dist/eval/replay.d.ts +23 -0
  126. package/dist/eval/replay.d.ts.map +1 -0
  127. package/dist/eval/replay.js +42 -0
  128. package/dist/eval/replay.js.map +1 -0
  129. package/dist/eval/runner.d.ts +35 -0
  130. package/dist/eval/runner.d.ts.map +1 -0
  131. package/dist/eval/runner.js +52 -0
  132. package/dist/eval/runner.js.map +1 -0
  133. package/dist/generators/agents-md-generator.d.ts +9 -0
  134. package/dist/generators/agents-md-generator.d.ts.map +1 -0
  135. package/dist/generators/agents-md-generator.js +71 -0
  136. package/dist/generators/agents-md-generator.js.map +1 -0
  137. package/dist/generators/blocks/domain-context.d.ts +7 -0
  138. package/dist/generators/blocks/domain-context.d.ts.map +1 -0
  139. package/dist/generators/blocks/domain-context.js +26 -0
  140. package/dist/generators/blocks/domain-context.js.map +1 -0
  141. package/dist/generators/blocks/drift-awareness.d.ts +6 -0
  142. package/dist/generators/blocks/drift-awareness.d.ts.map +1 -0
  143. package/dist/generators/blocks/drift-awareness.js +28 -0
  144. package/dist/generators/blocks/drift-awareness.js.map +1 -0
  145. package/dist/generators/blocks/evaluation-criteria.d.ts +7 -0
  146. package/dist/generators/blocks/evaluation-criteria.d.ts.map +1 -0
  147. package/dist/generators/blocks/evaluation-criteria.js +18 -0
  148. package/dist/generators/blocks/evaluation-criteria.js.map +1 -0
  149. package/dist/generators/blocks/guardrails.d.ts +6 -0
  150. package/dist/generators/blocks/guardrails.d.ts.map +1 -0
  151. package/dist/generators/blocks/guardrails.js +44 -0
  152. package/dist/generators/blocks/guardrails.js.map +1 -0
  153. package/dist/generators/blocks/identity.d.ts +6 -0
  154. package/dist/generators/blocks/identity.d.ts.map +1 -0
  155. package/dist/generators/blocks/identity.js +36 -0
  156. package/dist/generators/blocks/identity.js.map +1 -0
  157. package/dist/generators/blocks/memory-policy.d.ts +6 -0
  158. package/dist/generators/blocks/memory-policy.d.ts.map +1 -0
  159. package/dist/generators/blocks/memory-policy.js +34 -0
  160. package/dist/generators/blocks/memory-policy.js.map +1 -0
  161. package/dist/generators/blocks/playbook-index.d.ts +7 -0
  162. package/dist/generators/blocks/playbook-index.d.ts.map +1 -0
  163. package/dist/generators/blocks/playbook-index.js +14 -0
  164. package/dist/generators/blocks/playbook-index.js.map +1 -0
  165. package/dist/generators/blocks/session-rhythm.d.ts +6 -0
  166. package/dist/generators/blocks/session-rhythm.d.ts.map +1 -0
  167. package/dist/generators/blocks/session-rhythm.js +11 -0
  168. package/dist/generators/blocks/session-rhythm.js.map +1 -0
  169. package/dist/generators/blocks/skills-index.d.ts +6 -0
  170. package/dist/generators/blocks/skills-index.d.ts.map +1 -0
  171. package/dist/generators/blocks/skills-index.js +36 -0
  172. package/dist/generators/blocks/skills-index.js.map +1 -0
  173. package/dist/generators/blocks/tool-usage.d.ts +6 -0
  174. package/dist/generators/blocks/tool-usage.d.ts.map +1 -0
  175. package/dist/generators/blocks/tool-usage.js +31 -0
  176. package/dist/generators/blocks/tool-usage.js.map +1 -0
  177. package/dist/generators/blocks/vocabulary.d.ts +7 -0
  178. package/dist/generators/blocks/vocabulary.d.ts.map +1 -0
  179. package/dist/generators/blocks/vocabulary.js +27 -0
  180. package/dist/generators/blocks/vocabulary.js.map +1 -0
  181. package/dist/generators/claude-hooks-compat.d.ts +33 -0
  182. package/dist/generators/claude-hooks-compat.d.ts.map +1 -0
  183. package/dist/generators/claude-hooks-compat.js +322 -0
  184. package/dist/generators/claude-hooks-compat.js.map +1 -0
  185. package/dist/generators/claude-md-generator.d.ts +12 -0
  186. package/dist/generators/claude-md-generator.d.ts.map +1 -0
  187. package/dist/generators/claude-md-generator.js +60 -0
  188. package/dist/generators/claude-md-generator.js.map +1 -0
  189. package/dist/generators/index.d.ts +11 -0
  190. package/dist/generators/index.d.ts.map +1 -0
  191. package/dist/generators/index.js +11 -0
  192. package/dist/generators/index.js.map +1 -0
  193. package/dist/generators/soul-md-generator.d.ts +9 -0
  194. package/dist/generators/soul-md-generator.d.ts.map +1 -0
  195. package/dist/generators/soul-md-generator.js +104 -0
  196. package/dist/generators/soul-md-generator.js.map +1 -0
  197. package/dist/generators/types.d.ts +55 -0
  198. package/dist/generators/types.d.ts.map +1 -0
  199. package/dist/generators/types.js +7 -0
  200. package/dist/generators/types.js.map +1 -0
  201. package/dist/index.d.ts +19 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +20 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/interview/index.d.ts +11 -0
  206. package/dist/interview/index.d.ts.map +1 -0
  207. package/dist/interview/index.js +11 -0
  208. package/dist/interview/index.js.map +1 -0
  209. package/dist/interview/interviewer.d.ts +94 -0
  210. package/dist/interview/interviewer.d.ts.map +1 -0
  211. package/dist/interview/interviewer.js +516 -0
  212. package/dist/interview/interviewer.js.map +1 -0
  213. package/dist/interview/questions.d.ts +15 -0
  214. package/dist/interview/questions.d.ts.map +1 -0
  215. package/dist/interview/questions.js +86 -0
  216. package/dist/interview/questions.js.map +1 -0
  217. package/dist/interview/rubric.d.ts +265 -0
  218. package/dist/interview/rubric.d.ts.map +1 -0
  219. package/dist/interview/rubric.js +74 -0
  220. package/dist/interview/rubric.js.map +1 -0
  221. package/dist/interview/session.d.ts +9 -0
  222. package/dist/interview/session.d.ts.map +1 -0
  223. package/dist/interview/session.js +33 -0
  224. package/dist/interview/session.js.map +1 -0
  225. package/dist/interview/universal-rubric.d.ts +11 -0
  226. package/dist/interview/universal-rubric.d.ts.map +1 -0
  227. package/dist/interview/universal-rubric.js +165 -0
  228. package/dist/interview/universal-rubric.js.map +1 -0
  229. package/dist/llm/index.d.ts +8 -0
  230. package/dist/llm/index.d.ts.map +1 -0
  231. package/dist/llm/index.js +8 -0
  232. package/dist/llm/index.js.map +1 -0
  233. package/dist/llm/provider.d.ts +62 -0
  234. package/dist/llm/provider.d.ts.map +1 -0
  235. package/dist/llm/provider.js +24 -0
  236. package/dist/llm/provider.js.map +1 -0
  237. package/dist/llm/providers/anthropic.d.ts +18 -0
  238. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  239. package/dist/llm/providers/anthropic.js +56 -0
  240. package/dist/llm/providers/anthropic.js.map +1 -0
  241. package/dist/llm/providers/ollama.d.ts +17 -0
  242. package/dist/llm/providers/ollama.d.ts.map +1 -0
  243. package/dist/llm/providers/ollama.js +45 -0
  244. package/dist/llm/providers/ollama.js.map +1 -0
  245. package/dist/llm/providers/openai.d.ts +19 -0
  246. package/dist/llm/providers/openai.d.ts.map +1 -0
  247. package/dist/llm/providers/openai.js +52 -0
  248. package/dist/llm/providers/openai.js.map +1 -0
  249. package/dist/llm/resolve.d.ts +11 -0
  250. package/dist/llm/resolve.d.ts.map +1 -0
  251. package/dist/llm/resolve.js +56 -0
  252. package/dist/llm/resolve.js.map +1 -0
  253. package/dist/mcp/binder.d.ts +28 -0
  254. package/dist/mcp/binder.d.ts.map +1 -0
  255. package/dist/mcp/binder.js +87 -0
  256. package/dist/mcp/binder.js.map +1 -0
  257. package/dist/mcp/client.d.ts +99 -0
  258. package/dist/mcp/client.d.ts.map +1 -0
  259. package/dist/mcp/client.js +196 -0
  260. package/dist/mcp/client.js.map +1 -0
  261. package/dist/mcp/index.d.ts +9 -0
  262. package/dist/mcp/index.d.ts.map +1 -0
  263. package/dist/mcp/index.js +9 -0
  264. package/dist/mcp/index.js.map +1 -0
  265. package/dist/mcp/inspector.d.ts +29 -0
  266. package/dist/mcp/inspector.d.ts.map +1 -0
  267. package/dist/mcp/inspector.js +44 -0
  268. package/dist/mcp/inspector.js.map +1 -0
  269. package/dist/schemas/bindings.d.ts +248 -0
  270. package/dist/schemas/bindings.d.ts.map +1 -0
  271. package/dist/schemas/bindings.js +34 -0
  272. package/dist/schemas/bindings.js.map +1 -0
  273. package/dist/schemas/constitution.d.ts +229 -0
  274. package/dist/schemas/constitution.d.ts.map +1 -0
  275. package/dist/schemas/constitution.js +47 -0
  276. package/dist/schemas/constitution.js.map +1 -0
  277. package/dist/schemas/evalpack.d.ts +322 -0
  278. package/dist/schemas/evalpack.d.ts.map +1 -0
  279. package/dist/schemas/evalpack.js +43 -0
  280. package/dist/schemas/evalpack.js.map +1 -0
  281. package/dist/schemas/guardrails.d.ts +171 -0
  282. package/dist/schemas/guardrails.d.ts.map +1 -0
  283. package/dist/schemas/guardrails.js +35 -0
  284. package/dist/schemas/guardrails.js.map +1 -0
  285. package/dist/schemas/index.d.ts +18 -0
  286. package/dist/schemas/index.d.ts.map +1 -0
  287. package/dist/schemas/index.js +18 -0
  288. package/dist/schemas/index.js.map +1 -0
  289. package/dist/schemas/memory.d.ts +277 -0
  290. package/dist/schemas/memory.d.ts.map +1 -0
  291. package/dist/schemas/memory.js +42 -0
  292. package/dist/schemas/memory.js.map +1 -0
  293. package/dist/schemas/playbook.d.ts +270 -0
  294. package/dist/schemas/playbook.d.ts.map +1 -0
  295. package/dist/schemas/playbook.js +52 -0
  296. package/dist/schemas/playbook.js.map +1 -0
  297. package/dist/schemas/skills.d.ts +320 -0
  298. package/dist/schemas/skills.d.ts.map +1 -0
  299. package/dist/schemas/skills.js +84 -0
  300. package/dist/schemas/skills.js.map +1 -0
  301. package/dist/schemas/trace.d.ts +126 -0
  302. package/dist/schemas/trace.d.ts.map +1 -0
  303. package/dist/schemas/trace.js +70 -0
  304. package/dist/schemas/trace.js.map +1 -0
  305. package/dist/schemas/trust.d.ts +142 -0
  306. package/dist/schemas/trust.d.ts.map +1 -0
  307. package/dist/schemas/trust.js +30 -0
  308. package/dist/schemas/trust.js.map +1 -0
  309. package/dist/schemas/validators.d.ts +26 -0
  310. package/dist/schemas/validators.d.ts.map +1 -0
  311. package/dist/schemas/validators.js +79 -0
  312. package/dist/schemas/validators.js.map +1 -0
  313. package/dist/schemas/workspace.d.ts +725 -0
  314. package/dist/schemas/workspace.d.ts.map +1 -0
  315. package/dist/schemas/workspace.js +119 -0
  316. package/dist/schemas/workspace.js.map +1 -0
  317. package/dist/skills/constraints.d.ts +19 -0
  318. package/dist/skills/constraints.d.ts.map +1 -0
  319. package/dist/skills/constraints.js +91 -0
  320. package/dist/skills/constraints.js.map +1 -0
  321. package/dist/skills/generator.d.ts +13 -0
  322. package/dist/skills/generator.d.ts.map +1 -0
  323. package/dist/skills/generator.js +126 -0
  324. package/dist/skills/generator.js.map +1 -0
  325. package/dist/skills/graph.d.ts +42 -0
  326. package/dist/skills/graph.d.ts.map +1 -0
  327. package/dist/skills/graph.js +217 -0
  328. package/dist/skills/graph.js.map +1 -0
  329. package/dist/skills/index.d.ts +13 -0
  330. package/dist/skills/index.d.ts.map +1 -0
  331. package/dist/skills/index.js +13 -0
  332. package/dist/skills/index.js.map +1 -0
  333. package/dist/skills/linter.d.ts +22 -0
  334. package/dist/skills/linter.d.ts.map +1 -0
  335. package/dist/skills/linter.js +201 -0
  336. package/dist/skills/linter.js.map +1 -0
  337. package/dist/skills/packer.d.ts +27 -0
  338. package/dist/skills/packer.d.ts.map +1 -0
  339. package/dist/skills/packer.js +72 -0
  340. package/dist/skills/packer.js.map +1 -0
  341. package/dist/skills/tracker.d.ts +27 -0
  342. package/dist/skills/tracker.d.ts.map +1 -0
  343. package/dist/skills/tracker.js +131 -0
  344. package/dist/skills/tracker.js.map +1 -0
  345. package/dist/skills/versioner.d.ts +19 -0
  346. package/dist/skills/versioner.d.ts.map +1 -0
  347. package/dist/skills/versioner.js +76 -0
  348. package/dist/skills/versioner.js.map +1 -0
  349. package/dist/tracing/index.d.ts +8 -0
  350. package/dist/tracing/index.d.ts.map +1 -0
  351. package/dist/tracing/index.js +8 -0
  352. package/dist/tracing/index.js.map +1 -0
  353. package/dist/tracing/reader.d.ts +18 -0
  354. package/dist/tracing/reader.d.ts.map +1 -0
  355. package/dist/tracing/reader.js +34 -0
  356. package/dist/tracing/reader.js.map +1 -0
  357. package/dist/tracing/tracer.d.ts +22 -0
  358. package/dist/tracing/tracer.d.ts.map +1 -0
  359. package/dist/tracing/tracer.js +105 -0
  360. package/dist/tracing/tracer.js.map +1 -0
  361. package/dist/trust/auditor.d.ts +35 -0
  362. package/dist/trust/auditor.d.ts.map +1 -0
  363. package/dist/trust/auditor.js +78 -0
  364. package/dist/trust/auditor.js.map +1 -0
  365. package/dist/trust/index.d.ts +8 -0
  366. package/dist/trust/index.d.ts.map +1 -0
  367. package/dist/trust/index.js +8 -0
  368. package/dist/trust/index.js.map +1 -0
  369. package/dist/trust/manager.d.ts +18 -0
  370. package/dist/trust/manager.d.ts.map +1 -0
  371. package/dist/trust/manager.js +60 -0
  372. package/dist/trust/manager.js.map +1 -0
  373. package/dist/utils/filesystem.d.ts +15 -0
  374. package/dist/utils/filesystem.d.ts.map +1 -0
  375. package/dist/utils/filesystem.js +53 -0
  376. package/dist/utils/filesystem.js.map +1 -0
  377. package/dist/utils/hash.d.ts +7 -0
  378. package/dist/utils/hash.d.ts.map +1 -0
  379. package/dist/utils/hash.js +15 -0
  380. package/dist/utils/hash.js.map +1 -0
  381. package/dist/utils/index.d.ts +7 -0
  382. package/dist/utils/index.d.ts.map +1 -0
  383. package/dist/utils/index.js +7 -0
  384. package/dist/utils/index.js.map +1 -0
  385. package/dist/utils/yaml.d.ts +6 -0
  386. package/dist/utils/yaml.d.ts.map +1 -0
  387. package/dist/utils/yaml.js +14 -0
  388. package/dist/utils/yaml.js.map +1 -0
  389. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../schemas/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AAEH,eAAO,MAAM,qBAAqB;;;;IAKhC,mEAAmE;;IAGnE,gDAAgD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAchD,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE9E,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY;IACvB,uDAAuD;;IAEvD,iCAAiC;;IAEjC,sCAAsC;;IAEtC,uEAAuE;;;;;;;;;;;;EAEvE,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;IAIlC,0DAA0D;;IAE1D,wDAAwD;;IAExD,2EAA2E;;QAxB3E,uDAAuD;;QAEvD,iCAAiC;;QAEjC,sCAAsC;;QAEtC,uEAAuE;;;;;;;;;;;;;IAoBvE,iEAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMjE,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;QAzB/B,0DAA0D;;QAE1D,wDAAwD;;QAExD,2EAA2E;;YAxB3E,uDAAuD;;YAEvD,iCAAiC;;YAEjC,sCAAsC;;YAEtC,uEAAuE;;;;;;;;;;;;;QAoBvE,iEAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BjE,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;IAe7B,kCAAkC;;IAGlC,sCAAsC;;;;;;;;;;;IAMtC,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;YAhExC,0DAA0D;;YAE1D,wDAAwD;;YAExD,2EAA2E;;gBAxB3E,uDAAuD;;gBAEvD,iCAAiC;;gBAEjC,sCAAsC;;gBAEtC,uEAAuE;;;;;;;;;;;;;YAoBvE,iEAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6DjE,8DAA8D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE9D,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { z } from 'zod';
2
+ import { LLMProviderConfigSchema } from '../llm/provider.js';
3
+ /**
4
+ * Workspace Configuration Schema
5
+ *
6
+ * Configuration for a TasteKit workspace (.tastekit/tastekit.yaml)
7
+ */
8
+ export const WorkspaceConfigSchema = z.object({
9
+ version: z.string().describe('TasteKit version'),
10
+ project_name: z.string(),
11
+ created_at: z.string().datetime(),
12
+ /** Selected domain (e.g., 'general-agent', 'development-agent') */
13
+ domain_id: z.string().optional(),
14
+ /** LLM provider configuration for onboarding */
15
+ llm_provider: LLMProviderConfigSchema.optional(),
16
+ onboarding: z.object({
17
+ depth: z.enum(['quick', 'guided', 'operator']),
18
+ completed: z.boolean().default(false),
19
+ session_path: z.string().optional().describe('Path to canonical session.json'),
20
+ }).optional(),
21
+ compilation: z.object({
22
+ last_compiled_at: z.string().datetime().optional(),
23
+ artifacts_version: z.string().optional(),
24
+ }).optional(),
25
+ /** Voice configuration — validated by @actrun_ai/tastekit-voice at runtime */
26
+ voice: z.any().optional(),
27
+ });
28
+ /**
29
+ * Interview transcript turn
30
+ */
31
+ export const InterviewTurnSchema = z.object({
32
+ turn_number: z.number(),
33
+ role: z.enum(['interviewer', 'user']),
34
+ content: z.string(),
35
+ timestamp: z.string(),
36
+ dimension_refs: z.array(z.string()).optional(),
37
+ });
38
+ /**
39
+ * Confidence signal — a single piece of evidence from a conversation turn.
40
+ * Accumulates toward the dimension's confidence threshold (default 1.5).
41
+ */
42
+ export const SignalSchema = z.object({
43
+ /** Weight: HIGH=1.0, MED=0.6, LOW=0.3, INFERRED=0.2 */
44
+ weight: z.number(),
45
+ /** How the signal was derived */
46
+ source: z.enum(['explicit', 'implicit', 'inferred', 'anti']),
47
+ /** Which turn produced this signal */
48
+ turn_number: z.number(),
49
+ /** Optional excerpt from the conversation that produced this signal */
50
+ excerpt: z.string().optional(),
51
+ });
52
+ /**
53
+ * Dimension coverage tracking — with confidence-weighted signal extraction.
54
+ *
55
+ * Backward compatible: old sessions without confidence/signals still work
56
+ * because all new fields have defaults.
57
+ */
58
+ export const DimensionCoverageSchema = z.object({
59
+ dimension_id: z.string(),
60
+ status: z.enum(['not_started', 'in_progress', 'covered', 'skipped']),
61
+ /** Cumulative confidence score (sum of signal weights) */
62
+ confidence: z.number().min(0).default(0),
63
+ /** Confidence threshold for resolution (default 1.5) */
64
+ confidence_threshold: z.number().default(1.5),
65
+ /** Signal history — each observation that contributed to this dimension */
66
+ signals: z.array(SignalSchema).default([]),
67
+ /** Explicit negatives — things the user said they do NOT want */
68
+ anti_signals: z.array(z.string()).default([]),
69
+ summary: z.string().optional(),
70
+ extracted_facts: z.array(z.string()).optional(),
71
+ relevant_turns: z.array(z.number()),
72
+ });
73
+ export const InterviewMetaSchema = z.object({
74
+ pacing_position: z.enum(['early', 'mid', 'late']).optional(),
75
+ fatigue_detected: z.boolean().optional(),
76
+ framework_active: z.string().optional(),
77
+ draft_triggered: z.boolean().default(false),
78
+ confirmation_count: z.number().default(0),
79
+ });
80
+ /**
81
+ * Interview state (for resume support)
82
+ */
83
+ export const InterviewStateSchema = z.object({
84
+ transcript: z.array(InterviewTurnSchema),
85
+ dimension_coverage: z.array(DimensionCoverageSchema),
86
+ is_complete: z.boolean(),
87
+ turn_count: z.number(),
88
+ interview_meta: InterviewMetaSchema.optional(),
89
+ structured_answers: z.any().optional(),
90
+ });
91
+ /**
92
+ * Session State Schema
93
+ *
94
+ * Resumable onboarding state (canonical: .tastekit/session.json)
95
+ * All new fields are optional for backward compatibility with old sessions.
96
+ */
97
+ export const SessionStateSchema = z.object({
98
+ session_id: z.string(),
99
+ started_at: z.string().datetime(),
100
+ last_updated_at: z.string().datetime(),
101
+ depth: z.enum(['quick', 'guided', 'operator']),
102
+ current_step: z.string(),
103
+ completed_steps: z.array(z.string()),
104
+ answers: z.record(z.any()).describe('User answers by question ID'),
105
+ metadata: z.record(z.any()).optional(),
106
+ // --- LLM interview extensions (all optional for backward compat) ---
107
+ /** Domain selected during init */
108
+ domain_id: z.string().optional(),
109
+ /** LLM provider used for interview */
110
+ llm_provider: z.object({
111
+ name: z.string(),
112
+ model: z.string().optional(),
113
+ }).optional(),
114
+ /** Full interview state (for resume) */
115
+ interview: InterviewStateSchema.optional(),
116
+ /** Structured answers extracted by LLM at end of interview */
117
+ structured_answers: z.any().optional(),
118
+ });
119
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../schemas/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ConstraintResult } from '../schemas/skills.js';
2
+ /** Skills must not exceed a maximum size. */
3
+ export declare function validateSize(content: string, maxBytes?: number): ConstraintResult;
4
+ /** Evolved version can't be more than N% larger than the original. */
5
+ export declare function validateGrowth(original: string, evolved: string, maxGrowthPercent?: number): ConstraintResult;
6
+ /** Skill content must not be empty. */
7
+ export declare function validateNonEmpty(content: string): ConstraintResult;
8
+ /**
9
+ * Skill must have required SKILL.md sections.
10
+ *
11
+ * Required: Purpose, Procedure (or Steps), and Inputs (or Outputs).
12
+ */
13
+ export declare function validateStructure(content: string): ConstraintResult;
14
+ /** Run all constraints. Returns array of results (all must pass for acceptance). */
15
+ export declare function validateAll(content: string, baseline?: string, opts?: {
16
+ maxBytes?: number;
17
+ maxGrowthPct?: number;
18
+ }): ConstraintResult[];
19
+ //# sourceMappingURL=constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../skills/constraints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAYxD,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,gBAAgB,CAU5F;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,gBAAgB,SAAyB,GACxC,gBAAgB,CAuBlB;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAOlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAwBnE;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAClD,gBAAgB,EAAE,CAYpB"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Skill Constraint Validation
3
+ *
4
+ * Safety gates that every evolved skill must pass before acceptance.
5
+ * Adapted from NousResearch/hermes-agent-self-evolution constraint system.
6
+ */
7
+ const DEFAULT_MAX_BYTES = 15360; // 15KB
8
+ const DEFAULT_MAX_GROWTH_PCT = 20;
9
+ /** Skills must not exceed a maximum size. */
10
+ export function validateSize(content, maxBytes = DEFAULT_MAX_BYTES) {
11
+ const size = Buffer.byteLength(content, 'utf-8');
12
+ return {
13
+ passed: size <= maxBytes,
14
+ constraint_id: 'size_limit',
15
+ message: size <= maxBytes
16
+ ? `Size OK (${size} bytes)`
17
+ : `Skill exceeds max size: ${size} > ${maxBytes} bytes`,
18
+ details: { size, maxBytes },
19
+ };
20
+ }
21
+ /** Evolved version can't be more than N% larger than the original. */
22
+ export function validateGrowth(original, evolved, maxGrowthPercent = DEFAULT_MAX_GROWTH_PCT) {
23
+ const originalSize = Buffer.byteLength(original, 'utf-8');
24
+ const evolvedSize = Buffer.byteLength(evolved, 'utf-8');
25
+ if (originalSize === 0) {
26
+ return {
27
+ passed: true,
28
+ constraint_id: 'growth_limit',
29
+ message: 'Original was empty — growth check skipped',
30
+ };
31
+ }
32
+ const growthPct = ((evolvedSize - originalSize) / originalSize) * 100;
33
+ const passed = growthPct <= maxGrowthPercent;
34
+ return {
35
+ passed,
36
+ constraint_id: 'growth_limit',
37
+ message: passed
38
+ ? `Growth OK (${growthPct.toFixed(1)}%)`
39
+ : `Skill grew too much: ${growthPct.toFixed(1)}% > ${maxGrowthPercent}% allowed`,
40
+ details: { originalSize, evolvedSize, growthPct: Math.round(growthPct * 10) / 10, maxGrowthPercent },
41
+ };
42
+ }
43
+ /** Skill content must not be empty. */
44
+ export function validateNonEmpty(content) {
45
+ const stripped = content.trim();
46
+ return {
47
+ passed: stripped.length > 0,
48
+ constraint_id: 'non_empty',
49
+ message: stripped.length > 0 ? 'Content is non-empty' : 'Skill content is empty',
50
+ };
51
+ }
52
+ /**
53
+ * Skill must have required SKILL.md sections.
54
+ *
55
+ * Required: Purpose, Procedure (or Steps), and Inputs (or Outputs).
56
+ */
57
+ export function validateStructure(content) {
58
+ const lower = content.toLowerCase();
59
+ const requiredPatterns = [
60
+ { name: 'Purpose', patterns: ['## purpose', '# purpose', 'purpose:'] },
61
+ { name: 'Procedure', patterns: ['## procedure', '# procedure', '## steps', '# steps', 'procedure:'] },
62
+ { name: 'Inputs/Outputs', patterns: ['## inputs', '# inputs', '## outputs', '# outputs', 'inputs:', 'outputs:'] },
63
+ ];
64
+ const missing = [];
65
+ for (const req of requiredPatterns) {
66
+ const found = req.patterns.some(p => lower.includes(p));
67
+ if (!found)
68
+ missing.push(req.name);
69
+ }
70
+ return {
71
+ passed: missing.length === 0,
72
+ constraint_id: 'structure',
73
+ message: missing.length === 0
74
+ ? 'All required sections present'
75
+ : `Missing required sections: ${missing.join(', ')}`,
76
+ details: { missing },
77
+ };
78
+ }
79
+ /** Run all constraints. Returns array of results (all must pass for acceptance). */
80
+ export function validateAll(content, baseline, opts) {
81
+ const results = [
82
+ validateNonEmpty(content),
83
+ validateSize(content, opts?.maxBytes),
84
+ validateStructure(content),
85
+ ];
86
+ if (baseline) {
87
+ results.push(validateGrowth(baseline, content, opts?.maxGrowthPct));
88
+ }
89
+ return results;
90
+ }
91
+ //# sourceMappingURL=constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../skills/constraints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { SkillsManifestV1 } from '../schemas/skills.js';
2
+ import { ConstitutionV1 } from '../schemas/constitution.js';
3
+ /**
4
+ * Skills generator
5
+ *
6
+ * Generates Skills library from constitution and user profile.
7
+ */
8
+ export interface SkillGenerationOptions {
9
+ workspacePath: string;
10
+ constitution: ConstitutionV1;
11
+ }
12
+ export declare function generateSkills(options: SkillGenerationOptions): SkillsManifestV1;
13
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../skills/generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;GAIG;AAEH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,cAAc,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,gBAAgB,CAuChF"}
@@ -0,0 +1,126 @@
1
+ import { join } from 'path';
2
+ import { writeFileSafe } from '../utils/filesystem.js';
3
+ import { stringifyYAML } from '../utils/yaml.js';
4
+ export function generateSkills(options) {
5
+ const { workspacePath, constitution } = options;
6
+ const skillsPath = join(workspacePath, 'skills');
7
+ // Generate default skills based on constitution
8
+ const skills = [];
9
+ // Example: Content creation skill
10
+ const contentSkill = {
11
+ skill_id: 'content_creation',
12
+ name: 'Content Creation',
13
+ description: 'Create written content following user taste and principles',
14
+ tags: ['writing', 'content', 'creative'],
15
+ risk_level: 'low',
16
+ required_tools: [],
17
+ compatible_runtimes: ['claude-code', 'manus', 'openclaw'],
18
+ };
19
+ skills.push(contentSkill);
20
+ // Generate SKILL.md for content creation
21
+ const contentSkillMd = generateSkillMarkdown(contentSkill, constitution);
22
+ writeFileSafe(join(skillsPath, 'content_creation', 'SKILL.md'), contentSkillMd);
23
+ // Generate manifest
24
+ const manifest = {
25
+ schema_version: 'skills_manifest.v1',
26
+ skills,
27
+ };
28
+ writeFileSafe(join(skillsPath, 'manifest.v1.yaml'), stringifyYAML(manifest));
29
+ return manifest;
30
+ }
31
+ /**
32
+ * Convert a skill_id to a valid Agent Skills name (kebab-case).
33
+ */
34
+ function toAgentSkillsName(skillId) {
35
+ return skillId
36
+ .toLowerCase()
37
+ .replace(/_/g, '-')
38
+ .replace(/[^a-z0-9-]/g, '')
39
+ .slice(0, 64);
40
+ }
41
+ function generateSkillMarkdown(skill, constitution) {
42
+ const name = toAgentSkillsName(skill.skill_id);
43
+ const description = skill.description.slice(0, 1024);
44
+ return `---
45
+ name: ${name}
46
+ description: ${description}
47
+ ---
48
+
49
+ # ${skill.name}
50
+
51
+ ## Purpose
52
+
53
+ ${skill.description}
54
+
55
+ ## When to use
56
+
57
+ Use this skill when you need to create written content that follows the user's taste profile and principles.
58
+
59
+ ## When not to use
60
+
61
+ Do not use this skill for:
62
+ - Technical documentation (use technical writing skill instead)
63
+ - Code generation (use code generation skill instead)
64
+ - Data analysis reports (use data analysis skill instead)
65
+
66
+ ## Inputs
67
+
68
+ - **topic**: The topic or subject to write about
69
+ - **format**: Desired format (article, blog post, email, etc.)
70
+ - **length**: Target length (short, medium, long)
71
+
72
+ ## Outputs
73
+
74
+ - Written content following user's tone and principles
75
+ - Metadata about the content (word count, reading time, etc.)
76
+
77
+ ## Procedure
78
+
79
+ ### Minimal context (always load)
80
+
81
+ 1. Review user's top principles:
82
+ ${constitution.principles.slice(0, 3).map(p => ` - ${p.statement}`).join('\n')}
83
+
84
+ 2. Apply tone preferences:
85
+ - Voice: ${constitution.tone.voice_keywords.join(', ')}
86
+ - Avoid: ${constitution.tone.forbidden_phrases.join(', ') || 'none specified'}
87
+
88
+ ### On invoke (load when skill is invoked)
89
+
90
+ 3. Analyze the topic and determine appropriate structure
91
+ 4. Draft content following principles and tone
92
+ 5. Review for forbidden phrases and principle violations
93
+ 6. Refine and polish
94
+
95
+ ### On demand resources (load only if needed)
96
+
97
+ - **examples.md**: Example content in user's preferred style
98
+ - **templates/**: Content templates for different formats
99
+
100
+ ## Quality checks
101
+
102
+ - [ ] Content follows top 3 principles
103
+ - [ ] Tone matches voice keywords
104
+ - [ ] No forbidden phrases used
105
+ - [ ] Appropriate length for format
106
+ - [ ] Clear structure and flow
107
+
108
+ ## Guardrail notes
109
+
110
+ This skill does not require approval for:
111
+ - Draft generation
112
+ - Content refinement
113
+
114
+ This skill requires approval for:
115
+ - Publishing content externally
116
+ - Sending content via email or messaging
117
+
118
+ ## Progressive disclosure
119
+
120
+ This skill uses progressive disclosure to minimize context:
121
+ - **Minimal context**: Top principles and tone (always loaded)
122
+ - **On invoke**: Full procedure and quality checks (loaded when skill runs)
123
+ - **On demand**: Examples and templates (loaded only if explicitly needed)
124
+ `;
125
+ }
126
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../skills/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAejD,MAAM,UAAU,cAAc,CAAC,OAA+B;IAC5D,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAEjD,gDAAgD;IAChD,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,kCAAkC;IAClC,MAAM,YAAY,GAAkB;QAClC,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,4DAA4D;QACzE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;QACxC,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,EAAE;QAClB,mBAAmB,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC;KAC1D,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE1B,yCAAyC;IACzC,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACzE,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAChD,cAAc,CACf,CAAC;IAEF,oBAAoB;IACpB,MAAM,QAAQ,GAAqB;QACjC,cAAc,EAAE,oBAAoB;QACpC,MAAM;KACP,CAAC;IAEF,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EACpC,aAAa,CAAC,QAAQ,CAAC,CACxB,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,OAAO;SACX,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAoB,EAAE,YAA4B;IAC/E,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO;QACD,IAAI;eACG,WAAW;;;IAGtB,KAAK,CAAC,IAAI;;;;EAIZ,KAAK,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BjB,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;cAGlE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;cAC3C,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC/E,CAAC;AACF,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { SkillsManifestV1 } from '../schemas/skills.js';
2
+ /**
3
+ * Skill Graph Analyzer
4
+ *
5
+ * Analyzes relationships between skills: pipelines, orphans,
6
+ * cycles, and missing references.
7
+ */
8
+ export interface SkillGraphAnalysis {
9
+ /** Total number of skills */
10
+ node_count: number;
11
+ /** Total number of relationships (feeds_into + prerequisites) */
12
+ edge_count: number;
13
+ /** Graph density: edges / (nodes * (nodes - 1)) */
14
+ density: number;
15
+ /** Skills with no relationships */
16
+ orphans: string[];
17
+ /** Skills with 3+ connections */
18
+ hubs: string[];
19
+ /** Detected linear chains (A → B → C) */
20
+ pipelines: string[][];
21
+ /** Circular dependencies (should be empty) */
22
+ cycles: string[][];
23
+ /** References to non-existent skills */
24
+ missing_refs: Array<{
25
+ skill_id: string;
26
+ missing_ref: string;
27
+ relationship: string;
28
+ }>;
29
+ }
30
+ /**
31
+ * Analyze the skill graph from a manifest.
32
+ */
33
+ export declare function analyzeSkillGraph(manifest: SkillsManifestV1): SkillGraphAnalysis;
34
+ /**
35
+ * Get the pipeline path starting from a given skill.
36
+ */
37
+ export declare function getPipelinePath(manifest: SkillsManifestV1, startSkill: string): string[];
38
+ /**
39
+ * Recommend next skills based on a completed skill.
40
+ */
41
+ export declare function recommendNextSkill(manifest: SkillsManifestV1, completedSkill: string): string[];
42
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../skills/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,sBAAsB,CAAC;AAEvE;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACtB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,wCAAwC;IACxC,YAAY,EAAE,KAAK,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,CAgGhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB/F"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Analyze the skill graph from a manifest.
3
+ */
4
+ export function analyzeSkillGraph(manifest) {
5
+ const skills = manifest.skills;
6
+ const skillIds = new Set(skills.map(s => s.skill_id));
7
+ const nodeCount = skills.length;
8
+ // Build adjacency lists
9
+ const outEdges = new Map(); // skill → skills it feeds into
10
+ const inEdges = new Map(); // skill → skills that feed into it
11
+ const allConnections = new Map(); // skill → total connection count
12
+ const missingRefs = [];
13
+ let edgeCount = 0;
14
+ for (const skill of skills) {
15
+ if (!outEdges.has(skill.skill_id))
16
+ outEdges.set(skill.skill_id, new Set());
17
+ if (!inEdges.has(skill.skill_id))
18
+ inEdges.set(skill.skill_id, new Set());
19
+ if (!allConnections.has(skill.skill_id))
20
+ allConnections.set(skill.skill_id, 0);
21
+ // Process feeds_into
22
+ for (const target of skill.feeds_into ?? []) {
23
+ if (!skillIds.has(target)) {
24
+ missingRefs.push({ skill_id: skill.skill_id, missing_ref: target, relationship: 'feeds_into' });
25
+ continue;
26
+ }
27
+ outEdges.get(skill.skill_id).add(target);
28
+ if (!inEdges.has(target))
29
+ inEdges.set(target, new Set());
30
+ inEdges.get(target).add(skill.skill_id);
31
+ edgeCount++;
32
+ allConnections.set(skill.skill_id, (allConnections.get(skill.skill_id) ?? 0) + 1);
33
+ allConnections.set(target, (allConnections.get(target) ?? 0) + 1);
34
+ }
35
+ // Process prerequisites
36
+ for (const prereq of skill.prerequisites ?? []) {
37
+ if (!skillIds.has(prereq)) {
38
+ missingRefs.push({ skill_id: skill.skill_id, missing_ref: prereq, relationship: 'prerequisites' });
39
+ continue;
40
+ }
41
+ // prerequisites is the reverse of feeds_into
42
+ if (!outEdges.has(prereq))
43
+ outEdges.set(prereq, new Set());
44
+ outEdges.get(prereq).add(skill.skill_id);
45
+ inEdges.get(skill.skill_id).add(prereq);
46
+ edgeCount++;
47
+ allConnections.set(skill.skill_id, (allConnections.get(skill.skill_id) ?? 0) + 1);
48
+ allConnections.set(prereq, (allConnections.get(prereq) ?? 0) + 1);
49
+ }
50
+ // Process alternatives (bidirectional, but count once)
51
+ for (const alt of skill.alternatives ?? []) {
52
+ if (!skillIds.has(alt)) {
53
+ missingRefs.push({ skill_id: skill.skill_id, missing_ref: alt, relationship: 'alternatives' });
54
+ }
55
+ }
56
+ }
57
+ // Deduplicate edges (feeds_into and prerequisites may create duplicates)
58
+ edgeCount = 0;
59
+ const seenEdges = new Set();
60
+ for (const [source, targets] of outEdges) {
61
+ for (const target of targets) {
62
+ const key = `${source}→${target}`;
63
+ if (!seenEdges.has(key)) {
64
+ seenEdges.add(key);
65
+ edgeCount++;
66
+ }
67
+ }
68
+ }
69
+ // Calculate density
70
+ const density = nodeCount > 1 ? edgeCount / (nodeCount * (nodeCount - 1)) : 0;
71
+ // Find orphans (no connections at all)
72
+ const orphans = skills
73
+ .filter(s => (allConnections.get(s.skill_id) ?? 0) === 0)
74
+ .map(s => s.skill_id);
75
+ // Find hubs (3+ connections)
76
+ const hubs = [...allConnections.entries()]
77
+ .filter(([, count]) => count >= 3)
78
+ .map(([id]) => id);
79
+ // Detect pipelines (linear chains)
80
+ const pipelines = detectPipelines(skills, outEdges, inEdges);
81
+ // Detect cycles
82
+ const cycles = detectCycles(skills, outEdges);
83
+ return {
84
+ node_count: nodeCount,
85
+ edge_count: edgeCount,
86
+ density,
87
+ orphans,
88
+ hubs,
89
+ pipelines,
90
+ cycles,
91
+ missing_refs: missingRefs,
92
+ };
93
+ }
94
+ /**
95
+ * Get the pipeline path starting from a given skill.
96
+ */
97
+ export function getPipelinePath(manifest, startSkill) {
98
+ const skillMap = new Map(manifest.skills.map(s => [s.skill_id, s]));
99
+ const path = [startSkill];
100
+ const visited = new Set([startSkill]);
101
+ let current = startSkill;
102
+ while (true) {
103
+ const skill = skillMap.get(current);
104
+ if (!skill?.feeds_into?.length)
105
+ break;
106
+ const next = skill.feeds_into[0]; // Follow first feed
107
+ if (visited.has(next))
108
+ break; // Cycle
109
+ if (!skillMap.has(next))
110
+ break; // Missing ref
111
+ path.push(next);
112
+ visited.add(next);
113
+ current = next;
114
+ }
115
+ return path;
116
+ }
117
+ /**
118
+ * Recommend next skills based on a completed skill.
119
+ */
120
+ export function recommendNextSkill(manifest, completedSkill) {
121
+ const skill = manifest.skills.find(s => s.skill_id === completedSkill);
122
+ if (!skill)
123
+ return [];
124
+ const nextSkills = [];
125
+ // Direct feeds_into
126
+ if (skill.feeds_into) {
127
+ nextSkills.push(...skill.feeds_into);
128
+ }
129
+ // Skills that list this as a prerequisite
130
+ for (const s of manifest.skills) {
131
+ if (s.prerequisites?.includes(completedSkill) && !nextSkills.includes(s.skill_id)) {
132
+ nextSkills.push(s.skill_id);
133
+ }
134
+ }
135
+ return nextSkills;
136
+ }
137
+ /**
138
+ * Detect linear pipeline chains in the graph.
139
+ */
140
+ function detectPipelines(skills, outEdges, inEdges) {
141
+ const pipelines = [];
142
+ const visited = new Set();
143
+ // Find chain starts: skills with outgoing edges but no incoming edges
144
+ for (const skill of skills) {
145
+ const incoming = inEdges.get(skill.skill_id);
146
+ const outgoing = outEdges.get(skill.skill_id);
147
+ if ((!incoming || incoming.size === 0) && outgoing && outgoing.size > 0) {
148
+ // This is a pipeline start
149
+ const chain = followChain(skill.skill_id, outEdges, visited);
150
+ if (chain.length >= 2) {
151
+ pipelines.push(chain);
152
+ }
153
+ }
154
+ }
155
+ return pipelines;
156
+ }
157
+ function followChain(start, outEdges, visited) {
158
+ const chain = [start];
159
+ visited.add(start);
160
+ let current = start;
161
+ while (true) {
162
+ const targets = outEdges.get(current);
163
+ if (!targets || targets.size === 0)
164
+ break;
165
+ // Follow the first unvisited target
166
+ let next = null;
167
+ for (const t of targets) {
168
+ if (!visited.has(t)) {
169
+ next = t;
170
+ break;
171
+ }
172
+ }
173
+ if (!next)
174
+ break;
175
+ chain.push(next);
176
+ visited.add(next);
177
+ current = next;
178
+ }
179
+ return chain;
180
+ }
181
+ /**
182
+ * Detect cycles using DFS-based cycle detection.
183
+ */
184
+ function detectCycles(skills, outEdges) {
185
+ const cycles = [];
186
+ const WHITE = 0, GRAY = 1, BLACK = 2;
187
+ const color = new Map();
188
+ const parent = new Map();
189
+ for (const skill of skills) {
190
+ color.set(skill.skill_id, WHITE);
191
+ }
192
+ function dfs(node, path) {
193
+ color.set(node, GRAY);
194
+ path.push(node);
195
+ for (const neighbor of outEdges.get(node) ?? []) {
196
+ if (color.get(neighbor) === GRAY) {
197
+ // Found a cycle — extract it
198
+ const cycleStart = path.indexOf(neighbor);
199
+ if (cycleStart >= 0) {
200
+ cycles.push(path.slice(cycleStart));
201
+ }
202
+ }
203
+ else if (color.get(neighbor) === WHITE) {
204
+ dfs(neighbor, path);
205
+ }
206
+ }
207
+ path.pop();
208
+ color.set(node, BLACK);
209
+ }
210
+ for (const skill of skills) {
211
+ if (color.get(skill.skill_id) === WHITE) {
212
+ dfs(skill.skill_id, []);
213
+ }
214
+ }
215
+ return cycles;
216
+ }
217
+ //# sourceMappingURL=graph.js.map