@renseiai/agentfactory 0.8.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/src/config/index.d.ts +3 -0
  4. package/dist/src/config/index.d.ts.map +1 -0
  5. package/dist/src/config/index.js +1 -0
  6. package/dist/src/config/repository-config.d.ts +44 -0
  7. package/dist/src/config/repository-config.d.ts.map +1 -0
  8. package/dist/src/config/repository-config.js +88 -0
  9. package/dist/src/config/repository-config.test.d.ts +2 -0
  10. package/dist/src/config/repository-config.test.d.ts.map +1 -0
  11. package/dist/src/config/repository-config.test.js +249 -0
  12. package/dist/src/deployment/deployment-checker.d.ts +110 -0
  13. package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
  14. package/dist/src/deployment/deployment-checker.js +242 -0
  15. package/dist/src/deployment/index.d.ts +3 -0
  16. package/dist/src/deployment/index.d.ts.map +1 -0
  17. package/dist/src/deployment/index.js +2 -0
  18. package/dist/src/frontend/index.d.ts +2 -0
  19. package/dist/src/frontend/index.d.ts.map +1 -0
  20. package/dist/src/frontend/index.js +1 -0
  21. package/dist/src/frontend/types.d.ts +106 -0
  22. package/dist/src/frontend/types.d.ts.map +1 -0
  23. package/dist/src/frontend/types.js +11 -0
  24. package/dist/src/governor/decision-engine.d.ts +52 -0
  25. package/dist/src/governor/decision-engine.d.ts.map +1 -0
  26. package/dist/src/governor/decision-engine.js +220 -0
  27. package/dist/src/governor/decision-engine.test.d.ts +2 -0
  28. package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
  29. package/dist/src/governor/decision-engine.test.js +629 -0
  30. package/dist/src/governor/event-bus.d.ts +43 -0
  31. package/dist/src/governor/event-bus.d.ts.map +1 -0
  32. package/dist/src/governor/event-bus.js +8 -0
  33. package/dist/src/governor/event-deduplicator.d.ts +43 -0
  34. package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
  35. package/dist/src/governor/event-deduplicator.js +53 -0
  36. package/dist/src/governor/event-driven-governor.d.ts +131 -0
  37. package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
  38. package/dist/src/governor/event-driven-governor.js +379 -0
  39. package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
  40. package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
  41. package/dist/src/governor/event-driven-governor.test.js +673 -0
  42. package/dist/src/governor/event-types.d.ts +78 -0
  43. package/dist/src/governor/event-types.d.ts.map +1 -0
  44. package/dist/src/governor/event-types.js +32 -0
  45. package/dist/src/governor/governor-types.d.ts +82 -0
  46. package/dist/src/governor/governor-types.d.ts.map +1 -0
  47. package/dist/src/governor/governor-types.js +21 -0
  48. package/dist/src/governor/governor.d.ts +100 -0
  49. package/dist/src/governor/governor.d.ts.map +1 -0
  50. package/dist/src/governor/governor.js +262 -0
  51. package/dist/src/governor/governor.test.d.ts +2 -0
  52. package/dist/src/governor/governor.test.d.ts.map +1 -0
  53. package/dist/src/governor/governor.test.js +514 -0
  54. package/dist/src/governor/human-touchpoints.d.ts +131 -0
  55. package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
  56. package/dist/src/governor/human-touchpoints.js +251 -0
  57. package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
  58. package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
  59. package/dist/src/governor/human-touchpoints.test.js +366 -0
  60. package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
  61. package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
  62. package/dist/src/governor/in-memory-event-bus.js +79 -0
  63. package/dist/src/governor/index.d.ts +14 -0
  64. package/dist/src/governor/index.d.ts.map +1 -0
  65. package/dist/src/governor/index.js +13 -0
  66. package/dist/src/governor/override-parser.d.ts +60 -0
  67. package/dist/src/governor/override-parser.d.ts.map +1 -0
  68. package/dist/src/governor/override-parser.js +98 -0
  69. package/dist/src/governor/override-parser.test.d.ts +2 -0
  70. package/dist/src/governor/override-parser.test.d.ts.map +1 -0
  71. package/dist/src/governor/override-parser.test.js +312 -0
  72. package/dist/src/governor/platform-adapter.d.ts +69 -0
  73. package/dist/src/governor/platform-adapter.d.ts.map +1 -0
  74. package/dist/src/governor/platform-adapter.js +11 -0
  75. package/dist/src/governor/processing-state.d.ts +66 -0
  76. package/dist/src/governor/processing-state.d.ts.map +1 -0
  77. package/dist/src/governor/processing-state.js +43 -0
  78. package/dist/src/governor/processing-state.test.d.ts +2 -0
  79. package/dist/src/governor/processing-state.test.d.ts.map +1 -0
  80. package/dist/src/governor/processing-state.test.js +96 -0
  81. package/dist/src/governor/top-of-funnel.d.ts +118 -0
  82. package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
  83. package/dist/src/governor/top-of-funnel.js +168 -0
  84. package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
  85. package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
  86. package/dist/src/governor/top-of-funnel.test.js +331 -0
  87. package/dist/src/index.d.ts +11 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +10 -0
  90. package/dist/src/linear-cli.d.ts +38 -0
  91. package/dist/src/linear-cli.d.ts.map +1 -0
  92. package/dist/src/linear-cli.js +674 -0
  93. package/dist/src/logger.d.ts +117 -0
  94. package/dist/src/logger.d.ts.map +1 -0
  95. package/dist/src/logger.js +430 -0
  96. package/dist/src/manifest/generate.d.ts +20 -0
  97. package/dist/src/manifest/generate.d.ts.map +1 -0
  98. package/dist/src/manifest/generate.js +65 -0
  99. package/dist/src/manifest/index.d.ts +4 -0
  100. package/dist/src/manifest/index.d.ts.map +1 -0
  101. package/dist/src/manifest/index.js +2 -0
  102. package/dist/src/manifest/route-manifest.d.ts +34 -0
  103. package/dist/src/manifest/route-manifest.d.ts.map +1 -0
  104. package/dist/src/manifest/route-manifest.js +148 -0
  105. package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
  106. package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
  107. package/dist/src/orchestrator/activity-emitter.js +306 -0
  108. package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
  109. package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
  110. package/dist/src/orchestrator/api-activity-emitter.js +417 -0
  111. package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
  112. package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
  113. package/dist/src/orchestrator/heartbeat-writer.js +137 -0
  114. package/dist/src/orchestrator/index.d.ts +20 -0
  115. package/dist/src/orchestrator/index.d.ts.map +1 -0
  116. package/dist/src/orchestrator/index.js +22 -0
  117. package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
  118. package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
  119. package/dist/src/orchestrator/log-analyzer.js +572 -0
  120. package/dist/src/orchestrator/log-config.d.ts +39 -0
  121. package/dist/src/orchestrator/log-config.d.ts.map +1 -0
  122. package/dist/src/orchestrator/log-config.js +45 -0
  123. package/dist/src/orchestrator/orchestrator.d.ts +316 -0
  124. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
  125. package/dist/src/orchestrator/orchestrator.js +3290 -0
  126. package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
  127. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
  128. package/dist/src/orchestrator/parse-work-result.js +135 -0
  129. package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
  130. package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
  131. package/dist/src/orchestrator/parse-work-result.test.js +234 -0
  132. package/dist/src/orchestrator/progress-logger.d.ts +72 -0
  133. package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
  134. package/dist/src/orchestrator/progress-logger.js +135 -0
  135. package/dist/src/orchestrator/session-logger.d.ts +159 -0
  136. package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
  137. package/dist/src/orchestrator/session-logger.js +275 -0
  138. package/dist/src/orchestrator/state-recovery.d.ts +96 -0
  139. package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
  140. package/dist/src/orchestrator/state-recovery.js +302 -0
  141. package/dist/src/orchestrator/state-types.d.ts +165 -0
  142. package/dist/src/orchestrator/state-types.d.ts.map +1 -0
  143. package/dist/src/orchestrator/state-types.js +7 -0
  144. package/dist/src/orchestrator/stream-parser.d.ts +151 -0
  145. package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
  146. package/dist/src/orchestrator/stream-parser.js +137 -0
  147. package/dist/src/orchestrator/types.d.ts +232 -0
  148. package/dist/src/orchestrator/types.d.ts.map +1 -0
  149. package/dist/src/orchestrator/types.js +4 -0
  150. package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
  151. package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
  152. package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
  153. package/dist/src/providers/a2a-auth.d.ts +81 -0
  154. package/dist/src/providers/a2a-auth.d.ts.map +1 -0
  155. package/dist/src/providers/a2a-auth.js +188 -0
  156. package/dist/src/providers/a2a-auth.test.d.ts +2 -0
  157. package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
  158. package/dist/src/providers/a2a-auth.test.js +232 -0
  159. package/dist/src/providers/a2a-provider.d.ts +254 -0
  160. package/dist/src/providers/a2a-provider.d.ts.map +1 -0
  161. package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
  162. package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
  163. package/dist/src/providers/a2a-provider.integration.test.js +665 -0
  164. package/dist/src/providers/a2a-provider.js +811 -0
  165. package/dist/src/providers/a2a-provider.test.d.ts +2 -0
  166. package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
  167. package/dist/src/providers/a2a-provider.test.js +681 -0
  168. package/dist/src/providers/amp-provider.d.ts +20 -0
  169. package/dist/src/providers/amp-provider.d.ts.map +1 -0
  170. package/dist/src/providers/amp-provider.js +24 -0
  171. package/dist/src/providers/claude-provider.d.ts +18 -0
  172. package/dist/src/providers/claude-provider.d.ts.map +1 -0
  173. package/dist/src/providers/claude-provider.js +437 -0
  174. package/dist/src/providers/codex-provider.d.ts +133 -0
  175. package/dist/src/providers/codex-provider.d.ts.map +1 -0
  176. package/dist/src/providers/codex-provider.js +381 -0
  177. package/dist/src/providers/codex-provider.test.d.ts +2 -0
  178. package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
  179. package/dist/src/providers/codex-provider.test.js +387 -0
  180. package/dist/src/providers/index.d.ts +44 -0
  181. package/dist/src/providers/index.d.ts.map +1 -0
  182. package/dist/src/providers/index.js +85 -0
  183. package/dist/src/providers/spring-ai-provider.d.ts +90 -0
  184. package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
  185. package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
  186. package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
  187. package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
  188. package/dist/src/providers/spring-ai-provider.js +317 -0
  189. package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
  190. package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
  191. package/dist/src/providers/spring-ai-provider.test.js +200 -0
  192. package/dist/src/providers/types.d.ts +165 -0
  193. package/dist/src/providers/types.d.ts.map +1 -0
  194. package/dist/src/providers/types.js +13 -0
  195. package/dist/src/templates/adapters.d.ts +51 -0
  196. package/dist/src/templates/adapters.d.ts.map +1 -0
  197. package/dist/src/templates/adapters.js +104 -0
  198. package/dist/src/templates/adapters.test.d.ts +2 -0
  199. package/dist/src/templates/adapters.test.d.ts.map +1 -0
  200. package/dist/src/templates/adapters.test.js +165 -0
  201. package/dist/src/templates/agent-definition.d.ts +85 -0
  202. package/dist/src/templates/agent-definition.d.ts.map +1 -0
  203. package/dist/src/templates/agent-definition.js +97 -0
  204. package/dist/src/templates/agent-definition.test.d.ts +2 -0
  205. package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
  206. package/dist/src/templates/agent-definition.test.js +209 -0
  207. package/dist/src/templates/index.d.ts +14 -0
  208. package/dist/src/templates/index.d.ts.map +1 -0
  209. package/dist/src/templates/index.js +11 -0
  210. package/dist/src/templates/loader.d.ts +41 -0
  211. package/dist/src/templates/loader.d.ts.map +1 -0
  212. package/dist/src/templates/loader.js +114 -0
  213. package/dist/src/templates/registry.d.ts +80 -0
  214. package/dist/src/templates/registry.d.ts.map +1 -0
  215. package/dist/src/templates/registry.js +177 -0
  216. package/dist/src/templates/registry.test.d.ts +2 -0
  217. package/dist/src/templates/registry.test.d.ts.map +1 -0
  218. package/dist/src/templates/registry.test.js +198 -0
  219. package/dist/src/templates/renderer.d.ts +29 -0
  220. package/dist/src/templates/renderer.d.ts.map +1 -0
  221. package/dist/src/templates/renderer.js +35 -0
  222. package/dist/src/templates/strategy-templates.test.d.ts +2 -0
  223. package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
  224. package/dist/src/templates/strategy-templates.test.js +619 -0
  225. package/dist/src/templates/types.d.ts +233 -0
  226. package/dist/src/templates/types.d.ts.map +1 -0
  227. package/dist/src/templates/types.js +127 -0
  228. package/dist/src/templates/types.test.d.ts +2 -0
  229. package/dist/src/templates/types.test.d.ts.map +1 -0
  230. package/dist/src/templates/types.test.js +232 -0
  231. package/dist/src/tools/index.d.ts +6 -0
  232. package/dist/src/tools/index.d.ts.map +1 -0
  233. package/dist/src/tools/index.js +3 -0
  234. package/dist/src/tools/linear-runner.d.ts +34 -0
  235. package/dist/src/tools/linear-runner.d.ts.map +1 -0
  236. package/dist/src/tools/linear-runner.js +700 -0
  237. package/dist/src/tools/plugins/linear.d.ts +9 -0
  238. package/dist/src/tools/plugins/linear.d.ts.map +1 -0
  239. package/dist/src/tools/plugins/linear.js +138 -0
  240. package/dist/src/tools/registry.d.ts +9 -0
  241. package/dist/src/tools/registry.d.ts.map +1 -0
  242. package/dist/src/tools/registry.js +18 -0
  243. package/dist/src/tools/types.d.ts +18 -0
  244. package/dist/src/tools/types.d.ts.map +1 -0
  245. package/dist/src/tools/types.js +1 -0
  246. package/package.json +78 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Linear Tool Plugin
3
+ *
4
+ * Exposes all Linear CLI commands as typed, in-process agent tools.
5
+ * Agents call these directly instead of shelling out to `pnpm af-linear`.
6
+ */
7
+ import type { ToolPlugin } from '../types.js';
8
+ export declare const linearPlugin: ToolPlugin;
9
+ //# sourceMappingURL=linear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../../src/tools/plugins/linear.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAA;AAyMhE,eAAO,MAAM,YAAY,EAAE,UAU1B,CAAA"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Linear Tool Plugin
3
+ *
4
+ * Exposes all Linear CLI commands as typed, in-process agent tools.
5
+ * Agents call these directly instead of shelling out to `pnpm af-linear`.
6
+ */
7
+ import { z } from 'zod';
8
+ import { tool } from '@anthropic-ai/claude-agent-sdk';
9
+ import { runLinear } from '../linear-runner.js';
10
+ function makeTools(apiKey, teamName) {
11
+ async function run(command, args = {}, positionalArgs = []) {
12
+ try {
13
+ const result = await runLinear({ command, args, positionalArgs, apiKey });
14
+ return {
15
+ content: [{ type: 'text', text: JSON.stringify(result.output, null, 2) }],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ }
25
+ return [
26
+ tool('af_linear_get_issue', 'Get a Linear issue by ID or identifier', { issue_id: z.string().describe('Issue ID or identifier (e.g. SUP-123)') }, async (args) => run('get-issue', {}, [args.issue_id])),
27
+ tool('af_linear_create_issue', 'Create a new Linear issue', {
28
+ title: z.string().describe('Issue title'),
29
+ team: z.string().optional().describe('Team name (defaults to LINEAR_TEAM_NAME env var)'),
30
+ description: z.string().optional().describe('Issue description (markdown)'),
31
+ project: z.string().optional().describe('Project name'),
32
+ labels: z.array(z.string()).optional().describe('Label names'),
33
+ state: z.string().optional().describe('Initial state (e.g. "Backlog")'),
34
+ parent_id: z.string().optional().describe('Parent issue ID for sub-issues'),
35
+ }, async (args) => {
36
+ const cliArgs = {
37
+ title: args.title,
38
+ };
39
+ const team = args.team ?? teamName;
40
+ if (team)
41
+ cliArgs.team = team;
42
+ if (args.description)
43
+ cliArgs.description = args.description;
44
+ if (args.project)
45
+ cliArgs.project = args.project;
46
+ if (args.labels)
47
+ cliArgs.labels = args.labels;
48
+ if (args.state)
49
+ cliArgs.state = args.state;
50
+ if (args.parent_id)
51
+ cliArgs.parentId = args.parent_id;
52
+ return run('create-issue', cliArgs);
53
+ }),
54
+ tool('af_linear_update_issue', 'Update an existing Linear issue', {
55
+ issue_id: z.string().describe('Issue ID or identifier'),
56
+ title: z.string().optional().describe('New title'),
57
+ description: z.string().optional().describe('New description (markdown)'),
58
+ state: z.string().optional().describe('New state (e.g. "In Progress", "Done")'),
59
+ labels: z.array(z.string()).optional().describe('Label names to set'),
60
+ }, async (args) => {
61
+ const cliArgs = {};
62
+ if (args.title)
63
+ cliArgs.title = args.title;
64
+ if (args.description)
65
+ cliArgs.description = args.description;
66
+ if (args.state)
67
+ cliArgs.state = args.state;
68
+ if (args.labels)
69
+ cliArgs.labels = args.labels;
70
+ return run('update-issue', cliArgs, [args.issue_id]);
71
+ }),
72
+ tool('af_linear_list_comments', 'List comments on a Linear issue', { issue_id: z.string().describe('Issue ID or identifier') }, async (args) => run('list-comments', {}, [args.issue_id])),
73
+ tool('af_linear_create_comment', 'Add a comment to a Linear issue', {
74
+ issue_id: z.string().describe('Issue ID or identifier'),
75
+ body: z.string().describe('Comment text (markdown)'),
76
+ }, async (args) => run('create-comment', { body: args.body }, [args.issue_id])),
77
+ tool('af_linear_add_relation', 'Add a relation between two Linear issues', {
78
+ issue_id: z.string().describe('Source issue ID or identifier'),
79
+ related_issue_id: z.string().describe('Related issue ID or identifier'),
80
+ type: z.enum(['related', 'blocks', 'duplicate']).describe('Relation type'),
81
+ }, async (args) => run('add-relation', { type: args.type }, [args.issue_id, args.related_issue_id])),
82
+ tool('af_linear_list_relations', 'List relations for a Linear issue', { issue_id: z.string().describe('Issue ID or identifier') }, async (args) => run('list-relations', {}, [args.issue_id])),
83
+ tool('af_linear_remove_relation', 'Remove a relation between Linear issues', { relation_id: z.string().describe('Relation ID to remove') }, async (args) => run('remove-relation', {}, [args.relation_id])),
84
+ tool('af_linear_list_sub_issues', 'List sub-issues of a parent Linear issue with dependency graph', { issue_id: z.string().describe('Parent issue ID or identifier') }, async (args) => run('list-sub-issues', {}, [args.issue_id])),
85
+ tool('af_linear_list_sub_issue_statuses', 'List status of all sub-issues for a parent issue', { issue_id: z.string().describe('Parent issue ID or identifier') }, async (args) => run('list-sub-issue-statuses', {}, [args.issue_id])),
86
+ tool('af_linear_update_sub_issue', 'Update a sub-issue state and optionally add a comment', {
87
+ issue_id: z.string().describe('Sub-issue ID or identifier'),
88
+ state: z.string().optional().describe('New state (e.g. "Started", "Finished")'),
89
+ comment: z.string().optional().describe('Comment to add'),
90
+ }, async (args) => {
91
+ const cliArgs = {};
92
+ if (args.state)
93
+ cliArgs.state = args.state;
94
+ if (args.comment)
95
+ cliArgs.comment = args.comment;
96
+ return run('update-sub-issue', cliArgs, [args.issue_id]);
97
+ }),
98
+ tool('af_linear_check_blocked', 'Check if a Linear issue is blocked by other issues', { issue_id: z.string().describe('Issue ID or identifier') }, async (args) => run('check-blocked', {}, [args.issue_id])),
99
+ tool('af_linear_list_backlog_issues', 'List all backlog issues for a project', { project: z.string().describe('Project name') }, async (args) => run('list-backlog-issues', { project: args.project })),
100
+ tool('af_linear_list_unblocked_backlog', 'List unblocked backlog issues for a project (sorted by priority)', { project: z.string().describe('Project name') }, async (args) => run('list-unblocked-backlog', { project: args.project })),
101
+ tool('af_linear_check_deployment', 'Check deployment status of a pull request', {
102
+ pr_number: z.number().describe('Pull request number'),
103
+ format: z.enum(['json', 'markdown']).optional().describe('Output format (default: json)'),
104
+ }, async (args) => run('check-deployment', args.format ? { format: args.format } : {}, [String(args.pr_number)])),
105
+ tool('af_linear_create_blocker', 'Create a human-needed blocker issue linked to a source issue', {
106
+ source_issue_id: z.string().describe('Source issue ID or identifier that is blocked'),
107
+ title: z.string().describe('What the human needs to do'),
108
+ description: z.string().optional().describe('Detailed steps for the human'),
109
+ team: z.string().optional().describe('Team name (defaults to source issue team)'),
110
+ project: z.string().optional().describe('Project name (defaults to source issue project)'),
111
+ assignee: z.string().optional().describe('Assignee name or email'),
112
+ }, async (args) => {
113
+ const cliArgs = {
114
+ title: args.title,
115
+ };
116
+ if (args.description)
117
+ cliArgs.description = args.description;
118
+ if (args.team)
119
+ cliArgs.team = args.team;
120
+ if (args.project)
121
+ cliArgs.project = args.project;
122
+ if (args.assignee)
123
+ cliArgs.assignee = args.assignee;
124
+ return run('create-blocker', cliArgs, [args.source_issue_id]);
125
+ }),
126
+ ];
127
+ }
128
+ export const linearPlugin = {
129
+ name: 'af-linear',
130
+ description: 'Linear project management operations',
131
+ createTools(context) {
132
+ const apiKey = context.env.LINEAR_API_KEY;
133
+ if (!apiKey) {
134
+ return [];
135
+ }
136
+ return makeTools(apiKey, context.env.LINEAR_TEAM_NAME);
137
+ },
138
+ };
@@ -0,0 +1,9 @@
1
+ import { type McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-agent-sdk';
2
+ import type { ToolPlugin, ToolPluginContext } from './types.js';
3
+ export declare class ToolRegistry {
4
+ private plugins;
5
+ register(plugin: ToolPlugin): void;
6
+ /** Create MCP servers for all registered plugins */
7
+ createServers(context: ToolPluginContext): Record<string, McpSdkServerConfigWithInstance>;
8
+ }
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE/D,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAmB;IAElC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIlC,oDAAoD;IACpD,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC;CAU1F"}
@@ -0,0 +1,18 @@
1
+ import { createSdkMcpServer } from '@anthropic-ai/claude-agent-sdk';
2
+ export class ToolRegistry {
3
+ plugins = [];
4
+ register(plugin) {
5
+ this.plugins.push(plugin);
6
+ }
7
+ /** Create MCP servers for all registered plugins */
8
+ createServers(context) {
9
+ const servers = {};
10
+ for (const plugin of this.plugins) {
11
+ const tools = plugin.createTools(context);
12
+ if (tools.length > 0) {
13
+ servers[plugin.name] = createSdkMcpServer({ name: plugin.name, tools });
14
+ }
15
+ }
16
+ return servers;
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import type { SdkMcpToolDefinition } from '@anthropic-ai/claude-agent-sdk';
2
+ /** A plugin that contributes agent tools from CLI functionality */
3
+ export interface ToolPlugin {
4
+ /** Unique plugin name (used as MCP server name, e.g. 'af-linear') */
5
+ name: string;
6
+ /** Human-readable description */
7
+ description: string;
8
+ /** Create the tool definitions. Called once per agent spawn. */
9
+ createTools(context: ToolPluginContext): SdkMcpToolDefinition<any>[];
10
+ }
11
+ /** Context passed to plugins during tool creation */
12
+ export interface ToolPluginContext {
13
+ /** Environment variables available to the agent */
14
+ env: Record<string, string>;
15
+ /** Working directory */
16
+ cwd: string;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAE1E,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAA;CACrE;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAA;CACZ"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@renseiai/agentfactory",
3
+ "version": "0.8.0",
4
+ "type": "module",
5
+ "description": "Multi-agent fleet management for coding agents — orchestrator, providers, crash recovery",
6
+ "author": "Rensei AI (https://rensei.ai)",
7
+ "license": "MIT",
8
+ "engines": {
9
+ "node": ">=22.0.0"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/renseiai/agentfactory",
14
+ "directory": "packages/core"
15
+ },
16
+ "homepage": "https://github.com/renseiai/agentfactory/tree/main/packages/core",
17
+ "bugs": {
18
+ "url": "https://github.com/renseiai/agentfactory/issues"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/src/index.d.ts",
25
+ "import": "./dist/src/index.js",
26
+ "default": "./dist/src/index.js"
27
+ }
28
+ },
29
+ "main": "./dist/src/index.js",
30
+ "types": "./dist/src/index.d.ts"
31
+ },
32
+ "keywords": [
33
+ "agent",
34
+ "orchestrator",
35
+ "coding-agent",
36
+ "claude",
37
+ "codex",
38
+ "multi-agent",
39
+ "fleet-management"
40
+ ],
41
+ "main": "./dist/src/index.js",
42
+ "module": "./dist/src/index.js",
43
+ "types": "./dist/src/index.d.ts",
44
+ "exports": {
45
+ ".": {
46
+ "types": "./src/index.ts",
47
+ "import": "./dist/src/index.js",
48
+ "default": "./dist/src/index.js"
49
+ }
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "README.md",
54
+ "LICENSE"
55
+ ],
56
+ "dependencies": {
57
+ "@anthropic-ai/claude-agent-sdk": "^0.2.7",
58
+ "@renseiai/agentfactory-linear": "workspace:*",
59
+ "dotenv": "^17.2.3",
60
+ "handlebars": "^4.7.8",
61
+ "yaml": "^2.8.2",
62
+ "zod": "^4.3.6"
63
+ },
64
+ "devDependencies": {
65
+ "@renseiai/create-agentfactory-app": "workspace:*",
66
+ "@types/node": "^22.5.4",
67
+ "typescript": "^5.7.3",
68
+ "vitest": "^3.2.3"
69
+ },
70
+ "scripts": {
71
+ "build": "tsc",
72
+ "typecheck": "tsc --noEmit",
73
+ "test": "vitest run --passWithNoTests",
74
+ "test:watch": "vitest",
75
+ "clean": "rm -rf dist",
76
+ "prepublishOnly": "pnpm clean && pnpm build"
77
+ }
78
+ }