@agents-at-scale/ark 0.1.36 → 0.1.38
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 +53 -70
- package/dist/arkServices.d.ts +3 -27
- package/dist/arkServices.js +31 -3
- package/dist/arkServices.spec.js +118 -10
- package/dist/commands/chat/index.js +1 -2
- package/dist/commands/completion/index.js +0 -2
- package/dist/commands/generate/generators/project.js +33 -26
- package/dist/commands/generate/index.js +2 -2
- package/dist/commands/generate/templateDiscovery.js +13 -4
- package/dist/commands/install/index.js +49 -58
- package/dist/commands/models/create.d.ts +9 -1
- package/dist/commands/models/create.js +97 -90
- package/dist/commands/models/create.spec.js +9 -37
- package/dist/commands/models/index.js +8 -2
- package/dist/commands/models/index.spec.js +1 -1
- package/dist/commands/status/index.d.ts +3 -1
- package/dist/commands/status/index.js +54 -2
- package/dist/components/AsyncOperation.d.ts +54 -0
- package/dist/components/AsyncOperation.js +110 -0
- package/dist/components/ChatUI.js +39 -72
- package/dist/components/SelectMenu.d.ts +17 -0
- package/dist/components/SelectMenu.js +21 -0
- package/dist/components/StatusMessage.d.ts +20 -0
- package/dist/components/StatusMessage.js +13 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/arkApiClient.d.ts +1 -2
- package/dist/lib/arkApiClient.js +5 -6
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.js +9 -0
- package/dist/lib/nextSteps.js +1 -1
- package/dist/lib/nextSteps.spec.js +1 -1
- package/dist/lib/security.js +4 -0
- package/dist/lib/startup.js +6 -2
- package/dist/lib/startup.spec.js +1 -1
- package/dist/lib/timeout.d.ts +1 -0
- package/dist/lib/timeout.js +20 -0
- package/dist/lib/timeout.spec.d.ts +1 -0
- package/dist/lib/timeout.spec.js +14 -0
- package/dist/lib/waitForReady.d.ts +8 -0
- package/dist/lib/waitForReady.js +32 -0
- package/dist/lib/waitForReady.spec.d.ts +1 -0
- package/dist/lib/waitForReady.spec.js +104 -0
- package/dist/types/arkService.d.ts +27 -0
- package/dist/types/arkService.js +1 -0
- package/dist/ui/asyncOperations/connectingToArk.d.ts +15 -0
- package/dist/ui/asyncOperations/connectingToArk.js +63 -0
- package/package.json +7 -5
- package/templates/agent/agent.template.yaml +27 -0
- package/templates/marketplace/.editorconfig +24 -0
- package/templates/marketplace/.github/.keep +11 -0
- package/templates/marketplace/.github/workflows/.keep +16 -0
- package/templates/marketplace/.helmignore +23 -0
- package/templates/marketplace/.prettierrc.json +20 -0
- package/templates/marketplace/.yamllint.yml +53 -0
- package/templates/marketplace/README.md +197 -0
- package/templates/marketplace/agents/.keep +29 -0
- package/templates/marketplace/docs/.keep +19 -0
- package/templates/marketplace/mcp-servers/.keep +32 -0
- package/templates/marketplace/models/.keep +23 -0
- package/templates/marketplace/projects/.keep +43 -0
- package/templates/marketplace/queries/.keep +25 -0
- package/templates/marketplace/teams/.keep +29 -0
- package/templates/marketplace/tools/.keep +32 -0
- package/templates/marketplace/tools/examples/.keep +17 -0
- package/templates/mcp-server/Dockerfile +133 -0
- package/templates/mcp-server/Makefile +186 -0
- package/templates/mcp-server/README.md +178 -0
- package/templates/mcp-server/build.sh +76 -0
- package/templates/mcp-server/chart/Chart.yaml +22 -0
- package/templates/mcp-server/chart/templates/_helpers.tpl +62 -0
- package/templates/mcp-server/chart/templates/deployment.yaml +80 -0
- package/templates/mcp-server/chart/templates/hpa.yaml +32 -0
- package/templates/mcp-server/chart/templates/mcpserver.yaml +21 -0
- package/templates/mcp-server/chart/templates/secret.yaml +11 -0
- package/templates/mcp-server/chart/templates/service.yaml +15 -0
- package/templates/mcp-server/chart/templates/serviceaccount.yaml +13 -0
- package/templates/mcp-server/chart/values.yaml +84 -0
- package/templates/mcp-server/example-values.yaml +74 -0
- package/templates/mcp-server/examples/{{ .Values.mcpServerName }}-agent.yaml +33 -0
- package/templates/mcp-server/examples/{{ .Values.mcpServerName }}-query.yaml +24 -0
- package/templates/models/azure.yaml +33 -0
- package/templates/models/claude.yaml +28 -0
- package/templates/models/gemini.yaml +28 -0
- package/templates/models/openai.yaml +39 -0
- package/templates/project/.editorconfig +24 -0
- package/templates/project/.helmignore +24 -0
- package/templates/project/.prettierrc.json +16 -0
- package/templates/project/.yamllint.yml +50 -0
- package/templates/project/Chart.yaml +19 -0
- package/templates/project/Makefile +360 -0
- package/templates/project/README.md +377 -0
- package/templates/project/agents/.keep +11 -0
- package/templates/project/docs/.keep +14 -0
- package/templates/project/mcp-servers/.keep +34 -0
- package/templates/project/models/.keep +17 -0
- package/templates/project/queries/.keep +11 -0
- package/templates/project/scripts/setup.sh +108 -0
- package/templates/project/teams/.keep +11 -0
- package/templates/project/templates/00-rbac.yaml +168 -0
- package/templates/project/templates/01-models.yaml +11 -0
- package/templates/project/templates/02-mcp-servers.yaml +22 -0
- package/templates/project/templates/03-tools.yaml +12 -0
- package/templates/project/templates/04-agents.yaml +12 -0
- package/templates/project/templates/05-teams.yaml +11 -0
- package/templates/project/templates/06-queries.yaml +11 -0
- package/templates/project/templates/_helpers.tpl +91 -0
- package/templates/project/tests/e2e/.keep +10 -0
- package/templates/project/tests/unit/.keep +10 -0
- package/templates/project/tools/.keep +25 -0
- package/templates/project/tools/example-tool.yaml.disabled +94 -0
- package/templates/project/tools/examples/data-tool/Dockerfile +32 -0
- package/templates/project/values.yaml +141 -0
- package/templates/query/query.template.yaml +13 -0
- package/templates/team/team.template.yaml +17 -0
- package/templates/tool/.python-version +1 -0
- package/templates/tool/Dockerfile +23 -0
- package/templates/tool/README.md +238 -0
- package/templates/tool/agent.yaml +19 -0
- package/templates/tool/deploy.sh +10 -0
- package/templates/tool/deployment/deployment.yaml +31 -0
- package/templates/tool/deployment/kustomization.yaml +7 -0
- package/templates/tool/deployment/mcpserver.yaml +12 -0
- package/templates/tool/deployment/service.yaml +12 -0
- package/templates/tool/deployment/serviceaccount.yaml +8 -0
- package/templates/tool/deployment/values.yaml +3 -0
- package/templates/tool/pyproject.toml +9 -0
- package/templates/tool/src/main.py +36 -0
- package/templates/tool/uv.lock +498 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
export async function waitForDeploymentReady(deploymentName, namespace, timeoutSeconds) {
|
|
3
|
+
try {
|
|
4
|
+
await execa('kubectl', [
|
|
5
|
+
'wait',
|
|
6
|
+
'--for=condition=available',
|
|
7
|
+
`deployment/${deploymentName}`,
|
|
8
|
+
'-n',
|
|
9
|
+
namespace,
|
|
10
|
+
`--timeout=${timeoutSeconds}s`,
|
|
11
|
+
], { timeout: timeoutSeconds * 1000 });
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function waitForServicesReady(services, timeoutSeconds, onProgress) {
|
|
19
|
+
const validServices = services.filter((s) => s.k8sDeploymentName && s.namespace);
|
|
20
|
+
const checkPromises = validServices.map(async (service) => {
|
|
21
|
+
const isReady = await waitForDeploymentReady(service.k8sDeploymentName, service.namespace, timeoutSeconds);
|
|
22
|
+
if (onProgress) {
|
|
23
|
+
onProgress({
|
|
24
|
+
serviceName: service.name,
|
|
25
|
+
ready: isReady,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return isReady;
|
|
29
|
+
});
|
|
30
|
+
const results = await Promise.all(checkPromises);
|
|
31
|
+
return results.every((ready) => ready);
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, it, expect, jest, beforeEach } from '@jest/globals';
|
|
2
|
+
jest.unstable_mockModule('execa', () => ({
|
|
3
|
+
execa: jest.fn(),
|
|
4
|
+
}));
|
|
5
|
+
const { execa } = await import('execa');
|
|
6
|
+
const { waitForDeploymentReady, waitForServicesReady } = await import('./waitForReady.js');
|
|
7
|
+
const mockedExeca = execa;
|
|
8
|
+
describe('waitForDeploymentReady', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
jest.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
it('returns true when deployment is ready', async () => {
|
|
13
|
+
mockedExeca.mockResolvedValueOnce({
|
|
14
|
+
stdout: 'deployment.apps/ark-controller condition met',
|
|
15
|
+
stderr: '',
|
|
16
|
+
exitCode: 0,
|
|
17
|
+
});
|
|
18
|
+
const result = await waitForDeploymentReady('ark-controller', 'ark-system', 30);
|
|
19
|
+
expect(result).toBe(true);
|
|
20
|
+
expect(mockedExeca).toHaveBeenCalledWith('kubectl', [
|
|
21
|
+
'wait',
|
|
22
|
+
'--for=condition=available',
|
|
23
|
+
'deployment/ark-controller',
|
|
24
|
+
'-n',
|
|
25
|
+
'ark-system',
|
|
26
|
+
'--timeout=30s',
|
|
27
|
+
], { timeout: 30000 });
|
|
28
|
+
});
|
|
29
|
+
it('returns false on error', async () => {
|
|
30
|
+
mockedExeca.mockRejectedValueOnce(new Error('kubectl error'));
|
|
31
|
+
const result = await waitForDeploymentReady('ark-api', 'default', 10);
|
|
32
|
+
expect(result).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('waitForServicesReady', () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
jest.clearAllMocks();
|
|
38
|
+
});
|
|
39
|
+
const service1 = {
|
|
40
|
+
name: 'ark-controller',
|
|
41
|
+
helmReleaseName: 'ark-controller',
|
|
42
|
+
description: 'Core controller',
|
|
43
|
+
enabled: true,
|
|
44
|
+
category: 'core',
|
|
45
|
+
namespace: 'ark-system',
|
|
46
|
+
k8sDeploymentName: 'ark-controller',
|
|
47
|
+
};
|
|
48
|
+
const service2 = {
|
|
49
|
+
name: 'ark-api',
|
|
50
|
+
helmReleaseName: 'ark-api',
|
|
51
|
+
description: 'API service',
|
|
52
|
+
enabled: true,
|
|
53
|
+
category: 'service',
|
|
54
|
+
namespace: 'default',
|
|
55
|
+
k8sDeploymentName: 'ark-api',
|
|
56
|
+
};
|
|
57
|
+
it('returns true when all services are ready', async () => {
|
|
58
|
+
mockedExeca.mockResolvedValue({
|
|
59
|
+
stdout: 'condition met',
|
|
60
|
+
stderr: '',
|
|
61
|
+
exitCode: 0,
|
|
62
|
+
});
|
|
63
|
+
const result = await waitForServicesReady([service1, service2], 30);
|
|
64
|
+
expect(result).toBe(true);
|
|
65
|
+
expect(mockedExeca).toHaveBeenCalledTimes(2);
|
|
66
|
+
});
|
|
67
|
+
it('returns false when any service fails', async () => {
|
|
68
|
+
mockedExeca
|
|
69
|
+
.mockResolvedValueOnce({ stdout: 'ok', stderr: '', exitCode: 0 })
|
|
70
|
+
.mockRejectedValueOnce(new Error('timeout'));
|
|
71
|
+
const result = await waitForServicesReady([service1, service2], 30);
|
|
72
|
+
expect(result).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
it('calls progress callback', async () => {
|
|
75
|
+
mockedExeca.mockResolvedValue({
|
|
76
|
+
stdout: 'ok',
|
|
77
|
+
stderr: '',
|
|
78
|
+
exitCode: 0,
|
|
79
|
+
});
|
|
80
|
+
const onProgress = jest.fn();
|
|
81
|
+
await waitForServicesReady([service1], 30, onProgress);
|
|
82
|
+
expect(onProgress).toHaveBeenCalledWith({
|
|
83
|
+
serviceName: 'ark-controller',
|
|
84
|
+
ready: true,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
it('skips services without deployment info', async () => {
|
|
88
|
+
const incompleteService = {
|
|
89
|
+
name: 'incomplete',
|
|
90
|
+
helmReleaseName: 'incomplete',
|
|
91
|
+
description: 'No deployment info',
|
|
92
|
+
enabled: true,
|
|
93
|
+
category: 'service',
|
|
94
|
+
};
|
|
95
|
+
mockedExeca.mockResolvedValue({
|
|
96
|
+
stdout: 'ok',
|
|
97
|
+
stderr: '',
|
|
98
|
+
exitCode: 0,
|
|
99
|
+
});
|
|
100
|
+
const result = await waitForServicesReady([service1, incompleteService], 30);
|
|
101
|
+
expect(result).toBe(true);
|
|
102
|
+
expect(mockedExeca).toHaveBeenCalledTimes(1);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ArkService {
|
|
2
|
+
name: string;
|
|
3
|
+
helmReleaseName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
category: string;
|
|
7
|
+
namespace?: string;
|
|
8
|
+
chartPath?: string;
|
|
9
|
+
installArgs?: string[];
|
|
10
|
+
k8sServiceName?: string;
|
|
11
|
+
k8sServicePort?: number;
|
|
12
|
+
k8sPortForwardLocalPort?: number;
|
|
13
|
+
k8sDeploymentName?: string;
|
|
14
|
+
k8sDevDeploymentName?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ServiceCollection {
|
|
17
|
+
[key: string]: ArkService;
|
|
18
|
+
}
|
|
19
|
+
export interface ArkDependency {
|
|
20
|
+
name: string;
|
|
21
|
+
command: string;
|
|
22
|
+
args: string[];
|
|
23
|
+
description: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DependencyCollection {
|
|
26
|
+
[key: string]: ArkDependency;
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AsyncOperationConfig } from '../../components/AsyncOperation.js';
|
|
2
|
+
import { ArkApiClient } from '../../lib/arkApiClient.js';
|
|
3
|
+
import { ChatClient, QueryTarget } from '../../lib/chatClient.js';
|
|
4
|
+
export interface ConnectingToArkParams {
|
|
5
|
+
arkApiClient: ArkApiClient;
|
|
6
|
+
initialTargetId?: string;
|
|
7
|
+
onSuccess: (data: {
|
|
8
|
+
client: ChatClient;
|
|
9
|
+
targets: QueryTarget[];
|
|
10
|
+
selectedTarget: QueryTarget | null;
|
|
11
|
+
selectedIndex: number;
|
|
12
|
+
}) => void;
|
|
13
|
+
onQuit: () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function createConnectingToArkOperation(params: ConnectingToArkParams): AsyncOperationConfig;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ChatClient } from '../../lib/chatClient.js';
|
|
2
|
+
export function createConnectingToArkOperation(params) {
|
|
3
|
+
return {
|
|
4
|
+
message: 'Connecting to Ark...',
|
|
5
|
+
operation: async (_signal) => {
|
|
6
|
+
const client = new ChatClient(params.arkApiClient);
|
|
7
|
+
const targets = await client.getQueryTargets();
|
|
8
|
+
let selectedTarget = null;
|
|
9
|
+
let selectedIndex = 0;
|
|
10
|
+
if (params.initialTargetId) {
|
|
11
|
+
const matchedTarget = targets.find((t) => t.id === params.initialTargetId);
|
|
12
|
+
const matchedIndex = targets.findIndex((t) => t.id === params.initialTargetId);
|
|
13
|
+
if (matchedTarget) {
|
|
14
|
+
selectedTarget = matchedTarget;
|
|
15
|
+
selectedIndex = matchedIndex >= 0 ? matchedIndex : 0;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new Error(`Target "${params.initialTargetId}" not found. Use "ark targets list" to see available targets.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else if (targets.length > 0) {
|
|
22
|
+
const agents = targets.filter((t) => t.type === 'agent');
|
|
23
|
+
const models = targets.filter((t) => t.type === 'model');
|
|
24
|
+
const tools = targets.filter((t) => t.type === 'tool');
|
|
25
|
+
if (agents.length > 0) {
|
|
26
|
+
selectedTarget = agents[0];
|
|
27
|
+
selectedIndex = targets.findIndex((t) => t.id === agents[0].id);
|
|
28
|
+
}
|
|
29
|
+
else if (models.length > 0) {
|
|
30
|
+
selectedTarget = models[0];
|
|
31
|
+
selectedIndex = targets.findIndex((t) => t.id === models[0].id);
|
|
32
|
+
}
|
|
33
|
+
else if (tools.length > 0) {
|
|
34
|
+
selectedTarget = tools[0];
|
|
35
|
+
selectedIndex = targets.findIndex((t) => t.id === tools[0].id);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error('No targets available');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error('No agents, models, or tools available');
|
|
43
|
+
}
|
|
44
|
+
params.onSuccess({
|
|
45
|
+
client,
|
|
46
|
+
targets,
|
|
47
|
+
selectedTarget,
|
|
48
|
+
selectedIndex,
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
hideOnSuccess: true,
|
|
52
|
+
errorOptions: [
|
|
53
|
+
{ label: 'Try again', onSelect: () => { } },
|
|
54
|
+
{
|
|
55
|
+
label: 'Check status',
|
|
56
|
+
onSelect: () => {
|
|
57
|
+
console.log('Status command not yet implemented');
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{ label: 'Quit', onSelect: params.onQuit },
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
package/package.json
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents-at-scale/ark",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.38",
|
|
4
|
+
"description": "Ark CLI - Interactive terminal interface for ARK agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"ark": "dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
|
-
"dist"
|
|
11
|
+
"dist",
|
|
12
|
+
"templates"
|
|
12
13
|
],
|
|
13
14
|
"scripts": {
|
|
14
|
-
"build": "tsc && chmod +x dist/index.js",
|
|
15
|
+
"build": "npm run copy-templates && tsc && chmod +x dist/index.js",
|
|
16
|
+
"copy-templates": "rm -rf templates && cp -r ../../templates .",
|
|
15
17
|
"dev": "tsc --watch",
|
|
16
18
|
"start": "NODE_NO_WARNINGS=1 node dist/index.js",
|
|
17
19
|
"clean": "rm -rf dist",
|
|
18
20
|
"lint": "eslint src/ --fix && prettier --write src/",
|
|
19
21
|
"lint:check": "eslint src/ && prettier --check src/",
|
|
20
22
|
"test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage --coverageDirectory=./artifacts/coverage --coverageReporters=text --coverageReporters=lcov --coverageReporters=text-summary",
|
|
21
|
-
"postinstall": "echo \"
|
|
23
|
+
"postinstall": "echo \"Ark CLI installed. Run 'ark' to try it out.\""
|
|
22
24
|
},
|
|
23
25
|
"keywords": [
|
|
24
26
|
"ark",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
apiVersion: ark.mckinsey.com/v1alpha1
|
|
2
|
+
kind: Agent
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Values.agentName }}-agent
|
|
5
|
+
labels:
|
|
6
|
+
project: {{ .Values.projectName }}
|
|
7
|
+
role: assistant
|
|
8
|
+
tier: basic
|
|
9
|
+
spec:
|
|
10
|
+
description: {{ .Values.agentName }} agent for {{ .Values.projectName }} project
|
|
11
|
+
prompt: |
|
|
12
|
+
You are a helpful AI assistant for the {{ .Values.projectName }} project. You provide clear, concise, and accurate responses to user questions.
|
|
13
|
+
|
|
14
|
+
Key guidelines:
|
|
15
|
+
- Be direct and to the point
|
|
16
|
+
- Use simple language when possible
|
|
17
|
+
- If you don't know something, say so
|
|
18
|
+
- Always be polite and professional
|
|
19
|
+
|
|
20
|
+
# Reference to model (will be created by Helm chart)
|
|
21
|
+
modelRef:
|
|
22
|
+
name: default
|
|
23
|
+
|
|
24
|
+
# Optional: Add built-in tools
|
|
25
|
+
tools:
|
|
26
|
+
- type: built-in
|
|
27
|
+
name: terminate
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# EditorConfig is awesome: https://EditorConfig.org
|
|
2
|
+
|
|
3
|
+
# top-most EditorConfig file
|
|
4
|
+
root = true
|
|
5
|
+
|
|
6
|
+
[*]
|
|
7
|
+
indent_style = space
|
|
8
|
+
indent_size = 2
|
|
9
|
+
end_of_line = lf
|
|
10
|
+
charset = utf-8
|
|
11
|
+
trim_trailing_whitespace = true
|
|
12
|
+
insert_final_newline = true
|
|
13
|
+
|
|
14
|
+
[*.md]
|
|
15
|
+
trim_trailing_whitespace = false
|
|
16
|
+
|
|
17
|
+
[Makefile]
|
|
18
|
+
indent_style = tab
|
|
19
|
+
|
|
20
|
+
[*.py]
|
|
21
|
+
indent_size = 4
|
|
22
|
+
|
|
23
|
+
[*.go]
|
|
24
|
+
indent_style = tab
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# GitHub Configuration Directory
|
|
2
|
+
|
|
3
|
+
GitHub-specific configuration files for the marketplace repository.
|
|
4
|
+
|
|
5
|
+
Expected contents:
|
|
6
|
+
- workflows/ - GitHub Actions workflows
|
|
7
|
+
- ISSUE_TEMPLATE/ - Issue templates
|
|
8
|
+
- PULL_REQUEST_TEMPLATE.md - PR template
|
|
9
|
+
- CODEOWNERS - Code ownership rules
|
|
10
|
+
|
|
11
|
+
These files help maintain quality and consistency in contributions.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# GitHub Workflows Directory
|
|
2
|
+
|
|
3
|
+
GitHub Actions workflows for automating marketplace operations.
|
|
4
|
+
|
|
5
|
+
Common workflows:
|
|
6
|
+
- component-validation.yml - Validate contributed components
|
|
7
|
+
- security-scan.yml - Security scanning of components
|
|
8
|
+
- documentation-build.yml - Build and deploy documentation
|
|
9
|
+
- release.yml - Automated releases
|
|
10
|
+
- pr-checks.yml - Pull request validation
|
|
11
|
+
|
|
12
|
+
Workflows should:
|
|
13
|
+
- Be efficient and reliable
|
|
14
|
+
- Provide clear feedback
|
|
15
|
+
- Follow security best practices
|
|
16
|
+
- Be well-documented
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Patterns to ignore when building packages.
|
|
2
|
+
# This supports shell glob matching, relative path matching, and
|
|
3
|
+
# negation (prefixed with !). Only one pattern per line.
|
|
4
|
+
.DS_Store
|
|
5
|
+
# Common VCS dirs
|
|
6
|
+
.git/
|
|
7
|
+
.gitignore
|
|
8
|
+
.bzr/
|
|
9
|
+
.bzrignore
|
|
10
|
+
.hg/
|
|
11
|
+
.hgignore
|
|
12
|
+
.svn/
|
|
13
|
+
# Common backup files
|
|
14
|
+
*.swp
|
|
15
|
+
*.bak
|
|
16
|
+
*.tmp
|
|
17
|
+
*.orig
|
|
18
|
+
*~
|
|
19
|
+
# Various IDEs
|
|
20
|
+
.project
|
|
21
|
+
.idea/
|
|
22
|
+
*.tmproj
|
|
23
|
+
.vscode/
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semi": true,
|
|
3
|
+
"trailingComma": "es5",
|
|
4
|
+
"singleQuote": true,
|
|
5
|
+
"printWidth": 80,
|
|
6
|
+
"tabWidth": 2,
|
|
7
|
+
"useTabs": false,
|
|
8
|
+
"arrowParens": "avoid",
|
|
9
|
+
"bracketSpacing": true,
|
|
10
|
+
"proseWrap": "preserve",
|
|
11
|
+
"quoteProps": "as-needed",
|
|
12
|
+
"overrides": [
|
|
13
|
+
{
|
|
14
|
+
"files": "*.yaml",
|
|
15
|
+
"options": {
|
|
16
|
+
"singleQuote": false
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Default rules for yamllint
|
|
2
|
+
extends: default
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
# 120 chars should be enough, but don't fail if a line is longer
|
|
6
|
+
line-length:
|
|
7
|
+
max: 120
|
|
8
|
+
level: warning
|
|
9
|
+
|
|
10
|
+
# accept both key:value and key: value
|
|
11
|
+
colons:
|
|
12
|
+
max-spaces-before: 0
|
|
13
|
+
max-spaces-after: -1
|
|
14
|
+
|
|
15
|
+
# don't bother me with tabs vs spaces issues
|
|
16
|
+
indentation:
|
|
17
|
+
spaces: consistent
|
|
18
|
+
indent-sequences: whatever
|
|
19
|
+
|
|
20
|
+
# allow empty values like 'key:'
|
|
21
|
+
empty-values:
|
|
22
|
+
forbid-in-block-mappings: false
|
|
23
|
+
forbid-in-flow-mappings: false
|
|
24
|
+
|
|
25
|
+
# sometimes you have to use quotes
|
|
26
|
+
quoted-strings:
|
|
27
|
+
quote-type: any
|
|
28
|
+
required: false
|
|
29
|
+
|
|
30
|
+
# allow trailing spaces in comments
|
|
31
|
+
trailing-spaces:
|
|
32
|
+
level: warning
|
|
33
|
+
|
|
34
|
+
# allow truthy values
|
|
35
|
+
truthy:
|
|
36
|
+
allowed-values: ['true', 'false', 'on', 'off', 'yes', 'no']
|
|
37
|
+
check-keys: false
|
|
38
|
+
|
|
39
|
+
# allow ! in yaml
|
|
40
|
+
comments:
|
|
41
|
+
require-starting-space: false
|
|
42
|
+
ignore-shebangs: true
|
|
43
|
+
min-spaces-from-content: 1
|
|
44
|
+
|
|
45
|
+
# brackets
|
|
46
|
+
brackets:
|
|
47
|
+
max-spaces-inside: 1
|
|
48
|
+
max-spaces-inside-empty: 0
|
|
49
|
+
|
|
50
|
+
# braces
|
|
51
|
+
braces:
|
|
52
|
+
max-spaces-inside: 1
|
|
53
|
+
max-spaces-inside-empty: 0
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# ARK Marketplace
|
|
2
|
+
|
|
3
|
+
Welcome to the ARK Marketplace - a central repository for sharing reusable ARK components across projects and teams.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The marketplace serves as a community-driven collection of:
|
|
8
|
+
|
|
9
|
+
- **Agents** - Pre-configured AI agents for specific tasks
|
|
10
|
+
- **Teams** - Multi-agent workflows and orchestration patterns
|
|
11
|
+
- **Models** - Model configurations for different providers and use cases
|
|
12
|
+
- **Tools** - Extensions that add capabilities to agents
|
|
13
|
+
- **MCP Servers** - Model Context Protocol server implementations
|
|
14
|
+
- **Queries** - Reusable query templates and patterns
|
|
15
|
+
- **Projects** - Complete, end-to-end Ark project templates and solutions
|
|
16
|
+
|
|
17
|
+
## Repository Structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
marketplace/
|
|
21
|
+
├── agents/ # Reusable agent definitions
|
|
22
|
+
├── teams/ # Multi-agent workflow configurations
|
|
23
|
+
├── models/ # Model configurations by provider
|
|
24
|
+
├── queries/ # Query templates and patterns
|
|
25
|
+
├── tools/ # Tool definitions and implementations
|
|
26
|
+
├── mcp-servers/ # MCP server configurations
|
|
27
|
+
├── projects/ # Complete Ark project templates and solutions
|
|
28
|
+
├── tests/ # Test configurations and utilities
|
|
29
|
+
├── scripts/ # Automation and validation scripts
|
|
30
|
+
├── docs/ # Documentation and guides
|
|
31
|
+
├── templates/ # Component creation templates
|
|
32
|
+
└── .github/ # GitHub workflows and templates
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Contributing Components
|
|
36
|
+
|
|
37
|
+
### Getting Started
|
|
38
|
+
|
|
39
|
+
1. **Fork** this repository
|
|
40
|
+
2. **Choose** the appropriate directory for your component type
|
|
41
|
+
3. **Copy** the relevant template from `templates/` directory
|
|
42
|
+
4. **Implement** your component following the guidelines
|
|
43
|
+
5. **Test** your component thoroughly
|
|
44
|
+
6. **Submit** a pull request
|
|
45
|
+
|
|
46
|
+
### Component Guidelines
|
|
47
|
+
|
|
48
|
+
#### Agents (`agents/`)
|
|
49
|
+
|
|
50
|
+
- One agent per subdirectory
|
|
51
|
+
- Include `agent.yaml` with complete agent definition
|
|
52
|
+
- Provide comprehensive `README.md` with usage examples
|
|
53
|
+
- Test with multiple model providers when possible
|
|
54
|
+
|
|
55
|
+
#### Teams (`teams/`)
|
|
56
|
+
|
|
57
|
+
- Document the workflow strategy and use cases
|
|
58
|
+
- Include example inputs and expected outputs
|
|
59
|
+
- Explain when to use this team configuration
|
|
60
|
+
- Test the complete workflow end-to-end
|
|
61
|
+
|
|
62
|
+
#### Models (`models/`)
|
|
63
|
+
|
|
64
|
+
- Organize by provider (openai/, anthropic/, etc.)
|
|
65
|
+
- Include provider-specific configurations
|
|
66
|
+
- Document capabilities, limitations, and costs
|
|
67
|
+
- Specify recommended use cases
|
|
68
|
+
|
|
69
|
+
#### Tools (`tools/`)
|
|
70
|
+
|
|
71
|
+
- Follow Ark tool specification
|
|
72
|
+
- Include source code and build instructions
|
|
73
|
+
- Provide security considerations
|
|
74
|
+
- Include comprehensive error handling
|
|
75
|
+
|
|
76
|
+
#### MCP Servers (`mcp-servers/`)
|
|
77
|
+
|
|
78
|
+
- Follow MCP protocol specifications
|
|
79
|
+
- Document all available tools and resources
|
|
80
|
+
- Include security and monitoring configurations
|
|
81
|
+
- Provide integration examples
|
|
82
|
+
|
|
83
|
+
#### Queries (`queries/`)
|
|
84
|
+
|
|
85
|
+
- Make queries parameterizable where possible
|
|
86
|
+
- Document expected inputs and outputs
|
|
87
|
+
- Specify compatible agents and teams
|
|
88
|
+
- Include usage examples
|
|
89
|
+
|
|
90
|
+
#### Projects (`projects/`)
|
|
91
|
+
|
|
92
|
+
- Provide complete, self-contained Ark project structures
|
|
93
|
+
- Include comprehensive documentation with architecture overview
|
|
94
|
+
- Specify all required dependencies (models, tools, external services)
|
|
95
|
+
- Provide clear setup and deployment instructions
|
|
96
|
+
- Include working examples and sample data where applicable
|
|
97
|
+
- Document the use case and target scenarios
|
|
98
|
+
- Follow Ark best practices for resource organization
|
|
99
|
+
- Include multiple components working together (agents, teams, tools, etc.)
|
|
100
|
+
|
|
101
|
+
### Quality Standards
|
|
102
|
+
|
|
103
|
+
All contributions must meet these standards:
|
|
104
|
+
|
|
105
|
+
- ✅ **Documentation** - Clear README with setup and usage instructions
|
|
106
|
+
- ✅ **Security** - Follow security best practices
|
|
107
|
+
- ✅ **Compatibility** - Work with latest Ark version
|
|
108
|
+
- ✅ **Examples** - Provide working usage examples
|
|
109
|
+
- ✅ **Validation** - Pass all automated validation checks
|
|
110
|
+
|
|
111
|
+
### Submission Process
|
|
112
|
+
|
|
113
|
+
1. **Create** your component following the guidelines above
|
|
114
|
+
2. **Run** validation scripts: `scripts/validate-component.sh <component-path>`
|
|
115
|
+
3. **Test** your component in a real environment
|
|
116
|
+
4. **Submit** pull request with:
|
|
117
|
+
- Clear description of the component's purpose
|
|
118
|
+
- Usage examples and test results
|
|
119
|
+
- Documentation of any dependencies
|
|
120
|
+
- Screenshots or demos if applicable
|
|
121
|
+
|
|
122
|
+
### Review Process
|
|
123
|
+
|
|
124
|
+
1. **Automated Checks** - CI pipeline validates component structure and security
|
|
125
|
+
2. **Community Review** - Other contributors provide feedback
|
|
126
|
+
3. **Maintainer Review** - Core team performs final review
|
|
127
|
+
4. **Approval** - Component is merged and becomes available
|
|
128
|
+
|
|
129
|
+
## Using Marketplace Components
|
|
130
|
+
|
|
131
|
+
### Finding Components
|
|
132
|
+
|
|
133
|
+
- Browse directories by component type
|
|
134
|
+
- Check `README.md` files for detailed descriptions
|
|
135
|
+
- Look for tags and categories in component metadata
|
|
136
|
+
- Use GitHub search to find specific functionality
|
|
137
|
+
|
|
138
|
+
### Installing Components
|
|
139
|
+
|
|
140
|
+
1. **Copy** the component files to your project
|
|
141
|
+
2. **Customize** configuration as needed
|
|
142
|
+
3. **Install** any dependencies listed in component README
|
|
143
|
+
4. **Test** the component in your environment
|
|
144
|
+
5. **Deploy** following your project's deployment process
|
|
145
|
+
|
|
146
|
+
### Component Versioning
|
|
147
|
+
|
|
148
|
+
Components follow semantic versioning:
|
|
149
|
+
|
|
150
|
+
- **Major** - Breaking changes requiring migration
|
|
151
|
+
- **Minor** - New features, backward compatible
|
|
152
|
+
- **Patch** - Bug fixes and minor improvements
|
|
153
|
+
|
|
154
|
+
## Support and Community
|
|
155
|
+
|
|
156
|
+
### Getting Help
|
|
157
|
+
|
|
158
|
+
- 📖 **Documentation** - Check `docs/` directory for guides
|
|
159
|
+
- 💬 **Discussions** - Use GitHub Discussions for questions
|
|
160
|
+
- 🐛 **Issues** - Report bugs or request features via GitHub Issues
|
|
161
|
+
- 📧 **Contact** - Reach out to maintainers for urgent matters
|
|
162
|
+
|
|
163
|
+
### Contributing Beyond Components
|
|
164
|
+
|
|
165
|
+
We welcome contributions in many forms:
|
|
166
|
+
|
|
167
|
+
- 📝 **Documentation** improvements
|
|
168
|
+
- 🧪 **Testing** and validation improvements
|
|
169
|
+
- 🔧 **Tooling** and automation enhancements
|
|
170
|
+
- 🎨 **Templates** and examples
|
|
171
|
+
- 🔍 **Reviews** and feedback on submissions
|
|
172
|
+
|
|
173
|
+
## Governance
|
|
174
|
+
|
|
175
|
+
### Maintainers
|
|
176
|
+
|
|
177
|
+
The marketplace is maintained by the core team and trusted community contributors.
|
|
178
|
+
|
|
179
|
+
### Licensing
|
|
180
|
+
|
|
181
|
+
All contributions must be compatible with the project license. By contributing, you agree to license your contributions under the same terms.
|
|
182
|
+
|
|
183
|
+
### Code of Conduct
|
|
184
|
+
|
|
185
|
+
This project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). Please read and follow these guidelines in all interactions.
|
|
186
|
+
|
|
187
|
+
## Quick Start
|
|
188
|
+
|
|
189
|
+
Ready to contribute? Start here:
|
|
190
|
+
|
|
191
|
+
1. **Explore** existing components for inspiration
|
|
192
|
+
2. **Choose** a template from `templates/` directory
|
|
193
|
+
3. **Read** the component-specific guidelines in `docs/`
|
|
194
|
+
4. **Create** your component following the standards
|
|
195
|
+
5. **Submit** your pull request
|
|
196
|
+
|
|
197
|
+
Thank you for contributing to the {{ .Values.projectName }} Marketplace! 🚀
|