@copado/agentia-cli 1.0.0-rc.0 → 1.1.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 (47) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +494 -284
  3. package/dist/commands/cicd/cloud/commit.js +7 -2
  4. package/dist/commands/cicd/extension/create.js +53 -0
  5. package/dist/commands/cicd/extension/install.js +127 -0
  6. package/dist/commands/cicd/extension/package.js +35 -0
  7. package/dist/commands/cicd/extension/publish.js +61 -0
  8. package/dist/commands/cicd/extension/uninstall.js +99 -0
  9. package/dist/commands/cicd/extension/validate.js +47 -0
  10. package/dist/commands/cicd/work/get.js +18 -2
  11. package/dist/commands/setup/skills/create.js +1 -1
  12. package/dist/commands/setup/skills/update.js +1 -1
  13. package/dist/commands/setup.js +15 -3
  14. package/dist/commands/update.js +11 -4
  15. package/dist/lib/cli-update.js +6 -1
  16. package/dist/lib/defaults-store.js +3 -1
  17. package/dist/lib/extension/assets.js +4 -0
  18. package/dist/lib/extension/create.js +3 -0
  19. package/dist/lib/extension/git.js +17 -0
  20. package/dist/lib/extension/index.js +27 -0
  21. package/dist/lib/extension/install.js +4 -0
  22. package/dist/lib/extension/manifest.js +21 -0
  23. package/dist/lib/extension/package.js +3 -0
  24. package/dist/lib/extension/paths.js +5 -0
  25. package/dist/lib/extension/publish.js +3 -0
  26. package/dist/lib/extension/sf-deploy.js +8 -0
  27. package/dist/lib/extension/source.js +7 -0
  28. package/dist/lib/extension/uninstall.js +3 -0
  29. package/dist/lib/function-types.js +3 -1
  30. package/dist/lib/mcp/work-tools.js +19 -6
  31. package/dist/lib/project-setup.js +5 -4
  32. package/dist/lib/runtime.js +1 -1
  33. package/dist/lib/setup-skills.js +4 -1
  34. package/dist/lib/setup-templates.js +1 -4
  35. package/dist/lib/template-types.js +3 -1
  36. package/dist/lib/version-warning.js +3 -0
  37. package/dist/lib/work-committed-metadata.js +4 -0
  38. package/dist/lib/work-get.js +2 -1
  39. package/oclif.manifest.json +886 -471
  40. package/package.json +1 -1
  41. package/templates/rules/cursor/agentia.mdc +29 -0
  42. package/templates/skills/agentia/SKILL.md +29 -0
  43. package/templates/skills/agentia-cicd/SKILL.md +3 -1
  44. package/templates/skills/agentia-cicd/references/extensions.md +49 -0
  45. package/templates/skills/agentia-cicd/references/pipelines.md +1 -1
  46. package/templates/skills/agentia-cicd/references/work.md +6 -4
  47. package/templates/AGENTS.md +0 -24
@@ -0,0 +1,3 @@
1
+ import {modules} from '../runtime.js';
2
+ const createExtension = modules["extension/create.js"]["createExtension"]
3
+ export {createExtension};
@@ -0,0 +1,17 @@
1
+ import {modules} from '../runtime.js';
2
+ const assertSafeGitRemote = modules["extension/git.js"]["assertSafeGitRemote"]
3
+ const cloneExtensionRepo = modules["extension/git.js"]["cloneExtensionRepo"]
4
+ const createAnnotatedTag = modules["extension/git.js"]["createAnnotatedTag"]
5
+ const deleteLocalTag = modules["extension/git.js"]["deleteLocalTag"]
6
+ const extensionGit = modules["extension/git.js"]["extensionGit"]
7
+ const formatGitError = modules["extension/git.js"]["formatGitError"]
8
+ const getCurrentBranchName = modules["extension/git.js"]["getCurrentBranchName"]
9
+ const getHeadSha = modules["extension/git.js"]["getHeadSha"]
10
+ const isWorkingTreeClean = modules["extension/git.js"]["isWorkingTreeClean"]
11
+ const localTagExists = modules["extension/git.js"]["localTagExists"]
12
+ const pushBranchAndTag = modules["extension/git.js"]["pushBranchAndTag"]
13
+ const remoteTagExists = modules["extension/git.js"]["remoteTagExists"]
14
+ const resetExtensionGitExecForTests = modules["extension/git.js"]["resetExtensionGitExecForTests"]
15
+ const resolveLatestSemverTag = modules["extension/git.js"]["resolveLatestSemverTag"]
16
+ const setExtensionGitExecForTests = modules["extension/git.js"]["setExtensionGitExecForTests"]
17
+ export {assertSafeGitRemote, cloneExtensionRepo, createAnnotatedTag, deleteLocalTag, extensionGit, formatGitError, getCurrentBranchName, getHeadSha, isWorkingTreeClean, localTagExists, pushBranchAndTag, remoteTagExists, resetExtensionGitExecForTests, resolveLatestSemverTag, setExtensionGitExecForTests};
@@ -0,0 +1,27 @@
1
+ import {modules} from '../runtime.js';
2
+ const EXTENSION_MANIFEST_RELATIVE_PATH = modules["extension/index.js"]["EXTENSION_MANIFEST_RELATIVE_PATH"]
3
+ const assertSafeGitUrl = modules["extension/index.js"]["assertSafeGitUrl"]
4
+ const assertValidExtensionName = modules["extension/index.js"]["assertValidExtensionName"]
5
+ const assertValidSemver = modules["extension/index.js"]["assertValidSemver"]
6
+ const cloneExtensionRepo = modules["extension/index.js"]["cloneExtensionRepo"]
7
+ const createExtension = modules["extension/index.js"]["createExtension"]
8
+ const deployExtensionSalesforceSource = modules["extension/index.js"]["deployExtensionSalesforceSource"]
9
+ const extensionGit = modules["extension/index.js"]["extensionGit"]
10
+ const installExtension = modules["extension/index.js"]["installExtension"]
11
+ const loadFunctionUpsertPayload = modules["extension/index.js"]["loadFunctionUpsertPayload"]
12
+ const loadTemplateUpsertPayload = modules["extension/index.js"]["loadTemplateUpsertPayload"]
13
+ const materializeExtensionSource = modules["extension/index.js"]["materializeExtensionSource"]
14
+ const packageExtension = modules["extension/index.js"]["packageExtension"]
15
+ const parseExtensionManifest = modules["extension/index.js"]["parseExtensionManifest"]
16
+ const publishExtension = modules["extension/index.js"]["publishExtension"]
17
+ const readExtensionManifest = modules["extension/index.js"]["readExtensionManifest"]
18
+ const resetExtensionGitExecForTests = modules["extension/index.js"]["resetExtensionGitExecForTests"]
19
+ const resetExtensionSfDeployExecForTests = modules["extension/index.js"]["resetExtensionSfDeployExecForTests"]
20
+ const resolveLocalExtensionPath = modules["extension/index.js"]["resolveLocalExtensionPath"]
21
+ const setExtensionGitExecForTests = modules["extension/index.js"]["setExtensionGitExecForTests"]
22
+ const setExtensionSfDeployExecForTests = modules["extension/index.js"]["setExtensionSfDeployExecForTests"]
23
+ const uninstallExtension = modules["extension/index.js"]["uninstallExtension"]
24
+ const validateExtension = modules["extension/index.js"]["validateExtension"]
25
+ const versionTagName = modules["extension/index.js"]["versionTagName"]
26
+ const writeExtensionManifest = modules["extension/index.js"]["writeExtensionManifest"]
27
+ export {EXTENSION_MANIFEST_RELATIVE_PATH, assertSafeGitUrl, assertValidExtensionName, assertValidSemver, cloneExtensionRepo, createExtension, deployExtensionSalesforceSource, extensionGit, installExtension, loadFunctionUpsertPayload, loadTemplateUpsertPayload, materializeExtensionSource, packageExtension, parseExtensionManifest, publishExtension, readExtensionManifest, resetExtensionGitExecForTests, resetExtensionSfDeployExecForTests, resolveLocalExtensionPath, setExtensionGitExecForTests, setExtensionSfDeployExecForTests, uninstallExtension, validateExtension, versionTagName, writeExtensionManifest};
@@ -0,0 +1,4 @@
1
+ import {modules} from '../runtime.js';
2
+ const assertSafeGitUrl = modules["extension/install.js"]["assertSafeGitUrl"]
3
+ const installExtension = modules["extension/install.js"]["installExtension"]
4
+ export {assertSafeGitUrl, installExtension};
@@ -0,0 +1,21 @@
1
+ import {modules} from '../runtime.js';
2
+ const DEFAULT_SALESFORCE_SOURCE_DIR = modules["extension/manifest.js"]["DEFAULT_SALESFORCE_SOURCE_DIR"]
3
+ const EXTENSION_FUNCTIONS_DIR = modules["extension/manifest.js"]["EXTENSION_FUNCTIONS_DIR"]
4
+ const EXTENSION_MANIFEST_RELATIVE_PATH = modules["extension/manifest.js"]["EXTENSION_MANIFEST_RELATIVE_PATH"]
5
+ const EXTENSION_NAME_REGEX = modules["extension/manifest.js"]["EXTENSION_NAME_REGEX"]
6
+ const EXTENSION_TEMPLATES_DIR = modules["extension/manifest.js"]["EXTENSION_TEMPLATES_DIR"]
7
+ const SEMVER_REGEX = modules["extension/manifest.js"]["SEMVER_REGEX"]
8
+ const assertValidExtensionName = modules["extension/manifest.js"]["assertValidExtensionName"]
9
+ const assertValidSemver = modules["extension/manifest.js"]["assertValidSemver"]
10
+ const extensionManifestPath = modules["extension/manifest.js"]["extensionManifestPath"]
11
+ const metadataJsonPath = modules["extension/manifest.js"]["metadataJsonPath"]
12
+ const parseExtensionManifest = modules["extension/manifest.js"]["parseExtensionManifest"]
13
+ const parseVersionFromRef = modules["extension/manifest.js"]["parseVersionFromRef"]
14
+ const pathExists = modules["extension/manifest.js"]["pathExists"]
15
+ const readExtensionManifest = modules["extension/manifest.js"]["readExtensionManifest"]
16
+ const resolveSalesforceSourceDir = modules["extension/manifest.js"]["resolveSalesforceSourceDir"]
17
+ const scanExtensionAssets = modules["extension/manifest.js"]["scanExtensionAssets"]
18
+ const validateExtension = modules["extension/manifest.js"]["validateExtension"]
19
+ const versionTagName = modules["extension/manifest.js"]["versionTagName"]
20
+ const writeExtensionManifest = modules["extension/manifest.js"]["writeExtensionManifest"]
21
+ export {DEFAULT_SALESFORCE_SOURCE_DIR, EXTENSION_FUNCTIONS_DIR, EXTENSION_MANIFEST_RELATIVE_PATH, EXTENSION_NAME_REGEX, EXTENSION_TEMPLATES_DIR, SEMVER_REGEX, assertValidExtensionName, assertValidSemver, extensionManifestPath, metadataJsonPath, parseExtensionManifest, parseVersionFromRef, pathExists, readExtensionManifest, resolveSalesforceSourceDir, scanExtensionAssets, validateExtension, versionTagName, writeExtensionManifest};
@@ -0,0 +1,3 @@
1
+ import {modules} from '../runtime.js';
2
+ const packageExtension = modules["extension/package.js"]["packageExtension"]
3
+ export {packageExtension};
@@ -0,0 +1,5 @@
1
+ import {modules} from '../runtime.js';
2
+ const assertPathInsideRoot = modules["extension/paths.js"]["assertPathInsideRoot"]
3
+ const assertSafeExtensionFile = modules["extension/paths.js"]["assertSafeExtensionFile"]
4
+ const assertSafeExtensionTree = modules["extension/paths.js"]["assertSafeExtensionTree"]
5
+ export {assertPathInsideRoot, assertSafeExtensionFile, assertSafeExtensionTree};
@@ -0,0 +1,3 @@
1
+ import {modules} from '../runtime.js';
2
+ const publishExtension = modules["extension/publish.js"]["publishExtension"]
3
+ export {publishExtension};
@@ -0,0 +1,8 @@
1
+ import {modules} from '../runtime.js';
2
+ const assertSafeSfAlias = modules["extension/sf-deploy.js"]["assertSafeSfAlias"]
3
+ const deployExtensionSalesforceSource = modules["extension/sf-deploy.js"]["deployExtensionSalesforceSource"]
4
+ const extensionSourceDeployArgs = modules["extension/sf-deploy.js"]["extensionSourceDeployArgs"]
5
+ const resetExtensionSfDeployExecForTests = modules["extension/sf-deploy.js"]["resetExtensionSfDeployExecForTests"]
6
+ const sanitizeDeployOutput = modules["extension/sf-deploy.js"]["sanitizeDeployOutput"]
7
+ const setExtensionSfDeployExecForTests = modules["extension/sf-deploy.js"]["setExtensionSfDeployExecForTests"]
8
+ export {assertSafeSfAlias, deployExtensionSalesforceSource, extensionSourceDeployArgs, resetExtensionSfDeployExecForTests, sanitizeDeployOutput, setExtensionSfDeployExecForTests};
@@ -0,0 +1,7 @@
1
+ import {modules} from '../runtime.js';
2
+ const assertSafeGitUrl = modules["extension/source.js"]["assertSafeGitUrl"]
3
+ const localPathAsFileUrl = modules["extension/source.js"]["localPathAsFileUrl"]
4
+ const materializeExtensionSource = modules["extension/source.js"]["materializeExtensionSource"]
5
+ const normalizeRemoteGitUrl = modules["extension/source.js"]["normalizeRemoteGitUrl"]
6
+ const resolveLocalExtensionPath = modules["extension/source.js"]["resolveLocalExtensionPath"]
7
+ export {assertSafeGitUrl, localPathAsFileUrl, materializeExtensionSource, normalizeRemoteGitUrl, resolveLocalExtensionPath};
@@ -0,0 +1,3 @@
1
+ import {modules} from '../runtime.js';
2
+ const uninstallExtension = modules["extension/uninstall.js"]["uninstallExtension"]
3
+ export {uninstallExtension};
@@ -1,8 +1,10 @@
1
1
  import {modules} from './runtime.js';
2
+ const FUNCTION_DISK_DIR = modules["function-types.js"]["FUNCTION_DISK_DIR"]
2
3
  const FUNCTION_EXTENSIONS = modules["function-types.js"]["FUNCTION_EXTENSIONS"]
3
4
  const FUNCTION_LIST_TYPES = modules["function-types.js"]["FUNCTION_LIST_TYPES"]
4
5
  const FUNCTION_RUNTIMES = modules["function-types.js"]["FUNCTION_RUNTIMES"]
5
6
  const FUNCTION_RUNTIME_EXTENSION = modules["function-types.js"]["FUNCTION_RUNTIME_EXTENSION"]
7
+ const FUNCTION_UPSERT_RESPONSE_ONLY_KEYS = modules["function-types.js"]["FUNCTION_UPSERT_RESPONSE_ONLY_KEYS"]
6
8
  const formatFunctionDetail = modules["function-types.js"]["formatFunctionDetail"]
7
9
  const formatFunctionResultStatus = modules["function-types.js"]["formatFunctionResultStatus"]
8
10
  const formatFunctionRunResult = modules["function-types.js"]["formatFunctionRunResult"]
@@ -19,4 +21,4 @@ const normalizeFunctionUpsertPayload = modules["function-types.js"]["normalizeFu
19
21
  const normalizeFunctionsList = modules["function-types.js"]["normalizeFunctionsList"]
20
22
  const normalizeFunctionsListPage = modules["function-types.js"]["normalizeFunctionsListPage"]
21
23
  const parseParameterAssignments = modules["function-types.js"]["parseParameterAssignments"]
22
- export {FUNCTION_EXTENSIONS, FUNCTION_LIST_TYPES, FUNCTION_RUNTIMES, FUNCTION_RUNTIME_EXTENSION, formatFunctionDetail, formatFunctionResultStatus, formatFunctionRunResult, formatFunctionTable, functionEndpoint, functionResultEndpoint, functionResultLogEndpoint, functionRunEndpoint, functionsEndpoint, normalizeFunction, normalizeFunctionResultStatus, normalizeFunctionRunResult, normalizeFunctionUpsertPayload, normalizeFunctionsList, normalizeFunctionsListPage, parseParameterAssignments};
24
+ export {FUNCTION_DISK_DIR, FUNCTION_EXTENSIONS, FUNCTION_LIST_TYPES, FUNCTION_RUNTIMES, FUNCTION_RUNTIME_EXTENSION, FUNCTION_UPSERT_RESPONSE_ONLY_KEYS, formatFunctionDetail, formatFunctionResultStatus, formatFunctionRunResult, formatFunctionTable, functionEndpoint, functionResultEndpoint, functionResultLogEndpoint, functionRunEndpoint, functionsEndpoint, normalizeFunction, normalizeFunctionResultStatus, normalizeFunctionRunResult, normalizeFunctionUpsertPayload, normalizeFunctionsList, normalizeFunctionsListPage, parseParameterAssignments};
@@ -18,7 +18,7 @@ import { DEFAULT_APEX_TEST_WAIT_MINUTES, parseApexTestClassNames, runWorkApexTes
18
18
  import { buildWorkCommitRequest, normalizeWorkCommitInput, performWorkCommit, resolveWorkCommitPlatformExperience, WORK_COMMIT_ACTIONS, WORK_COMMIT_CHANGES_HELP, WORK_COMMIT_DEFAULT_TIMEOUT_SECONDS, WORK_COMMIT_METADATA_CATEGORY_HELP, } from '../work-commit.js';
19
19
  import { buildWorkCreatePayload } from '../work-defaults.js';
20
20
  import { validateWorkMutationPayload, WORK_LONG_TEXT_MAX_LENGTH, WORK_SHORT_TEXT_MAX_LENGTH, } from '../work-flags.js';
21
- import { fetchWorkItem, fetchWorkItems } from '../work-get.js';
21
+ import { fetchWorkItems, fetchWorkItemWithOptions } from '../work-get.js';
22
22
  import { performWorkLocalCommit } from '../work-local-commit.js';
23
23
  import { reportLocalQualityGatesFailure, reportLocalQualityGatesOutcome, } from '../work-local-run-tests.js';
24
24
  import { capturingWorkPushHooks, performWorkPush, resolveActiveFeatureWorkItem, resolveWorkPushContext, resolveWorkPushNeed, uploadCapturedPublishLogsBestEffort, } from '../work-push.js';
@@ -126,8 +126,13 @@ async function workList(args = {}) {
126
126
  return mcpPaginatedListPayload('userStories', await fetchWorkItems(filters));
127
127
  }
128
128
  async function workGet(args = {}) {
129
- const userStory = await fetchWorkItem(args.id);
130
- return { userStory };
129
+ const { committedMetadata, userStory } = await fetchWorkItemWithOptions(args.id, {
130
+ committedMetadata: args.committedMetadata === true,
131
+ });
132
+ return {
133
+ userStory,
134
+ ...(committedMetadata === undefined ? {} : { committedMetadata }),
135
+ };
131
136
  }
132
137
  async function workCreate(args = {}) {
133
138
  const explicitPayload = buildWorkMutationPayloadFromArgs(args);
@@ -522,7 +527,11 @@ async function cloudCommit(args = {}) {
522
527
  throw new Error('Use changes or simple metadata fields, not both.');
523
528
  }
524
529
  if (args.changes === undefined && !hasMcpSimpleCommitArgs(args)) {
525
- throw new Error('Requires simple metadata fields such as metadataName and metadataType, or changes input.');
530
+ throw new Error('Requires simple metadata fields such as metadataName, metadataType, and metadataCategory, or changes input.');
531
+ }
532
+ if (args.changes === undefined &&
533
+ (args.metadataCategory === undefined || args.metadataCategory.trim().length === 0)) {
534
+ throw new Error('metadataCategory is required.');
526
535
  }
527
536
  const workItemId = await resolveWorkItemId(args.id);
528
537
  const request = buildWorkCommitRequest(buildMcpWorkCommitInput(args), {
@@ -657,8 +666,12 @@ export function registerAgentiaMcpWorkTools(server) {
657
666
  title: 'Agentia Work List',
658
667
  }, (args) => safelyHandleTool(() => workList(args || {})));
659
668
  server.registerTool('agentia_work_get', {
660
- description: 'Get a Copado user story by Id via the CICD gateway. Omit Id to use the active work item from work set.',
669
+ description: 'Get a Copado user story by Id via the CICD gateway. Omit Id to use the active work item from work set. Set committedMetadata=true to also include the Story committed metadata list.',
661
670
  inputSchema: {
671
+ committedMetadata: z
672
+ .boolean()
673
+ .optional()
674
+ .describe('When true, also include the Story committed metadata list as committedMetadata in the result.'),
662
675
  id: z.string().optional().describe('User story Id. Defaults to the active work item from work set.'),
663
676
  },
664
677
  title: 'Agentia Work Get',
@@ -782,7 +795,7 @@ export function registerAgentiaMcpWorkTools(server) {
782
795
  .describe(`Maximum total wait in seconds. Defaults to ${PROMOTION_RUN_DEFAULT_TIMEOUT_SECONDS}.`),
783
796
  };
784
797
  server.registerTool('agentia_cloud_commit', {
785
- description: 'Create a Copado cloud metadata commit. Preflights the user story, submits POST /release/commit, and optionally waits for the job. Use simple metadata fields for one change or changes for multi-change requests. For Salesforce metadata, set metadataCategory to SFDX (or c: "SFDX" on each changes entry); Copado SFDX deploy skips entries that omit that field. For local Git work, use git commit then agentia_work_publish; pass permissions and fullMetadata on agentia_work_publish.',
798
+ description: 'Create a Copado cloud metadata commit. Preflights the user story, submits POST /release/commit, and optionally waits for the job. Use simple metadata fields for one change or changes for multi-change requests. metadataCategory is required for simple input; each changes entry requires c (or category). For Salesforce metadata, set metadataCategory/c to SFDX; Copado SFDX deploy skips entries that omit that field. For local Git work, use git commit then agentia_work_publish; pass permissions and fullMetadata on agentia_work_publish.',
786
799
  inputSchema: cloudCommitInputSchema,
787
800
  title: 'Agentia Cloud Commit',
788
801
  }, (args) => safelyHandleTool(() => cloudCommit(args || {})));
@@ -1,13 +1,14 @@
1
1
  import {modules} from './runtime.js';
2
+ const LEGACY_AGENTIA_AGENTS_END_MARKER = modules["project-setup.js"]["LEGACY_AGENTIA_AGENTS_END_MARKER"]
3
+ const LEGACY_AGENTIA_AGENTS_START_MARKER = modules["project-setup.js"]["LEGACY_AGENTIA_AGENTS_START_MARKER"]
2
4
  const createLocalQualityGateScripts = modules["project-setup.js"]["createLocalQualityGateScripts"]
3
5
  const ensureAgentiaGitignore = modules["project-setup.js"]["ensureAgentiaGitignore"]
4
- const findAgentsMd = modules["project-setup.js"]["findAgentsMd"]
5
6
  const findLocalQualityGateScripts = modules["project-setup.js"]["findLocalQualityGateScripts"]
6
7
  const gitignoreHasAgentiaEntry = modules["project-setup.js"]["gitignoreHasAgentiaEntry"]
8
+ const legacyAgentiaSectionRemovalMessage = modules["project-setup.js"]["legacyAgentiaSectionRemovalMessage"]
9
+ const removeLegacyAgentiaSection = modules["project-setup.js"]["removeLegacyAgentiaSection"]
7
10
  const resetProjectSetupDepsForTests = modules["project-setup.js"]["resetProjectSetupDepsForTests"]
8
- const resolveAgentsMdContent = modules["project-setup.js"]["resolveAgentsMdContent"]
9
11
  const resolveProjectContext = modules["project-setup.js"]["resolveProjectContext"]
10
12
  const runProjectSetup = modules["project-setup.js"]["runProjectSetup"]
11
13
  const setProjectSetupDepsForTests = modules["project-setup.js"]["setProjectSetupDepsForTests"]
12
- const writeAgentsMd = modules["project-setup.js"]["writeAgentsMd"]
13
- export {createLocalQualityGateScripts, ensureAgentiaGitignore, findAgentsMd, findLocalQualityGateScripts, gitignoreHasAgentiaEntry, resetProjectSetupDepsForTests, resolveAgentsMdContent, resolveProjectContext, runProjectSetup, setProjectSetupDepsForTests, writeAgentsMd};
14
+ export {LEGACY_AGENTIA_AGENTS_END_MARKER, LEGACY_AGENTIA_AGENTS_START_MARKER, createLocalQualityGateScripts, ensureAgentiaGitignore, findLocalQualityGateScripts, gitignoreHasAgentiaEntry, legacyAgentiaSectionRemovalMessage, removeLegacyAgentiaSection, resetProjectSetupDepsForTests, resolveProjectContext, runProjectSetup, setProjectSetupDepsForTests};