@2amtech/hai 0.0.1

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 (239) hide show
  1. package/README.md +212 -0
  2. package/dist/ai/agent-info.d.ts +1 -0
  3. package/dist/ai/agent-info.js +42 -0
  4. package/dist/ai/agent-info.js.map +1 -0
  5. package/dist/ai/agents/architect.d.ts +3 -0
  6. package/dist/ai/agents/architect.js +107 -0
  7. package/dist/ai/agents/architect.js.map +1 -0
  8. package/dist/ai/agents/backend-dev.d.ts +3 -0
  9. package/dist/ai/agents/backend-dev.js +33 -0
  10. package/dist/ai/agents/backend-dev.js.map +1 -0
  11. package/dist/ai/agents/frontend-dev.d.ts +3 -0
  12. package/dist/ai/agents/frontend-dev.js +31 -0
  13. package/dist/ai/agents/frontend-dev.js.map +1 -0
  14. package/dist/ai/agents/index.d.ts +3 -0
  15. package/dist/ai/agents/index.js +17 -0
  16. package/dist/ai/agents/index.js.map +1 -0
  17. package/dist/ai/agents/refactorer.d.ts +3 -0
  18. package/dist/ai/agents/refactorer.js +38 -0
  19. package/dist/ai/agents/refactorer.js.map +1 -0
  20. package/dist/ai/agents/researcher.d.ts +3 -0
  21. package/dist/ai/agents/researcher.js +28 -0
  22. package/dist/ai/agents/researcher.js.map +1 -0
  23. package/dist/ai/agents/security-reviewer.d.ts +3 -0
  24. package/dist/ai/agents/security-reviewer.js +99 -0
  25. package/dist/ai/agents/security-reviewer.js.map +1 -0
  26. package/dist/ai/agents/types.d.ts +6 -0
  27. package/dist/ai/agents/types.js +2 -0
  28. package/dist/ai/agents/types.js.map +1 -0
  29. package/dist/ai/agents/verifier.d.ts +3 -0
  30. package/dist/ai/agents/verifier.js +28 -0
  31. package/dist/ai/agents/verifier.js.map +1 -0
  32. package/dist/ai/prompts/document.d.ts +3 -0
  33. package/dist/ai/prompts/document.js +57 -0
  34. package/dist/ai/prompts/document.js.map +1 -0
  35. package/dist/ai/prompts/implement.d.ts +3 -0
  36. package/dist/ai/prompts/implement.js +128 -0
  37. package/dist/ai/prompts/implement.js.map +1 -0
  38. package/dist/ai/prompts/index.d.ts +3 -0
  39. package/dist/ai/prompts/index.js +17 -0
  40. package/dist/ai/prompts/index.js.map +1 -0
  41. package/dist/ai/prompts/optimize-ai.d.ts +3 -0
  42. package/dist/ai/prompts/optimize-ai.js +104 -0
  43. package/dist/ai/prompts/optimize-ai.js.map +1 -0
  44. package/dist/ai/prompts/pull-specs.d.ts +3 -0
  45. package/dist/ai/prompts/pull-specs.js +10 -0
  46. package/dist/ai/prompts/pull-specs.js.map +1 -0
  47. package/dist/ai/prompts/pull-tickets.d.ts +3 -0
  48. package/dist/ai/prompts/pull-tickets.js +11 -0
  49. package/dist/ai/prompts/pull-tickets.js.map +1 -0
  50. package/dist/ai/prompts/pull.d.ts +3 -0
  51. package/dist/ai/prompts/pull.js +9 -0
  52. package/dist/ai/prompts/pull.js.map +1 -0
  53. package/dist/ai/prompts/review-changes.d.ts +3 -0
  54. package/dist/ai/prompts/review-changes.js +88 -0
  55. package/dist/ai/prompts/review-changes.js.map +1 -0
  56. package/dist/ai/prompts/types.d.ts +6 -0
  57. package/dist/ai/prompts/types.js +2 -0
  58. package/dist/ai/prompts/types.js.map +1 -0
  59. package/dist/app.d.ts +14 -0
  60. package/dist/app.js +40 -0
  61. package/dist/app.js.map +1 -0
  62. package/dist/cli.d.ts +2 -0
  63. package/dist/cli.js +79 -0
  64. package/dist/cli.js.map +1 -0
  65. package/dist/commands/get.d.ts +8 -0
  66. package/dist/commands/get.js +73 -0
  67. package/dist/commands/get.js.map +1 -0
  68. package/dist/commands/init.d.ts +3 -0
  69. package/dist/commands/init.js +113 -0
  70. package/dist/commands/init.js.map +1 -0
  71. package/dist/commands/mcp/helpers.d.ts +15 -0
  72. package/dist/commands/mcp/helpers.js +21 -0
  73. package/dist/commands/mcp/helpers.js.map +1 -0
  74. package/dist/commands/mcp/pull.d.ts +3 -0
  75. package/dist/commands/mcp/pull.js +85 -0
  76. package/dist/commands/mcp/pull.js.map +1 -0
  77. package/dist/commands/mcp/server.d.ts +2 -0
  78. package/dist/commands/mcp/server.js +80 -0
  79. package/dist/commands/mcp/server.js.map +1 -0
  80. package/dist/commands/mcp/specs.d.ts +2 -0
  81. package/dist/commands/mcp/specs.js +325 -0
  82. package/dist/commands/mcp/specs.js.map +1 -0
  83. package/dist/commands/mcp/tickets.d.ts +3 -0
  84. package/dist/commands/mcp/tickets.js +77 -0
  85. package/dist/commands/mcp/tickets.js.map +1 -0
  86. package/dist/commands/pull.d.ts +10 -0
  87. package/dist/commands/pull.js +61 -0
  88. package/dist/commands/pull.js.map +1 -0
  89. package/dist/commands/status.d.ts +2 -0
  90. package/dist/commands/status.js +102 -0
  91. package/dist/commands/status.js.map +1 -0
  92. package/dist/components/ticket-renderer.d.ts +5 -0
  93. package/dist/components/ticket-renderer.js +89 -0
  94. package/dist/components/ticket-renderer.js.map +1 -0
  95. package/dist/contexts/config-context.d.ts +17 -0
  96. package/dist/contexts/config-context.js +77 -0
  97. package/dist/contexts/config-context.js.map +1 -0
  98. package/dist/contexts/error-context.d.ts +12 -0
  99. package/dist/contexts/error-context.js +28 -0
  100. package/dist/contexts/error-context.js.map +1 -0
  101. package/dist/helpers/config.d.ts +4 -0
  102. package/dist/helpers/config.js +29 -0
  103. package/dist/helpers/config.js.map +1 -0
  104. package/dist/helpers/fs.d.ts +8 -0
  105. package/dist/helpers/fs.js +83 -0
  106. package/dist/helpers/fs.js.map +1 -0
  107. package/dist/helpers/init.d.ts +2 -0
  108. package/dist/helpers/init.js +18 -0
  109. package/dist/helpers/init.js.map +1 -0
  110. package/dist/helpers/preflight.d.ts +8 -0
  111. package/dist/helpers/preflight.js +77 -0
  112. package/dist/helpers/preflight.js.map +1 -0
  113. package/dist/helpers/pull.d.ts +9 -0
  114. package/dist/helpers/pull.js +79 -0
  115. package/dist/helpers/pull.js.map +1 -0
  116. package/dist/helpers/symlink.d.ts +9 -0
  117. package/dist/helpers/symlink.js +104 -0
  118. package/dist/helpers/symlink.js.map +1 -0
  119. package/dist/helpers/tickets.d.ts +4 -0
  120. package/dist/helpers/tickets.js +56 -0
  121. package/dist/helpers/tickets.js.map +1 -0
  122. package/dist/hooks/use-async.d.ts +6 -0
  123. package/dist/hooks/use-async.js +37 -0
  124. package/dist/hooks/use-async.js.map +1 -0
  125. package/dist/plugins/atlassian/adf-to-markdown.d.ts +11 -0
  126. package/dist/plugins/atlassian/adf-to-markdown.js +121 -0
  127. package/dist/plugins/atlassian/adf-to-markdown.js.map +1 -0
  128. package/dist/plugins/atlassian/auth-step.d.ts +10 -0
  129. package/dist/plugins/atlassian/auth-step.js +59 -0
  130. package/dist/plugins/atlassian/auth-step.js.map +1 -0
  131. package/dist/plugins/atlassian/confluence-client.d.ts +24 -0
  132. package/dist/plugins/atlassian/confluence-client.js +250 -0
  133. package/dist/plugins/atlassian/confluence-client.js.map +1 -0
  134. package/dist/plugins/atlassian/data.d.ts +18 -0
  135. package/dist/plugins/atlassian/data.js +12 -0
  136. package/dist/plugins/atlassian/data.js.map +1 -0
  137. package/dist/plugins/atlassian/index.d.ts +2 -0
  138. package/dist/plugins/atlassian/index.js +57 -0
  139. package/dist/plugins/atlassian/index.js.map +1 -0
  140. package/dist/plugins/atlassian/init-step.d.ts +11 -0
  141. package/dist/plugins/atlassian/init-step.js +54 -0
  142. package/dist/plugins/atlassian/init-step.js.map +1 -0
  143. package/dist/plugins/atlassian/jira-client.d.ts +38 -0
  144. package/dist/plugins/atlassian/jira-client.js +308 -0
  145. package/dist/plugins/atlassian/jira-client.js.map +1 -0
  146. package/dist/plugins/atlassian/specs-step.d.ts +13 -0
  147. package/dist/plugins/atlassian/specs-step.js +71 -0
  148. package/dist/plugins/atlassian/specs-step.js.map +1 -0
  149. package/dist/plugins/atlassian/tickets-step.d.ts +8 -0
  150. package/dist/plugins/atlassian/tickets-step.js +45 -0
  151. package/dist/plugins/atlassian/tickets-step.js.map +1 -0
  152. package/dist/plugins/claude-code/agents.d.ts +4 -0
  153. package/dist/plugins/claude-code/agents.js +56 -0
  154. package/dist/plugins/claude-code/agents.js.map +1 -0
  155. package/dist/plugins/claude-code/commands.d.ts +4 -0
  156. package/dist/plugins/claude-code/commands.js +54 -0
  157. package/dist/plugins/claude-code/commands.js.map +1 -0
  158. package/dist/plugins/claude-code/index.d.ts +2 -0
  159. package/dist/plugins/claude-code/index.js +57 -0
  160. package/dist/plugins/claude-code/index.js.map +1 -0
  161. package/dist/plugins/cursor/index.d.ts +2 -0
  162. package/dist/plugins/cursor/index.js +60 -0
  163. package/dist/plugins/cursor/index.js.map +1 -0
  164. package/dist/plugins/index.d.ts +1 -0
  165. package/dist/plugins/index.js +16 -0
  166. package/dist/plugins/index.js.map +1 -0
  167. package/dist/plugins/local/index.d.ts +2 -0
  168. package/dist/plugins/local/index.js +53 -0
  169. package/dist/plugins/local/index.js.map +1 -0
  170. package/dist/plugins/local/init-step.d.ts +9 -0
  171. package/dist/plugins/local/init-step.js +24 -0
  172. package/dist/plugins/local/init-step.js.map +1 -0
  173. package/dist/plugins/local/local-spec-provider.d.ts +9 -0
  174. package/dist/plugins/local/local-spec-provider.js +66 -0
  175. package/dist/plugins/local/local-spec-provider.js.map +1 -0
  176. package/dist/plugins/local/local-ticket-provider.d.ts +24 -0
  177. package/dist/plugins/local/local-ticket-provider.js +89 -0
  178. package/dist/plugins/local/local-ticket-provider.js.map +1 -0
  179. package/dist/plugins/none/index.d.ts +2 -0
  180. package/dist/plugins/none/index.js +78 -0
  181. package/dist/plugins/none/index.js.map +1 -0
  182. package/dist/plugins/other-ai/index.d.ts +2 -0
  183. package/dist/plugins/other-ai/index.js +48 -0
  184. package/dist/plugins/other-ai/index.js.map +1 -0
  185. package/dist/plugins/registry.d.ts +4 -0
  186. package/dist/plugins/registry.js +18 -0
  187. package/dist/plugins/registry.js.map +1 -0
  188. package/dist/plugins/resolve.d.ts +8 -0
  189. package/dist/plugins/resolve.js +23 -0
  190. package/dist/plugins/resolve.js.map +1 -0
  191. package/dist/plugins/types.d.ts +36 -0
  192. package/dist/plugins/types.js +2 -0
  193. package/dist/plugins/types.js.map +1 -0
  194. package/dist/plugins/vscode-copilot/agents.d.ts +4 -0
  195. package/dist/plugins/vscode-copilot/agents.js +51 -0
  196. package/dist/plugins/vscode-copilot/agents.js.map +1 -0
  197. package/dist/plugins/vscode-copilot/index.d.ts +2 -0
  198. package/dist/plugins/vscode-copilot/index.js +59 -0
  199. package/dist/plugins/vscode-copilot/index.js.map +1 -0
  200. package/dist/plugins/vscode-copilot/prompts.d.ts +4 -0
  201. package/dist/plugins/vscode-copilot/prompts.js +60 -0
  202. package/dist/plugins/vscode-copilot/prompts.js.map +1 -0
  203. package/dist/schemas/config.d.ts +24 -0
  204. package/dist/schemas/config.js +38 -0
  205. package/dist/schemas/config.js.map +1 -0
  206. package/dist/types.d.ts +84 -0
  207. package/dist/types.js +2 -0
  208. package/dist/types.js.map +1 -0
  209. package/dist/ui/confirm.d.ts +7 -0
  210. package/dist/ui/confirm.js +19 -0
  211. package/dist/ui/confirm.js.map +1 -0
  212. package/dist/ui/error-display.d.ts +6 -0
  213. package/dist/ui/error-display.js +23 -0
  214. package/dist/ui/error-display.js.map +1 -0
  215. package/dist/ui/masked-input.d.ts +9 -0
  216. package/dist/ui/masked-input.js +25 -0
  217. package/dist/ui/masked-input.js.map +1 -0
  218. package/dist/ui/multi-select.d.ts +13 -0
  219. package/dist/ui/multi-select.js +127 -0
  220. package/dist/ui/multi-select.js.map +1 -0
  221. package/dist/ui/select-input.d.ts +12 -0
  222. package/dist/ui/select-input.js +81 -0
  223. package/dist/ui/select-input.js.map +1 -0
  224. package/dist/ui/spinner.d.ts +6 -0
  225. package/dist/ui/spinner.js +18 -0
  226. package/dist/ui/spinner.js.map +1 -0
  227. package/dist/ui/text-input.d.ts +9 -0
  228. package/dist/ui/text-input.js +23 -0
  229. package/dist/ui/text-input.js.map +1 -0
  230. package/dist/wizard/passthrough-step.d.ts +6 -0
  231. package/dist/wizard/passthrough-step.js +8 -0
  232. package/dist/wizard/passthrough-step.js.map +1 -0
  233. package/dist/wizard/plugin-select-step.d.ts +10 -0
  234. package/dist/wizard/plugin-select-step.js +31 -0
  235. package/dist/wizard/plugin-select-step.js.map +1 -0
  236. package/dist/wizard/summary-step.d.ts +2 -0
  237. package/dist/wizard/summary-step.js +97 -0
  238. package/dist/wizard/summary-step.js.map +1 -0
  239. package/package.json +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../source/plugins/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAU;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,oBAAoB,EAAE,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAC9D,IAAI,CACJ,EAAE,CACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAmB;IAC1D,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AiProvider, TicketProvider, SpecProvider } from '../types.js';
2
+ import type { HaiConfig } from '../schemas/config.js';
3
+ import type { CapabilityType, ProviderMap } from './types.js';
4
+ export declare function resolveProvider<T extends CapabilityType>(config: HaiConfig, capability: T): ProviderMap[T];
5
+ export declare function resolveTicketProvider(config: HaiConfig): TicketProvider;
6
+ export declare function resolveSpecProvider(config: HaiConfig): SpecProvider;
7
+ export declare function resolveAiProvider(config: HaiConfig): AiProvider;
8
+ export declare function hasCapability(config: HaiConfig, capability: CapabilityType): boolean;
@@ -0,0 +1,23 @@
1
+ import { findPluginForCapability, extractPluginData } from '../schemas/config.js';
2
+ import { getPlugin } from './registry.js';
3
+ export function resolveProvider(config, capability) {
4
+ const entry = findPluginForCapability(config, capability);
5
+ if (!entry) {
6
+ throw new Error(`No plugin provides "${capability}"`);
7
+ }
8
+ const plugin = getPlugin(entry.plugin);
9
+ return plugin.createProvider(capability, extractPluginData(entry));
10
+ }
11
+ export function resolveTicketProvider(config) {
12
+ return resolveProvider(config, 'tickets');
13
+ }
14
+ export function resolveSpecProvider(config) {
15
+ return resolveProvider(config, 'specs');
16
+ }
17
+ export function resolveAiProvider(config) {
18
+ return resolveProvider(config, 'ai');
19
+ }
20
+ export function hasCapability(config, capability) {
21
+ return !!findPluginForCapability(config, capability);
22
+ }
23
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../source/plugins/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,uBAAuB,EAAE,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAGxC,MAAM,UAAU,eAAe,CAC9B,MAAiB,EACjB,UAAa;IAEb,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACtD,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACpD,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IAClD,OAAO,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,MAAiB,EACjB,UAA0B;IAE1B,OAAO,CAAC,CAAC,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { AiProvider, TicketProvider, SpecProvider } from '../types.js';
3
+ export type CapabilityType = 'ai' | 'tickets' | 'specs';
4
+ export type PluginData = Record<string, unknown>;
5
+ export interface PluginEntry {
6
+ plugin: string;
7
+ provides: CapabilityType[];
8
+ [key: string]: unknown;
9
+ }
10
+ export type ProviderMap = {
11
+ ai: AiProvider;
12
+ tickets: TicketProvider;
13
+ specs: SpecProvider;
14
+ };
15
+ export interface HaiPlugin {
16
+ readonly id: string;
17
+ readonly name: string;
18
+ getCapabilities(): CapabilityType[];
19
+ InitStep: ComponentType<{
20
+ capability: CapabilityType;
21
+ existingData?: PluginData;
22
+ onComplete: (data: PluginData) => void;
23
+ }>;
24
+ createProvider<T extends CapabilityType, V extends PluginData>(capability: T, data: V): ProviderMap[T];
25
+ /** Extract the list of project keys for ticket syncing */
26
+ getTicketProjects?(data: PluginData): string[];
27
+ /** Extract space keys and optional ancestor for spec syncing */
28
+ getSpecConfig?(data: PluginData): {
29
+ spaces: string[];
30
+ ancestor?: string;
31
+ };
32
+ /** Whether this plugin requires user configuration for a capability */
33
+ needsConfiguration?(capability: CapabilityType): boolean;
34
+ /** Return a human-readable summary for a capability */
35
+ summarize?(capability: CapabilityType, data: PluginData): string;
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../source/plugins/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare function getCopilotAgents(): Array<{
2
+ filename: string;
3
+ content: string;
4
+ }>;
@@ -0,0 +1,51 @@
1
+ import { AGENTS } from '../../ai/agents/index.js';
2
+ const COPILOT_AGENT_OVERRIDES = {
3
+ architect: {
4
+ tools: ['read', 'search', 'agent', 'edit'],
5
+ },
6
+ 'backend-dev': {
7
+ tools: ['read', 'edit', 'execute', 'search', 'agent'],
8
+ },
9
+ 'frontend-dev': {
10
+ tools: ['read', 'edit', 'execute', 'search', 'agent'],
11
+ },
12
+ refactorer: {
13
+ tools: ['read', 'edit', 'execute', 'search'],
14
+ },
15
+ researcher: {
16
+ tools: ['read', 'search', 'execute', 'agent'],
17
+ },
18
+ 'security-reviewer': {
19
+ tools: ['read', 'search', 'execute'],
20
+ },
21
+ verifier: {
22
+ tools: ['read', 'search', 'execute', 'agent'],
23
+ },
24
+ };
25
+ function formatTools(tools) {
26
+ return `[${tools.map(t => `'${t}'`).join(', ')}]`;
27
+ }
28
+ function buildAgentMarkdown(agent, config) {
29
+ return `---
30
+ name: ${agent.name}
31
+ description: >
32
+ ${agent.description}
33
+ tools: ${formatTools(config.tools)}
34
+ ---
35
+
36
+ ${agent.body}
37
+ `;
38
+ }
39
+ export function getCopilotAgents() {
40
+ return Object.entries(AGENTS).map(([key, agent]) => {
41
+ const config = COPILOT_AGENT_OVERRIDES[key];
42
+ if (!config) {
43
+ throw new Error(`Missing Copilot agent config for: ${key}`);
44
+ }
45
+ return {
46
+ filename: `${key}.agent.md`,
47
+ content: buildAgentMarkdown(agent, config),
48
+ };
49
+ });
50
+ }
51
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../source/plugins/vscode-copilot/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAOlD,MAAM,uBAAuB,GAAuC;IACnE,SAAS,EAAE;QACV,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;KAC1C;IACD,aAAa,EAAE;QACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;KACrD;IACD,cAAc,EAAE;QACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;KACrD;IACD,UAAU,EAAE;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;KAC5C;IACD,UAAU,EAAE;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;KAC7C;IACD,mBAAmB,EAAE;QACpB,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;KACpC;IACD,QAAQ,EAAE;QACT,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;KAC7C;CACD,CAAC;AAEF,SAAS,WAAW,CAAC,KAAe;IACnC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAsB,EACtB,MAA0B;IAE1B,OAAO;QACA,KAAK,CAAC,IAAI;;IAEd,KAAK,CAAC,WAAW;SACZ,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;;;EAGhC,KAAK,CAAC,IAAI;CACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO;YACN,QAAQ,EAAE,GAAG,GAAG,WAAW;YAC3B,OAAO,EAAE,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC;SAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { HaiPlugin } from '../types.js';
2
+ export declare const vscodeCopilotPlugin: HaiPlugin;
@@ -0,0 +1,59 @@
1
+ import { writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { PassthroughStep } from '../../wizard/passthrough-step.js';
4
+ import { readJsonFileSafe } from '../../helpers/fs.js';
5
+ import { generateAgentInfo } from '../../ai/agent-info.js';
6
+ import { getCopilotPrompts } from './prompts.js';
7
+ import { getCopilotAgents } from './agents.js';
8
+ export const vscodeCopilotPlugin = {
9
+ id: 'vscode-copilot',
10
+ name: 'GitHub Copilot',
11
+ getCapabilities() {
12
+ return ['ai'];
13
+ },
14
+ needsConfiguration() {
15
+ return false;
16
+ },
17
+ InitStep: PassthroughStep,
18
+ createProvider(capability, _data) {
19
+ if (capability !== 'ai') {
20
+ throw new Error(`GitHub Copilot plugin does not support capability: ${capability}`);
21
+ }
22
+ const provider = {
23
+ name: 'GitHub Copilot',
24
+ async install(cwd) {
25
+ // Register MCP server in .vscode/mcp.json
26
+ const dir = join(cwd, '.vscode');
27
+ await mkdir(dir, { recursive: true });
28
+ const configPath = join(dir, 'mcp.json');
29
+ const existing = await readJsonFileSafe(configPath);
30
+ const servers = (existing['servers'] ?? {});
31
+ servers['hai'] = {
32
+ command: 'npx',
33
+ args: ['hai', 'mcp', '.'],
34
+ };
35
+ existing['servers'] = servers;
36
+ await writeFile(configPath, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
37
+ // Install prompt files
38
+ const promptsDir = join(cwd, '.github', 'prompts');
39
+ await mkdir(promptsDir, { recursive: true });
40
+ for (const prompt of getCopilotPrompts()) {
41
+ await writeFile(join(promptsDir, prompt.filename), prompt.content, 'utf-8');
42
+ }
43
+ // Install agent definitions
44
+ const agentsDir = join(cwd, '.github', 'agents');
45
+ await mkdir(agentsDir, { recursive: true });
46
+ for (const agent of getCopilotAgents()) {
47
+ await writeFile(join(agentsDir, agent.filename), agent.content, 'utf-8');
48
+ }
49
+ // Generate agent info in .ai/ directory
50
+ await writeFile(join(cwd, '.ai', 'AGENTS.md'), generateAgentInfo(), 'utf-8');
51
+ },
52
+ };
53
+ return provider;
54
+ },
55
+ summarize(_capability, _data) {
56
+ return '';
57
+ },
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/plugins/vscode-copilot/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getCopilotPrompts(): Array<{
2
+ filename: string;
3
+ content: string;
4
+ }>;
@@ -0,0 +1,60 @@
1
+ import { PROMPTS } from '../../ai/prompts/index.js';
2
+ const COPILOT_PROMPT_OVERRIDES = {
3
+ 'pull-tickets': {
4
+ tools: ['hai/*'],
5
+ agent: 'agent',
6
+ },
7
+ 'pull-specs': {
8
+ tools: ['hai/*'],
9
+ agent: 'agent',
10
+ },
11
+ pull: {
12
+ tools: ['hai/*'],
13
+ agent: 'agent',
14
+ },
15
+ implement: {
16
+ tools: ['hai/*', 'read', 'edit', 'execute', 'search', 'agent'],
17
+ agent: 'agent',
18
+ },
19
+ 'optimize-ai': {
20
+ tools: ['read', 'edit', 'execute', 'search'],
21
+ agent: 'agent',
22
+ },
23
+ document: {
24
+ tools: ['read', 'edit', 'execute', 'search'],
25
+ agent: 'agent',
26
+ },
27
+ 'review-changes': {
28
+ tools: ['read', 'execute', 'search'],
29
+ agent: 'agent',
30
+ },
31
+ };
32
+ function toCamelCase(kebab) {
33
+ return kebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
34
+ }
35
+ function formatTools(tools) {
36
+ return `[${tools.map(t => `'${t}'`).join(', ')}]`;
37
+ }
38
+ function buildPromptMarkdown(prompt, config) {
39
+ return `---
40
+ description: ${prompt.description}
41
+ agent: '${config.agent}'
42
+ tools: ${formatTools(config.tools)}
43
+ ---
44
+
45
+ ${prompt.body}
46
+ `;
47
+ }
48
+ export function getCopilotPrompts() {
49
+ return Object.entries(PROMPTS).map(([key, prompt]) => {
50
+ const config = COPILOT_PROMPT_OVERRIDES[key];
51
+ if (!config) {
52
+ throw new Error(`Missing Copilot prompt config for: ${key}`);
53
+ }
54
+ return {
55
+ filename: `${toCamelCase(key)}.prompt.md`,
56
+ content: buildPromptMarkdown(prompt, config),
57
+ };
58
+ });
59
+ }
60
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../source/plugins/vscode-copilot/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAQpD,MAAM,wBAAwB,GAAwC;IACrE,cAAc,EAAE;QACf,KAAK,EAAE,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO;KACd;IACD,YAAY,EAAE;QACb,KAAK,EAAE,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO;KACd;IACD,IAAI,EAAE;QACL,KAAK,EAAE,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO;KACd;IACD,SAAS,EAAE;QACV,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;QAC9D,KAAK,EAAE,OAAO;KACd;IACD,aAAa,EAAE;QACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC5C,KAAK,EAAE,OAAO;KACd;IACD,QAAQ,EAAE;QACT,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC5C,KAAK,EAAE,OAAO;KACd;IACD,gBAAgB,EAAE;QACjB,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QACpC,KAAK,EAAE,OAAO;KACd;CACD,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IACnC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAAwB,EACxB,MAA2B;IAE3B,OAAO;eACO,MAAM,CAAC,WAAW;UACvB,MAAM,CAAC,KAAK;SACb,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;;;EAGhC,MAAM,CAAC,IAAI;CACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAIhC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACN,QAAQ,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY;YACzC,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;SAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import type { CapabilityType } from '../plugins/types.js';
3
+ export declare const PluginEntrySchema: z.ZodObject<{
4
+ plugin: z.ZodString;
5
+ provides: z.ZodArray<z.ZodEnum<{
6
+ ai: "ai";
7
+ tickets: "tickets";
8
+ specs: "specs";
9
+ }>>;
10
+ }, z.core.$loose>;
11
+ export type PluginEntry = z.infer<typeof PluginEntrySchema>;
12
+ export declare const HaiConfigSchema: z.ZodObject<{
13
+ plugins: z.ZodArray<z.ZodObject<{
14
+ plugin: z.ZodString;
15
+ provides: z.ZodArray<z.ZodEnum<{
16
+ ai: "ai";
17
+ tickets: "tickets";
18
+ specs: "specs";
19
+ }>>;
20
+ }, z.core.$loose>>;
21
+ }, z.core.$strip>;
22
+ export type HaiConfig = z.infer<typeof HaiConfigSchema>;
23
+ export declare function extractPluginData(entry: PluginEntry): Record<string, unknown>;
24
+ export declare function findPluginForCapability(config: HaiConfig, capability: CapabilityType): PluginEntry | undefined;
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ export const PluginEntrySchema = z
3
+ .object({
4
+ plugin: z.string().min(1),
5
+ provides: z
6
+ .array(z.enum(['ai', 'tickets', 'specs']))
7
+ .min(1, 'plugin must provide at least one capability'),
8
+ })
9
+ .passthrough();
10
+ export const HaiConfigSchema = z
11
+ .object({
12
+ plugins: z
13
+ .array(PluginEntrySchema)
14
+ .min(1, 'at least one plugin must be configured'),
15
+ })
16
+ .superRefine((config, ctx) => {
17
+ const seen = new Set();
18
+ for (const entry of config.plugins) {
19
+ for (const cap of entry.provides) {
20
+ if (seen.has(cap)) {
21
+ ctx.addIssue({
22
+ code: z.ZodIssueCode.custom,
23
+ message: `Capability "${cap}" is provided by multiple plugins`,
24
+ path: ['plugins'],
25
+ });
26
+ }
27
+ seen.add(cap);
28
+ }
29
+ }
30
+ });
31
+ export function extractPluginData(entry) {
32
+ const { plugin: _plugin, provides: _provides, ...data } = entry;
33
+ return data;
34
+ }
35
+ export function findPluginForCapability(config, capability) {
36
+ return config.plugins.find(p => p.provides.includes(capability));
37
+ }
38
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../source/schemas/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAChC,MAAM,CAAC;IACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,QAAQ,EAAE,CAAC;SACT,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,EAAE,6CAA6C,CAAC;CACvD,CAAC;KACD,WAAW,EAAE,CAAC;AAIhB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC9B,MAAM,CAAC;IACP,OAAO,EAAE,CAAC;SACR,KAAK,CAAC,iBAAiB,CAAC;SACxB,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;CAClD,CAAC;KACD,WAAW,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,GAAG,CAAC,QAAQ,CAAC;oBACZ,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;oBAC3B,OAAO,EAAE,eAAe,GAAG,mCAAmC;oBAC9D,IAAI,EAAE,CAAC,SAAS,CAAC;iBACjB,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACF,CAAC;AACF,CAAC,CAAC,CAAC;AAIJ,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IACnD,MAAM,EAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAC,GAAG,KAAK,CAAC;IAC9D,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,MAAiB,EACjB,UAA0B;IAE1B,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,84 @@
1
+ export interface Comment {
2
+ author: string;
3
+ created: string;
4
+ body: string;
5
+ }
6
+ export interface Attachment {
7
+ id: string;
8
+ filename: string;
9
+ mimeType: string;
10
+ content: string;
11
+ }
12
+ export interface TicketLink {
13
+ key: string;
14
+ relation: string;
15
+ }
16
+ export interface Ticket {
17
+ key: string;
18
+ summary: string;
19
+ status: string;
20
+ statusCategory: string;
21
+ assignee: string | null;
22
+ priority: string;
23
+ created: string;
24
+ updated: string;
25
+ description: string;
26
+ comments: Comment[];
27
+ links: TicketLink[];
28
+ attachments: Attachment[];
29
+ }
30
+ export interface Project {
31
+ key: string;
32
+ name: string;
33
+ }
34
+ export interface Space {
35
+ id: string;
36
+ key: string;
37
+ name: string;
38
+ }
39
+ export interface SpecPage {
40
+ id: string;
41
+ title: string;
42
+ updated: string;
43
+ body: string;
44
+ source: string;
45
+ ancestors: string[];
46
+ }
47
+ export interface SyncOptions {
48
+ dryRun?: boolean;
49
+ updateLocal?: boolean;
50
+ }
51
+ export interface SyncResult {
52
+ downloaded: string[];
53
+ updated: string[];
54
+ removed: string[];
55
+ }
56
+ export interface SpecProvider {
57
+ fetchSpaces(): Promise<Space[]>;
58
+ fetchPages(spaceKey: string, ancestorTitle?: string): Promise<SpecPage[]>;
59
+ sync(destPath: string, options?: SyncOptions): Promise<SyncResult>;
60
+ }
61
+ export interface AiProvider {
62
+ readonly name: string;
63
+ install(cwd: string): Promise<void>;
64
+ }
65
+ export interface TicketProvider {
66
+ fetchProjects(): Promise<Project[]>;
67
+ fetchIssue(key: string): Promise<{
68
+ ticket: Ticket;
69
+ linkedKeys: string[];
70
+ }>;
71
+ fetchWorkingTickets(projects: string[]): Promise<{
72
+ tickets: Ticket[];
73
+ linkedKeys: string[];
74
+ }>;
75
+ fetchDoneTickets(projects: string[]): Promise<{
76
+ tickets: Ticket[];
77
+ linkedKeys: string[];
78
+ }>;
79
+ searchByText(query: string): Promise<{
80
+ tickets: Ticket[];
81
+ linkedKeys: string[];
82
+ }>;
83
+ sync(destPath: string, options?: SyncOptions): Promise<SyncResult>;
84
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../source/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ message: string;
4
+ onConfirm: (confirmed: boolean) => void;
5
+ };
6
+ export default function Confirm({ message, onConfirm }: Props): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { Text, Box, useInput } from 'ink';
3
+ export default function Confirm({ message, onConfirm }) {
4
+ useInput(input => {
5
+ const lower = input.toLowerCase();
6
+ if (lower === 'y') {
7
+ onConfirm(true);
8
+ }
9
+ else if (lower === 'n') {
10
+ onConfirm(false);
11
+ }
12
+ }, {
13
+ isActive: true,
14
+ });
15
+ return (React.createElement(Box, null,
16
+ React.createElement(Text, { bold: true }, message),
17
+ React.createElement(Text, { dimColor: true }, " (y/n)")));
18
+ }
19
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../source/ui/confirm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAC;AAOxC,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAC,OAAO,EAAE,SAAS,EAAQ;IAC1D,QAAQ,CACP,KAAK,CAAC,EAAE;QACP,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC1B,SAAS,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACF,CAAC,EACD;QACC,QAAQ,EAAE,IAAI;KACd,CACD,CAAC;IAEF,OAAO,CACN,oBAAC,GAAG;QACH,oBAAC,IAAI,IAAC,IAAI,UAAE,OAAO,CAAQ;QAC3B,oBAAC,IAAI,IAAC,QAAQ,mBAAc,CACvB,CACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ error: Error;
4
+ };
5
+ export default function ErrorDisplay({ error }: Props): React.JSX.Element;
6
+ export {};
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { Text, Box } from 'ink';
3
+ function getHint(message) {
4
+ if (message.includes('401') || message.includes('403')) {
5
+ return 'Check your credentials. Run "hai configure" to update them.';
6
+ }
7
+ if (message.includes('Config file not found')) {
8
+ return 'Run "hai init" to set up your project.';
9
+ }
10
+ if (message.includes('.gitignore')) {
11
+ return 'Run "hai configure" to fix this automatically.';
12
+ }
13
+ return null;
14
+ }
15
+ export default function ErrorDisplay({ error }) {
16
+ const hint = getHint(error.message);
17
+ return (React.createElement(Box, { flexDirection: "column" },
18
+ React.createElement(Text, { color: "red" },
19
+ "Error: ",
20
+ error.message),
21
+ hint && (React.createElement(Text, { color: "yellow", dimColor: true }, hint))));
22
+ }
23
+ //# sourceMappingURL=error-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-display.js","sourceRoot":"","sources":["../../source/ui/error-display.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,IAAI,EAAE,GAAG,EAAC,MAAM,KAAK,CAAC;AAM9B,SAAS,OAAO,CAAC,OAAe;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,6DAA6D,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC/C,OAAO,wCAAwC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,OAAO,gDAAgD,CAAC;IACzD,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAC,KAAK,EAAQ;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CACN,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QAC1B,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;YAAS,KAAK,CAAC,OAAO,CAAQ;QAC9C,IAAI,IAAI,CACR,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,UAC3B,IAAI,CACC,CACP,CACI,CACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ label: string;
4
+ onSubmit: (value: string) => void;
5
+ placeholder?: string;
6
+ defaultValue?: string;
7
+ };
8
+ export default function MaskedInput({ label, onSubmit, placeholder, defaultValue, }: Props): React.JSX.Element;
9
+ export {};
@@ -0,0 +1,25 @@
1
+ import React, { useState } from 'react';
2
+ import { Text, Box, useInput } from 'ink';
3
+ export default function MaskedInput({ label, onSubmit, placeholder, defaultValue, }) {
4
+ const [value, setValue] = useState(defaultValue ?? '');
5
+ useInput((input, key) => {
6
+ if (key.return) {
7
+ if (value.trim()) {
8
+ onSubmit(value.trim());
9
+ }
10
+ }
11
+ else if (key.backspace || key.delete) {
12
+ setValue(prev => prev.slice(0, -1));
13
+ }
14
+ else if (input && !key.ctrl && !key.meta) {
15
+ setValue(prev => prev + input);
16
+ }
17
+ });
18
+ return (React.createElement(Box, null,
19
+ React.createElement(Text, { bold: true },
20
+ label,
21
+ ": "),
22
+ value ? (React.createElement(Text, null, '*'.repeat(value.length))) : (React.createElement(Text, { dimColor: true }, placeholder ?? '')),
23
+ React.createElement(Text, { color: "cyan" }, "\u2588")));
24
+ }
25
+ //# sourceMappingURL=masked-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masked-input.js","sourceRoot":"","sources":["../../source/ui/masked-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AACtC,OAAO,EAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAC;AASxC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,WAAW,EACX,YAAY,GACL;IACP,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAEvD,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAChC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,CACN,oBAAC,GAAG;QACH,oBAAC,IAAI,IAAC,IAAI;YAAE,KAAK;iBAAU;QAC1B,KAAK,CAAC,CAAC,CAAC,CACR,oBAAC,IAAI,QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAQ,CACvC,CAAC,CAAC,CAAC,CACH,oBAAC,IAAI,IAAC,QAAQ,UAAE,WAAW,IAAI,EAAE,CAAQ,CACzC;QACD,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAS,CACtB,CACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export interface MultiSelectItem {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ type Props = {
7
+ items: MultiSelectItem[];
8
+ onSubmit: (selected: MultiSelectItem[]) => void;
9
+ label?: string;
10
+ initialSelected?: Set<string>;
11
+ };
12
+ export default function MultiSelect({ items, onSubmit, label, initialSelected, }: Props): React.JSX.Element;
13
+ export {};