@agents-at-scale/ark 0.1.56 → 0.1.59

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.
@@ -1,8 +1,10 @@
1
1
  import { Command } from 'commander';
2
2
  import type { ArkConfig } from '../../lib/config.js';
3
- export declare function installArk(config: ArkConfig, serviceName?: string, options?: {
3
+ export declare function installArk(config: ArkConfig, serviceNames?: string[], options?: {
4
4
  yes?: boolean;
5
5
  waitForReady?: string;
6
6
  verbose?: boolean;
7
+ arkVersion?: string;
8
+ marketplaceVersion?: string;
7
9
  }): Promise<void>;
8
10
  export declare function createInstallCommand(config: ArkConfig): Command;
@@ -10,6 +10,38 @@ import { printNextSteps } from '../../lib/nextSteps.js';
10
10
  import ora from 'ora';
11
11
  import { waitForServicesReady, } from '../../lib/waitForReady.js';
12
12
  import { parseTimeoutToSeconds } from '../../lib/timeout.js';
13
+ function isValidVersion(version) {
14
+ return /^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/.test(version);
15
+ }
16
+ function isVersionNotFoundError(error, options) {
17
+ let errorMsg = '';
18
+ if (error && typeof error === 'object') {
19
+ const err = error;
20
+ // Check stderr first (execa captures this with pipe), then message
21
+ errorMsg = err.stderr || err.message || String(error);
22
+ }
23
+ else {
24
+ errorMsg = String(error);
25
+ }
26
+ if (options.arkVersion && errorMsg.includes(`:${options.arkVersion}: not found`)) {
27
+ return true;
28
+ }
29
+ if (options.marketplaceVersion && errorMsg.includes(`:${options.marketplaceVersion}: not found`)) {
30
+ return true;
31
+ }
32
+ return false;
33
+ }
34
+ function handleInstallError(error, service, options) {
35
+ if (isVersionNotFoundError(error, options)) {
36
+ const version = options.arkVersion || options.marketplaceVersion;
37
+ output.warning(`${service.name} version ${version} not found, skipping...`);
38
+ return true; // should continue to next service
39
+ }
40
+ // Other errors still fail
41
+ output.error(`failed to install ${service.name}`);
42
+ console.error(error);
43
+ process.exit(1);
44
+ }
13
45
  async function uninstallPrerequisites(service, verbose = false) {
14
46
  if (!service.prerequisiteUninstalls?.length)
15
47
  return;
@@ -43,14 +75,35 @@ async function checkAndCleanFailedRelease(releaseName, namespace, verbose = fals
43
75
  // Ignore errors - prerequisite may not exist
44
76
  }
45
77
  }
46
- async function installService(service, verbose = false) {
78
+ async function installService(service, verbose = false, arkVersionOverride, marketplaceVersionOverride) {
47
79
  await uninstallPrerequisites(service, verbose);
48
80
  await checkAndCleanFailedRelease(service.helmReleaseName, service.namespace, verbose);
81
+ let chartPath = service.chartPath;
82
+ // Override version for ARK core services
83
+ if (arkVersionOverride &&
84
+ chartPath.includes('ghcr.io/mckinsey/agents-at-scale-ark/charts')) {
85
+ chartPath = chartPath.replace(/:[^:]+$/, `:${arkVersionOverride}`);
86
+ }
87
+ // Override version for marketplace items
88
+ if (marketplaceVersionOverride &&
89
+ chartPath.includes('ghcr.io/mckinsey/agents-at-scale-marketplace/charts')) {
90
+ // Check if version tag exists after the last slash
91
+ const lastSlashIndex = chartPath.lastIndexOf('/');
92
+ const afterLastSlash = chartPath.slice(lastSlashIndex + 1);
93
+ if (afterLastSlash.includes(':')) {
94
+ // Replace existing version
95
+ chartPath = chartPath.replace(/:[^:/]+$/, `:${marketplaceVersionOverride}`);
96
+ }
97
+ else {
98
+ // Append version
99
+ chartPath = `${chartPath}:${marketplaceVersionOverride}`;
100
+ }
101
+ }
49
102
  const helmArgs = [
50
103
  'upgrade',
51
104
  '--install',
52
105
  service.helmReleaseName,
53
- service.chartPath,
106
+ chartPath,
54
107
  ];
55
108
  // Only add namespace flag if service has explicit namespace
56
109
  if (service.namespace) {
@@ -58,9 +111,21 @@ async function installService(service, verbose = false) {
58
111
  }
59
112
  // Add any additional install args
60
113
  helmArgs.push(...(service.installArgs || []));
61
- await execute('helm', helmArgs, { stdio: 'inherit' }, { verbose });
114
+ await execute('helm', helmArgs, {
115
+ stdout: 'inherit',
116
+ stderr: 'pipe',
117
+ }, { verbose });
62
118
  }
63
- export async function installArk(config, serviceName, options = {}) {
119
+ export async function installArk(config, serviceNames = [], options = {}) {
120
+ // Validate version strings
121
+ if (options.arkVersion && !isValidVersion(options.arkVersion)) {
122
+ output.error(`Invalid ARK version format: ${options.arkVersion}. Expected semantic versioning (e.g., 0.1.50)`);
123
+ process.exit(1);
124
+ }
125
+ if (options.marketplaceVersion && !isValidVersion(options.marketplaceVersion)) {
126
+ output.error(`Invalid marketplace version format: ${options.marketplaceVersion}. Expected semantic versioning (e.g., 0.1.7)`);
127
+ process.exit(1);
128
+ }
64
129
  // Validate that --wait-for-ready requires -y
65
130
  if (options.waitForReady && !options.yes) {
66
131
  output.error('--wait-for-ready requires -y flag for non-interactive mode');
@@ -75,69 +140,71 @@ export async function installArk(config, serviceName, options = {}) {
75
140
  // Show cluster info
76
141
  output.success(`connected to cluster: ${chalk.bold(clusterInfo.context)}`);
77
142
  console.log(); // Add blank line after cluster info
78
- // If a specific service is requested, install only that service
79
- if (serviceName) {
80
- // Check if it's a marketplace item
81
- if (isMarketplaceService(serviceName)) {
82
- const service = await getMarketplaceItem(serviceName);
83
- if (!service) {
84
- output.error(`marketplace item '${serviceName}' not found`);
85
- output.info('available marketplace items:');
86
- const marketplaceServices = await getAllMarketplaceServices();
87
- if (marketplaceServices) {
88
- for (const name of Object.keys(marketplaceServices)) {
89
- output.info(` marketplace/services/${name}`);
143
+ // If specific services are requested, install only those services
144
+ if (serviceNames.length > 0) {
145
+ for (const serviceName of serviceNames) {
146
+ // Check if it's a marketplace item
147
+ if (isMarketplaceService(serviceName)) {
148
+ const service = await getMarketplaceItem(serviceName);
149
+ if (!service) {
150
+ output.error(`marketplace item '${serviceName}' not found`);
151
+ output.info('available marketplace items:');
152
+ const marketplaceServices = await getAllMarketplaceServices();
153
+ if (marketplaceServices) {
154
+ for (const name of Object.keys(marketplaceServices)) {
155
+ output.info(` marketplace/services/${name}`);
156
+ }
90
157
  }
91
- }
92
- const marketplaceAgents = await getAllMarketplaceAgents();
93
- if (marketplaceAgents) {
94
- for (const name of Object.keys(marketplaceAgents)) {
95
- output.info(` marketplace/agents/${name}`);
158
+ const marketplaceAgents = await getAllMarketplaceAgents();
159
+ if (marketplaceAgents) {
160
+ for (const name of Object.keys(marketplaceAgents)) {
161
+ output.info(` marketplace/agents/${name}`);
162
+ }
163
+ }
164
+ const marketplaceExecutors = await getAllMarketplaceExecutors();
165
+ if (marketplaceExecutors) {
166
+ for (const name of Object.keys(marketplaceExecutors)) {
167
+ output.info(` marketplace/executors/${name}`);
168
+ }
169
+ }
170
+ if (!marketplaceServices && !marketplaceAgents && !marketplaceExecutors) {
171
+ output.warning('Marketplace unavailable');
96
172
  }
173
+ process.exit(1);
174
+ }
175
+ output.info(`installing marketplace item ${service.name}...`);
176
+ try {
177
+ await installService(service, options.verbose, options.arkVersion, options.marketplaceVersion);
178
+ output.success(`${service.name} installed successfully`);
97
179
  }
98
- const marketplaceExecutors = await getAllMarketplaceExecutors();
99
- if (marketplaceExecutors) {
100
- for (const name of Object.keys(marketplaceExecutors)) {
101
- output.info(` marketplace/executors/${name}`);
180
+ catch (error) {
181
+ if (handleInstallError(error, service, options)) {
182
+ continue;
102
183
  }
103
184
  }
104
- if (!marketplaceServices && !marketplaceAgents && !marketplaceExecutors) {
105
- output.warning('Marketplace unavailable');
185
+ continue;
186
+ }
187
+ // Core ARK service
188
+ const services = getInstallableServices();
189
+ const service = Object.values(services).find((s) => s.name === serviceName);
190
+ if (!service) {
191
+ output.error(`service '${serviceName}' not found`);
192
+ output.info('available services:');
193
+ for (const s of Object.values(services)) {
194
+ output.info(` ${s.name}`);
106
195
  }
107
196
  process.exit(1);
108
197
  }
109
- output.info(`installing marketplace item ${service.name}...`);
198
+ output.info(`installing ${service.name}...`);
110
199
  try {
111
- await installService(service, options.verbose);
200
+ await installService(service, options.verbose, options.arkVersion, options.marketplaceVersion);
112
201
  output.success(`${service.name} installed successfully`);
113
202
  }
114
203
  catch (error) {
115
- output.error(`failed to install ${service.name}`);
116
- console.error(error);
117
- process.exit(1);
118
- }
119
- return;
120
- }
121
- // Core ARK service
122
- const services = getInstallableServices();
123
- const service = Object.values(services).find((s) => s.name === serviceName);
124
- if (!service) {
125
- output.error(`service '${serviceName}' not found`);
126
- output.info('available services:');
127
- for (const s of Object.values(services)) {
128
- output.info(` ${s.name}`);
204
+ if (handleInstallError(error, service, options)) {
205
+ continue;
206
+ }
129
207
  }
130
- process.exit(1);
131
- }
132
- output.info(`installing ${service.name}...`);
133
- try {
134
- await installService(service, options.verbose);
135
- output.success(`${service.name} installed successfully`);
136
- }
137
- catch (error) {
138
- output.error(`failed to install ${service.name}`);
139
- console.error(error);
140
- process.exit(1);
141
208
  }
142
209
  return;
143
210
  }
@@ -264,12 +331,15 @@ export async function installArk(config, serviceName, options = {}) {
264
331
  }
265
332
  output.info(`installing ${service.name}...`);
266
333
  try {
267
- await installService(service, options.verbose);
334
+ await installService(service, options.verbose, options.arkVersion, options.marketplaceVersion);
268
335
  console.log(); // Add blank line after command output
269
336
  }
270
- catch {
337
+ catch (error) {
338
+ if (handleInstallError(error, service, options)) {
339
+ console.log(); // Add blank line after warning
340
+ continue;
341
+ }
271
342
  console.log(); // Add blank line after error output
272
- process.exit(1);
273
343
  }
274
344
  }
275
345
  }
@@ -295,17 +365,20 @@ export async function installArk(config, serviceName, options = {}) {
295
365
  for (const service of Object.values(services)) {
296
366
  output.info(`installing ${service.name}...`);
297
367
  try {
298
- await installService(service, options.verbose);
368
+ await installService(service, options.verbose, options.arkVersion, options.marketplaceVersion);
299
369
  console.log(); // Add blank line after command output
300
370
  }
301
- catch {
371
+ catch (error) {
372
+ if (handleInstallError(error, service, options)) {
373
+ console.log(); // Add blank line after warning
374
+ continue;
375
+ }
302
376
  console.log(); // Add blank line after error output
303
- process.exit(1);
304
377
  }
305
378
  }
306
379
  }
307
380
  // Show next steps after successful installation
308
- if (!serviceName || serviceName === 'all') {
381
+ if (serviceNames.length === 0) {
309
382
  printNextSteps();
310
383
  }
311
384
  // Wait for Ark to be ready if requested
@@ -350,12 +423,14 @@ export function createInstallCommand(config) {
350
423
  const command = new Command('install');
351
424
  command
352
425
  .description('Install ARK components using Helm')
353
- .argument('[service]', 'specific service to install, or all if omitted')
426
+ .argument('[service...]', 'specific services to install, or all if omitted')
354
427
  .option('-y, --yes', 'automatically confirm all installations')
428
+ .option('--ark-version <version>', 'ARK version to install (e.g., 0.1.50, defaults to CLI version)')
429
+ .option('--marketplace-version <version>', 'Marketplace item version to install (e.g., 0.1.5)')
355
430
  .option('--wait-for-ready <timeout>', 'wait for Ark to be ready after installation (e.g., 30s, 2m)')
356
431
  .option('-v, --verbose', 'show commands being executed')
357
- .action(async (service, options) => {
358
- await installArk(config, service, options);
432
+ .action(async (services, options) => {
433
+ await installArk(config, services, options);
359
434
  });
360
435
  return command;
361
436
  }
@@ -14,7 +14,7 @@ async function uninstallService(service, verbose = false) {
14
14
  }
15
15
  await execute('helm', helmArgs, { stdio: 'inherit' }, { verbose });
16
16
  }
17
- async function uninstallArk(config, serviceName, options = {}) {
17
+ async function uninstallArk(config, serviceNames = [], options = {}) {
18
18
  // Check cluster connectivity from config
19
19
  if (!config.clusterInfo) {
20
20
  showNoClusterError();
@@ -24,38 +24,62 @@ async function uninstallArk(config, serviceName, options = {}) {
24
24
  // Show cluster info
25
25
  output.success(`connected to cluster: ${chalk.bold(clusterInfo.context)}`);
26
26
  console.log(); // Add blank line after cluster info
27
- // If a specific service is requested, uninstall only that service
28
- if (serviceName) {
29
- // Check if it's a marketplace item
30
- if (isMarketplaceService(serviceName)) {
31
- const service = await getMarketplaceItem(serviceName);
32
- if (!service) {
33
- output.error(`marketplace item '${serviceName}' not found`);
34
- output.info('available marketplace items:');
35
- const marketplaceServices = await getAllMarketplaceServices();
36
- if (marketplaceServices) {
37
- for (const name of Object.keys(marketplaceServices)) {
38
- output.info(` marketplace/services/${name}`);
27
+ // If specific services are requested, uninstall only those services
28
+ if (serviceNames.length > 0) {
29
+ for (const serviceName of serviceNames) {
30
+ // Check if it's a marketplace item
31
+ if (isMarketplaceService(serviceName)) {
32
+ const service = await getMarketplaceItem(serviceName);
33
+ if (!service) {
34
+ output.error(`marketplace item '${serviceName}' not found`);
35
+ output.info('available marketplace items:');
36
+ const marketplaceServices = await getAllMarketplaceServices();
37
+ if (marketplaceServices) {
38
+ for (const name of Object.keys(marketplaceServices)) {
39
+ output.info(` marketplace/services/${name}`);
40
+ }
39
41
  }
40
- }
41
- const marketplaceAgents = await getAllMarketplaceAgents();
42
- if (marketplaceAgents) {
43
- for (const name of Object.keys(marketplaceAgents)) {
44
- output.info(` marketplace/agents/${name}`);
42
+ const marketplaceAgents = await getAllMarketplaceAgents();
43
+ if (marketplaceAgents) {
44
+ for (const name of Object.keys(marketplaceAgents)) {
45
+ output.info(` marketplace/agents/${name}`);
46
+ }
45
47
  }
46
- }
47
- const marketplaceExecutors = await getAllMarketplaceExecutors();
48
- if (marketplaceExecutors) {
49
- for (const name of Object.keys(marketplaceExecutors)) {
50
- output.info(` marketplace/executors/${name}`);
48
+ const marketplaceExecutors = await getAllMarketplaceExecutors();
49
+ if (marketplaceExecutors) {
50
+ for (const name of Object.keys(marketplaceExecutors)) {
51
+ output.info(` marketplace/executors/${name}`);
52
+ }
53
+ }
54
+ if (!marketplaceServices && !marketplaceAgents && !marketplaceExecutors) {
55
+ output.warning('Marketplace unavailable');
51
56
  }
57
+ process.exit(1);
52
58
  }
53
- if (!marketplaceServices && !marketplaceAgents && !marketplaceExecutors) {
54
- output.warning('Marketplace unavailable');
59
+ output.info(`uninstalling marketplace item ${service.name}...`);
60
+ try {
61
+ await uninstallService(service, options.verbose);
62
+ output.success(`${service.name} uninstalled successfully`);
63
+ }
64
+ catch (error) {
65
+ output.error(`failed to uninstall ${service.name}`);
66
+ console.error(error);
67
+ process.exit(1);
68
+ }
69
+ continue;
70
+ }
71
+ // Core ARK service
72
+ const services = getInstallableServices();
73
+ const service = Object.values(services).find((s) => s.name === serviceName);
74
+ if (!service) {
75
+ output.error(`service '${serviceName}' not found`);
76
+ output.info('available services:');
77
+ for (const s of Object.values(services)) {
78
+ output.info(` ${s.name}`);
55
79
  }
56
80
  process.exit(1);
57
81
  }
58
- output.info(`uninstalling marketplace item ${service.name}...`);
82
+ output.info(`uninstalling ${service.name}...`);
59
83
  try {
60
84
  await uninstallService(service, options.verbose);
61
85
  output.success(`${service.name} uninstalled successfully`);
@@ -65,28 +89,6 @@ async function uninstallArk(config, serviceName, options = {}) {
65
89
  console.error(error);
66
90
  process.exit(1);
67
91
  }
68
- return;
69
- }
70
- // Core ARK service
71
- const services = getInstallableServices();
72
- const service = Object.values(services).find((s) => s.name === serviceName);
73
- if (!service) {
74
- output.error(`service '${serviceName}' not found`);
75
- output.info('available services:');
76
- for (const s of Object.values(services)) {
77
- output.info(` ${s.name}`);
78
- }
79
- process.exit(1);
80
- }
81
- output.info(`uninstalling ${service.name}...`);
82
- try {
83
- await uninstallService(service, options.verbose);
84
- output.success(`${service.name} uninstalled successfully`);
85
- }
86
- catch (error) {
87
- output.error(`failed to uninstall ${service.name}`);
88
- console.error(error);
89
- process.exit(1);
90
92
  }
91
93
  return;
92
94
  }
@@ -134,11 +136,11 @@ export function createUninstallCommand(config) {
134
136
  const command = new Command('uninstall');
135
137
  command
136
138
  .description('Uninstall ARK components using Helm')
137
- .argument('[service]', 'specific service to uninstall, or all if omitted')
139
+ .argument('[service...]', 'specific services to uninstall, or all if omitted')
138
140
  .option('-y, --yes', 'automatically confirm all uninstallations')
139
141
  .option('-v, --verbose', 'show commands being executed')
140
- .action(async (service, options) => {
141
- await uninstallArk(config, service, options);
142
+ .action(async (services, options) => {
143
+ await uninstallArk(config, services, options);
142
144
  });
143
145
  return command;
144
146
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-at-scale/ark",
3
- "version": "0.1.56",
3
+ "version": "0.1.59",
4
4
  "description": "Ark CLI - Interactive terminal interface for ARK agents",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  "dependencies": {
45
45
  "@kubernetes/client-node": "^1.3.0",
46
46
  "@modelcontextprotocol/sdk": "^1.27.1",
47
- "axios": "^1.13.5",
47
+ "axios": "^1.15.0",
48
48
  "chalk": "^4.1.2",
49
49
  "commander": "^12.1.0",
50
50
  "debug": "^4.4.1",
@@ -87,8 +87,10 @@
87
87
  "overrides": {
88
88
  "minimatch": "^10.2.3",
89
89
  "rollup": "4.59.0",
90
- "hono": "^4.12.4",
91
- "@hono/node-server": "^1.19.10",
92
- "flatted": "^3.4.2"
90
+ "hono": "^4.12.12",
91
+ "@hono/node-server": "^1.19.13",
92
+ "flatted": "^3.4.2",
93
+ "tar": "^7.5.11",
94
+ "express-rate-limit": "^8.3.0"
93
95
  }
94
96
  }
@@ -1,197 +1,8 @@
1
- # ARK Marketplace
1
+ # Ark Marketplace
2
2
 
3
- Welcome to the ARK Marketplace - a central repository for sharing reusable ARK components across projects and teams.
3
+ The Ark Marketplace lives in a separate repository:
4
4
 
5
- ## Overview
5
+ **Repository**: https://github.com/mckinsey/agents-at-scale-marketplace
6
+ **Documentation**: https://mckinsey.github.io/agents-at-scale-marketplace/
6
7
 
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! 🚀
8
+ See the marketplace repo for structure, contribution guidelines, and available components (executors, services, MCP servers, agents, demos).
@@ -95,7 +95,7 @@ ENTRYPOINT [ "/bin/sh", "-c", "mcp-proxy --debug --port 8080 --host 0.0.0.0 --sh
95
95
  {{- end }}
96
96
 
97
97
  {{- else if eq .Values.technology "python" }}
98
- FROM python:3.11-slim
98
+ FROM python:3.11.13-slim
99
99
 
100
100
  WORKDIR /app
101
101
 
@@ -1,4 +1,4 @@
1
- FROM python:3.11-slim
1
+ FROM python:3.11.13-slim
2
2
 
3
3
  # Set working directory
4
4
  WORKDIR /app
@@ -1,4 +1,4 @@
1
- FROM python:3.12-slim
1
+ FROM python:3.12.11-slim
2
2
 
3
3
  WORKDIR /app
4
4
 
@@ -1,24 +0,0 @@
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
@@ -1,11 +0,0 @@
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.
@@ -1,16 +0,0 @@
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
@@ -1,23 +0,0 @@
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/
@@ -1,20 +0,0 @@
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
- }
@@ -1,53 +0,0 @@
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
@@ -1,29 +0,0 @@
1
- # Agents Directory
2
-
3
- This directory contains reusable agent definitions that can be shared across projects.
4
-
5
- ## Structure
6
-
7
- Each agent should be in its own file or subdirectory (complex agents) with:
8
-
9
- - agent.yaml (the main agent definition)
10
- - README.md (documentation)
11
- - examples/ (optional usage examples)
12
-
13
- ## Naming Convention
14
-
15
- Use descriptive names that indicate the agent's purpose:
16
-
17
- - data-analyst/
18
- - code-reviewer/
19
- - security-scanner/
20
- - documentation-writer/
21
-
22
- ## Contributing
23
-
24
- When contributing an agent:
25
-
26
- 1. Ensure it follows the Ark agent specification
27
- 2. Include comprehensive documentation
28
- 3. Provide usage examples
29
- 4. Test with multiple models when possible
@@ -1,19 +0,0 @@
1
- # Documentation Directory
2
-
3
- Documentation for the marketplace and its components.
4
-
5
- ## Structure
6
-
7
- - contributing.md - Guidelines for contributors
8
- - component-specs/ - Specifications for different component types
9
- - best-practices/ - Development and usage best practices
10
- - tutorials/ - Step-by-step guides
11
- - api/ - API documentation
12
-
13
- ## Documentation Standards
14
-
15
- 1. Use clear, concise language
16
- 2. Include code examples
17
- 3. Keep documentation up-to-date
18
- 4. Follow markdown conventions
19
- 5. Include diagrams where helpful
@@ -1,59 +0,0 @@
1
- {
2
- "version": "1.0.0",
3
- "marketplace": "ARK Marketplace",
4
- "items": [
5
- {
6
- "name": "phoenix",
7
- "displayName": "Phoenix",
8
- "description": "AI/ML observability platform with OpenTelemetry integration",
9
- "version": "0.1.5",
10
- "author": "ARK Marketplace",
11
- "homepage": "https://github.com/mckinsey/agents-at-scale-marketplace",
12
- "repository": "https://github.com/mckinsey/agents-at-scale-marketplace",
13
- "license": "Apache-2.0",
14
- "tags": ["observability", "telemetry", "monitoring"],
15
- "category": "observability",
16
- "icon": "https://example.com/phoenix-icon.png",
17
- "documentation": "https://mckinsey.github.io/agents-at-scale-marketplace/services/phoenix/",
18
- "support": {
19
- "url": "https://github.com/mckinsey/agents-at-scale-marketplace/issues"
20
- },
21
- "ark": {
22
- "chartPath": "oci://ghcr.io/mckinsey/agents-at-scale-marketplace/charts/phoenix",
23
- "namespace": "phoenix",
24
- "helmReleaseName": "phoenix",
25
- "installArgs": ["--create-namespace"],
26
- "k8sServiceName": "phoenix",
27
- "k8sServicePort": 6006,
28
- "k8sDeploymentName": "phoenix"
29
- }
30
- },
31
- {
32
- "name": "langfuse",
33
- "displayName": "Langfuse",
34
- "description": "Open-source LLM observability and analytics platform with session tracking",
35
- "version": "0.1.4",
36
- "author": "ARK Marketplace",
37
- "homepage": "https://github.com/mckinsey/agents-at-scale-marketplace",
38
- "repository": "https://github.com/mckinsey/agents-at-scale-marketplace",
39
- "license": "Apache-2.0",
40
- "tags": ["observability", "analytics", "llm", "tracking"],
41
- "category": "observability",
42
- "icon": "https://example.com/langfuse-icon.png",
43
- "documentation": "https://mckinsey.github.io/agents-at-scale-marketplace/services/langfuse/",
44
- "support": {
45
- "url": "https://github.com/mckinsey/agents-at-scale-marketplace/issues"
46
- },
47
- "ark": {
48
- "chartPath": "oci://ghcr.io/mckinsey/agents-at-scale-marketplace/charts/langfuse",
49
- "namespace": "telemetry",
50
- "helmReleaseName": "langfuse",
51
- "installArgs": ["--create-namespace"],
52
- "k8sServiceName": "langfuse",
53
- "k8sServicePort": 3000,
54
- "k8sDeploymentName": "langfuse-web"
55
- }
56
- }
57
- ]
58
- }
59
-
@@ -1,32 +0,0 @@
1
- # MCP Servers Directory
2
-
3
- This directory contains Model Context Protocol (MCP) server configurations and implementations.
4
-
5
- ## Structure
6
-
7
- Each MCP server should be in its own subdirectory with:
8
-
9
- - mcp-server.yaml (server configuration)
10
- - src/ (source code if custom implementation)
11
- - Dockerfile (if containerized)
12
- - README.md (documentation)
13
- - examples/ (usage examples)
14
-
15
- ## Naming Convention
16
-
17
- Use descriptive names that indicate the server's purpose:
18
-
19
- - file-system-server/
20
- - database-server/
21
- - api-gateway-server/
22
- - knowledge-base-server/
23
-
24
- ## Contributing
25
-
26
- When contributing an MCP server:
27
-
28
- 1. Follow MCP protocol specifications
29
- 2. Include security configurations
30
- 3. Document all available tools/resources
31
- 4. Provide integration examples
32
- 5. Include monitoring and logging setup
@@ -1,23 +0,0 @@
1
- # Models Directory
2
-
3
- This directory contains model configurations for different AI providers and use cases.
4
-
5
- ## Structure
6
- Each model configuration should be:
7
- - provider-specific directories (openai/, anthropic/, etc.)
8
- - model-specific YAML files within each directory
9
- - README.md documenting capabilities and limitations
10
-
11
- ## Naming Convention
12
- Use provider and model names:
13
- - openai/gpt-4.yaml
14
- - anthropic/claude-3-sonnet.yaml
15
- - azure/gpt-4-32k.yaml
16
- - local/llama2-7b.yaml
17
-
18
- ## Contributing
19
- When contributing a model configuration:
20
- 1. Include provider-specific settings
21
- 2. Document token limits and capabilities
22
- 3. Specify recommended use cases
23
- 4. Include cost considerations if applicable
@@ -1,43 +0,0 @@
1
- # Projects Directory
2
-
3
- This directory contains complete, reusable Ark projects that demonstrate comprehensive use cases and multi-component solutions.
4
-
5
- ## Purpose
6
-
7
- - **Full Project Templates**: Complete Ark project structures with multiple agents, teams, models, and tools working together
8
- - **End-to-End Solutions**: Real-world scenarios that showcase complex workflows and integrations
9
- - **Reference Implementations**: Best practices for structuring large-scale Ark deployments
10
-
11
- ## Structure Guidelines
12
-
13
- Each project should include:
14
-
15
- - **Complete project structure**: All necessary YAML configurations
16
- - **README.md**: Detailed setup instructions, use case description, and architecture overview
17
- - **Documentation**: Architecture diagrams, workflow explanations, and deployment guides
18
- - **Examples**: Sample queries and expected outputs
19
- - **Dependencies**: Clear list of required models, tools, and external services
20
-
21
- ## Naming Convention
22
-
23
- Use descriptive names that indicate the use case:
24
-
25
- - `customer-support-workflow/` - Multi-agent customer service system
26
- - `research-assistant-pipeline/` - Academic research and analysis workflow
27
- - `content-generation-studio/` - Creative content production system
28
-
29
- ## Project Requirements
30
-
31
- - Each project must be self-contained and deployable
32
- - Include comprehensive documentation
33
- - Provide clear setup and configuration instructions
34
- - Include sample data or test cases where applicable
35
- - Follow Ark best practices for resource organization
36
-
37
- ## Examples
38
-
39
- - Multi-agent workflows with specialized roles
40
- - Integration with external APIs and services
41
- - Complex data processing pipelines
42
- - Cross-functional team collaboration scenarios
43
- - Industry-specific solution templates
@@ -1,25 +0,0 @@
1
- # Queries Directory
2
-
3
- This directory contains reusable query templates for common use cases.
4
-
5
- ## Structure
6
- Each query should be in its own file or subdirectory:
7
- - query-name.yaml (simple queries)
8
- - complex-query/ (for queries with multiple files)
9
- - query.yaml
10
- - README.md
11
- - examples/
12
-
13
- ## Naming Convention
14
- Use descriptive names that indicate the query's purpose:
15
- - code-analysis.yaml
16
- - data-transformation.yaml
17
- - security-audit.yaml
18
- - document-summarization.yaml
19
-
20
- ## Contributing
21
- When contributing a query:
22
- 1. Make it parameterizable where possible
23
- 2. Include clear documentation of expected inputs
24
- 3. Provide example outputs
25
- 4. Specify compatible agents/teams
@@ -1,29 +0,0 @@
1
- # Teams Directory
2
-
3
- This directory contains reusable team configurations for multi-agent workflows.
4
-
5
- ## Structure
6
-
7
- Each team should be in its own file (simple) or subdirectory (complex) with:
8
-
9
- - team.yaml (the main team definition)
10
- - README.md (documentation describing the workflow)
11
- - examples/ (optional usage examples)
12
-
13
- ## Naming Convention
14
-
15
- Use descriptive names that indicate the team's workflow:
16
-
17
- - code-review-team/
18
- - data-pipeline-team/
19
- - content-creation-team/
20
- - security-audit-team/
21
-
22
- ## Contributing
23
-
24
- When contributing a team:
25
-
26
- 1. Document the team's workflow and strategy
27
- 2. Explain when to use this team configuration
28
- 3. Include examples of typical inputs and outputs
29
- 4. Test the team configuration thoroughly
@@ -1,32 +0,0 @@
1
- # Tools Directory
2
-
3
- This directory contains reusable tool definitions for extending agent capabilities.
4
-
5
- ## Structure
6
-
7
- Each tool should be in its own subdirectory with:
8
-
9
- - tool.yaml (the main tool definition)
10
- - src/ (source code if applicable)
11
- - Dockerfile (if containerized)
12
- - README.md (documentation)
13
- - examples/ (usage examples)
14
-
15
- ## Naming Convention
16
-
17
- Use descriptive names that indicate the tool's function:
18
-
19
- - file-processor/
20
- - database-connector/
21
- - api-client/
22
- - data-validator/
23
-
24
- ## Contributing
25
-
26
- When contributing a tool:
27
-
28
- 1. Follow the Ark tool specification
29
- 2. Include comprehensive documentation
30
- 3. Provide usage examples
31
- 4. Ensure proper error handling
32
- 5. Include security considerations
@@ -1,17 +0,0 @@
1
- # Tool Examples Directory
2
-
3
- This directory contains example tool implementations that can serve as templates.
4
-
5
- Examples should demonstrate:
6
-
7
- - Best practices for tool development
8
- - Common patterns and use cases
9
- - Integration with different agent types
10
- - Error handling and logging
11
-
12
- Each example should include:
13
-
14
- - Complete source code
15
- - Documentation
16
- - Build instructions
17
- - Testing guidelines