@copado/agentia-cli 1.1.0 → 1.2.0

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 (196) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +2370 -1850
  3. package/dist/commands/ai/agent/ask.js +4 -4
  4. package/dist/commands/ai/agent/chat.js +4 -4
  5. package/dist/commands/cicd/credential/auth/status.js +38 -0
  6. package/dist/commands/cicd/credential/auth/web/login.js +54 -0
  7. package/dist/commands/cicd/credential/list.js +13 -17
  8. package/dist/commands/cicd/credential/open.js +30 -0
  9. package/dist/commands/cicd/credential/update.js +9 -12
  10. package/dist/commands/cicd/environment/auth/status.js +34 -13
  11. package/dist/commands/cicd/environment/auth/web/login.js +20 -4
  12. package/dist/commands/cicd/environment/open.js +6 -22
  13. package/dist/commands/cicd/extension-configuration/get.js +24 -0
  14. package/dist/commands/cicd/extension-configuration/list.js +49 -0
  15. package/dist/commands/cicd/extension-configuration/open.js +38 -0
  16. package/dist/commands/cicd/metadata/content/get.js +1 -1
  17. package/dist/commands/cicd/metadata/dependency/list.js +2 -2
  18. package/dist/commands/cicd/metadata/explore.js +81 -0
  19. package/dist/commands/cicd/metadata/list.js +3 -3
  20. package/dist/commands/cicd/metadata/refresh/deleted.js +1 -1
  21. package/dist/commands/cicd/metadata/refresh/run.js +2 -2
  22. package/dist/commands/cicd/metadata/refresh/status.js +2 -2
  23. package/dist/commands/cicd/pipeline/automation/activate.js +39 -0
  24. package/dist/commands/cicd/pipeline/automation/create.js +33 -0
  25. package/dist/commands/cicd/pipeline/automation/deactivate.js +39 -0
  26. package/dist/commands/cicd/pipeline/automation/delete.js +45 -0
  27. package/dist/commands/cicd/pipeline/automation/get.js +32 -0
  28. package/dist/commands/cicd/pipeline/automation/list.js +38 -0
  29. package/dist/commands/cicd/pipeline/automation/open.js +38 -0
  30. package/dist/commands/cicd/pipeline/automation/update.js +38 -0
  31. package/dist/commands/cicd/pipeline/quality-gate/activate.js +39 -0
  32. package/dist/commands/cicd/pipeline/quality-gate/create.js +34 -0
  33. package/dist/commands/cicd/pipeline/quality-gate/deactivate.js +39 -0
  34. package/dist/commands/cicd/pipeline/quality-gate/delete.js +45 -0
  35. package/dist/commands/cicd/pipeline/quality-gate/get.js +32 -0
  36. package/dist/commands/cicd/pipeline/quality-gate/list.js +34 -0
  37. package/dist/commands/cicd/pipeline/quality-gate/open.js +38 -0
  38. package/dist/commands/cicd/pipeline/quality-gate/update.js +38 -0
  39. package/dist/commands/cicd/work/create.js +1 -0
  40. package/dist/commands/cicd/work/environment-sync.js +8 -7
  41. package/dist/commands/cicd/work/set.js +6 -4
  42. package/dist/commands/cicd/work/submit.js +3 -2
  43. package/dist/commands/cicd/work/update.js +1 -0
  44. package/dist/commands/plugins/install.js +2 -5
  45. package/dist/commands/setup/skills/create.js +28 -2
  46. package/dist/commands/setup/skills/list.js +55 -0
  47. package/dist/commands/setup/skills/update.js +36 -3
  48. package/dist/commands/setup.js +3 -3
  49. package/dist/commands/testing/data-table/create.js +1 -2
  50. package/dist/commands/testing/data-table/delete.js +1 -2
  51. package/dist/commands/testing/data-table/export.js +2 -6
  52. package/dist/commands/testing/data-table/get.js +2 -4
  53. package/dist/commands/testing/data-table/list.js +1 -2
  54. package/dist/commands/testing/data-table/update.js +3 -4
  55. package/dist/commands/testing/job/create.js +26 -22
  56. package/dist/commands/testing/job/delete.js +2 -2
  57. package/dist/commands/testing/job/files/download.js +73 -0
  58. package/dist/commands/testing/job/files/list.js +43 -0
  59. package/dist/commands/testing/job/{upload.js → files/upload.js} +13 -9
  60. package/dist/commands/testing/job/get.js +2 -2
  61. package/dist/commands/testing/job/list.js +1 -1
  62. package/dist/commands/testing/job/refs.js +4 -4
  63. package/dist/commands/testing/job/run.js +134 -1
  64. package/dist/commands/testing/{build → job/runs}/abort.js +10 -8
  65. package/dist/commands/testing/job/runs/get.js +42 -0
  66. package/dist/commands/testing/{build → job/runs}/list.js +19 -10
  67. package/dist/commands/testing/{logs.js → job/runs/logs.js} +9 -6
  68. package/dist/commands/testing/{build → job/runs}/search.js +9 -7
  69. package/dist/commands/testing/job/schedule/get.js +5 -11
  70. package/dist/commands/testing/job/schedule/remove.js +3 -3
  71. package/dist/commands/testing/job/schedule/set.js +3 -3
  72. package/dist/commands/testing/job/update.js +22 -65
  73. package/dist/commands/testing/live/continue.js +5 -10
  74. package/dist/commands/testing/live/execute.js +3 -3
  75. package/dist/commands/testing/live/history.js +7 -2
  76. package/dist/commands/testing/live/inspect.js +5 -4
  77. package/dist/commands/testing/live/interrupt.js +5 -10
  78. package/dist/commands/testing/live/recorder.js +23 -115
  79. package/dist/commands/testing/live/reports.js +3 -3
  80. package/dist/commands/testing/live/screenshot.js +3 -3
  81. package/dist/commands/testing/live/set-options.js +11 -4
  82. package/dist/commands/testing/live/start.js +9 -4
  83. package/dist/commands/testing/live/status.js +2 -5
  84. package/dist/commands/testing/live/stop.js +3 -5
  85. package/dist/commands/testing/live/view.js +2 -2
  86. package/dist/commands/testing/project/create.js +1 -17
  87. package/dist/commands/testing/project/get.js +0 -1
  88. package/dist/commands/testing/project/list.js +2 -2
  89. package/dist/commands/testing/project/permission/set.js +3 -7
  90. package/dist/commands/testing/project/permission/update.js +2 -2
  91. package/dist/commands/testing/robot/create.js +22 -25
  92. package/dist/commands/testing/robot/get.js +1 -1
  93. package/dist/commands/testing/robot/list.js +3 -3
  94. package/dist/commands/testing/robot/update.js +3 -3
  95. package/dist/commands/testing/user-parameter/create.js +3 -9
  96. package/dist/commands/testing/user-parameter/update.js +1 -7
  97. package/dist/commands/testing/variable/create.js +4 -9
  98. package/dist/commands/testing/variable/list.js +3 -3
  99. package/dist/commands/testing/variable/update.js +5 -12
  100. package/dist/help.js +17 -0
  101. package/dist/lib/ai-types.js +2 -1
  102. package/dist/lib/claude-mcp-config.js +15 -0
  103. package/dist/lib/credential-sync.js +1 -2
  104. package/dist/lib/defaults-store.js +4 -1
  105. package/dist/lib/environment-auth-status.js +2 -1
  106. package/dist/lib/environment-auth.js +2 -1
  107. package/dist/lib/environment-credential-flags.js +3 -1
  108. package/dist/lib/environment-credential-operations.js +8 -2
  109. package/dist/lib/environment-types.js +3 -1
  110. package/dist/lib/extension-configuration-ops.js +4 -0
  111. package/dist/lib/extension-configuration-sanitize.js +7 -0
  112. package/dist/lib/extension-configuration-types.js +8 -0
  113. package/dist/lib/http-proxy.js +13 -0
  114. package/dist/lib/mcp/ai-tools.js +3 -3
  115. package/dist/lib/mcp/command-id.js +2 -0
  116. package/dist/lib/mcp/pipeline-automation-quality-tools.js +452 -0
  117. package/dist/lib/mcp/server.js +70 -1
  118. package/dist/lib/mcp/testing-live-tools.js +24 -13
  119. package/dist/lib/mcp/testing-tools.js +239 -550
  120. package/dist/lib/mcp/tool-annotations.js +27 -18
  121. package/dist/lib/mcp/tools.js +117 -32
  122. package/dist/lib/mcp/work-tools.js +18 -4
  123. package/dist/lib/metadata-explore.js +8 -0
  124. package/dist/lib/network-error.js +8 -0
  125. package/dist/lib/pipeline-automation-flags.js +12 -0
  126. package/dist/lib/pipeline-automation-ops.js +9 -0
  127. package/dist/lib/pipeline-automation-types.js +18 -0
  128. package/dist/lib/pipeline-lifecycle-id.js +3 -0
  129. package/dist/lib/pipeline-quality-gate-flags.js +12 -0
  130. package/dist/lib/pipeline-quality-gate-ops.js +9 -0
  131. package/dist/lib/pipeline-quality-gate-types.js +17 -0
  132. package/dist/lib/plugin-host/ai.js +2 -1
  133. package/dist/lib/plugin-skills.js +22 -0
  134. package/dist/lib/plugin-trust/gate.js +1 -2
  135. package/dist/lib/project-root.js +3 -1
  136. package/dist/lib/runtime.js +1 -1
  137. package/dist/lib/salesforce-tooling-check.js +6 -0
  138. package/dist/lib/skill-packs.js +7 -0
  139. package/dist/lib/testing-archive.js +9 -0
  140. package/dist/lib/testing-data-table.js +39 -0
  141. package/dist/lib/testing-execution.js +22 -0
  142. package/dist/lib/testing-flags.js +6 -2
  143. package/dist/lib/testing-gateway.js +4 -1
  144. package/dist/lib/testing-live-command.js +3 -1
  145. package/dist/lib/testing-live-operations.js +7 -1
  146. package/dist/lib/testing-live-recorder.js +3 -1
  147. package/dist/lib/testing-live-state.js +8 -1
  148. package/dist/lib/testing-operations.js +6 -21
  149. package/dist/lib/testing-sanitization.js +2 -1
  150. package/dist/lib/testing-secret-input.js +2 -1
  151. package/dist/lib/testing-types.js +24 -3
  152. package/dist/lib/work-environment-sync.js +3 -1
  153. package/dist/lib/work-flags.js +6 -1
  154. package/dist/lib/work-local-development-flow.js +4 -0
  155. package/dist/lib/work-submit-wait.js +3 -1
  156. package/oclif.manifest.json +6609 -6895
  157. package/package.json +35 -2
  158. package/templates/skills/agentia-ai/SKILL.md +3 -4
  159. package/templates/skills/agentia-ai/references/ai-agents.md +2 -2
  160. package/templates/skills/agentia-cicd/SKILL.md +7 -4
  161. package/templates/skills/agentia-cicd/references/environments-and-credentials.md +19 -13
  162. package/templates/skills/agentia-cicd/references/extensions.md +3 -0
  163. package/templates/skills/agentia-cicd/references/pipelines.md +36 -2
  164. package/templates/skills/agentia-cicd/references/work.md +20 -5
  165. package/templates/skills/agentia-metadata/SKILL.md +140 -0
  166. package/templates/skills/agentia-metadata/references/metadata-explore.md +142 -0
  167. package/templates/skills/agentia-testing/SKILL.md +3 -3
  168. package/templates/skills/agentia-testing/references/tests.md +14 -14
  169. package/dist/commands/testing/build/get.js +0 -38
  170. package/dist/commands/testing/build/latest.js +0 -40
  171. package/dist/commands/testing/build/logs.js +0 -47
  172. package/dist/commands/testing/build/run.js +0 -26
  173. package/dist/commands/testing/create.js +0 -2
  174. package/dist/commands/testing/job/download.js +0 -54
  175. package/dist/commands/testing/job/files.js +0 -34
  176. package/dist/commands/testing/run.js +0 -26
  177. package/dist/commands/testing/status.js +0 -45
  178. package/dist/commands/testing/test/create.js +0 -2
  179. package/dist/commands/testing/test/logs.js +0 -2
  180. package/dist/commands/testing/test/run.js +0 -26
  181. package/dist/commands/testing/test/status.js +0 -2
  182. package/dist/commands/testing/test/update.js +0 -2
  183. package/dist/commands/testing/update.js +0 -65
  184. package/dist/lib/testing-data-command.js +0 -8
  185. package/dist/lib/testing-data-core.js +0 -20
  186. package/dist/lib/testing-data-export.js +0 -6
  187. package/dist/lib/testing-data-import.js +0 -6
  188. package/dist/lib/testing-data-io.js +0 -12
  189. package/dist/lib/testing-data-operations.js +0 -10
  190. package/dist/lib/testing-data-types.js +0 -4
  191. package/dist/lib/testing-live-endpoints.js +0 -6
  192. package/dist/lib/testing-live-history.js +0 -7
  193. package/dist/lib/testing-run-command.js +0 -3
  194. package/dist/lib/testing-schedule.js +0 -5
  195. package/dist/lib/testing-session.js +0 -5
  196. package/dist/lib/testing-watch.js +0 -4
@@ -2,6 +2,8 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { createRequire } from 'node:module';
4
4
  import process from 'node:process';
5
+ import { z } from 'zod';
6
+ import { logVerboseDebug } from '../debug.js';
5
7
  import { migrateUserSettingsFromProjectConfig } from '../defaults-store.js';
6
8
  import { applyProjectRoot, hasExplicitProjectRoot } from '../project-root.js';
7
9
  import { runWithMcpRequestSignal } from './request-context.js';
@@ -10,15 +12,71 @@ import { withToolAnnotations } from './tool-annotations.js';
10
12
  import { registerAgentiaMcpTools } from './tools.js';
11
13
  const require = createRequire(import.meta.url);
12
14
  const packageJson = require('../../../package.json');
15
+ /**
16
+ * SDK ListRootsResultSchema requires every uri to start with file://.
17
+ * Some clients send empty or non-file URIs; accept them here and filter below.
18
+ */
19
+ const LenientListRootsResultSchema = z
20
+ .object({
21
+ roots: z.array(z.unknown()).optional().default([]),
22
+ })
23
+ .passthrough();
24
+ /** Keep only usable local file roots; empty / non-file:// entries are ignored. */
25
+ export function collectMcpFileRootUris(roots) {
26
+ const uris = [];
27
+ for (const root of roots) {
28
+ if (root === null || typeof root !== 'object')
29
+ continue;
30
+ const { uri } = root;
31
+ if (typeof uri !== 'string')
32
+ continue;
33
+ const trimmed = uri.trim();
34
+ if (trimmed.startsWith('file://'))
35
+ uris.push(trimmed);
36
+ }
37
+ return uris;
38
+ }
13
39
  export function createAgentiaMcpServer(lifecycleSignal, projectContextReady = Promise.resolve()) {
14
40
  const server = new McpServer({
15
41
  name: packageJson.name ?? 'agentia-cli',
16
42
  version: packageJson.version,
17
43
  });
44
+ installMcpClientCallDebugLogging(server.server);
18
45
  wrapMcpToolRegistration(server, lifecycleSignal, projectContextReady);
19
46
  registerAgentiaMcpTools(server);
20
47
  return server;
21
48
  }
49
+ /**
50
+ * Log every server→client MCP request/notification when DEBUG=verbose.
51
+ * Covers roots/list and any future client calls made through the protocol.
52
+ */
53
+ export function installMcpClientCallDebugLogging(protocol) {
54
+ const target = protocol;
55
+ const originalRequest = target.request.bind(target);
56
+ target.request = async (request, resultSchema, options) => {
57
+ logVerboseDebug('MCP client request', request);
58
+ try {
59
+ const result = await originalRequest(request, resultSchema, options);
60
+ logVerboseDebug('MCP client response', {
61
+ method: typeof request?.method === 'string' ? request.method : undefined,
62
+ result,
63
+ });
64
+ return result;
65
+ }
66
+ catch (error) {
67
+ logVerboseDebug('MCP client error', {
68
+ error: error instanceof Error ? error.message : String(error),
69
+ method: typeof request?.method === 'string' ? request.method : undefined,
70
+ });
71
+ throw error;
72
+ }
73
+ };
74
+ const originalNotification = target.notification.bind(target);
75
+ target.notification = async (notification, options) => {
76
+ logVerboseDebug('MCP client notification', notification);
77
+ await originalNotification(notification, options);
78
+ };
79
+ }
22
80
  function combineSignals(requestSignal, lifecycleSignal) {
23
81
  if (requestSignal === undefined || lifecycleSignal === undefined) {
24
82
  return { dispose() { }, signal: requestSignal ?? lifecycleSignal };
@@ -61,8 +119,19 @@ function wrapMcpToolRegistration(server, lifecycleSignal, projectContextReady =
61
119
  function clientSupportsRoots(server) {
62
120
  return (server.server._clientCapabilities?.roots !== undefined);
63
121
  }
122
+ async function listMcpFileRootUris(server) {
123
+ try {
124
+ const result = await server.server.request({ method: 'roots/list' }, LenientListRootsResultSchema);
125
+ return collectMcpFileRootUris(result.roots);
126
+ }
127
+ catch (error) {
128
+ const message = error instanceof Error ? error.message : String(error);
129
+ process.stderr.write(`[agentia-mcp] ignoring invalid MCP roots/list response: ${message}\n`);
130
+ return undefined;
131
+ }
132
+ }
64
133
  async function applyMcpProjectRoot(server, includeMcpRoots) {
65
- const rootUris = includeMcpRoots ? (await server.server.listRoots()).roots.map((root) => root.uri) : undefined;
134
+ const rootUris = includeMcpRoots ? await listMcpFileRootUris(server) : undefined;
66
135
  applyProjectRoot(undefined, rootUris);
67
136
  await migrateUserSettingsFromProjectConfig().catch(() => {
68
137
  // Best-effort; MCP tools still fall back to reading legacy project keys.
@@ -2,15 +2,22 @@ import { mkdtemp } from 'node:fs/promises';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { join } from 'node:path';
4
4
  import { z } from 'zod';
5
- import { controlTestingLive, executeTestingLive, getTestingLiveHistory, getTestingLiveReports, getTestingLiveStatus, inspectTestingLive, saveTestingLiveScreenshot, setTestingLiveOptions, startTestingLive, stopTestingLive, } from '../testing-live-operations.js';
5
+ import { controlTestingLive, executeTestingLive, getTestingLiveHistory, getTestingLiveReports, getTestingLiveStatus, inspectTestingLive, parseTestingLiveScreen, saveTestingLiveScreenshot, setTestingLiveOptions, startTestingLive, stopTestingLive, } from '../testing-live-operations.js';
6
6
  import { TESTING_LIVE_LIBRARIES } from '../testing-live-types.js';
7
7
  import { safelyHandleTool } from './result.js';
8
8
  async function testingLiveStart(args) {
9
- const screenValues = [args.screenWidth, args.screenHeight, args.screenDepth];
10
- const supplied = screenValues.filter((value) => value !== undefined);
11
- if (supplied.length > 0 && supplied.length !== 3) {
12
- throw new Error('Provide screenWidth, screenHeight, and screenDepth together.');
9
+ const hasScreenParts = args.screenDepth !== undefined || args.screenHeight !== undefined || args.screenWidth !== undefined;
10
+ if (hasScreenParts && (args.screen !== undefined || args.viewport !== undefined)) {
11
+ throw new Error('Use either screen/viewport or screenWidth/screenHeight/screenDepth, not both.');
13
12
  }
13
+ let screenInput = args.screen;
14
+ if (hasScreenParts) {
15
+ if (args.screenDepth === undefined || args.screenHeight === undefined || args.screenWidth === undefined) {
16
+ throw new Error('Provide screenWidth, screenHeight, and screenDepth together.');
17
+ }
18
+ screenInput = { depth: args.screenDepth, height: args.screenHeight, width: args.screenWidth };
19
+ }
20
+ const screen = parseTestingLiveScreen(screenInput, args.viewport);
14
21
  return {
15
22
  result: await startTestingLive({
16
23
  description: args.description,
@@ -21,9 +28,7 @@ async function testingLiveStart(args) {
21
28
  noBrowser: args.noBrowser,
22
29
  pollIntervalMs: args.pollIntervalSeconds === undefined ? undefined : args.pollIntervalSeconds * 1000,
23
30
  projectId: args.project,
24
- screen: supplied.length === 0
25
- ? undefined
26
- : { depth: args.screenDepth, height: args.screenHeight, width: args.screenWidth },
31
+ screen,
27
32
  section: args.section,
28
33
  sectionIndex: args.sectionIndex,
29
34
  sessionVersion: args.sessionVersion,
@@ -58,7 +63,9 @@ async function testingLiveExecute(args) {
58
63
  };
59
64
  }
60
65
  async function testingLiveControl(action, args) {
61
- return { result: await controlTestingLive(action, { jobId: args.job, projectId: args.project, sessionId: args.sessionId }) };
66
+ return {
67
+ result: await controlTestingLive(action, { jobId: args.job, projectId: args.project, sessionId: args.sessionId }),
68
+ };
62
69
  }
63
70
  async function testingLiveInspect(args) {
64
71
  return {
@@ -100,7 +107,9 @@ async function testingLiveSetOptions(args) {
100
107
  };
101
108
  }
102
109
  async function testingLiveHistory(args) {
103
- return { result: getTestingLiveHistory({ jobId: args.job, limit: args.limit, projectId: args.project, status: args.status }) };
110
+ return {
111
+ result: getTestingLiveHistory({ jobId: args.job, limit: args.limit, projectId: args.project, status: args.status }),
112
+ };
104
113
  }
105
114
  export const testingLiveMcpHandlers = {
106
115
  testingLiveContinue: (args) => testingLiveControl('continue', args),
@@ -116,7 +125,7 @@ export const testingLiveMcpHandlers = {
116
125
  testingLiveStop,
117
126
  };
118
127
  const liveSessionSchema = {
119
- job: z.number().int().positive().optional().describe('Optional CRT job/test ID guard.'),
128
+ job: z.number().int().positive().optional().describe('Optional CRT job ID guard.'),
120
129
  project: z.number().int().positive().describe('CRT project ID.'),
121
130
  sessionId: z.number().int().positive().optional().describe('Optional active live session ID guard.'),
122
131
  };
@@ -135,12 +144,13 @@ export function registerTestingLiveMcpTools(server) {
135
144
  inputSchema: {
136
145
  description: z.string().max(500).optional(),
137
146
  japIme: z.boolean().optional(),
138
- job: z.number().int().positive().describe('CRT job/test ID.'),
147
+ job: z.number().int().positive().describe('CRT job ID.'),
139
148
  library: z.enum(TESTING_LIVE_LIBRARIES).optional(),
140
149
  noBootstrap: z.boolean().optional(),
141
150
  noBrowser: z.boolean().optional(),
142
151
  pollIntervalSeconds: z.number().int().min(1).max(30).optional(),
143
152
  project: z.number().int().positive().describe('CRT project ID.'),
153
+ screen: z.string().max(100).optional(),
144
154
  screenDepth: z.number().int().min(8).max(32).optional(),
145
155
  screenHeight: z.number().int().min(240).max(4320).optional(),
146
156
  screenWidth: z.number().int().min(320).max(7680).optional(),
@@ -148,6 +158,7 @@ export function registerTestingLiveMcpTools(server) {
148
158
  sectionIndex: z.number().int().positive().optional(),
149
159
  sessionVersion: z.string().max(100).optional(),
150
160
  timeoutSeconds: z.number().int().min(1).max(600).optional(),
161
+ viewport: z.string().max(100).optional(),
151
162
  },
152
163
  title: 'Agentia Testing Live Start',
153
164
  }, (args) => safelyHandleTool(() => testingLiveStart(args)));
@@ -204,7 +215,7 @@ export function registerTestingLiveMcpTools(server) {
204
215
  server.registerTool('agentia_testing_live_history', {
205
216
  description: 'Read bounded sanitized local CRT live execution history.',
206
217
  inputSchema: {
207
- job: z.number().int().positive().describe('CRT job/test ID.'),
218
+ job: z.number().int().positive().describe('CRT job ID.'),
208
219
  limit: z.number().int().min(1).max(500).optional(),
209
220
  project: z.number().int().positive().describe('CRT project ID.'),
210
221
  status: z.enum(['completed', 'failed', 'recorded']).optional(),