@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.
Files changed (129) hide show
  1. package/README.md +53 -70
  2. package/dist/arkServices.d.ts +3 -27
  3. package/dist/arkServices.js +31 -3
  4. package/dist/arkServices.spec.js +118 -10
  5. package/dist/commands/chat/index.js +1 -2
  6. package/dist/commands/completion/index.js +0 -2
  7. package/dist/commands/generate/generators/project.js +33 -26
  8. package/dist/commands/generate/index.js +2 -2
  9. package/dist/commands/generate/templateDiscovery.js +13 -4
  10. package/dist/commands/install/index.js +49 -58
  11. package/dist/commands/models/create.d.ts +9 -1
  12. package/dist/commands/models/create.js +97 -90
  13. package/dist/commands/models/create.spec.js +9 -37
  14. package/dist/commands/models/index.js +8 -2
  15. package/dist/commands/models/index.spec.js +1 -1
  16. package/dist/commands/status/index.d.ts +3 -1
  17. package/dist/commands/status/index.js +54 -2
  18. package/dist/components/AsyncOperation.d.ts +54 -0
  19. package/dist/components/AsyncOperation.js +110 -0
  20. package/dist/components/ChatUI.js +39 -72
  21. package/dist/components/SelectMenu.d.ts +17 -0
  22. package/dist/components/SelectMenu.js +21 -0
  23. package/dist/components/StatusMessage.d.ts +20 -0
  24. package/dist/components/StatusMessage.js +13 -0
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +1 -1
  27. package/dist/lib/arkApiClient.d.ts +1 -2
  28. package/dist/lib/arkApiClient.js +5 -6
  29. package/dist/lib/config.d.ts +4 -0
  30. package/dist/lib/config.js +9 -0
  31. package/dist/lib/nextSteps.js +1 -1
  32. package/dist/lib/nextSteps.spec.js +1 -1
  33. package/dist/lib/security.js +4 -0
  34. package/dist/lib/startup.js +6 -2
  35. package/dist/lib/startup.spec.js +1 -1
  36. package/dist/lib/timeout.d.ts +1 -0
  37. package/dist/lib/timeout.js +20 -0
  38. package/dist/lib/timeout.spec.d.ts +1 -0
  39. package/dist/lib/timeout.spec.js +14 -0
  40. package/dist/lib/waitForReady.d.ts +8 -0
  41. package/dist/lib/waitForReady.js +32 -0
  42. package/dist/lib/waitForReady.spec.d.ts +1 -0
  43. package/dist/lib/waitForReady.spec.js +104 -0
  44. package/dist/types/arkService.d.ts +27 -0
  45. package/dist/types/arkService.js +1 -0
  46. package/dist/ui/asyncOperations/connectingToArk.d.ts +15 -0
  47. package/dist/ui/asyncOperations/connectingToArk.js +63 -0
  48. package/package.json +7 -5
  49. package/templates/agent/agent.template.yaml +27 -0
  50. package/templates/marketplace/.editorconfig +24 -0
  51. package/templates/marketplace/.github/.keep +11 -0
  52. package/templates/marketplace/.github/workflows/.keep +16 -0
  53. package/templates/marketplace/.helmignore +23 -0
  54. package/templates/marketplace/.prettierrc.json +20 -0
  55. package/templates/marketplace/.yamllint.yml +53 -0
  56. package/templates/marketplace/README.md +197 -0
  57. package/templates/marketplace/agents/.keep +29 -0
  58. package/templates/marketplace/docs/.keep +19 -0
  59. package/templates/marketplace/mcp-servers/.keep +32 -0
  60. package/templates/marketplace/models/.keep +23 -0
  61. package/templates/marketplace/projects/.keep +43 -0
  62. package/templates/marketplace/queries/.keep +25 -0
  63. package/templates/marketplace/teams/.keep +29 -0
  64. package/templates/marketplace/tools/.keep +32 -0
  65. package/templates/marketplace/tools/examples/.keep +17 -0
  66. package/templates/mcp-server/Dockerfile +133 -0
  67. package/templates/mcp-server/Makefile +186 -0
  68. package/templates/mcp-server/README.md +178 -0
  69. package/templates/mcp-server/build.sh +76 -0
  70. package/templates/mcp-server/chart/Chart.yaml +22 -0
  71. package/templates/mcp-server/chart/templates/_helpers.tpl +62 -0
  72. package/templates/mcp-server/chart/templates/deployment.yaml +80 -0
  73. package/templates/mcp-server/chart/templates/hpa.yaml +32 -0
  74. package/templates/mcp-server/chart/templates/mcpserver.yaml +21 -0
  75. package/templates/mcp-server/chart/templates/secret.yaml +11 -0
  76. package/templates/mcp-server/chart/templates/service.yaml +15 -0
  77. package/templates/mcp-server/chart/templates/serviceaccount.yaml +13 -0
  78. package/templates/mcp-server/chart/values.yaml +84 -0
  79. package/templates/mcp-server/example-values.yaml +74 -0
  80. package/templates/mcp-server/examples/{{ .Values.mcpServerName }}-agent.yaml +33 -0
  81. package/templates/mcp-server/examples/{{ .Values.mcpServerName }}-query.yaml +24 -0
  82. package/templates/models/azure.yaml +33 -0
  83. package/templates/models/claude.yaml +28 -0
  84. package/templates/models/gemini.yaml +28 -0
  85. package/templates/models/openai.yaml +39 -0
  86. package/templates/project/.editorconfig +24 -0
  87. package/templates/project/.helmignore +24 -0
  88. package/templates/project/.prettierrc.json +16 -0
  89. package/templates/project/.yamllint.yml +50 -0
  90. package/templates/project/Chart.yaml +19 -0
  91. package/templates/project/Makefile +360 -0
  92. package/templates/project/README.md +377 -0
  93. package/templates/project/agents/.keep +11 -0
  94. package/templates/project/docs/.keep +14 -0
  95. package/templates/project/mcp-servers/.keep +34 -0
  96. package/templates/project/models/.keep +17 -0
  97. package/templates/project/queries/.keep +11 -0
  98. package/templates/project/scripts/setup.sh +108 -0
  99. package/templates/project/teams/.keep +11 -0
  100. package/templates/project/templates/00-rbac.yaml +168 -0
  101. package/templates/project/templates/01-models.yaml +11 -0
  102. package/templates/project/templates/02-mcp-servers.yaml +22 -0
  103. package/templates/project/templates/03-tools.yaml +12 -0
  104. package/templates/project/templates/04-agents.yaml +12 -0
  105. package/templates/project/templates/05-teams.yaml +11 -0
  106. package/templates/project/templates/06-queries.yaml +11 -0
  107. package/templates/project/templates/_helpers.tpl +91 -0
  108. package/templates/project/tests/e2e/.keep +10 -0
  109. package/templates/project/tests/unit/.keep +10 -0
  110. package/templates/project/tools/.keep +25 -0
  111. package/templates/project/tools/example-tool.yaml.disabled +94 -0
  112. package/templates/project/tools/examples/data-tool/Dockerfile +32 -0
  113. package/templates/project/values.yaml +141 -0
  114. package/templates/query/query.template.yaml +13 -0
  115. package/templates/team/team.template.yaml +17 -0
  116. package/templates/tool/.python-version +1 -0
  117. package/templates/tool/Dockerfile +23 -0
  118. package/templates/tool/README.md +238 -0
  119. package/templates/tool/agent.yaml +19 -0
  120. package/templates/tool/deploy.sh +10 -0
  121. package/templates/tool/deployment/deployment.yaml +31 -0
  122. package/templates/tool/deployment/kustomization.yaml +7 -0
  123. package/templates/tool/deployment/mcpserver.yaml +12 -0
  124. package/templates/tool/deployment/service.yaml +12 -0
  125. package/templates/tool/deployment/serviceaccount.yaml +8 -0
  126. package/templates/tool/deployment/values.yaml +3 -0
  127. package/templates/tool/pyproject.toml +9 -0
  128. package/templates/tool/src/main.py +36 -0
  129. 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.36",
4
- "description": "ARK CLI - Interactive terminal interface for ARK agents",
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 \"ARK CLI installed! Run 'ark' to try it out.\""
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! 🚀