@indy2kro/agentenv 0.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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/dist/adapters/base.d.ts +58 -0
  4. package/dist/adapters/base.d.ts.map +1 -0
  5. package/dist/adapters/base.js +16 -0
  6. package/dist/adapters/base.js.map +1 -0
  7. package/dist/adapters/claude.d.ts +21 -0
  8. package/dist/adapters/claude.d.ts.map +1 -0
  9. package/dist/adapters/claude.js +198 -0
  10. package/dist/adapters/claude.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +23 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +134 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/copilot.d.ts +21 -0
  16. package/dist/adapters/copilot.d.ts.map +1 -0
  17. package/dist/adapters/copilot.js +111 -0
  18. package/dist/adapters/copilot.js.map +1 -0
  19. package/dist/adapters/detect.d.ts +23 -0
  20. package/dist/adapters/detect.d.ts.map +1 -0
  21. package/dist/adapters/detect.js +80 -0
  22. package/dist/adapters/detect.js.map +1 -0
  23. package/dist/adapters/index.d.ts +12 -0
  24. package/dist/adapters/index.d.ts.map +1 -0
  25. package/dist/adapters/index.js +11 -0
  26. package/dist/adapters/index.js.map +1 -0
  27. package/dist/adapters/opencode.d.ts +19 -0
  28. package/dist/adapters/opencode.d.ts.map +1 -0
  29. package/dist/adapters/opencode.js +107 -0
  30. package/dist/adapters/opencode.js.map +1 -0
  31. package/dist/commands/apply.d.ts +21 -0
  32. package/dist/commands/apply.d.ts.map +1 -0
  33. package/dist/commands/apply.js +113 -0
  34. package/dist/commands/apply.js.map +1 -0
  35. package/dist/commands/configure.d.ts +13 -0
  36. package/dist/commands/configure.d.ts.map +1 -0
  37. package/dist/commands/configure.js +151 -0
  38. package/dist/commands/configure.js.map +1 -0
  39. package/dist/commands/setup.d.ts +11 -0
  40. package/dist/commands/setup.d.ts.map +1 -0
  41. package/dist/commands/setup.js +78 -0
  42. package/dist/commands/setup.js.map +1 -0
  43. package/dist/commands/status.d.ts +3 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +152 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/config/schema.d.ts +142 -0
  48. package/dist/config/schema.d.ts.map +1 -0
  49. package/dist/config/schema.js +778 -0
  50. package/dist/config/schema.js.map +1 -0
  51. package/dist/config/scopes.d.ts +14 -0
  52. package/dist/config/scopes.d.ts.map +1 -0
  53. package/dist/config/scopes.js +32 -0
  54. package/dist/config/scopes.js.map +1 -0
  55. package/dist/generate/agentsmd.d.ts +44 -0
  56. package/dist/generate/agentsmd.d.ts.map +1 -0
  57. package/dist/generate/agentsmd.js +340 -0
  58. package/dist/generate/agentsmd.js.map +1 -0
  59. package/dist/index.d.ts +7 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +24 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/integrations/base.d.ts +33 -0
  64. package/dist/integrations/base.d.ts.map +1 -0
  65. package/dist/integrations/base.js +9 -0
  66. package/dist/integrations/base.js.map +1 -0
  67. package/dist/integrations/index.d.ts +7 -0
  68. package/dist/integrations/index.d.ts.map +1 -0
  69. package/dist/integrations/index.js +5 -0
  70. package/dist/integrations/index.js.map +1 -0
  71. package/dist/integrations/superpowers.d.ts +48 -0
  72. package/dist/integrations/superpowers.d.ts.map +1 -0
  73. package/dist/integrations/superpowers.js +191 -0
  74. package/dist/integrations/superpowers.js.map +1 -0
  75. package/dist/shell/detector.d.ts +92 -0
  76. package/dist/shell/detector.d.ts.map +1 -0
  77. package/dist/shell/detector.js +714 -0
  78. package/dist/shell/detector.js.map +1 -0
  79. package/dist/toolchain/fallbacks.d.ts +77 -0
  80. package/dist/toolchain/fallbacks.d.ts.map +1 -0
  81. package/dist/toolchain/fallbacks.js +238 -0
  82. package/dist/toolchain/fallbacks.js.map +1 -0
  83. package/dist/toolchain/gh.d.ts +20 -0
  84. package/dist/toolchain/gh.d.ts.map +1 -0
  85. package/dist/toolchain/gh.js +36 -0
  86. package/dist/toolchain/gh.js.map +1 -0
  87. package/dist/toolchain/mise.d.ts +92 -0
  88. package/dist/toolchain/mise.d.ts.map +1 -0
  89. package/dist/toolchain/mise.js +346 -0
  90. package/dist/toolchain/mise.js.map +1 -0
  91. package/dist/toolchain/rtk.d.ts +27 -0
  92. package/dist/toolchain/rtk.d.ts.map +1 -0
  93. package/dist/toolchain/rtk.js +76 -0
  94. package/dist/toolchain/rtk.js.map +1 -0
  95. package/dist/wizard/build.d.ts +24 -0
  96. package/dist/wizard/build.d.ts.map +1 -0
  97. package/dist/wizard/build.js +64 -0
  98. package/dist/wizard/build.js.map +1 -0
  99. package/package.json +80 -0
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Mise Toolchain Integration
3
+ * Handles mise.toml generation and mise commands
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as child_process from 'child_process';
8
+ import { TOOL_TIERS } from '../config/schema.js';
9
+ import { FALLBACK_REQUIRED_TOOLS, requiresFallback } from './fallbacks.js';
10
+ // Tool to mise name mappings
11
+ export const MISE_TOOL_NAMES = {
12
+ ripgrep: 'ripgrep',
13
+ fd: 'fd',
14
+ jq: 'jq',
15
+ rtk: 'rtk',
16
+ ast_grep: 'ast-grep',
17
+ git_delta: 'delta',
18
+ universal_ctags: 'universal-ctags',
19
+ gh: 'gh',
20
+ difftastic: 'difftastic',
21
+ yq: 'yq',
22
+ bat: 'bat',
23
+ eza: 'eza',
24
+ miller: 'miller',
25
+ tokei: 'tokei',
26
+ hyperfine: 'hyperfine',
27
+ fzf: 'fzf',
28
+ just: 'just',
29
+ watchexec: 'watchexec',
30
+ direnv: 'direnv',
31
+ };
32
+ // Tools that cannot be installed via mise and require fallback
33
+ // Based on Phase 0 findings: universal-ctags and tokei are not in mise registry
34
+ export { FALLBACK_REQUIRED_TOOLS, requiresFallback };
35
+ /**
36
+ * Tools agentenv invokes directly are pinned to versions we have verified;
37
+ * everything else resolves to latest. rtk is invoked by agentenv's delegation
38
+ * (its `init` flags are the hook contract), moves fast, and must stay pinned —
39
+ * bump deliberately per plan §10.
40
+ */
41
+ export const PINNED_TOOL_VERSIONS = {
42
+ rtk: '0.49.0',
43
+ };
44
+ /**
45
+ * Generate mise.toml content from agentenv config
46
+ */
47
+ export function generateMiseToml(config, customTools = []) {
48
+ const lines = [];
49
+ lines.push('# mise.toml - Generated by agentenv');
50
+ lines.push('# Do not edit directly; edit agentenv.toml instead');
51
+ lines.push('');
52
+ // Tools section
53
+ lines.push('[tools]');
54
+ const tools = config.tools || {};
55
+ const toolKeys = Object.keys(tools);
56
+ // Process tools by tier
57
+ const tier1Tools = toolKeys.filter((key) => TOOL_TIERS[key] === 1 && tools[key]);
58
+ const tier2Tools = toolKeys.filter((key) => TOOL_TIERS[key] === 2 && tools[key]);
59
+ const tier3Tools = toolKeys.filter((key) => TOOL_TIERS[key] === 3 && tools[key]);
60
+ // Add enabled tools
61
+ const allEnabledTools = [...tier1Tools, ...tier2Tools, ...tier3Tools];
62
+ for (const toolKey of allEnabledTools) {
63
+ // Skip tools that require fallback installation (not in mise registry)
64
+ if (requiresFallback(toolKey)) {
65
+ continue;
66
+ }
67
+ const miseName = MISE_TOOL_NAMES[toolKey] || toolKey;
68
+ const version = PINNED_TOOL_VERSIONS[miseName] || 'latest';
69
+ lines.push(`${miseName} = "${version}"`);
70
+ }
71
+ // Add custom tools with mise_source
72
+ for (const ct of customTools) {
73
+ if (ct.mise_source) {
74
+ const version = ct.version || 'latest';
75
+ lines.push(`\n# Custom tool: ${ct.name}`);
76
+ lines.push(`${ct.mise_source} = "${version}"`);
77
+ }
78
+ }
79
+ lines.push('');
80
+ // Env section for agentenv-specific variables
81
+ lines.push('[env]');
82
+ lines.push('AGENTENV_MANAGED = "true"');
83
+ lines.push('');
84
+ return lines.join('\n');
85
+ }
86
+ /**
87
+ * Save mise.toml to a file
88
+ */
89
+ export function saveMiseToml(content, outputPath) {
90
+ try {
91
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
92
+ fs.writeFileSync(outputPath, content);
93
+ }
94
+ catch (err) {
95
+ throw new Error(`Failed to save mise.toml: ${err}`, { cause: err });
96
+ }
97
+ }
98
+ /**
99
+ * Get list of tools to install from config
100
+ */
101
+ export function getToolsToInstall(config) {
102
+ const tools = config.tools || {};
103
+ const toolKeys = Object.keys(tools);
104
+ const result = [];
105
+ for (const key of toolKeys) {
106
+ if (tools[key]) {
107
+ // Skip tools that require fallback installation (not in mise registry)
108
+ if (requiresFallback(key)) {
109
+ continue;
110
+ }
111
+ const miseName = MISE_TOOL_NAMES[key] || key;
112
+ result.push({
113
+ name: key,
114
+ miseName,
115
+ version: PINNED_TOOL_VERSIONS[miseName] || 'latest',
116
+ tier: TOOL_TIERS[key] || 3,
117
+ });
118
+ }
119
+ }
120
+ return result;
121
+ }
122
+ /**
123
+ * Check if mise is installed
124
+ */
125
+ export function isMiseInstalled() {
126
+ try {
127
+ child_process.execSync('mise --version', { stdio: 'ignore' });
128
+ return true;
129
+ }
130
+ catch {
131
+ return false;
132
+ }
133
+ }
134
+ /**
135
+ * Get mise version
136
+ */
137
+ export function getMiseVersion() {
138
+ try {
139
+ const output = child_process.execSync('mise --version', { encoding: 'utf-8' });
140
+ return output.trim();
141
+ }
142
+ catch {
143
+ return 'unknown';
144
+ }
145
+ }
146
+ /**
147
+ * Check if a specific tool is installed via mise
148
+ */
149
+ export function isToolInstalled(toolName) {
150
+ try {
151
+ child_process.execSync(`mise which ${toolName}`, { stdio: 'ignore' });
152
+ return true;
153
+ }
154
+ catch {
155
+ return false;
156
+ }
157
+ }
158
+ /**
159
+ * Install mise itself
160
+ * This should be done by the user before running agentenv
161
+ */
162
+ export function ensureMiseInstalled() {
163
+ if (isMiseInstalled()) {
164
+ return {
165
+ success: true,
166
+ message: 'mise is already installed',
167
+ };
168
+ }
169
+ return {
170
+ success: false,
171
+ message: 'mise is not installed. Please install it first: https://mise.jdx.dev',
172
+ };
173
+ }
174
+ /**
175
+ * Run mise install
176
+ * Installs all tools listed in mise.toml
177
+ */
178
+ export async function runMiseInstall(miseTomlPath, cwd = '.') {
179
+ try {
180
+ const result = child_process.spawnSync('mise', ['install'], {
181
+ cwd,
182
+ encoding: 'utf-8',
183
+ stdio: 'pipe',
184
+ env: {
185
+ ...process.env,
186
+ // Ensure mise uses the correct config file
187
+ MISE_CONFIG_FILE: miseTomlPath,
188
+ },
189
+ });
190
+ return {
191
+ success: result.status === 0,
192
+ stdout: result.stdout || '',
193
+ stderr: result.stderr || '',
194
+ exitCode: result.status ?? null,
195
+ };
196
+ }
197
+ catch (err) {
198
+ return {
199
+ success: false,
200
+ stdout: '',
201
+ stderr: err instanceof Error ? err.message : String(err),
202
+ exitCode: null,
203
+ };
204
+ }
205
+ }
206
+ /**
207
+ * Get installed tool versions via mise
208
+ */
209
+ export function getInstalledVersions() {
210
+ const versions = {};
211
+ try {
212
+ const output = child_process.execSync('mise ls --json', {
213
+ encoding: 'utf-8',
214
+ stdio: 'pipe',
215
+ });
216
+ const tools = JSON.parse(output);
217
+ for (const tool of tools) {
218
+ versions[tool.name] = tool.version;
219
+ }
220
+ }
221
+ catch {
222
+ // Ignore errors (mise might not be installed or might not support --json)
223
+ }
224
+ return versions;
225
+ }
226
+ /**
227
+ * Parse existing mise.toml file
228
+ */
229
+ export function parseMiseToml(filePath) {
230
+ try {
231
+ if (!fs.existsSync(filePath)) {
232
+ return null;
233
+ }
234
+ const content = fs.readFileSync(filePath, 'utf-8');
235
+ return parseToml(content);
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
241
+ /**
242
+ * Simple TOML parser helper
243
+ */
244
+ function parseToml(content) {
245
+ const result = {};
246
+ let currentTable = result;
247
+ const lines = content.split('\n');
248
+ for (const line of lines) {
249
+ const trimmed = line.trim();
250
+ // Skip comments and empty lines
251
+ if (trimmed === '' || trimmed.startsWith('#')) {
252
+ continue;
253
+ }
254
+ // Section header
255
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
256
+ const section = trimmed.slice(1, -1);
257
+ if (section.includes('.')) {
258
+ // Nested section
259
+ const parts = section.split('.');
260
+ let parent = result;
261
+ for (let i = 0; i < parts.length - 1; i++) {
262
+ if (!parent[parts[i]]) {
263
+ parent[parts[i]] = {};
264
+ }
265
+ parent = parent[parts[i]];
266
+ }
267
+ currentTable = parent;
268
+ }
269
+ else {
270
+ if (!result[section]) {
271
+ result[section] = {};
272
+ }
273
+ currentTable = result[section];
274
+ }
275
+ continue;
276
+ }
277
+ // Key-value pair
278
+ const equalsIndex = trimmed.indexOf('=');
279
+ if (equalsIndex > 0) {
280
+ const key = trimmed.slice(0, equalsIndex).trim();
281
+ const value = trimmed.slice(equalsIndex + 1).trim();
282
+ // Remove quotes if present
283
+ let cleanValue = value;
284
+ if ((value.startsWith('"') && value.endsWith('"')) ||
285
+ (value.startsWith("'") && value.endsWith("'"))) {
286
+ cleanValue = value.slice(1, -1);
287
+ }
288
+ // Parse boolean
289
+ if (cleanValue.toLowerCase() === 'true') {
290
+ cleanValue = true;
291
+ }
292
+ else if (cleanValue.toLowerCase() === 'false') {
293
+ cleanValue = false;
294
+ }
295
+ // Parse number
296
+ if (!isNaN(Number(cleanValue))) {
297
+ cleanValue = Number(cleanValue);
298
+ }
299
+ currentTable[key] = cleanValue;
300
+ }
301
+ }
302
+ return result;
303
+ }
304
+ /**
305
+ * Merge existing mise.toml with new tools
306
+ * Preserves existing tools that are not in the new config
307
+ */
308
+ export function mergeMiseConfigs(existing, newConfig) {
309
+ const result = {
310
+ tools: { ...newConfig.tools },
311
+ env: { ...newConfig.env },
312
+ settings: { ...newConfig.settings },
313
+ };
314
+ if (existing) {
315
+ // Merge tools - preserve existing versions if not in new config
316
+ for (const [tool, version] of Object.entries(existing.tools || {})) {
317
+ if (!result.tools[tool]) {
318
+ result.tools[tool] = version;
319
+ }
320
+ }
321
+ // Merge env
322
+ if (existing.env) {
323
+ for (const [key, value] of Object.entries(existing.env)) {
324
+ if (!result.env || !result.env[key]) {
325
+ if (!result.env) {
326
+ result.env = {};
327
+ }
328
+ result.env[key] = value;
329
+ }
330
+ }
331
+ }
332
+ // Merge settings
333
+ if (existing.settings) {
334
+ for (const [key, value] of Object.entries(existing.settings)) {
335
+ if (!result.settings || result.settings[key] === undefined) {
336
+ if (!result.settings) {
337
+ result.settings = {};
338
+ }
339
+ result.settings[key] = value;
340
+ }
341
+ }
342
+ }
343
+ }
344
+ return result;
345
+ }
346
+ //# sourceMappingURL=mise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mise.js","sourceRoot":"","sources":["../../src/toolchain/mise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * RTK Toolchain Integration
3
+ * Delegate per-agent hook wiring to `rtk init <flags>` instead of
4
+ * re-implementing hook formats by hand (see docs/research/rtk-init-delegation.md).
5
+ */
6
+ export interface RtkInitResult {
7
+ success: boolean;
8
+ message: string;
9
+ stdout: string;
10
+ stderr: string;
11
+ }
12
+ /**
13
+ * Runs `rtk init` with the given args in the given cwd. Injectable so tests
14
+ * can stub it (CI has no rtk on PATH).
15
+ */
16
+ export type RtkInitFn = (args: string[], cwd: string) => RtkInitResult;
17
+ /** rtk init args per agent, verified against rtk 0.42.4 and 0.49.0. */
18
+ export declare const RTK_INIT_FLAGS: Record<string, string[]>;
19
+ /** Resolve the rtk init function to use, defaulting to the real one. */
20
+ export declare function resolveRtkInit(rtkInit?: RtkInitFn): RtkInitFn;
21
+ /**
22
+ * Surfaces what rtk actually rewrote as part of the per-agent message, so its
23
+ * work isn't silently invisible (Phase 4 transparency log).
24
+ * Also notes the side effect of creating ~/.local/share/rtk/history.db
25
+ */
26
+ export declare function rtkMessage(run: RtkInitResult): string;
27
+ //# sourceMappingURL=rtk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtk.d.ts","sourceRoot":"","sources":["../../src/toolchain/rtk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,aAAa,CAAC;AAEvE,uEAAuE;AACvE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAInD,CAAC;AAgDF,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAYrD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * RTK Toolchain Integration
3
+ * Delegate per-agent hook wiring to `rtk init <flags>` instead of
4
+ * re-implementing hook formats by hand (see docs/research/rtk-init-delegation.md).
5
+ */
6
+ import * as child_process from 'child_process';
7
+ import { resolveBinary } from '../adapters/detect.js';
8
+ /** rtk init args per agent, verified against rtk 0.42.4 and 0.49.0. */
9
+ export const RTK_INIT_FLAGS = {
10
+ codex_cli: ['--codex'],
11
+ copilot: ['--copilot'],
12
+ opencode: ['-g', '--opencode'],
13
+ };
14
+ const defaultRtkInit = (args, cwd) => {
15
+ // Testing escape hatch: point at a stub `rtk` program (run via node) that
16
+ // writes the files a real `rtk init` would, so the full CLI pipeline can be
17
+ // exercised in CI without installing rtk.
18
+ const stub = process.env.AGENTENV_RTK_BIN;
19
+ const rtkPath = stub ? process.execPath : resolveBinary('rtk');
20
+ if (!stub && !rtkPath) {
21
+ return {
22
+ success: false,
23
+ message: 'rtk binary not found on PATH — is rtk in mise.toml (Tier 1) and did `mise install` run?',
24
+ stdout: '',
25
+ stderr: '',
26
+ };
27
+ }
28
+ const cmd = stub ? process.execPath : rtkPath;
29
+ const cmdArgs = stub ? [stub, 'init', ...args] : ['init', ...args];
30
+ try {
31
+ const result = child_process.spawnSync(cmd, cmdArgs, {
32
+ cwd,
33
+ encoding: 'utf-8',
34
+ stdio: 'pipe',
35
+ });
36
+ const ok = result.status === 0;
37
+ return {
38
+ success: ok,
39
+ message: ok
40
+ ? `rtk init ${args.join(' ')} succeeded`
41
+ : `rtk init ${args.join(' ')} failed (exit ${result.status ?? 'null'})`,
42
+ stdout: result.stdout || '',
43
+ stderr: result.stderr || '',
44
+ };
45
+ }
46
+ catch (err) {
47
+ return {
48
+ success: false,
49
+ message: `rtk init ${args.join(' ')} errored: ${err instanceof Error ? err.message : String(err)}`,
50
+ stdout: '',
51
+ stderr: '',
52
+ };
53
+ }
54
+ };
55
+ /** Resolve the rtk init function to use, defaulting to the real one. */
56
+ export function resolveRtkInit(rtkInit) {
57
+ return rtkInit ?? defaultRtkInit;
58
+ }
59
+ /**
60
+ * Surfaces what rtk actually rewrote as part of the per-agent message, so its
61
+ * work isn't silently invisible (Phase 4 transparency log).
62
+ * Also notes the side effect of creating ~/.local/share/rtk/history.db
63
+ */
64
+ export function rtkMessage(run) {
65
+ const rewrote = run.stdout.replace(/\s+/g, ' ').trim();
66
+ if (!rewrote)
67
+ return run.message;
68
+ const summary = rewrote.length > 400 ? rewrote.slice(0, 400).trimEnd() + '...' : rewrote;
69
+ // Add transparency note about rtk history database creation
70
+ // As documented in docs/research/rtk-init-delegation.md and phase0-linux-verification.md
71
+ const message = `${run.message}: ${summary}`;
72
+ // Note: rtk init always creates ~/.local/share/rtk/history.db (command history database)
73
+ // This is a side effect that users should be aware of
74
+ return message;
75
+ }
76
+ //# sourceMappingURL=rtk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtk.js","sourceRoot":"","sources":["../../src/toolchain/rtk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Wizard helpers: pure config assembly + diff presentation.
3
+ * Kept free of inquirer/CLI so the logic is unit-testable.
4
+ */
5
+ import type { AgentKey, AgentenvConfig, ConfigDiffEntry, CustomTool } from '../config/schema.js';
6
+ export declare const AGENT_OPTIONS: Array<{
7
+ value: AgentKey;
8
+ label: string;
9
+ }>;
10
+ export declare const TIER_1_TOOLS: readonly ["ripgrep", "fd", "jq", "rtk"];
11
+ export declare const TIER_2_TOOLS: readonly ["ast_grep", "git_delta", "gh", "difftastic"];
12
+ export declare function simpleToolSelection(includeTier2: boolean): string[];
13
+ export interface WizardSelections {
14
+ agents: AgentKey[];
15
+ tools: string[];
16
+ customTools: CustomTool[];
17
+ scope: 'project' | 'user';
18
+ rtkEnabled: boolean;
19
+ }
20
+ /** Assemble a full AgentenvConfig from picker selections. */
21
+ export declare function buildConfigFromSelections(sel: WizardSelections): AgentenvConfig;
22
+ /** Render a ConfigDiffEntry[] as human-readable review lines. */
23
+ export declare function formatDiffLines(diff: ConfigDiffEntry[]): string[];
24
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/wizard/build.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjG,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKnE,CAAC;AAEF,eAAO,MAAM,YAAY,yCAA0C,CAAC;AACpE,eAAO,MAAM,YAAY,wDAAyD,CAAC;AAEnF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,EAAE,CAEnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,6DAA6D;AAC7D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,cAAc,CA4B/E;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CASjE"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Wizard helpers: pure config assembly + diff presentation.
3
+ * Kept free of inquirer/CLI so the logic is unit-testable.
4
+ */
5
+ import { TOOL_KEYS } from '../config/schema.js';
6
+ export const AGENT_OPTIONS = [
7
+ { value: 'claude_code', label: 'Claude Code' },
8
+ { value: 'codex_cli', label: 'Codex CLI' },
9
+ { value: 'copilot', label: 'GitHub Copilot' },
10
+ { value: 'opencode', label: 'OpenCode' },
11
+ ];
12
+ export const TIER_1_TOOLS = ['ripgrep', 'fd', 'jq', 'rtk'];
13
+ export const TIER_2_TOOLS = ['ast_grep', 'git_delta', 'gh', 'difftastic'];
14
+ export function simpleToolSelection(includeTier2) {
15
+ return includeTier2 ? [...TIER_1_TOOLS, ...TIER_2_TOOLS] : [...TIER_1_TOOLS];
16
+ }
17
+ /** Assemble a full AgentenvConfig from picker selections. */
18
+ export function buildConfigFromSelections(sel) {
19
+ const agents = {
20
+ claude_code: false,
21
+ codex_cli: false,
22
+ copilot: false,
23
+ opencode: false,
24
+ };
25
+ for (const agent of sel.agents)
26
+ agents[agent] = true;
27
+ const tools = {};
28
+ for (const key of TOOL_KEYS)
29
+ tools[key] = sel.tools.includes(key);
30
+ return {
31
+ scope: sel.scope,
32
+ agents,
33
+ tools,
34
+ custom_tools: sel.customTools.length > 0 ? sel.customTools : undefined,
35
+ rtk: {
36
+ enabled: sel.rtkEnabled,
37
+ init: { claude_code: true, codex_cli: true, copilot: true, opencode: true },
38
+ },
39
+ tier0: { check_enabled: true },
40
+ generate: {
41
+ marker_start: '<!-- agentenv-managed-start -->',
42
+ marker_end: '<!-- agentenv-managed-end -->',
43
+ files: ['AGENTS.md', 'CLAUDE.md'],
44
+ },
45
+ };
46
+ }
47
+ /** Render a ConfigDiffEntry[] as human-readable review lines. */
48
+ export function formatDiffLines(diff) {
49
+ return diff.map((entry) => {
50
+ const action = entry.kind === 'added' ? 'add' : entry.kind === 'removed' ? 'remove' : 'change';
51
+ const detail = entry.kind === 'changed'
52
+ ? `: ${formatValue(entry.oldValue)} -> ${formatValue(entry.newValue)}`
53
+ : '';
54
+ return `${action.padEnd(7)} ${entry.key}${detail}`;
55
+ });
56
+ }
57
+ function formatValue(value) {
58
+ if (value === undefined)
59
+ return 'unset';
60
+ if (typeof value === 'boolean' || typeof value === 'string')
61
+ return String(value);
62
+ return JSON.stringify(value);
63
+ }
64
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/wizard/build.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@indy2kro/agentenv",
3
+ "version": "0.1.0",
4
+ "description": "CLI for configuring a consistent, capable shell environment for AI coding agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "agentenv": "./dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "!dist/**/*.test.*",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/indy2kro/agentenv.git"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "prepublishOnly": "npm run build",
27
+ "start": "ts-node src/index.ts",
28
+ "dev": "ts-node-dev src/index.ts",
29
+ "test": "npm run build && node dist/config/schema.test.js && node dist/config/scopes.test.js && node dist/generate/agentsmd.test.js && node dist/adapters/claude.test.js && node dist/adapters/adapters.test.js && node dist/adapters/detect.test.js && node dist/shell/detector.test.js && node dist/toolchain/mise.test.js && node dist/toolchain/gh.test.js && node dist/integrations/superpowers.test.js && node dist/toolchain/fallbacks.test.js && node dist/wizard/build.test.js && node dist/commands/apply.test.js",
30
+ "smoke": "npm run build && node scripts/smoke.mjs",
31
+ "smoke:real": "npm run build && node scripts/smoke.mjs --real",
32
+ "lint": "eslint src --max-warnings 0",
33
+ "lint:fix": "eslint src --fix",
34
+ "format": "prettier --write src",
35
+ "format:check": "prettier --check src",
36
+ "prepare": "cd ../.. && husky"
37
+ },
38
+ "keywords": [
39
+ "ai",
40
+ "coding",
41
+ "agents",
42
+ "claude",
43
+ "copilot",
44
+ "codex",
45
+ "opencode",
46
+ "environment",
47
+ "mise",
48
+ "rtk"
49
+ ],
50
+ "author": "Cristian Radu <indy2kro@gmail.com>",
51
+ "license": "MIT",
52
+ "dependencies": {
53
+ "@inquirer/prompts": "^8.7.2",
54
+ "commander": "^15.0.0",
55
+ "toml": "^5.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "@eslint/js": "^10.0.1",
59
+ "@types/node": "^20.0.0",
60
+ "eslint": "^10.10.0",
61
+ "eslint-config-prettier": "^10.1.8",
62
+ "globals": "^17.12.0",
63
+ "husky": "^9.1.7",
64
+ "lint-staged": "^17.5.1",
65
+ "prettier": "^3.9.6",
66
+ "ts-node": "^10.9.0",
67
+ "ts-node-dev": "^2.0.0",
68
+ "typescript": "^5.0.0",
69
+ "typescript-eslint": "^8.70.0"
70
+ },
71
+ "engines": {
72
+ "node": ">=22.13.0"
73
+ },
74
+ "lint-staged": {
75
+ "*.ts": [
76
+ "eslint --fix --max-warnings 0",
77
+ "prettier --write"
78
+ ]
79
+ }
80
+ }