@humanbased/crosscheck 1.2.0-beta.80 → 1.2.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 (301) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +388 -149
  3. package/README.zh.md +1 -1
  4. package/crosscheck.config.example.yml +2 -63
  5. package/dist/__tests__/codex.test.js +27 -14
  6. package/dist/__tests__/codex.test.js.map +1 -1
  7. package/dist/__tests__/comment-bodies.test.js +1 -49
  8. package/dist/__tests__/comment-bodies.test.js.map +1 -1
  9. package/dist/__tests__/conflict-resolve.test.js +1 -44
  10. package/dist/__tests__/conflict-resolve.test.js.map +1 -1
  11. package/dist/__tests__/fix.test.js +0 -33
  12. package/dist/__tests__/fix.test.js.map +1 -1
  13. package/dist/__tests__/onboard-preservation.test.js +0 -5
  14. package/dist/__tests__/onboard-preservation.test.js.map +1 -1
  15. package/dist/__tests__/optimize.test.js +0 -2
  16. package/dist/__tests__/optimize.test.js.map +1 -1
  17. package/dist/__tests__/repo-picker.test.js +1 -7
  18. package/dist/__tests__/repo-picker.test.js.map +1 -1
  19. package/dist/__tests__/review-comment-body.test.js +0 -35
  20. package/dist/__tests__/review-comment-body.test.js.map +1 -1
  21. package/dist/__tests__/review-models.test.js +3 -19
  22. package/dist/__tests__/review-models.test.js.map +1 -1
  23. package/dist/__tests__/runner.test.js +1 -29
  24. package/dist/__tests__/runner.test.js.map +1 -1
  25. package/dist/cli.js +0 -29
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/onboard.d.ts +0 -11
  28. package/dist/commands/onboard.d.ts.map +1 -1
  29. package/dist/commands/onboard.js +2 -88
  30. package/dist/commands/onboard.js.map +1 -1
  31. package/dist/commands/review.d.ts.map +1 -1
  32. package/dist/commands/review.js +6 -65
  33. package/dist/commands/review.js.map +1 -1
  34. package/dist/commands/run.d.ts.map +1 -1
  35. package/dist/commands/run.js +3 -23
  36. package/dist/commands/run.js.map +1 -1
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +1 -53
  39. package/dist/commands/status.js.map +1 -1
  40. package/dist/commands/watch.d.ts.map +1 -1
  41. package/dist/commands/watch.js +6 -52
  42. package/dist/commands/watch.js.map +1 -1
  43. package/dist/config/loader.d.ts +1 -3
  44. package/dist/config/loader.d.ts.map +1 -1
  45. package/dist/config/loader.js +0 -13
  46. package/dist/config/loader.js.map +1 -1
  47. package/dist/config/review-model-tiers.json +3 -3
  48. package/dist/config/schema.d.ts +10 -254
  49. package/dist/config/schema.d.ts.map +1 -1
  50. package/dist/config/schema.js +2 -62
  51. package/dist/config/schema.js.map +1 -1
  52. package/dist/github/client.d.ts +1 -6
  53. package/dist/github/client.d.ts.map +1 -1
  54. package/dist/github/client.js +7 -15
  55. package/dist/github/client.js.map +1 -1
  56. package/dist/issues/ticket-ref.d.ts.map +1 -1
  57. package/dist/issues/ticket-ref.js +5 -6
  58. package/dist/issues/ticket-ref.js.map +1 -1
  59. package/dist/lib/clone.d.ts +0 -1
  60. package/dist/lib/clone.d.ts.map +1 -1
  61. package/dist/lib/clone.js +10 -32
  62. package/dist/lib/clone.js.map +1 -1
  63. package/dist/lib/comment-bodies.d.ts +0 -35
  64. package/dist/lib/comment-bodies.d.ts.map +1 -1
  65. package/dist/lib/comment-bodies.js +9 -43
  66. package/dist/lib/comment-bodies.js.map +1 -1
  67. package/dist/lib/repo-picker.d.ts +0 -3
  68. package/dist/lib/repo-picker.d.ts.map +1 -1
  69. package/dist/lib/repo-picker.js +9 -45
  70. package/dist/lib/repo-picker.js.map +1 -1
  71. package/dist/lib/review-models.d.ts +2 -15
  72. package/dist/lib/review-models.d.ts.map +1 -1
  73. package/dist/lib/review-models.js +6 -26
  74. package/dist/lib/review-models.js.map +1 -1
  75. package/dist/lib/runner.d.ts +0 -12
  76. package/dist/lib/runner.d.ts.map +1 -1
  77. package/dist/lib/runner.js +42 -186
  78. package/dist/lib/runner.js.map +1 -1
  79. package/dist/lib/workflow.d.ts +0 -9
  80. package/dist/lib/workflow.d.ts.map +1 -1
  81. package/dist/lib/workflow.js +0 -20
  82. package/dist/lib/workflow.js.map +1 -1
  83. package/dist/reviewers/claude.d.ts +1 -4
  84. package/dist/reviewers/claude.d.ts.map +1 -1
  85. package/dist/reviewers/claude.js +7 -39
  86. package/dist/reviewers/claude.js.map +1 -1
  87. package/dist/reviewers/codex.d.ts +1 -3
  88. package/dist/reviewers/codex.d.ts.map +1 -1
  89. package/dist/reviewers/codex.js +70 -76
  90. package/dist/reviewers/codex.js.map +1 -1
  91. package/dist/reviewers/conflict-resolve.d.ts +1 -3
  92. package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
  93. package/dist/reviewers/conflict-resolve.js +6 -21
  94. package/dist/reviewers/conflict-resolve.js.map +1 -1
  95. package/dist/reviewers/fix.d.ts +2 -5
  96. package/dist/reviewers/fix.d.ts.map +1 -1
  97. package/dist/reviewers/fix.js +10 -26
  98. package/dist/reviewers/fix.js.map +1 -1
  99. package/get-started.md +4 -139
  100. package/package.json +3 -4
  101. package/assets/icon-256.png +0 -0
  102. package/assets/linear-comment.svg +0 -18
  103. package/assets/linear-onboard.svg +0 -30
  104. package/assets/linear-status.svg +0 -23
  105. package/assets/linear-test.svg +0 -34
  106. package/assets/skills/code-review/.crosscheck-skill.json +0 -9
  107. package/assets/skills/code-review/LICENSE +0 -21
  108. package/assets/skills/code-review/SKILL.md +0 -89
  109. package/assets/skills/code-review/agents/openai.yaml +0 -3
  110. package/assets/skills/code-review-skill/.crosscheck-skill.json +0 -9
  111. package/assets/skills/code-review-skill/LICENSE +0 -21
  112. package/assets/skills/code-review-skill/SKILL.md +0 -231
  113. package/assets/skills/code-review-skill/assets/pr-review-template.md +0 -137
  114. package/assets/skills/code-review-skill/assets/review-checklist.md +0 -123
  115. package/assets/skills/code-review-skill/reference/angular.md +0 -768
  116. package/assets/skills/code-review-skill/reference/architecture-review-guide.md +0 -472
  117. package/assets/skills/code-review-skill/reference/c.md +0 -890
  118. package/assets/skills/code-review-skill/reference/code-quality-universal.md +0 -488
  119. package/assets/skills/code-review-skill/reference/code-review-best-practices.md +0 -136
  120. package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +0 -286
  121. package/assets/skills/code-review-skill/reference/cpp.md +0 -893
  122. package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +0 -515
  123. package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +0 -492
  124. package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +0 -309
  125. package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +0 -308
  126. package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +0 -264
  127. package/assets/skills/code-review-skill/reference/csharp.md +0 -525
  128. package/assets/skills/code-review-skill/reference/css-less-sass.md +0 -661
  129. package/assets/skills/code-review-skill/reference/django.md +0 -985
  130. package/assets/skills/code-review-skill/reference/fastapi.md +0 -580
  131. package/assets/skills/code-review-skill/reference/go.md +0 -993
  132. package/assets/skills/code-review-skill/reference/java.md +0 -409
  133. package/assets/skills/code-review-skill/reference/java8.md +0 -586
  134. package/assets/skills/code-review-skill/reference/kotlin.md +0 -1018
  135. package/assets/skills/code-review-skill/reference/nestjs.md +0 -593
  136. package/assets/skills/code-review-skill/reference/performance-review-guide.md +0 -816
  137. package/assets/skills/code-review-skill/reference/php.md +0 -684
  138. package/assets/skills/code-review-skill/reference/python.md +0 -1073
  139. package/assets/skills/code-review-skill/reference/qt.md +0 -757
  140. package/assets/skills/code-review-skill/reference/react.md +0 -871
  141. package/assets/skills/code-review-skill/reference/ruby.md +0 -964
  142. package/assets/skills/code-review-skill/reference/rust.md +0 -846
  143. package/assets/skills/code-review-skill/reference/security-review-guide.md +0 -494
  144. package/assets/skills/code-review-skill/reference/svelte.md +0 -1064
  145. package/assets/skills/code-review-skill/reference/swift.md +0 -936
  146. package/assets/skills/code-review-skill/reference/typescript.md +0 -1016
  147. package/assets/skills/code-review-skill/reference/vue.md +0 -924
  148. package/assets/skills/code-review-skill/reference/zig.md +0 -440
  149. package/assets/skills/code-review-skill/scripts/pr-analyzer.py +0 -435
  150. package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +0 -380
  151. package/assets/skills/codebase-design/.crosscheck-skill.json +0 -9
  152. package/assets/skills/codebase-design/DEEPENING.md +0 -37
  153. package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +0 -44
  154. package/assets/skills/codebase-design/LICENSE +0 -21
  155. package/assets/skills/codebase-design/SKILL.md +0 -114
  156. package/assets/skills/codebase-design/agents/openai.yaml +0 -3
  157. package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +0 -9
  158. package/assets/skills/diagnosing-bugs/LICENSE +0 -21
  159. package/assets/skills/diagnosing-bugs/SKILL.md +0 -134
  160. package/assets/skills/diagnosing-bugs/agents/openai.yaml +0 -3
  161. package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +0 -41
  162. package/dist/__tests__/can-write-verdict.test.d.ts +0 -2
  163. package/dist/__tests__/can-write-verdict.test.d.ts.map +0 -1
  164. package/dist/__tests__/can-write-verdict.test.js +0 -31
  165. package/dist/__tests__/can-write-verdict.test.js.map +0 -1
  166. package/dist/__tests__/linear-branding.test.d.ts +0 -2
  167. package/dist/__tests__/linear-branding.test.d.ts.map +0 -1
  168. package/dist/__tests__/linear-branding.test.js +0 -156
  169. package/dist/__tests__/linear-branding.test.js.map +0 -1
  170. package/dist/__tests__/linear-client.test.d.ts +0 -2
  171. package/dist/__tests__/linear-client.test.d.ts.map +0 -1
  172. package/dist/__tests__/linear-client.test.js +0 -120
  173. package/dist/__tests__/linear-client.test.js.map +0 -1
  174. package/dist/__tests__/linear-comment.test.d.ts +0 -2
  175. package/dist/__tests__/linear-comment.test.d.ts.map +0 -1
  176. package/dist/__tests__/linear-comment.test.js +0 -151
  177. package/dist/__tests__/linear-comment.test.js.map +0 -1
  178. package/dist/__tests__/linear-identity.test.d.ts +0 -2
  179. package/dist/__tests__/linear-identity.test.d.ts.map +0 -1
  180. package/dist/__tests__/linear-identity.test.js +0 -253
  181. package/dist/__tests__/linear-identity.test.js.map +0 -1
  182. package/dist/__tests__/linear-notify.test.d.ts +0 -2
  183. package/dist/__tests__/linear-notify.test.d.ts.map +0 -1
  184. package/dist/__tests__/linear-notify.test.js +0 -144
  185. package/dist/__tests__/linear-notify.test.js.map +0 -1
  186. package/dist/__tests__/linear-ref.test.d.ts +0 -2
  187. package/dist/__tests__/linear-ref.test.d.ts.map +0 -1
  188. package/dist/__tests__/linear-ref.test.js +0 -261
  189. package/dist/__tests__/linear-ref.test.js.map +0 -1
  190. package/dist/__tests__/linear-test-ref.test.d.ts +0 -2
  191. package/dist/__tests__/linear-test-ref.test.d.ts.map +0 -1
  192. package/dist/__tests__/linear-test-ref.test.js +0 -81
  193. package/dist/__tests__/linear-test-ref.test.js.map +0 -1
  194. package/dist/__tests__/linear-verify.test.d.ts +0 -2
  195. package/dist/__tests__/linear-verify.test.d.ts.map +0 -1
  196. package/dist/__tests__/linear-verify.test.js +0 -132
  197. package/dist/__tests__/linear-verify.test.js.map +0 -1
  198. package/dist/__tests__/linear-worker.test.d.ts +0 -2
  199. package/dist/__tests__/linear-worker.test.d.ts.map +0 -1
  200. package/dist/__tests__/linear-worker.test.js +0 -83
  201. package/dist/__tests__/linear-worker.test.js.map +0 -1
  202. package/dist/__tests__/linear-write-possible.test.d.ts +0 -2
  203. package/dist/__tests__/linear-write-possible.test.d.ts.map +0 -1
  204. package/dist/__tests__/linear-write-possible.test.js +0 -30
  205. package/dist/__tests__/linear-write-possible.test.js.map +0 -1
  206. package/dist/__tests__/repository-guidance.test.d.ts +0 -2
  207. package/dist/__tests__/repository-guidance.test.d.ts.map +0 -1
  208. package/dist/__tests__/repository-guidance.test.js +0 -107
  209. package/dist/__tests__/repository-guidance.test.js.map +0 -1
  210. package/dist/__tests__/review-strategy.test.d.ts +0 -2
  211. package/dist/__tests__/review-strategy.test.d.ts.map +0 -1
  212. package/dist/__tests__/review-strategy.test.js +0 -195
  213. package/dist/__tests__/review-strategy.test.js.map +0 -1
  214. package/dist/__tests__/skill-attribution.test.d.ts +0 -2
  215. package/dist/__tests__/skill-attribution.test.d.ts.map +0 -1
  216. package/dist/__tests__/skill-attribution.test.js +0 -53
  217. package/dist/__tests__/skill-attribution.test.js.map +0 -1
  218. package/dist/__tests__/skill-broker.test.d.ts +0 -2
  219. package/dist/__tests__/skill-broker.test.d.ts.map +0 -1
  220. package/dist/__tests__/skill-broker.test.js +0 -144
  221. package/dist/__tests__/skill-broker.test.js.map +0 -1
  222. package/dist/__tests__/skill-catalog.test.d.ts +0 -2
  223. package/dist/__tests__/skill-catalog.test.d.ts.map +0 -1
  224. package/dist/__tests__/skill-catalog.test.js +0 -40
  225. package/dist/__tests__/skill-catalog.test.js.map +0 -1
  226. package/dist/__tests__/skill-installer.test.d.ts +0 -2
  227. package/dist/__tests__/skill-installer.test.d.ts.map +0 -1
  228. package/dist/__tests__/skill-installer.test.js +0 -96
  229. package/dist/__tests__/skill-installer.test.js.map +0 -1
  230. package/dist/__tests__/skills-config.test.d.ts +0 -2
  231. package/dist/__tests__/skills-config.test.d.ts.map +0 -1
  232. package/dist/__tests__/skills-config.test.js +0 -12
  233. package/dist/__tests__/skills-config.test.js.map +0 -1
  234. package/dist/commands/linear-test.d.ts +0 -18
  235. package/dist/commands/linear-test.d.ts.map +0 -1
  236. package/dist/commands/linear-test.js +0 -130
  237. package/dist/commands/linear-test.js.map +0 -1
  238. package/dist/commands/skill.d.ts +0 -2
  239. package/dist/commands/skill.d.ts.map +0 -1
  240. package/dist/commands/skill.js +0 -16
  241. package/dist/commands/skill.js.map +0 -1
  242. package/dist/config/review-strategy.json +0 -202
  243. package/dist/lib/repository-guidance.d.ts +0 -2
  244. package/dist/lib/repository-guidance.d.ts.map +0 -1
  245. package/dist/lib/repository-guidance.js +0 -55
  246. package/dist/lib/repository-guidance.js.map +0 -1
  247. package/dist/lib/review-strategy.d.ts +0 -62
  248. package/dist/lib/review-strategy.d.ts.map +0 -1
  249. package/dist/lib/review-strategy.js +0 -235
  250. package/dist/lib/review-strategy.js.map +0 -1
  251. package/dist/linear/client.d.ts +0 -18
  252. package/dist/linear/client.d.ts.map +0 -1
  253. package/dist/linear/client.js +0 -67
  254. package/dist/linear/client.js.map +0 -1
  255. package/dist/linear/comment.d.ts +0 -20
  256. package/dist/linear/comment.d.ts.map +0 -1
  257. package/dist/linear/comment.js +0 -57
  258. package/dist/linear/comment.js.map +0 -1
  259. package/dist/linear/identity.d.ts +0 -59
  260. package/dist/linear/identity.d.ts.map +0 -1
  261. package/dist/linear/identity.js +0 -187
  262. package/dist/linear/identity.js.map +0 -1
  263. package/dist/linear/notify.d.ts +0 -35
  264. package/dist/linear/notify.d.ts.map +0 -1
  265. package/dist/linear/notify.js +0 -76
  266. package/dist/linear/notify.js.map +0 -1
  267. package/dist/linear/ref.d.ts +0 -13
  268. package/dist/linear/ref.d.ts.map +0 -1
  269. package/dist/linear/ref.js +0 -90
  270. package/dist/linear/ref.js.map +0 -1
  271. package/dist/linear/verify.d.ts +0 -26
  272. package/dist/linear/verify.d.ts.map +0 -1
  273. package/dist/linear/verify.js +0 -67
  274. package/dist/linear/verify.js.map +0 -1
  275. package/dist/skills/attribution.d.ts +0 -4
  276. package/dist/skills/attribution.d.ts.map +0 -1
  277. package/dist/skills/attribution.js +0 -14
  278. package/dist/skills/attribution.js.map +0 -1
  279. package/dist/skills/broker-server.d.ts +0 -2
  280. package/dist/skills/broker-server.d.ts.map +0 -1
  281. package/dist/skills/broker-server.js +0 -17
  282. package/dist/skills/broker-server.js.map +0 -1
  283. package/dist/skills/broker.d.ts +0 -42
  284. package/dist/skills/broker.d.ts.map +0 -1
  285. package/dist/skills/broker.js +0 -285
  286. package/dist/skills/broker.js.map +0 -1
  287. package/dist/skills/catalog.d.ts +0 -28
  288. package/dist/skills/catalog.d.ts.map +0 -1
  289. package/dist/skills/catalog.js +0 -104
  290. package/dist/skills/catalog.js.map +0 -1
  291. package/dist/skills/installer.d.ts +0 -10
  292. package/dist/skills/installer.d.ts.map +0 -1
  293. package/dist/skills/installer.js +0 -138
  294. package/dist/skills/installer.js.map +0 -1
  295. package/dist/skills/integrity.d.ts +0 -4
  296. package/dist/skills/integrity.d.ts.map +0 -1
  297. package/dist/skills/integrity.js +0 -36
  298. package/dist/skills/integrity.js.map +0 -1
  299. package/docs/dynamic-thoroughness.md +0 -286
  300. package/docs/linear-identity-contract.md +0 -139
  301. package/docs/linear-identity.md +0 -293
@@ -1,90 +0,0 @@
1
- // Write-side ref resolution: which Linear issue should crosscheck comment on?
2
- //
3
- // Extraction primitives live in src/issues/ticket-ref.ts and are reused here —
4
- // this module only adds the two things the write path needs on top:
5
- //
6
- // 1. linear.app issue URLs, which are unambiguous and so need no configuration.
7
- // 2. A stricter policy for bare identifiers: they are only honoured for team keys
8
- // the operator has configured. Enrichment can afford to match `UTF-8` and let
9
- // the lookup return nothing, because a failed read is a no-op. A failed *write*
10
- // would post a review comment onto an unrelated issue, so the write path
11
- // requires the operator to name their team keys first.
12
- import { extractTicketRefs, parseTicketId } from '../issues/ticket-ref.js';
13
- // The identifier occupies one whole path segment. Lookaheads kept getting this
14
- // wrong in both directions: requiring `/` or end-of-path missed `IN-42.` at the
15
- // end of a sentence, and allowing any non-alphanumeric accepted `IN-123-typo` as
16
- // `IN-123`. Take the segment, strip trailing sentence punctuation, and require
17
- // parseTicketId to match it whole.
18
- const ISSUE_SEGMENTS = /^\/([^/]+)\/issue\/([^/]+)/i;
19
- // Leading punctuation is safe to allow — but only characters that cannot be part
20
- // of a hostname, so `notlinear.app` still cannot match. Missing `(linear.app/...)`
21
- // made it fall through to the bare-ID extractor, which returns no workspace and
22
- // so silently loses the workspace-mismatch protection.
23
- const BARE_URL = /(?:^|[\s([{<"'`,;])linear\.app\/([^/\s]+)\/issue\/([^/\s]+)/gi;
24
- // Absolute URLs are parsed and their hostname compared exactly. A boundary check
25
- // on the text is not enough: `https://evil.example/linear.app/acme/issue/IN-1`
26
- // satisfies any "character before linear.app" rule while pointing somewhere else.
27
- const ABSOLUTE_URL = /\bhttps?:\/\/[^\s<>()"'`]+/gi;
28
- /** Trailing sentence punctuation is never part of an identifier. */
29
- function stripTrailingPunctuation(segment) {
30
- return segment.replace(/[.,;:!?)\]}>'"]+$/, '');
31
- }
32
- function fromUrl(text) {
33
- for (const match of text.matchAll(ABSOLUTE_URL)) {
34
- let parsed;
35
- try {
36
- parsed = new URL(match[0]);
37
- }
38
- catch {
39
- continue;
40
- }
41
- if (parsed.hostname.toLowerCase() !== 'linear.app')
42
- continue;
43
- const segments = parsed.pathname.match(ISSUE_SEGMENTS);
44
- if (!segments)
45
- continue;
46
- const ref = parseTicketId(stripTrailingPunctuation(segments[2]));
47
- if (ref)
48
- return withWorkspace(ref, segments[1]);
49
- }
50
- // Iterate, like the absolute-URL path above: a malformed candidate earlier in
51
- // the text must not stop a valid one later from resolving.
52
- for (const bare of text.matchAll(BARE_URL)) {
53
- const ref = parseTicketId(stripTrailingPunctuation(bare[2]));
54
- if (ref)
55
- return withWorkspace(ref, bare[1]);
56
- }
57
- return null;
58
- }
59
- // An explicit URL names a workspace. Identifiers are only unique within one, so
60
- // dropping the slug lets a URL for workspace A resolve against credentials for
61
- // workspace B and comment on B's same-numbered issue.
62
- function withWorkspace(ref, workspace) {
63
- return { ...ref, workspace: workspace.toLowerCase(), source: 'body' };
64
- }
65
- function matchField(text, teamKeys) {
66
- const url = fromUrl(text);
67
- if (url)
68
- return url;
69
- // Bare identifiers only for configured keys — see the module header.
70
- if (teamKeys.length === 0)
71
- return null;
72
- const bare = extractTicketRefs({ title: text }, [...teamKeys])[0];
73
- return bare ? { ...bare, source: 'body' } : null;
74
- }
75
- export function extractLinearRef(pr, teamKeys) {
76
- const fields = [
77
- [pr.branch, 'branch'],
78
- [pr.title, 'title'],
79
- [pr.body, 'body'],
80
- ];
81
- for (const [text, source] of fields) {
82
- if (!text)
83
- continue;
84
- const ref = matchField(text, teamKeys);
85
- if (ref)
86
- return { ...ref, source };
87
- }
88
- return null;
89
- }
90
- //# sourceMappingURL=ref.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/linear/ref.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,oEAAoE;AACpE,EAAE;AACF,kFAAkF;AAClF,oFAAoF;AACpF,mFAAmF;AACnF,qFAAqF;AACrF,8EAA8E;AAC9E,4DAA4D;AAE5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAkB,MAAM,yBAAyB,CAAA;AAc1F,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,mCAAmC;AACnC,MAAM,cAAc,GAAG,6BAA6B,CAAA;AACpD,iFAAiF;AACjF,mFAAmF;AACnF,gFAAgF;AAChF,uDAAuD;AACvD,MAAM,QAAQ,GAAG,+DAA+D,CAAA;AAEhF,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,MAAM,YAAY,GAAG,8BAA8B,CAAA;AAEnD,oEAAoE;AACpE,SAAS,wBAAwB,CAAC,OAAe;IAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,MAAW,CAAA;QACf,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,YAAY;YAAE,SAAQ;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QACtD,IAAI,CAAC,QAAQ;YAAE,SAAQ;QACvB,MAAM,GAAG,GAAG,aAAa,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,IAAI,GAAG;YAAE,OAAO,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,8EAA8E;IAC9E,2DAA2D;IAC3D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5D,IAAI,GAAG;YAAE,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,sDAAsD;AACtD,SAAS,aAAa,CAAC,GAAc,EAAE,SAAiB;IACtD,OAAO,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAA2B;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IAEnB,qEAAqE;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAc,EAAE,QAA2B;IAC1E,MAAM,MAAM,GAAiE;QAC3E,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QACrB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;QACnB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;KAClB,CAAA;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACtC,IAAI,GAAG;YAAE,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAA;IACpC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,26 +0,0 @@
1
- import { type LinearAuthMode, type LinearCredentials, type ResolveOptions, type ResolvedLinearAuth } from './identity.js';
2
- import { type LinearRequestOptions } from './client.js';
3
- import type { LinearConfig } from '../config/schema.js';
4
- export interface LinearIdentityReport {
5
- ok: boolean;
6
- mode: LinearAuthMode;
7
- /** Actor name writes will carry, including any per-step suffix the caller applies. */
8
- actor: string;
9
- organization?: string;
10
- /**
11
- * 'app' — writes render as the OAuth application (botActor). The goal state.
12
- * 'user' — writes attribute to a human account. What IN-2271 is eliminating.
13
- */
14
- attribution: 'app' | 'user';
15
- /** In api_key mode, the human account writes currently attribute to. */
16
- attributesTo?: string;
17
- /** Populated when ok is false. Never contains credential material. */
18
- error?: string;
19
- /**
20
- * The identity this probe resolved, so callers can reuse it instead of minting
21
- * a second token. Absent when resolution failed.
22
- */
23
- auth?: ResolvedLinearAuth;
24
- }
25
- export declare function verifyLinearIdentity(config: LinearConfig, creds: LinearCredentials, opts?: ResolveOptions & LinearRequestOptions): Promise<LinearIdentityReport>;
26
- //# sourceMappingURL=verify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/linear/verify.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAC5I,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,cAAc,CAAA;IACpB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,WAAW,EAAE,KAAK,GAAG,MAAM,CAAA;IAC3B,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAC1B;AAQD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,cAAc,GAAG,oBAAyB,GAC/C,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
@@ -1,67 +0,0 @@
1
- // Answers the one question a deployment cutover needs answered (IN-2271):
2
- // when this daemon writes to Linear, whose name is on it?
3
- //
4
- // The acceptance criterion for switching Humanbased's deployments to the HB Agent
5
- // Gateway is "zero writes from symphony/crosscheck attribute to a human account".
6
- // That is checkable ahead of time — resolve the identity, confirm the token is
7
- // accepted, and report what the write would render as.
8
- //
9
- // Never throws. A verification that fails is a report with ok: false, because the
10
- // caller is a status command that must still print the rest of its output.
11
- import { resolveLinearAuth } from './identity.js';
12
- import { linearGraphQL } from './client.js';
13
- const ORG_QUERY = `query { organization { name } }`;
14
- const VIEWER_QUERY = `query { viewer { name email } organization { name } }`;
15
- export async function verifyLinearIdentity(config, creds, opts = {}) {
16
- const mode = config.auth.mode;
17
- const attribution = mode === 'client_credentials' ? 'app' : 'user';
18
- let auth;
19
- try {
20
- auth = await resolveLinearAuth(config, creds, opts);
21
- }
22
- catch (err) {
23
- return {
24
- ok: false,
25
- mode,
26
- actor: config.identity.actor,
27
- attribution,
28
- error: err instanceof Error ? err.message : String(err),
29
- };
30
- }
31
- try {
32
- if (auth.mode === 'client_credentials') {
33
- // An app token has no viewer — it acts as itself. Reaching the org at all is
34
- // proof the minted token is accepted.
35
- const data = await linearGraphQL(auth, ORG_QUERY, {}, opts);
36
- return {
37
- ok: true,
38
- mode: auth.mode,
39
- actor: auth.actor,
40
- attribution: 'app',
41
- auth,
42
- ...(data.organization && { organization: data.organization.name }),
43
- };
44
- }
45
- const data = await linearGraphQL(auth, VIEWER_QUERY, {}, opts);
46
- const who = data.viewer?.email ?? data.viewer?.name ?? undefined;
47
- return {
48
- ok: true,
49
- mode: auth.mode,
50
- actor: auth.actor,
51
- attribution: 'user',
52
- auth,
53
- ...(data.organization && { organization: data.organization.name }),
54
- ...(who && { attributesTo: who }),
55
- };
56
- }
57
- catch (err) {
58
- return {
59
- ok: false,
60
- mode: auth.mode,
61
- actor: auth.actor,
62
- attribution,
63
- error: err instanceof Error ? err.message : String(err),
64
- };
65
- }
66
- }
67
- //# sourceMappingURL=verify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/linear/verify.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0DAA0D;AAC1D,EAAE;AACF,kFAAkF;AAClF,kFAAkF;AAClF,+EAA+E;AAC/E,uDAAuD;AACvD,EAAE;AACF,kFAAkF;AAClF,2EAA2E;AAE3E,OAAO,EAAE,iBAAiB,EAA6F,MAAM,eAAe,CAAA;AAC5I,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAA;AAyBtE,MAAM,SAAS,GAAG,iCAAiC,CAAA;AACnD,MAAM,YAAY,GAAG,uDAAuD,CAAA;AAK5E,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAoB,EACpB,KAAwB,EACxB,OAA8C,EAAE;IAEhD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,WAAW,GAAG,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IAElE,IAAI,IAAI,CAAA;IACR,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;YAC5B,WAAW;YACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACvC,6EAA6E;YAC7E,sCAAsC;YACtC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAc,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;YACxE,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,KAAK;gBAClB,IAAI;gBACJ,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;aACnE,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,aAAa,CAAiB,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;QAChE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,MAAM;YACnB,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAClE,GAAG,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;SAClC,CAAA;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW;YACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { SkillMetadata } from './broker.js';
2
- export declare function formatSkillAttribution(skills: SkillMetadata[]): string;
3
- export declare function renderSkillAttributionLine(skills: SkillMetadata[]): string;
4
- //# sourceMappingURL=attribution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/skills/attribution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAEtE;AAID,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAG1E"}
@@ -1,14 +0,0 @@
1
- import { formatSkillIdentity } from './catalog.js';
2
- // Skills are separated by a middot and kept on one line: the receipt has to be
3
- // present for licensing, but it is metadata about the run, not part of it.
4
- export function formatSkillAttribution(skills) {
5
- return skills.map(formatSkillIdentity).join(' · ');
6
- }
7
- // One italic line, same weight as the reviewer attribution it sits beneath.
8
- // Empty string when nothing activated, so callers can concatenate blind.
9
- export function renderSkillAttributionLine(skills) {
10
- if (skills.length === 0)
11
- return '';
12
- return `_Skills: ${formatSkillAttribution(skills)}_`;
13
- }
14
- //# sourceMappingURL=attribution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/skills/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,OAAO,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACpD,CAAC;AAED,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CAAC,MAAuB;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,OAAO,YAAY,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAA;AACtD,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function runSkillBrokerProxy(socketPath: string): Promise<void>;
2
- //# sourceMappingURL=broker-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker-server.d.ts","sourceRoot":"","sources":["../../src/skills/broker-server.ts"],"names":[],"mappings":"AASA,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E"}
@@ -1,17 +0,0 @@
1
- import { once } from 'events';
2
- import { createConnection } from 'net';
3
- function parseSocketPath(argv) {
4
- const index = argv.indexOf('--socket');
5
- if (index === -1 || !argv[index + 1])
6
- throw new Error('--socket <path> is required');
7
- return argv[index + 1];
8
- }
9
- export async function runSkillBrokerProxy(socketPath) {
10
- const socket = createConnection(socketPath);
11
- await once(socket, 'connect');
12
- process.stdin.pipe(socket);
13
- socket.pipe(process.stdout);
14
- await once(socket, 'close');
15
- }
16
- await runSkillBrokerProxy(parseSocketPath(process.argv.slice(2)));
17
- //# sourceMappingURL=broker-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker-server.js","sourceRoot":"","sources":["../../src/skills/broker-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAEtC,SAAS,eAAe,CAAC,IAAc;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACpF,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC7B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -1,42 +0,0 @@
1
- import { type SkillIdentity } from './catalog.js';
2
- export type SkillMetadata = Omit<SkillIdentity, 'path'>;
3
- export interface BrokerToolResult {
4
- content: Array<{
5
- type: 'text';
6
- text: string;
7
- }>;
8
- isError?: boolean;
9
- }
10
- export interface McpRequest {
11
- jsonrpc: '2.0';
12
- id?: string | number | null;
13
- method: string;
14
- params?: unknown;
15
- }
16
- export interface McpResponse {
17
- jsonrpc: '2.0';
18
- id: string | number | null;
19
- result?: unknown;
20
- error?: {
21
- code: number;
22
- message: string;
23
- };
24
- }
25
- export interface SkillActivationSession {
26
- path: string;
27
- stepType: string;
28
- enabledSkills: SkillMetadata[];
29
- activations(): SkillMetadata[];
30
- close(): void;
31
- }
32
- export declare function createSkillActivationSession(stepType: string, enabledNames: string[], catalog: SkillIdentity[]): SkillActivationSession;
33
- export declare function skillBrokerCommand(session: SkillActivationSession): {
34
- command: string;
35
- args: string[];
36
- };
37
- export declare function renderSkillBrokerInstructions(session: SkillActivationSession): string;
38
- export declare function claudeSkillBrokerArgs(session?: SkillActivationSession): string[];
39
- export declare function codexSkillBrokerArgs(session?: SkillActivationSession): string[];
40
- export declare function callSkillBrokerTool(sessionPath: string, toolName: string, rawArgs: unknown): BrokerToolResult;
41
- export declare function handleSkillBrokerRequest(sessionPath: string, request: McpRequest): McpResponse | null;
42
- //# sourceMappingURL=broker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/skills/broker.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAErE,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AASvD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,aAAa,EAAE,CAAA;IAC9B,WAAW,IAAI,aAAa,EAAE,CAAA;IAC9B,KAAK,IAAI,IAAI,CAAA;CACd;AAiED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,aAAa,EAAE,GACvB,sBAAsB,CAyDxB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAIvG;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CA+BrF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAMhF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAO/E;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,gBAAgB,CAyClB;AA0CD,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAsBrG"}
@@ -1,285 +0,0 @@
1
- import { existsSync, mkdtempSync, readFileSync, rmSync, statSync } from 'fs';
2
- import { join, resolve, sep } from 'path';
3
- import { fileURLToPath } from 'url';
4
- import { randomUUID } from 'crypto';
5
- import { createServer } from 'net';
6
- import { createInterface } from 'readline';
7
- import { tmpdir } from 'os';
8
- import { findCompetingSkill } from './catalog.js';
9
- const BROKER_SERVER_PATH = fileURLToPath(new URL('./broker-server.js', import.meta.url));
10
- const BROKER_SERVER_TS_PATH = fileURLToPath(new URL('./broker-server.ts', import.meta.url));
11
- const MAX_SKILL_FILE_BYTES = 512_000;
12
- const sessionStates = new Map();
13
- const brokerCommands = new WeakMap();
14
- function readState(sessionPath) {
15
- const state = sessionStates.get(sessionPath);
16
- if (!state)
17
- throw new Error('Skill session not found');
18
- return state;
19
- }
20
- async function serveBrokerConnection(socket, sessionPath) {
21
- const lines = createInterface({ input: socket, crlfDelay: Infinity });
22
- for await (const line of lines) {
23
- if (!line.trim())
24
- continue;
25
- let response;
26
- try {
27
- response = handleSkillBrokerRequest(sessionPath, JSON.parse(line));
28
- }
29
- catch (err) {
30
- response = {
31
- jsonrpc: '2.0',
32
- id: null,
33
- error: { code: -32700, message: err instanceof Error ? err.message : String(err) },
34
- };
35
- }
36
- if (response)
37
- socket.write(`${JSON.stringify(response)}\n`);
38
- }
39
- }
40
- function createBrokerServer(socketPath, sessionPath, sockets, onError, onConnection) {
41
- const server = createServer(socket => {
42
- onConnection();
43
- // The agent starts MCP before repository code; make its argv-visible endpoint single-use.
44
- server.close();
45
- sockets.add(socket);
46
- socket.once('close', () => sockets.delete(socket));
47
- void serveBrokerConnection(socket, sessionPath).catch(() => socket.destroy());
48
- });
49
- server.on('error', onError);
50
- server.listen(socketPath);
51
- return server;
52
- }
53
- function metadata(skill) {
54
- const { path: _path, ...identity } = skill;
55
- return identity;
56
- }
57
- function error(message) {
58
- return { content: [{ type: 'text', text: message }], isError: true };
59
- }
60
- function stringArg(args, key) {
61
- return typeof args[key] === 'string' && args[key].trim() ? args[key].trim() : null;
62
- }
63
- export function createSkillActivationSession(stepType, enabledNames, catalog) {
64
- const enabledSet = new Set(enabledNames);
65
- const enabled = catalog.filter(skill => enabledSet.has(skill.name));
66
- const sessionDir = process.platform === 'win32' ? undefined : mkdtempSync(join(tmpdir(), 'crosscheck-skill-'));
67
- const path = process.platform === 'win32'
68
- ? `\\\\.\\pipe\\crosscheck-skill-${randomUUID()}`
69
- : sessionDir;
70
- sessionStates.set(path, { schemaVersion: 1, stepType, enabled, activated: [] });
71
- let listenError;
72
- const sockets = new Set();
73
- const servers = new Set();
74
- let pendingServer;
75
- const session = {
76
- path,
77
- stepType,
78
- enabledSkills: enabled.map(metadata),
79
- activations: () => {
80
- if (listenError)
81
- throw new Error(`Skill broker failed to listen: ${listenError.message}`);
82
- const state = readState(path);
83
- const activated = new Set(state.activated);
84
- return state.enabled.filter(skill => activated.has(skill.name)).map(metadata);
85
- },
86
- close: () => {
87
- sessionStates.delete(path);
88
- for (const socket of sockets)
89
- socket.destroy();
90
- for (const server of servers)
91
- server.close();
92
- if (sessionDir)
93
- rmSync(sessionDir, { recursive: true, force: true });
94
- },
95
- };
96
- brokerCommands.set(session, () => {
97
- if (pendingServer) {
98
- const staleServer = pendingServer;
99
- if (staleServer.listening)
100
- staleServer.close();
101
- else
102
- staleServer.once('listening', () => staleServer.close());
103
- }
104
- const socketPath = process.platform === 'win32'
105
- ? `\\\\.\\pipe\\crosscheck-skill-${randomUUID()}`
106
- : join(sessionDir, `${randomUUID().slice(0, 8)}.sock`);
107
- const server = createBrokerServer(socketPath, path, sockets, err => { if (pendingServer === server)
108
- listenError = err; }, () => { if (pendingServer === server)
109
- pendingServer = undefined; });
110
- pendingServer = server;
111
- servers.add(server);
112
- server.once('close', () => servers.delete(server));
113
- return { command: process.execPath, args: [
114
- ...(existsSync(BROKER_SERVER_PATH) ? [BROKER_SERVER_PATH] : ['--import', 'tsx', BROKER_SERVER_TS_PATH]),
115
- '--socket', socketPath,
116
- ] };
117
- });
118
- return session;
119
- }
120
- export function skillBrokerCommand(session) {
121
- const command = brokerCommands.get(session);
122
- if (!command)
123
- throw new Error('Skill session not found');
124
- return command();
125
- }
126
- export function renderSkillBrokerInstructions(session) {
127
- if (session.enabledSkills.length === 0)
128
- return '';
129
- const skills = session.enabledSkills
130
- .map(skill => `- ${skill.name}: ${skill.description} (by @${skill.author}, ${skill.license})`)
131
- .join('\n');
132
- // Ordered, obligatory, and step-aware on purpose. The advisory phrasing this
133
- // replaced ("decide whether a skill applies") never produced a single
134
- // activation in production: a fully-specified step leaves the agent no reason
135
- // to reach for an optional tool. Two further frictions are handled here —
136
- // catalog descriptions are written for interactive use ("when the user wants
137
- // …") and so never match a headless step, and a SKILL.md that links to files
138
- // in its own package is unusable unless the agent knows read_skill_file is the
139
- // only way to fetch them (Read/Grep/Glob are not granted for skill paths).
140
- //
141
- // Deliberately no "if none apply, say so" step: on a review step the model's
142
- // output IS the posted comment body, so that sentence would land above
143
- // `## Summary` on every review where nothing matched. The skills_none_activated
144
- // log event carries that signal instead, where nobody has to read it. The
145
- // silence is stated outright below for the same reason — a skill that did
146
- // activate is attributed in the comment footer, not narrated in the body.
147
- return [
148
- '## Agent Skills (do this first)',
149
- `Crosscheck exposes Agent Skills for this ${session.stepType} step through the crosscheck MCP server. Before you begin:`,
150
- '1. Call `list_enabled_skills`.',
151
- `2. Judge each description against the work in front of you. The descriptions are written for interactive use, so read "when the user wants X" as "when this step is X" — this is a ${session.stepType} step.`,
152
- '3. Call `activate_skill` for every skill that applies, then follow its instructions for the rest of this step. Some skills compete with one another — activating one makes the other an error, so among competing skills pick the single best fit.',
153
- 'Do not mention skills, activation, or these instructions in your output — crosscheck records which skills were activated and attributes them itself.',
154
- 'A SKILL.md may link to further files inside its own package. Fetch those with `read_skill_file`, passing a path relative to the skill root — Read, Grep and Glob are not available for skill files.',
155
- 'Skills enabled for this step:',
156
- skills,
157
- ].join('\n');
158
- }
159
- export function claudeSkillBrokerArgs(session) {
160
- if (!session)
161
- return [];
162
- const broker = skillBrokerCommand(session);
163
- return ['--mcp-config', JSON.stringify({
164
- mcpServers: { crosscheck: { command: broker.command, args: broker.args } },
165
- })];
166
- }
167
- export function codexSkillBrokerArgs(session) {
168
- if (!session)
169
- return [];
170
- const broker = skillBrokerCommand(session);
171
- return [
172
- '-c', `mcp_servers.crosscheck.command=${JSON.stringify(broker.command)}`,
173
- '-c', `mcp_servers.crosscheck.args=${JSON.stringify(broker.args)}`,
174
- ];
175
- }
176
- export function callSkillBrokerTool(sessionPath, toolName, rawArgs) {
177
- const state = readState(sessionPath);
178
- const args = rawArgs && typeof rawArgs === 'object' ? rawArgs : {};
179
- if (toolName === 'list_enabled_skills') {
180
- return { content: [{ type: 'text', text: JSON.stringify(state.enabled.map(metadata), null, 2) }] };
181
- }
182
- const name = stringArg(args, 'name');
183
- if (!name)
184
- return error('name is required');
185
- const skill = state.enabled.find(candidate => candidate.name === name);
186
- if (!skill)
187
- return error(`Skill ${name} is not enabled for this operation`);
188
- if (toolName === 'activate_skill') {
189
- const competitor = findCompetingSkill(name, state.activated);
190
- if (competitor)
191
- return error(`Skill ${name} competes with activated ${competitor}; activate only one review baseline`);
192
- const instructions = readFileSync(join(skill.path, 'SKILL.md'), 'utf8');
193
- if (!state.activated.includes(name)) {
194
- state.activated.push(name);
195
- }
196
- return {
197
- content: [{
198
- type: 'text',
199
- text: `Activated ${name} (by @${skill.author}, ${skill.license}).\nSkill root: ${skill.path}\n\n${instructions}`,
200
- }],
201
- };
202
- }
203
- if (toolName === 'read_skill_file') {
204
- if (!state.activated.includes(name))
205
- return error(`Activate ${name} before reading its files`);
206
- const requestedPath = stringArg(args, 'path');
207
- if (!requestedPath)
208
- return error('path is required');
209
- const root = resolve(skill.path);
210
- const path = resolve(root, requestedPath);
211
- if (path !== root && !path.startsWith(`${root}${sep}`))
212
- return error('Skill file path must stay inside the skill package');
213
- if (!existsSync(path) || !statSync(path).isFile())
214
- return error(`Skill file not found: ${requestedPath}`);
215
- if (statSync(path).size > MAX_SKILL_FILE_BYTES)
216
- return error(`Skill file exceeds ${MAX_SKILL_FILE_BYTES} bytes`);
217
- return { content: [{ type: 'text', text: readFileSync(path, 'utf8') }] };
218
- }
219
- return error(`Unknown skill broker tool: ${toolName}`);
220
- }
221
- // Broker tools never mutate the repository or external systems; activation only
222
- // records an idempotent receipt in the current step's temporary session.
223
- const READ_ONLY_TOOL_ANNOTATIONS = {
224
- readOnlyHint: true,
225
- destructiveHint: false,
226
- idempotentHint: true,
227
- openWorldHint: false,
228
- };
229
- const TOOLS = [
230
- {
231
- name: 'list_enabled_skills',
232
- description: 'List Agent Skills enabled for the current Crosscheck operation. Metadata only; this does not activate a skill.',
233
- inputSchema: { type: 'object', properties: {}, additionalProperties: false },
234
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
235
- },
236
- {
237
- name: 'activate_skill',
238
- description: 'Activate an enabled skill when its description applies, record attribution, and load its SKILL.md instructions.',
239
- inputSchema: {
240
- type: 'object',
241
- properties: { name: { type: 'string' } },
242
- required: ['name'],
243
- additionalProperties: false,
244
- },
245
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
246
- },
247
- {
248
- name: 'read_skill_file',
249
- description: 'Read a referenced file from a skill after activating it.',
250
- inputSchema: {
251
- type: 'object',
252
- properties: { name: { type: 'string' }, path: { type: 'string' } },
253
- required: ['name', 'path'],
254
- additionalProperties: false,
255
- },
256
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
257
- },
258
- ];
259
- export function handleSkillBrokerRequest(sessionPath, request) {
260
- if (request.method.startsWith('notifications/'))
261
- return null;
262
- const id = request.id ?? null;
263
- if (request.method === 'initialize') {
264
- const params = request.params && typeof request.params === 'object' ? request.params : {};
265
- return {
266
- jsonrpc: '2.0', id,
267
- result: {
268
- protocolVersion: typeof params.protocolVersion === 'string' ? params.protocolVersion : '2024-11-05',
269
- capabilities: { tools: {} },
270
- serverInfo: { name: 'crosscheck-skill-broker', version: '1.0.0' },
271
- },
272
- };
273
- }
274
- if (request.method === 'ping')
275
- return { jsonrpc: '2.0', id, result: {} };
276
- if (request.method === 'tools/list')
277
- return { jsonrpc: '2.0', id, result: { tools: TOOLS } };
278
- if (request.method === 'tools/call') {
279
- const params = request.params && typeof request.params === 'object' ? request.params : {};
280
- const name = typeof params.name === 'string' ? params.name : '';
281
- return { jsonrpc: '2.0', id, result: callSkillBrokerTool(sessionPath, name, params.arguments) };
282
- }
283
- return { jsonrpc: '2.0', id, error: { code: -32601, message: `Method not found: ${request.method}` } };
284
- }
285
- //# sourceMappingURL=broker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/skills/broker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,YAAY,EAA4B,MAAM,KAAK,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,kBAAkB,EAAsB,MAAM,cAAc,CAAA;AAsCrE,MAAM,kBAAkB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACxF,MAAM,qBAAqB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC3F,MAAM,oBAAoB,GAAG,OAAO,CAAA;AACpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAA;AAC1D,MAAM,cAAc,GAAG,IAAI,OAAO,EAAqE,CAAA;AAEvG,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IACtD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,WAAmB;IACtE,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrE,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAQ;QAC1B,IAAI,QAA4B,CAAA;QAChC,IAAI,CAAC;YACH,QAAQ,GAAG,wBAAwB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC,CAAA;QAClF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,QAAQ,GAAG;gBACT,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACnF,CAAA;QACH,CAAC;QACD,IAAI,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,UAAkB,EAClB,WAAmB,EACnB,OAAoB,EACpB,OAA6B,EAC7B,YAAwB;IAExB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;QACnC,YAAY,EAAE,CAAA;QACd,0FAA0F;QAC1F,MAAM,CAAC,KAAK,EAAE,CAAA;QACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClD,KAAK,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAoB;IACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAA;IAC1C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACtE,CAAC;AAED,SAAS,SAAS,CAAC,IAA6B,EAAE,GAAW;IAC3D,OAAO,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAgB,EAChB,YAAsB,EACtB,OAAwB;IAExB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC9G,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACvC,CAAC,CAAC,iCAAiC,UAAU,EAAE,EAAE;QACjD,CAAC,CAAC,UAAW,CAAA;IACf,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;IAC/E,IAAI,WAA8B,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,IAAI,aAAiC,CAAA;IAErC,MAAM,OAAO,GAA2B;QACtC,IAAI;QACJ,QAAQ;QACR,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;YACzF,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC/E,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAA;YAC9C,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YAC5C,IAAI,UAAU;gBAAE,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtE,CAAC;KACF,CAAA;IAED,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE;QAC/B,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,aAAa,CAAA;YACjC,IAAI,WAAW,CAAC,SAAS;gBAAE,WAAW,CAAC,KAAK,EAAE,CAAA;;gBACzC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC7C,CAAC,CAAC,iCAAiC,UAAU,EAAE,EAAE;YACjD,CAAC,CAAC,IAAI,CAAC,UAAW,EAAE,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QACzD,MAAM,MAAM,GAAW,kBAAkB,CACvC,UAAU,EACV,IAAI,EACJ,OAAO,EACP,GAAG,CAAC,EAAE,GAAG,IAAI,aAAa,KAAK,MAAM;YAAE,WAAW,GAAG,GAAG,CAAA,CAAC,CAAC,EAC1D,GAAG,EAAE,GAAG,IAAI,aAAa,KAAK,MAAM;YAAE,aAAa,GAAG,SAAS,CAAA,CAAC,CAAC,CAClE,CAAA;QACD,aAAa,GAAG,MAAM,CAAA;QACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;gBACxC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;gBACvG,UAAU,EAAE,UAAU;aACvB,EAAE,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA+B;IAChE,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IACxD,OAAO,OAAO,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAA+B;IAC3E,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa;SACjC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,SAAS,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC;SAC7F,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,6EAA6E;IAC7E,sEAAsE;IACtE,8EAA8E;IAC9E,0EAA0E;IAC1E,6EAA6E;IAC7E,6EAA6E;IAC7E,+EAA+E;IAC/E,2EAA2E;IAC3E,EAAE;IACF,6EAA6E;IAC7E,uEAAuE;IACvE,gFAAgF;IAChF,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,OAAO;QACL,iCAAiC;QACjC,4CAA4C,OAAO,CAAC,QAAQ,4DAA4D;QACxH,gCAAgC;QAChC,sLAAsL,OAAO,CAAC,QAAQ,QAAQ;QAC9M,oPAAoP;QACpP,sJAAsJ;QACtJ,qMAAqM;QACrM,+BAA+B;QAC/B,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACvB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC;YACrC,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;SAC3E,CAAC,CAAC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgC;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACvB,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO;QACL,IAAI,EAAE,kCAAkC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACxE,IAAI,EAAE,+BAA+B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;KACnE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,QAAgB,EAChB,OAAgB;IAEhB,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAkC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE7F,IAAI,QAAQ,KAAK,qBAAqB,EAAE,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACpG,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACtE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,SAAS,IAAI,oCAAoC,CAAC,CAAA;IAE3E,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;QAC5D,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC,SAAS,IAAI,4BAA4B,UAAU,qCAAqC,CAAC,CAAA;QACtH,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;QACvE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,aAAa,IAAI,SAAS,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,mBAAmB,KAAK,CAAC,IAAI,OAAO,YAAY,EAAE;iBACjH,CAAC;SACH,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,YAAY,IAAI,2BAA2B,CAAC,CAAA;QAC9F,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACzC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC,oDAAoD,CAAC,CAAA;QAC1H,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,KAAK,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAA;QACzG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,oBAAoB;YAAE,OAAO,KAAK,CAAC,sBAAsB,oBAAoB,QAAQ,CAAC,CAAA;QAChH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;IAC1E,CAAC;IAED,OAAO,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAA;AACxD,CAAC;AAED,gFAAgF;AAChF,yEAAyE;AACzE,MAAM,0BAA0B,GAAG;IACjC,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,KAAK;CACZ,CAAA;AAEV,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,gHAAgH;QAC7H,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,iHAAiH;QAC9H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;YAClB,oBAAoB,EAAE,KAAK;SAC5B;QACD,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAClE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YAC1B,oBAAoB,EAAE,KAAK;SAC5B;QACD,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAA;AAED,MAAM,UAAU,wBAAwB,CAAC,WAAmB,EAAE,OAAmB;IAC/E,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5D,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAA;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;QACpH,OAAO;YACL,OAAO,EAAE,KAAK,EAAE,EAAE;YAClB,MAAM,EAAE;gBACN,eAAe,EAAE,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;gBACnG,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;aAClE;SACF,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAA;IAC5F,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;QACpH,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IACjG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAA;AACxG,CAAC"}
@@ -1,28 +0,0 @@
1
- export interface SkillIdentity {
2
- name: string;
3
- description: string;
4
- author: string;
5
- license: string;
6
- source: string;
7
- revision: string;
8
- integrity: string;
9
- path: string;
10
- }
11
- export interface SkillFrontmatter {
12
- name?: string;
13
- description?: string;
14
- author?: string;
15
- license?: string;
16
- }
17
- export declare const RECOMMENDED_SKILL_NAMES: readonly ["code-review-skill", "codebase-design", "diagnosing-bugs"];
18
- export declare const BUNDLED_SKILL_RECOMMENDATIONS: Readonly<Record<string, string>>;
19
- export declare function findCompetingSkill(skillName: string, selectedNames: readonly string[]): string | undefined;
20
- export declare const INSTALLED_SKILLS_DIR: string;
21
- export declare function readSkillFrontmatter(skillPath: string): SkillFrontmatter;
22
- export declare function isValidSkillAuthor(value: unknown): value is string;
23
- export declare function isValidSkillLicense(value: unknown): value is string;
24
- export declare function loadBundledSkills(rootDir?: string): SkillIdentity[];
25
- export declare function loadInstalledSkills(rootDir?: string): SkillIdentity[];
26
- export declare function loadSkillCatalog(installedRoot?: string): SkillIdentity[];
27
- export declare function formatSkillIdentity(skill: Pick<SkillIdentity, 'name' | 'author' | 'license'>): string;
28
- //# sourceMappingURL=catalog.d.ts.map