@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.
- package/README.md +212 -0
- package/dist/ai/agent-info.d.ts +1 -0
- package/dist/ai/agent-info.js +42 -0
- package/dist/ai/agent-info.js.map +1 -0
- package/dist/ai/agents/architect.d.ts +3 -0
- package/dist/ai/agents/architect.js +107 -0
- package/dist/ai/agents/architect.js.map +1 -0
- package/dist/ai/agents/backend-dev.d.ts +3 -0
- package/dist/ai/agents/backend-dev.js +33 -0
- package/dist/ai/agents/backend-dev.js.map +1 -0
- package/dist/ai/agents/frontend-dev.d.ts +3 -0
- package/dist/ai/agents/frontend-dev.js +31 -0
- package/dist/ai/agents/frontend-dev.js.map +1 -0
- package/dist/ai/agents/index.d.ts +3 -0
- package/dist/ai/agents/index.js +17 -0
- package/dist/ai/agents/index.js.map +1 -0
- package/dist/ai/agents/refactorer.d.ts +3 -0
- package/dist/ai/agents/refactorer.js +38 -0
- package/dist/ai/agents/refactorer.js.map +1 -0
- package/dist/ai/agents/researcher.d.ts +3 -0
- package/dist/ai/agents/researcher.js +28 -0
- package/dist/ai/agents/researcher.js.map +1 -0
- package/dist/ai/agents/security-reviewer.d.ts +3 -0
- package/dist/ai/agents/security-reviewer.js +99 -0
- package/dist/ai/agents/security-reviewer.js.map +1 -0
- package/dist/ai/agents/types.d.ts +6 -0
- package/dist/ai/agents/types.js +2 -0
- package/dist/ai/agents/types.js.map +1 -0
- package/dist/ai/agents/verifier.d.ts +3 -0
- package/dist/ai/agents/verifier.js +28 -0
- package/dist/ai/agents/verifier.js.map +1 -0
- package/dist/ai/prompts/document.d.ts +3 -0
- package/dist/ai/prompts/document.js +57 -0
- package/dist/ai/prompts/document.js.map +1 -0
- package/dist/ai/prompts/implement.d.ts +3 -0
- package/dist/ai/prompts/implement.js +128 -0
- package/dist/ai/prompts/implement.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +3 -0
- package/dist/ai/prompts/index.js +17 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/optimize-ai.d.ts +3 -0
- package/dist/ai/prompts/optimize-ai.js +104 -0
- package/dist/ai/prompts/optimize-ai.js.map +1 -0
- package/dist/ai/prompts/pull-specs.d.ts +3 -0
- package/dist/ai/prompts/pull-specs.js +10 -0
- package/dist/ai/prompts/pull-specs.js.map +1 -0
- package/dist/ai/prompts/pull-tickets.d.ts +3 -0
- package/dist/ai/prompts/pull-tickets.js +11 -0
- package/dist/ai/prompts/pull-tickets.js.map +1 -0
- package/dist/ai/prompts/pull.d.ts +3 -0
- package/dist/ai/prompts/pull.js +9 -0
- package/dist/ai/prompts/pull.js.map +1 -0
- package/dist/ai/prompts/review-changes.d.ts +3 -0
- package/dist/ai/prompts/review-changes.js +88 -0
- package/dist/ai/prompts/review-changes.js.map +1 -0
- package/dist/ai/prompts/types.d.ts +6 -0
- package/dist/ai/prompts/types.js +2 -0
- package/dist/ai/prompts/types.js.map +1 -0
- package/dist/app.d.ts +14 -0
- package/dist/app.js +40 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/get.d.ts +8 -0
- package/dist/commands/get.js +73 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +113 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp/helpers.d.ts +15 -0
- package/dist/commands/mcp/helpers.js +21 -0
- package/dist/commands/mcp/helpers.js.map +1 -0
- package/dist/commands/mcp/pull.d.ts +3 -0
- package/dist/commands/mcp/pull.js +85 -0
- package/dist/commands/mcp/pull.js.map +1 -0
- package/dist/commands/mcp/server.d.ts +2 -0
- package/dist/commands/mcp/server.js +80 -0
- package/dist/commands/mcp/server.js.map +1 -0
- package/dist/commands/mcp/specs.d.ts +2 -0
- package/dist/commands/mcp/specs.js +325 -0
- package/dist/commands/mcp/specs.js.map +1 -0
- package/dist/commands/mcp/tickets.d.ts +3 -0
- package/dist/commands/mcp/tickets.js +77 -0
- package/dist/commands/mcp/tickets.js.map +1 -0
- package/dist/commands/pull.d.ts +10 -0
- package/dist/commands/pull.js +61 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/components/ticket-renderer.d.ts +5 -0
- package/dist/components/ticket-renderer.js +89 -0
- package/dist/components/ticket-renderer.js.map +1 -0
- package/dist/contexts/config-context.d.ts +17 -0
- package/dist/contexts/config-context.js +77 -0
- package/dist/contexts/config-context.js.map +1 -0
- package/dist/contexts/error-context.d.ts +12 -0
- package/dist/contexts/error-context.js +28 -0
- package/dist/contexts/error-context.js.map +1 -0
- package/dist/helpers/config.d.ts +4 -0
- package/dist/helpers/config.js +29 -0
- package/dist/helpers/config.js.map +1 -0
- package/dist/helpers/fs.d.ts +8 -0
- package/dist/helpers/fs.js +83 -0
- package/dist/helpers/fs.js.map +1 -0
- package/dist/helpers/init.d.ts +2 -0
- package/dist/helpers/init.js +18 -0
- package/dist/helpers/init.js.map +1 -0
- package/dist/helpers/preflight.d.ts +8 -0
- package/dist/helpers/preflight.js +77 -0
- package/dist/helpers/preflight.js.map +1 -0
- package/dist/helpers/pull.d.ts +9 -0
- package/dist/helpers/pull.js +79 -0
- package/dist/helpers/pull.js.map +1 -0
- package/dist/helpers/symlink.d.ts +9 -0
- package/dist/helpers/symlink.js +104 -0
- package/dist/helpers/symlink.js.map +1 -0
- package/dist/helpers/tickets.d.ts +4 -0
- package/dist/helpers/tickets.js +56 -0
- package/dist/helpers/tickets.js.map +1 -0
- package/dist/hooks/use-async.d.ts +6 -0
- package/dist/hooks/use-async.js +37 -0
- package/dist/hooks/use-async.js.map +1 -0
- package/dist/plugins/atlassian/adf-to-markdown.d.ts +11 -0
- package/dist/plugins/atlassian/adf-to-markdown.js +121 -0
- package/dist/plugins/atlassian/adf-to-markdown.js.map +1 -0
- package/dist/plugins/atlassian/auth-step.d.ts +10 -0
- package/dist/plugins/atlassian/auth-step.js +59 -0
- package/dist/plugins/atlassian/auth-step.js.map +1 -0
- package/dist/plugins/atlassian/confluence-client.d.ts +24 -0
- package/dist/plugins/atlassian/confluence-client.js +250 -0
- package/dist/plugins/atlassian/confluence-client.js.map +1 -0
- package/dist/plugins/atlassian/data.d.ts +18 -0
- package/dist/plugins/atlassian/data.js +12 -0
- package/dist/plugins/atlassian/data.js.map +1 -0
- package/dist/plugins/atlassian/index.d.ts +2 -0
- package/dist/plugins/atlassian/index.js +57 -0
- package/dist/plugins/atlassian/index.js.map +1 -0
- package/dist/plugins/atlassian/init-step.d.ts +11 -0
- package/dist/plugins/atlassian/init-step.js +54 -0
- package/dist/plugins/atlassian/init-step.js.map +1 -0
- package/dist/plugins/atlassian/jira-client.d.ts +38 -0
- package/dist/plugins/atlassian/jira-client.js +308 -0
- package/dist/plugins/atlassian/jira-client.js.map +1 -0
- package/dist/plugins/atlassian/specs-step.d.ts +13 -0
- package/dist/plugins/atlassian/specs-step.js +71 -0
- package/dist/plugins/atlassian/specs-step.js.map +1 -0
- package/dist/plugins/atlassian/tickets-step.d.ts +8 -0
- package/dist/plugins/atlassian/tickets-step.js +45 -0
- package/dist/plugins/atlassian/tickets-step.js.map +1 -0
- package/dist/plugins/claude-code/agents.d.ts +4 -0
- package/dist/plugins/claude-code/agents.js +56 -0
- package/dist/plugins/claude-code/agents.js.map +1 -0
- package/dist/plugins/claude-code/commands.d.ts +4 -0
- package/dist/plugins/claude-code/commands.js +54 -0
- package/dist/plugins/claude-code/commands.js.map +1 -0
- package/dist/plugins/claude-code/index.d.ts +2 -0
- package/dist/plugins/claude-code/index.js +57 -0
- package/dist/plugins/claude-code/index.js.map +1 -0
- package/dist/plugins/cursor/index.d.ts +2 -0
- package/dist/plugins/cursor/index.js +60 -0
- package/dist/plugins/cursor/index.js.map +1 -0
- package/dist/plugins/index.d.ts +1 -0
- package/dist/plugins/index.js +16 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/local/index.d.ts +2 -0
- package/dist/plugins/local/index.js +53 -0
- package/dist/plugins/local/index.js.map +1 -0
- package/dist/plugins/local/init-step.d.ts +9 -0
- package/dist/plugins/local/init-step.js +24 -0
- package/dist/plugins/local/init-step.js.map +1 -0
- package/dist/plugins/local/local-spec-provider.d.ts +9 -0
- package/dist/plugins/local/local-spec-provider.js +66 -0
- package/dist/plugins/local/local-spec-provider.js.map +1 -0
- package/dist/plugins/local/local-ticket-provider.d.ts +24 -0
- package/dist/plugins/local/local-ticket-provider.js +89 -0
- package/dist/plugins/local/local-ticket-provider.js.map +1 -0
- package/dist/plugins/none/index.d.ts +2 -0
- package/dist/plugins/none/index.js +78 -0
- package/dist/plugins/none/index.js.map +1 -0
- package/dist/plugins/other-ai/index.d.ts +2 -0
- package/dist/plugins/other-ai/index.js +48 -0
- package/dist/plugins/other-ai/index.js.map +1 -0
- package/dist/plugins/registry.d.ts +4 -0
- package/dist/plugins/registry.js +18 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/resolve.d.ts +8 -0
- package/dist/plugins/resolve.js +23 -0
- package/dist/plugins/resolve.js.map +1 -0
- package/dist/plugins/types.d.ts +36 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/vscode-copilot/agents.d.ts +4 -0
- package/dist/plugins/vscode-copilot/agents.js +51 -0
- package/dist/plugins/vscode-copilot/agents.js.map +1 -0
- package/dist/plugins/vscode-copilot/index.d.ts +2 -0
- package/dist/plugins/vscode-copilot/index.js +59 -0
- package/dist/plugins/vscode-copilot/index.js.map +1 -0
- package/dist/plugins/vscode-copilot/prompts.d.ts +4 -0
- package/dist/plugins/vscode-copilot/prompts.js +60 -0
- package/dist/plugins/vscode-copilot/prompts.js.map +1 -0
- package/dist/schemas/config.d.ts +24 -0
- package/dist/schemas/config.js +38 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/confirm.d.ts +7 -0
- package/dist/ui/confirm.js +19 -0
- package/dist/ui/confirm.js.map +1 -0
- package/dist/ui/error-display.d.ts +6 -0
- package/dist/ui/error-display.js +23 -0
- package/dist/ui/error-display.js.map +1 -0
- package/dist/ui/masked-input.d.ts +9 -0
- package/dist/ui/masked-input.js +25 -0
- package/dist/ui/masked-input.js.map +1 -0
- package/dist/ui/multi-select.d.ts +13 -0
- package/dist/ui/multi-select.js +127 -0
- package/dist/ui/multi-select.js.map +1 -0
- package/dist/ui/select-input.d.ts +12 -0
- package/dist/ui/select-input.js +81 -0
- package/dist/ui/select-input.js.map +1 -0
- package/dist/ui/spinner.d.ts +6 -0
- package/dist/ui/spinner.js +18 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/text-input.d.ts +9 -0
- package/dist/ui/text-input.js +23 -0
- package/dist/ui/text-input.js.map +1 -0
- package/dist/wizard/passthrough-step.d.ts +6 -0
- package/dist/wizard/passthrough-step.js +8 -0
- package/dist/wizard/passthrough-step.js.map +1 -0
- package/dist/wizard/plugin-select-step.d.ts +10 -0
- package/dist/wizard/plugin-select-step.js +31 -0
- package/dist/wizard/plugin-select-step.js.map +1 -0
- package/dist/wizard/summary-step.d.ts +2 -0
- package/dist/wizard/summary-step.js +97 -0
- package/dist/wizard/summary-step.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../source/plugins/types.ts"],"names":[],"mappings":""}
|
|
@@ -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,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":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,MAAM,mBAAmB,GAAc;IAC7C,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,gBAAgB;IAEtB,eAAe;QACd,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,kBAAkB;QACjB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,QAAQ,EAAE,eAAe;IAEzB,cAAc,CACb,UAAa,EACb,KAAiB;QAEjB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACd,sDAAsD,UAAU,EAAE,CAClE,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAe;YAC5B,IAAI,EAAE,gBAAgB;YAEtB,KAAK,CAAC,OAAO,CAAC,GAAW;gBACxB,0CAA0C;gBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACjC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAGzC,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,GAAG;oBAChB,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;iBACzB,CAAC;gBACF,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;gBAC9B,MAAM,SAAS,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACxC,OAAO,CACP,CAAC;gBAEF,uBAAuB;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,EAAE,CAAC;oBAC1C,MAAM,SAAS,CACd,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EACjC,MAAM,CAAC,OAAO,EACd,OAAO,CACP,CAAC;gBACH,CAAC;gBAED,4BAA4B;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACjD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,EAAE,CAAC;oBACxC,MAAM,SAAS,CACd,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC/B,KAAK,CAAC,OAAO,EACb,OAAO,CACP,CAAC;gBACH,CAAC;gBAED,wCAAwC;gBACxC,MAAM,SAAS,CACd,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,EAC7B,iBAAiB,EAAE,EACnB,OAAO,CACP,CAAC;YACH,CAAC;SACD,CAAC;QAEF,OAAO,QAA0B,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,WAA2B,EAAE,KAAiB;QACvD,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC"}
|
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../source/types.ts"],"names":[],"mappings":""}
|
|
@@ -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,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 {};
|