@agents-dev/cli 0.7.7

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 (152) hide show
  1. package/AGENTS.md +400 -0
  2. package/CHANGELOG.md +297 -0
  3. package/CONTRIBUTING.md +164 -0
  4. package/LICENSE +21 -0
  5. package/README.md +117 -0
  6. package/bin/agents +24 -0
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.js +282 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/connect.d.ts +7 -0
  11. package/dist/commands/connect.js +48 -0
  12. package/dist/commands/connect.js.map +1 -0
  13. package/dist/commands/disconnect.d.ts +7 -0
  14. package/dist/commands/disconnect.js +47 -0
  15. package/dist/commands/disconnect.js.map +1 -0
  16. package/dist/commands/doctor.d.ts +6 -0
  17. package/dist/commands/doctor.js +430 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/init.d.ts +5 -0
  20. package/dist/commands/init.js +24 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/mcp-add.d.ts +20 -0
  23. package/dist/commands/mcp-add.js +250 -0
  24. package/dist/commands/mcp-add.js.map +1 -0
  25. package/dist/commands/mcp-import.d.ts +13 -0
  26. package/dist/commands/mcp-import.js +207 -0
  27. package/dist/commands/mcp-import.js.map +1 -0
  28. package/dist/commands/mcp-list.d.ts +5 -0
  29. package/dist/commands/mcp-list.js +34 -0
  30. package/dist/commands/mcp-list.js.map +1 -0
  31. package/dist/commands/mcp-remove.d.ts +7 -0
  32. package/dist/commands/mcp-remove.js +34 -0
  33. package/dist/commands/mcp-remove.js.map +1 -0
  34. package/dist/commands/mcp-test.d.ts +8 -0
  35. package/dist/commands/mcp-test.js +402 -0
  36. package/dist/commands/mcp-test.js.map +1 -0
  37. package/dist/commands/reset.d.ts +6 -0
  38. package/dist/commands/reset.js +76 -0
  39. package/dist/commands/reset.js.map +1 -0
  40. package/dist/commands/start.d.ts +6 -0
  41. package/dist/commands/start.js +292 -0
  42. package/dist/commands/start.js.map +1 -0
  43. package/dist/commands/status.d.ts +7 -0
  44. package/dist/commands/status.js +278 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/commands/sync.d.ts +6 -0
  47. package/dist/commands/sync.js +22 -0
  48. package/dist/commands/sync.js.map +1 -0
  49. package/dist/commands/watch.d.ts +7 -0
  50. package/dist/commands/watch.js +117 -0
  51. package/dist/commands/watch.js.map +1 -0
  52. package/dist/core/claudeCli.d.ts +7 -0
  53. package/dist/core/claudeCli.js +35 -0
  54. package/dist/core/claudeCli.js.map +1 -0
  55. package/dist/core/config.d.ts +17 -0
  56. package/dist/core/config.js +121 -0
  57. package/dist/core/config.js.map +1 -0
  58. package/dist/core/cursorCli.d.ts +9 -0
  59. package/dist/core/cursorCli.js +60 -0
  60. package/dist/core/cursorCli.js.map +1 -0
  61. package/dist/core/fs.d.ts +11 -0
  62. package/dist/core/fs.js +76 -0
  63. package/dist/core/fs.js.map +1 -0
  64. package/dist/core/gitignore.d.ts +3 -0
  65. package/dist/core/gitignore.js +54 -0
  66. package/dist/core/gitignore.js.map +1 -0
  67. package/dist/core/mcp.d.ts +8 -0
  68. package/dist/core/mcp.js +134 -0
  69. package/dist/core/mcp.js.map +1 -0
  70. package/dist/core/mcpCrud.d.ts +34 -0
  71. package/dist/core/mcpCrud.js +105 -0
  72. package/dist/core/mcpCrud.js.map +1 -0
  73. package/dist/core/mcpImport.d.ts +14 -0
  74. package/dist/core/mcpImport.js +507 -0
  75. package/dist/core/mcpImport.js.map +1 -0
  76. package/dist/core/mcpSecrets.d.ts +27 -0
  77. package/dist/core/mcpSecrets.js +144 -0
  78. package/dist/core/mcpSecrets.js.map +1 -0
  79. package/dist/core/mcpValidation.d.ts +19 -0
  80. package/dist/core/mcpValidation.js +78 -0
  81. package/dist/core/mcpValidation.js.map +1 -0
  82. package/dist/core/paths.d.ts +37 -0
  83. package/dist/core/paths.js +43 -0
  84. package/dist/core/paths.js.map +1 -0
  85. package/dist/core/project.d.ts +16 -0
  86. package/dist/core/project.js +34 -0
  87. package/dist/core/project.js.map +1 -0
  88. package/dist/core/renderers.d.ts +14 -0
  89. package/dist/core/renderers.js +113 -0
  90. package/dist/core/renderers.js.map +1 -0
  91. package/dist/core/shell.d.ts +8 -0
  92. package/dist/core/shell.js +21 -0
  93. package/dist/core/shell.js.map +1 -0
  94. package/dist/core/shellWords.d.ts +1 -0
  95. package/dist/core/shellWords.js +84 -0
  96. package/dist/core/shellWords.js.map +1 -0
  97. package/dist/core/skills.d.ts +8 -0
  98. package/dist/core/skills.js +150 -0
  99. package/dist/core/skills.js.map +1 -0
  100. package/dist/core/skillsValidation.d.ts +1 -0
  101. package/dist/core/skillsValidation.js +68 -0
  102. package/dist/core/skillsValidation.js.map +1 -0
  103. package/dist/core/sync.d.ts +2 -0
  104. package/dist/core/sync.js +427 -0
  105. package/dist/core/sync.js.map +1 -0
  106. package/dist/core/syncLock.d.ts +1 -0
  107. package/dist/core/syncLock.js +84 -0
  108. package/dist/core/syncLock.js.map +1 -0
  109. package/dist/core/templates.d.ts +1 -0
  110. package/dist/core/templates.js +38 -0
  111. package/dist/core/templates.js.map +1 -0
  112. package/dist/core/trust.d.ts +7 -0
  113. package/dist/core/trust.js +51 -0
  114. package/dist/core/trust.js.map +1 -0
  115. package/dist/core/vscodeSettings.d.ts +17 -0
  116. package/dist/core/vscodeSettings.js +212 -0
  117. package/dist/core/vscodeSettings.js.map +1 -0
  118. package/dist/core/warnings.d.ts +2 -0
  119. package/dist/core/warnings.js +26 -0
  120. package/dist/core/warnings.js.map +1 -0
  121. package/dist/integrations/antigravity.d.ts +9 -0
  122. package/dist/integrations/antigravity.js +13 -0
  123. package/dist/integrations/antigravity.js.map +1 -0
  124. package/dist/integrations/claude.d.ts +1 -0
  125. package/dist/integrations/claude.js +4 -0
  126. package/dist/integrations/claude.js.map +1 -0
  127. package/dist/integrations/codex.d.ts +5 -0
  128. package/dist/integrations/codex.js +5 -0
  129. package/dist/integrations/codex.js.map +1 -0
  130. package/dist/integrations/copilotVscode.d.ts +7 -0
  131. package/dist/integrations/copilotVscode.js +9 -0
  132. package/dist/integrations/copilotVscode.js.map +1 -0
  133. package/dist/integrations/cursor.d.ts +7 -0
  134. package/dist/integrations/cursor.js +9 -0
  135. package/dist/integrations/cursor.js.map +1 -0
  136. package/dist/integrations/gemini.d.ts +12 -0
  137. package/dist/integrations/gemini.js +15 -0
  138. package/dist/integrations/gemini.js.map +1 -0
  139. package/dist/integrations/registry.d.ts +9 -0
  140. package/dist/integrations/registry.js +21 -0
  141. package/dist/integrations/registry.js.map +1 -0
  142. package/dist/types.d.ts +85 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/docs/EXAMPLES.md +211 -0
  146. package/docs/README.md +26 -0
  147. package/docs/agents-system.md +178 -0
  148. package/package.json +77 -0
  149. package/templates/agents/AGENTS.md +23 -0
  150. package/templates/agents/README.md +25 -0
  151. package/templates/agents/skills/README.md +27 -0
  152. package/templates/agents/skills/skill-guide/SKILL.md +29 -0
@@ -0,0 +1,144 @@
1
+ const PLACEHOLDER_PATTERN = /^\$\{[A-Z0-9_]+\}$/;
2
+ const SECRET_KEY_PATTERN = /(secret|token|api[_-]?key|password|passphrase|authorization|auth|bearer)/i;
3
+ const SECRET_VALUE_PATTERN = /^(sk-[A-Za-z0-9_-]{12,}|ghp_[A-Za-z0-9]{20,}|AIza[0-9A-Za-z_-]{20,}|eyJ[A-Za-z0-9_-]{10,})/;
4
+ const SECRET_TEMPLATE_PATTERN = /(^\$\{[A-Z0-9_]+\}$|^ghp_x+$|^x{3,}$|token[_-]?here|your[_-]?(token|api[_-]?key|secret)|replace[_-]?me|changeme|example|placeholder|dummy|sample|<[^>]*(token|api[_-]?key|secret)[^>]*>$)/i;
5
+ const SECRET_ARG_FLAG_PATTERN = /^--?(api[-_]?key|token|secret|password|passphrase|auth|authorization)$/i;
6
+ export function isPlaceholderValue(value) {
7
+ return PLACEHOLDER_PATTERN.test(value);
8
+ }
9
+ export function isSecretLikeKey(key) {
10
+ return SECRET_KEY_PATTERN.test(key);
11
+ }
12
+ export function isSecretLikeLiteral(value) {
13
+ if (!value || isPlaceholderValue(value))
14
+ return false;
15
+ if (value.length >= 24 && !value.includes(' '))
16
+ return true;
17
+ return SECRET_VALUE_PATTERN.test(value);
18
+ }
19
+ export function isLikelyTemplateSecretValue(value) {
20
+ if (!value)
21
+ return true;
22
+ return SECRET_TEMPLATE_PATTERN.test(value);
23
+ }
24
+ export function isSecretArgFlag(flag) {
25
+ return SECRET_ARG_FLAG_PATTERN.test(flag);
26
+ }
27
+ export function inferSecretArgs(args) {
28
+ const secretIndexes = [];
29
+ for (let i = 0; i < args.length - 1; i += 1) {
30
+ if (!SECRET_ARG_FLAG_PATTERN.test(args[i]))
31
+ continue;
32
+ const value = args[i + 1];
33
+ if (value.startsWith('-'))
34
+ continue;
35
+ if (isPlaceholderValue(value))
36
+ continue;
37
+ secretIndexes.push(i + 1);
38
+ }
39
+ return [...new Set(secretIndexes)].sort((a, b) => a - b);
40
+ }
41
+ export function inferSecretKeyValues(values) {
42
+ const out = {};
43
+ for (const [key, value] of Object.entries(values ?? {})) {
44
+ if (!isSecretLikeKey(key))
45
+ continue;
46
+ if (isPlaceholderValue(value))
47
+ continue;
48
+ out[key] = value;
49
+ }
50
+ return out;
51
+ }
52
+ export function splitServerSecrets(input) {
53
+ const publicServer = JSON.parse(JSON.stringify(input.server));
54
+ const localOverride = {};
55
+ const secretEnv = input.secretEnv ?? {};
56
+ const secretEnvKeys = new Set([...Object.keys(secretEnv), ...(input.secretEnvKeys ?? [])]);
57
+ if (secretEnvKeys.size > 0) {
58
+ publicServer.env = { ...(publicServer.env ?? {}) };
59
+ const localEnv = {};
60
+ for (const key of [...secretEnvKeys].sort((a, b) => a.localeCompare(b))) {
61
+ publicServer.env[key] = toPlaceholder(input.name, `env_${key}`, key);
62
+ if (Object.prototype.hasOwnProperty.call(secretEnv, key)) {
63
+ localEnv[key] = secretEnv[key];
64
+ }
65
+ }
66
+ if (Object.keys(localEnv).length > 0) {
67
+ localOverride.env = localEnv;
68
+ }
69
+ }
70
+ const secretHeaders = input.secretHeaders ?? {};
71
+ const secretHeaderKeys = new Set([...Object.keys(secretHeaders), ...(input.secretHeaderKeys ?? [])]);
72
+ if (secretHeaderKeys.size > 0) {
73
+ publicServer.headers = { ...(publicServer.headers ?? {}) };
74
+ const localHeaders = {};
75
+ for (const key of [...secretHeaderKeys].sort((a, b) => a.localeCompare(b))) {
76
+ publicServer.headers[key] = toPlaceholder(input.name, `header_${key}`);
77
+ if (Object.prototype.hasOwnProperty.call(secretHeaders, key)) {
78
+ localHeaders[key] = secretHeaders[key];
79
+ }
80
+ }
81
+ if (Object.keys(localHeaders).length > 0) {
82
+ localOverride.headers = localHeaders;
83
+ }
84
+ }
85
+ const secretArgValues = new Map();
86
+ for (const entry of input.secretArgs ?? []) {
87
+ secretArgValues.set(entry.index, entry.value);
88
+ }
89
+ const secretArgIndexes = new Set([
90
+ ...secretArgValues.keys(),
91
+ ...(input.secretArgIndexes ?? [])
92
+ ]);
93
+ if (secretArgIndexes.size > 0) {
94
+ if (!publicServer.args || publicServer.args.length === 0) {
95
+ throw new Error('Cannot apply secret args to a server without args.');
96
+ }
97
+ const secretIndexesSorted = [...secretArgIndexes].sort((a, b) => a - b);
98
+ const localArgs = [...publicServer.args];
99
+ let hasLocalArgValues = false;
100
+ for (const index of secretIndexesSorted) {
101
+ if (index < 0 || index >= publicServer.args.length) {
102
+ throw new Error(`Secret arg index ${String(index)} is out of bounds for server "${input.name}".`);
103
+ }
104
+ publicServer.args[index] = toPlaceholder(input.name, `arg_${String(index)}`);
105
+ localArgs[index] = publicServer.args[index];
106
+ if (secretArgValues.has(index)) {
107
+ localArgs[index] = secretArgValues.get(index);
108
+ hasLocalArgValues = true;
109
+ }
110
+ }
111
+ if (hasLocalArgValues) {
112
+ localOverride.args = localArgs;
113
+ }
114
+ }
115
+ return {
116
+ publicServer,
117
+ localOverride: cleanupEmptyOverride(localOverride)
118
+ };
119
+ }
120
+ function cleanupEmptyOverride(override) {
121
+ const out = { ...override };
122
+ if (out.env && Object.keys(out.env).length === 0)
123
+ delete out.env;
124
+ if (out.headers && Object.keys(out.headers).length === 0)
125
+ delete out.headers;
126
+ if (out.args && out.args.length === 0)
127
+ delete out.args;
128
+ return out;
129
+ }
130
+ function toPlaceholder(serverName, suffix, preferredName) {
131
+ if (preferredName && /^[A-Z_][A-Z0-9_]*$/.test(preferredName)) {
132
+ return `\${${preferredName}}`;
133
+ }
134
+ const variable = `MCP_${sanitizeToken(serverName)}_${sanitizeToken(suffix)}`;
135
+ return `\${${variable}}`;
136
+ }
137
+ function sanitizeToken(value) {
138
+ return value
139
+ .toUpperCase()
140
+ .replace(/[^A-Z0-9]+/g, '_')
141
+ .replace(/^_+|_+$/g, '')
142
+ .replace(/_+/g, '_');
143
+ }
144
+ //# sourceMappingURL=mcpSecrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpSecrets.js","sourceRoot":"","sources":["../../src/core/mcpSecrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AgentsConfig, IntegrationName, McpTransportType } from '../types.js';
2
+ export declare function validateServerName(name: string): void;
3
+ export declare function validateTransport(transport: string): McpTransportType;
4
+ export declare function parseKeyValue(input: string, label: string): {
5
+ key: string;
6
+ value: string;
7
+ };
8
+ export declare function validateEnvKey(key: string, context?: string): void;
9
+ export declare function validateHeaderKey(key: string, context?: string): void;
10
+ export declare function parseSecretArg(input: string): {
11
+ index: number;
12
+ value: string;
13
+ };
14
+ export declare function parseTargetOptions(values: string[] | undefined): IntegrationName[];
15
+ export declare function resolveDefaultTargets(config: AgentsConfig): {
16
+ targets: IntegrationName[];
17
+ warning?: string;
18
+ };
19
+ export declare function validateEnvValueForShell(key: string, value: string, context: string): void;
@@ -0,0 +1,78 @@
1
+ import { INTEGRATION_IDS, parseIntegrationList } from '../integrations/registry.js';
2
+ const SERVER_NAME_PATTERN = /^[a-zA-Z0-9_\-:.]+$/;
3
+ const TRANSPORTS = ['stdio', 'http', 'sse'];
4
+ const ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
5
+ const HEADER_KEY_PATTERN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
6
+ export function validateServerName(name) {
7
+ if (!name.trim()) {
8
+ throw new Error('MCP server name cannot be empty.');
9
+ }
10
+ if (!SERVER_NAME_PATTERN.test(name)) {
11
+ throw new Error(`Invalid server name "${name}": must contain only alphanumeric characters, hyphens, underscores, colons, and dots`);
12
+ }
13
+ if (name.includes('..')) {
14
+ throw new Error(`Invalid server name "${name}": cannot contain ".."`);
15
+ }
16
+ }
17
+ export function validateTransport(transport) {
18
+ if (!TRANSPORTS.includes(transport)) {
19
+ throw new Error(`Unsupported MCP transport "${transport}". Allowed: ${TRANSPORTS.join(', ')}`);
20
+ }
21
+ return transport;
22
+ }
23
+ export function parseKeyValue(input, label) {
24
+ const idx = input.indexOf('=');
25
+ if (idx <= 0) {
26
+ throw new Error(`Invalid ${label} "${input}". Expected KEY=VALUE.`);
27
+ }
28
+ const key = input.slice(0, idx).trim();
29
+ const value = input.slice(idx + 1);
30
+ if (!key) {
31
+ throw new Error(`Invalid ${label} "${input}". Key cannot be empty.`);
32
+ }
33
+ return { key, value };
34
+ }
35
+ export function validateEnvKey(key, context = 'environment variable') {
36
+ if (!ENV_KEY_PATTERN.test(key)) {
37
+ throw new Error(`Invalid ${context} key "${key}": must match ${ENV_KEY_PATTERN.toString()}`);
38
+ }
39
+ }
40
+ export function validateHeaderKey(key, context = 'header') {
41
+ if (!HEADER_KEY_PATTERN.test(key)) {
42
+ throw new Error(`Invalid ${context} key "${key}": must match ${HEADER_KEY_PATTERN.toString()}`);
43
+ }
44
+ }
45
+ export function parseSecretArg(input) {
46
+ const parsed = parseKeyValue(input, 'secret arg');
47
+ const index = Number.parseInt(parsed.key, 10);
48
+ if (!Number.isInteger(index) || index < 0) {
49
+ throw new Error(`Invalid secret arg "${input}". Index must be a non-negative integer.`);
50
+ }
51
+ return { index, value: parsed.value };
52
+ }
53
+ export function parseTargetOptions(values) {
54
+ const flattened = (values ?? [])
55
+ .flatMap((value) => value.split(','))
56
+ .map((value) => value.trim())
57
+ .filter(Boolean);
58
+ if (flattened.length === 0)
59
+ return [];
60
+ return parseIntegrationList(flattened.join(','));
61
+ }
62
+ export function resolveDefaultTargets(config) {
63
+ if (config.integrations.enabled.length > 0) {
64
+ return { targets: [...new Set(config.integrations.enabled)] };
65
+ }
66
+ return {
67
+ targets: [...INTEGRATION_IDS],
68
+ warning: 'No integrations are enabled; defaulting MCP targets to all integrations.'
69
+ };
70
+ }
71
+ export function validateEnvValueForShell(key, value, context) {
72
+ // Arguments are passed via spawnSync without a shell, so punctuation is safe.
73
+ // We only reject control bytes that can break transport/CLI parsing.
74
+ if (/[\x00-\x1F\x7F]/.test(value)) {
75
+ throw new Error(`Invalid ${context} value for "${key}": contains control characters`);
76
+ }
77
+ }
78
+ //# sourceMappingURL=mcpValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpValidation.js","sourceRoot":"","sources":["../../src/core/mcpValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface ProjectPaths {
2
+ root: string;
3
+ agentsDir: string;
4
+ agentsConfig: string;
5
+ agentsLocal: string;
6
+ rootAgentsMd: string;
7
+ agentsReadme: string;
8
+ agentsSkillsDir: string;
9
+ generatedDir: string;
10
+ generatedCodex: string;
11
+ generatedGemini: string;
12
+ generatedCopilot: string;
13
+ generatedCursor: string;
14
+ generatedAntigravity: string;
15
+ generatedClaude: string;
16
+ generatedClaudeState: string;
17
+ generatedCursorState: string;
18
+ generatedSkillsState: string;
19
+ generatedVscodeSettingsState: string;
20
+ generatedSyncLock: string;
21
+ codexConfig: string;
22
+ geminiSettings: string;
23
+ vscodeMcp: string;
24
+ vscodeSettings: string;
25
+ cursorMcp: string;
26
+ antigravityProjectMcp: string;
27
+ codexDir: string;
28
+ geminiDir: string;
29
+ vscodeDir: string;
30
+ cursorDir: string;
31
+ antigravityDir: string;
32
+ claudeDir: string;
33
+ geminiSkillsBridge: string;
34
+ claudeSkillsBridge: string;
35
+ cursorSkillsBridge: string;
36
+ }
37
+ export declare function getProjectPaths(projectRoot: string): ProjectPaths;
@@ -0,0 +1,43 @@
1
+ import path from 'node:path';
2
+ export function getProjectPaths(projectRoot) {
3
+ const root = path.resolve(projectRoot);
4
+ const agentsDir = path.join(root, '.agents');
5
+ const generatedDir = path.join(agentsDir, 'generated');
6
+ return {
7
+ root,
8
+ agentsDir,
9
+ agentsConfig: path.join(agentsDir, 'agents.json'),
10
+ agentsLocal: path.join(agentsDir, 'local.json'),
11
+ rootAgentsMd: path.join(root, 'AGENTS.md'),
12
+ agentsReadme: path.join(agentsDir, 'README.md'),
13
+ agentsSkillsDir: path.join(agentsDir, 'skills'),
14
+ generatedDir,
15
+ generatedCodex: path.join(generatedDir, 'codex.config.toml'),
16
+ generatedGemini: path.join(generatedDir, 'gemini.settings.json'),
17
+ generatedCopilot: path.join(generatedDir, 'copilot.vscode.mcp.json'),
18
+ generatedCursor: path.join(generatedDir, 'cursor.mcp.json'),
19
+ generatedAntigravity: path.join(generatedDir, 'antigravity.mcp.json'),
20
+ generatedClaude: path.join(generatedDir, 'claude.mcp.json'),
21
+ generatedClaudeState: path.join(generatedDir, 'claude.state.json'),
22
+ generatedCursorState: path.join(generatedDir, 'cursor.state.json'),
23
+ generatedSkillsState: path.join(generatedDir, 'skills.state.json'),
24
+ generatedVscodeSettingsState: path.join(generatedDir, 'vscode.settings.state.json'),
25
+ generatedSyncLock: path.join(generatedDir, 'sync.lock'),
26
+ codexConfig: path.join(root, '.codex', 'config.toml'),
27
+ geminiSettings: path.join(root, '.gemini', 'settings.json'),
28
+ vscodeMcp: path.join(root, '.vscode', 'mcp.json'),
29
+ vscodeSettings: path.join(root, '.vscode', 'settings.json'),
30
+ cursorMcp: path.join(root, '.cursor', 'mcp.json'),
31
+ antigravityProjectMcp: path.join(root, '.antigravity', 'mcp.json'),
32
+ codexDir: path.join(root, '.codex'),
33
+ geminiDir: path.join(root, '.gemini'),
34
+ vscodeDir: path.join(root, '.vscode'),
35
+ cursorDir: path.join(root, '.cursor'),
36
+ antigravityDir: path.join(root, '.antigravity'),
37
+ claudeDir: path.join(root, '.claude'),
38
+ geminiSkillsBridge: path.join(root, '.gemini', 'skills'),
39
+ claudeSkillsBridge: path.join(root, '.claude', 'skills'),
40
+ cursorSkillsBridge: path.join(root, '.cursor', 'skills')
41
+ };
42
+ }
43
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AgentsConfig, IntegrationName, SyncMode } from '../types.js';
2
+ export declare function initializeProjectSkeleton(args: {
3
+ projectRoot: string;
4
+ force: boolean;
5
+ integrations: IntegrationName[];
6
+ integrationOptions: AgentsConfig['integrations']['options'];
7
+ syncMode: SyncMode;
8
+ hideGeneratedInVscode: boolean;
9
+ }): Promise<{
10
+ changed: string[];
11
+ }>;
12
+ export declare function updateProjectState(args: {
13
+ projectRoot: string;
14
+ config: AgentsConfig;
15
+ }): Promise<void>;
16
+ export declare function projectInitialized(projectRoot: string): Promise<boolean>;
@@ -0,0 +1,34 @@
1
+ import path from 'node:path';
2
+ import { ensureDir, pathExists } from './fs.js';
3
+ import { createDefaultAgentsConfig, saveAgentsConfig } from './config.js';
4
+ import { getProjectPaths } from './paths.js';
5
+ import { scaffoldBaseTemplates } from './templates.js';
6
+ export async function initializeProjectSkeleton(args) {
7
+ const { projectRoot, force, integrations, integrationOptions, syncMode, hideGeneratedInVscode } = args;
8
+ const paths = getProjectPaths(projectRoot);
9
+ await ensureDir(paths.agentsDir);
10
+ await ensureDir(paths.generatedDir);
11
+ await ensureDir(paths.agentsSkillsDir);
12
+ const changed = [];
13
+ changed.push(...(await scaffoldBaseTemplates(projectRoot, force)));
14
+ const config = createDefaultAgentsConfig({
15
+ enabledIntegrations: integrations,
16
+ integrationOptions,
17
+ syncMode,
18
+ hideGenerated: hideGeneratedInVscode
19
+ });
20
+ if (force || !(await pathExists(paths.agentsConfig))) {
21
+ await saveAgentsConfig(projectRoot, config);
22
+ changed.push(path.relative(projectRoot, paths.agentsConfig) || paths.agentsConfig);
23
+ }
24
+ return { changed };
25
+ }
26
+ export async function updateProjectState(args) {
27
+ const { projectRoot, config } = args;
28
+ await saveAgentsConfig(projectRoot, config);
29
+ }
30
+ export async function projectInitialized(projectRoot) {
31
+ const paths = getProjectPaths(projectRoot);
32
+ return pathExists(paths.agentsConfig);
33
+ }
34
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAO/C;IACC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAA;IAEtG,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAChC,MAAM,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACnC,MAAM,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IAElE,MAAM,MAAM,GAAG,yBAAyB,CAAC;QACvC,mBAAmB,EAAE,YAAY;QACjC,kBAAkB;QAClB,QAAQ;QACR,aAAa,EAAE,qBAAqB;KACrC,CAAC,CAAA;IAEF,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IACpF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAA;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAGxC;IACC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACpC,MAAM,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAC1C,OAAO,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ResolvedMcpServer } from '../types.js';
2
+ export interface RenderResult {
3
+ content: string;
4
+ warnings: string[];
5
+ }
6
+ export declare function renderCodexToml(servers: ResolvedMcpServer[]): RenderResult;
7
+ export declare function renderGeminiServers(servers: ResolvedMcpServer[]): {
8
+ mcpServers: Record<string, unknown>;
9
+ warnings: string[];
10
+ };
11
+ export declare function renderVscodeMcp(servers: ResolvedMcpServer[]): {
12
+ servers: Record<string, unknown>;
13
+ warnings: string[];
14
+ };
@@ -0,0 +1,113 @@
1
+ function escapeToml(value) {
2
+ return value.replaceAll('\\', '\\\\').replaceAll('"', '\\"');
3
+ }
4
+ function quoteTomlKey(key) {
5
+ return `"${escapeToml(key)}"`;
6
+ }
7
+ export function renderCodexToml(servers) {
8
+ const warnings = [];
9
+ const lines = ['# Generated by agents sync. Do not edit manually.', ''];
10
+ for (const server of servers) {
11
+ lines.push(`[mcp_servers.${quoteTomlKey(server.name)}]`);
12
+ if (server.transport === 'stdio') {
13
+ if (!server.command) {
14
+ warnings.push(`Server "${server.name}" has no command; skipped in Codex output.`);
15
+ lines.pop();
16
+ continue;
17
+ }
18
+ lines.push(`command = "${escapeToml(server.command)}"`);
19
+ lines.push(`args = [${(server.args ?? []).map((arg) => `"${escapeToml(arg)}"`).join(', ')}]`);
20
+ }
21
+ else {
22
+ if (!server.url) {
23
+ warnings.push(`Server "${server.name}" has no url; skipped in Codex output.`);
24
+ lines.pop();
25
+ continue;
26
+ }
27
+ if (server.transport === 'sse') {
28
+ warnings.push(`Server "${server.name}" uses legacy sse transport; rendering as URL for Codex compatibility.`);
29
+ }
30
+ lines.push(`url = "${escapeToml(server.url)}"`);
31
+ }
32
+ lines.push('enabled = true');
33
+ lines.push('autoApprove = []');
34
+ lines.push('');
35
+ if (server.env && Object.keys(server.env).length > 0) {
36
+ lines.push(`[mcp_servers.${quoteTomlKey(server.name)}.env]`);
37
+ for (const key of Object.keys(server.env).sort()) {
38
+ lines.push(`${quoteTomlKey(key)} = "${escapeToml(server.env[key])}"`);
39
+ }
40
+ lines.push('');
41
+ }
42
+ if (server.headers && Object.keys(server.headers).length > 0) {
43
+ lines.push(`[mcp_servers.${quoteTomlKey(server.name)}.http_headers]`);
44
+ for (const key of Object.keys(server.headers).sort()) {
45
+ lines.push(`${quoteTomlKey(key)} = "${escapeToml(server.headers[key])}"`);
46
+ }
47
+ lines.push('');
48
+ }
49
+ }
50
+ return {
51
+ content: `${lines.join('\n')}\n`,
52
+ warnings
53
+ };
54
+ }
55
+ export function renderGeminiServers(servers) {
56
+ const warnings = [];
57
+ const out = {};
58
+ for (const server of servers) {
59
+ if (server.transport === 'stdio') {
60
+ if (!server.command) {
61
+ warnings.push(`Server "${server.name}" has no command; skipped in Gemini output.`);
62
+ continue;
63
+ }
64
+ out[server.name] = {
65
+ type: 'stdio',
66
+ command: server.command,
67
+ args: server.args ?? [],
68
+ ...(server.env ? { env: server.env } : {})
69
+ };
70
+ continue;
71
+ }
72
+ if (!server.url) {
73
+ warnings.push(`Server "${server.name}" has no url; skipped in Gemini output.`);
74
+ continue;
75
+ }
76
+ out[server.name] = {
77
+ type: server.transport,
78
+ url: server.url,
79
+ ...(server.headers ? { headers: server.headers } : {})
80
+ };
81
+ }
82
+ return { mcpServers: out, warnings };
83
+ }
84
+ export function renderVscodeMcp(servers) {
85
+ const warnings = [];
86
+ const out = {};
87
+ for (const server of servers) {
88
+ if (server.transport === 'stdio') {
89
+ if (!server.command) {
90
+ warnings.push(`Server "${server.name}" has no command; skipped in VS Code MCP output.`);
91
+ continue;
92
+ }
93
+ out[server.name] = {
94
+ type: 'stdio',
95
+ command: server.command,
96
+ args: server.args ?? [],
97
+ ...(server.env ? { env: server.env } : {})
98
+ };
99
+ continue;
100
+ }
101
+ if (!server.url) {
102
+ warnings.push(`Server "${server.name}" has no url; skipped in VS Code MCP output.`);
103
+ continue;
104
+ }
105
+ out[server.name] = {
106
+ type: server.transport,
107
+ url: server.url,
108
+ ...(server.headers ? { headers: server.headers } : {})
109
+ };
110
+ }
111
+ return { servers: out, warnings };
112
+ }
113
+ //# sourceMappingURL=renderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/core/renderers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface ShellResult {
2
+ ok: boolean;
3
+ code: number;
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ export declare function runCommand(cmd: string, args: string[], cwd: string, timeoutMs?: number): ShellResult;
8
+ export declare function commandExists(command: string): boolean;
@@ -0,0 +1,21 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ export function runCommand(cmd, args, cwd, timeoutMs) {
3
+ const result = spawnSync(cmd, args, {
4
+ cwd,
5
+ encoding: 'utf8',
6
+ ...(timeoutMs !== undefined ? { timeout: timeoutMs } : {})
7
+ });
8
+ const stderr = result.stderr ?? (result.error ? String(result.error.message ?? result.error) : '');
9
+ return {
10
+ ok: (result.status ?? 1) === 0,
11
+ code: result.status ?? 1,
12
+ stdout: result.stdout ?? '',
13
+ stderr
14
+ };
15
+ }
16
+ export function commandExists(command) {
17
+ const probe = process.platform === 'win32' ? 'where' : 'which';
18
+ const result = spawnSync(probe, [command], { stdio: 'ignore' });
19
+ return (result.status ?? 1) === 0;
20
+ }
21
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/core/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAS9C,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,SAAkB;IACrF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;QAClC,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAElG,OAAO;QACL,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function parseShellWords(input: string): string[];