@antomanc/aginit 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 (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +245 -0
  3. package/THIRD_PARTY_NOTICES.md +36 -0
  4. package/bin/aginit.js +8 -0
  5. package/dist/adapters/agents-md.d.ts +8 -0
  6. package/dist/adapters/agents-md.d.ts.map +1 -0
  7. package/dist/adapters/agents-md.js +121 -0
  8. package/dist/adapters/agents-md.js.map +1 -0
  9. package/dist/adapters/browser.d.ts +5 -0
  10. package/dist/adapters/browser.d.ts.map +1 -0
  11. package/dist/adapters/browser.js +42 -0
  12. package/dist/adapters/browser.js.map +1 -0
  13. package/dist/adapters/git.d.ts +5 -0
  14. package/dist/adapters/git.d.ts.map +1 -0
  15. package/dist/adapters/git.js +90 -0
  16. package/dist/adapters/git.js.map +1 -0
  17. package/dist/adapters/graft.d.ts +14 -0
  18. package/dist/adapters/graft.d.ts.map +1 -0
  19. package/dist/adapters/graft.js +56 -0
  20. package/dist/adapters/graft.js.map +1 -0
  21. package/dist/adapters/package-manager.d.ts +20 -0
  22. package/dist/adapters/package-manager.d.ts.map +1 -0
  23. package/dist/adapters/package-manager.js +89 -0
  24. package/dist/adapters/package-manager.js.map +1 -0
  25. package/dist/adapters/skills.d.ts +29 -0
  26. package/dist/adapters/skills.d.ts.map +1 -0
  27. package/dist/adapters/skills.js +80 -0
  28. package/dist/adapters/skills.js.map +1 -0
  29. package/dist/cli/doctor.d.ts +2 -0
  30. package/dist/cli/doctor.d.ts.map +1 -0
  31. package/dist/cli/doctor.js +212 -0
  32. package/dist/cli/doctor.js.map +1 -0
  33. package/dist/cli/init.d.ts +3 -0
  34. package/dist/cli/init.d.ts.map +1 -0
  35. package/dist/cli/init.js +32 -0
  36. package/dist/cli/init.js.map +1 -0
  37. package/dist/cli/main.d.ts +3 -0
  38. package/dist/cli/main.d.ts.map +1 -0
  39. package/dist/cli/main.js +162 -0
  40. package/dist/cli/main.js.map +1 -0
  41. package/dist/cli/new.d.ts +15 -0
  42. package/dist/cli/new.d.ts.map +1 -0
  43. package/dist/cli/new.js +161 -0
  44. package/dist/cli/new.js.map +1 -0
  45. package/dist/cli/wizard.d.ts +31 -0
  46. package/dist/cli/wizard.d.ts.map +1 -0
  47. package/dist/cli/wizard.js +260 -0
  48. package/dist/cli/wizard.js.map +1 -0
  49. package/dist/config/defaults.d.ts +8 -0
  50. package/dist/config/defaults.d.ts.map +1 -0
  51. package/dist/config/defaults.js +122 -0
  52. package/dist/config/defaults.js.map +1 -0
  53. package/dist/config/schema.d.ts +40 -0
  54. package/dist/config/schema.d.ts.map +1 -0
  55. package/dist/config/schema.js +4 -0
  56. package/dist/config/schema.js.map +1 -0
  57. package/dist/config/validation.d.ts +11 -0
  58. package/dist/config/validation.d.ts.map +1 -0
  59. package/dist/config/validation.js +99 -0
  60. package/dist/config/validation.js.map +1 -0
  61. package/dist/index.d.ts +16 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +16 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/presets/adr.d.ts +5 -0
  66. package/dist/presets/adr.d.ts.map +1 -0
  67. package/dist/presets/adr.js +33 -0
  68. package/dist/presets/adr.js.map +1 -0
  69. package/dist/presets/cli.d.ts +3 -0
  70. package/dist/presets/cli.d.ts.map +1 -0
  71. package/dist/presets/cli.js +126 -0
  72. package/dist/presets/cli.js.map +1 -0
  73. package/dist/presets/generic.d.ts +3 -0
  74. package/dist/presets/generic.d.ts.map +1 -0
  75. package/dist/presets/generic.js +29 -0
  76. package/dist/presets/generic.js.map +1 -0
  77. package/dist/presets/registry.d.ts +6 -0
  78. package/dist/presets/registry.d.ts.map +1 -0
  79. package/dist/presets/registry.js +20 -0
  80. package/dist/presets/registry.js.map +1 -0
  81. package/dist/presets/testing.d.ts +6 -0
  82. package/dist/presets/testing.d.ts.map +1 -0
  83. package/dist/presets/testing.js +46 -0
  84. package/dist/presets/testing.js.map +1 -0
  85. package/dist/presets/types.d.ts +14 -0
  86. package/dist/presets/types.d.ts.map +1 -0
  87. package/dist/presets/types.js +2 -0
  88. package/dist/presets/types.js.map +1 -0
  89. package/dist/presets/web.d.ts +3 -0
  90. package/dist/presets/web.d.ts.map +1 -0
  91. package/dist/presets/web.js +84 -0
  92. package/dist/presets/web.js.map +1 -0
  93. package/dist/utils/fs.d.ts +13 -0
  94. package/dist/utils/fs.d.ts.map +1 -0
  95. package/dist/utils/fs.js +60 -0
  96. package/dist/utils/fs.js.map +1 -0
  97. package/dist/utils/logger.d.ts +10 -0
  98. package/dist/utils/logger.d.ts.map +1 -0
  99. package/dist/utils/logger.js +20 -0
  100. package/dist/utils/logger.js.map +1 -0
  101. package/dist/utils/shell.d.ts +17 -0
  102. package/dist/utils/shell.d.ts.map +1 -0
  103. package/dist/utils/shell.js +87 -0
  104. package/dist/utils/shell.js.map +1 -0
  105. package/package.json +71 -0
  106. package/src/adapters/agents-md.ts +143 -0
  107. package/src/adapters/browser.ts +49 -0
  108. package/src/adapters/git.ts +100 -0
  109. package/src/adapters/graft.ts +80 -0
  110. package/src/adapters/package-manager.ts +116 -0
  111. package/src/adapters/skills.ts +117 -0
  112. package/src/cli/doctor.ts +244 -0
  113. package/src/cli/init.ts +34 -0
  114. package/src/cli/main.ts +191 -0
  115. package/src/cli/new.ts +200 -0
  116. package/src/cli/wizard.ts +300 -0
  117. package/src/config/defaults.ts +137 -0
  118. package/src/config/schema.ts +44 -0
  119. package/src/config/validation.ts +96 -0
  120. package/src/index.ts +15 -0
  121. package/src/presets/adr.ts +37 -0
  122. package/src/presets/cli.ts +136 -0
  123. package/src/presets/generic.ts +32 -0
  124. package/src/presets/registry.ts +24 -0
  125. package/src/presets/testing.ts +56 -0
  126. package/src/presets/types.ts +15 -0
  127. package/src/presets/web.ts +99 -0
  128. package/src/utils/fs.ts +79 -0
  129. package/src/utils/logger.ts +20 -0
  130. package/src/utils/shell.ts +116 -0
@@ -0,0 +1,116 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs';
5
+ import { logger } from './logger.js';
6
+
7
+ const execFileAsync = promisify(execFile);
8
+
9
+ export interface ShellResult {
10
+ stdout: string;
11
+ stderr: string;
12
+ exitCode: number;
13
+ ok: boolean;
14
+ }
15
+
16
+ export interface RunOptions {
17
+ cwd?: string;
18
+ env?: NodeJS.ProcessEnv;
19
+ dryRun?: boolean;
20
+ silent?: boolean;
21
+ timeout?: number;
22
+ }
23
+
24
+ function resolveExecutable(binName: string): { executable: string; isBatch: boolean } {
25
+ if (process.platform !== 'win32') {
26
+ return { executable: binName, isBatch: false };
27
+ }
28
+ const isBatch = (file: string) => /\.(cmd|bat)$/i.test(file);
29
+ if (path.extname(binName)) {
30
+ return { executable: binName, isBatch: isBatch(binName) };
31
+ }
32
+ const pathExts = (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean);
33
+ const dirs = (process.env.PATH || '').split(path.delimiter).filter(Boolean);
34
+ for (const dir of dirs) {
35
+ const cleanDir = dir.replace(/^"|"$/g, '');
36
+ for (const ext of pathExts) {
37
+ const candidate = path.join(cleanDir, `${binName}${ext}`);
38
+ try {
39
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
40
+ return { executable: candidate, isBatch: isBatch(candidate) };
41
+ }
42
+ } catch {
43
+ // continue
44
+ }
45
+ }
46
+ }
47
+ return { executable: binName, isBatch: false };
48
+ }
49
+
50
+ /** Execute a program with literal arguments. No shell expansion or interpolation. */
51
+ export async function runExecutable(
52
+ executable: string,
53
+ args: string[] = [],
54
+ options: RunOptions = {}
55
+ ): Promise<ShellResult> {
56
+ const {
57
+ cwd = process.cwd(),
58
+ env = process.env,
59
+ dryRun = false,
60
+ silent = false,
61
+ timeout = 300_000
62
+ } = options;
63
+
64
+ if (dryRun) {
65
+ logger.dim(
66
+ `[dry-run] Would execute: ${[executable, ...args].map((a) => JSON.stringify(a)).join(' ')} (in ${cwd})`
67
+ );
68
+ return { stdout: '', stderr: '', exitCode: 0, ok: true };
69
+ }
70
+
71
+ try {
72
+ const { executable: targetExe, isBatch } = resolveExecutable(executable);
73
+ const { stdout, stderr } = await execFileAsync(targetExe, args, {
74
+ cwd,
75
+ env: { ...process.env, ...env },
76
+ maxBuffer: 10 * 1024 * 1024,
77
+ timeout,
78
+ shell: isBatch
79
+ });
80
+ if (!silent && stdout.trim()) logger.dim(stdout.trim());
81
+ return { stdout: stdout.trim(), stderr: stderr.trim(), exitCode: 0, ok: true };
82
+ } catch (error: any) {
83
+ return {
84
+ stdout: String(error.stdout || '').trim(),
85
+ stderr: String(error.stderr || error.message || '').trim(),
86
+ exitCode: typeof error.code === 'number' ? error.code : 1,
87
+ ok: false
88
+ };
89
+ }
90
+ }
91
+
92
+ export async function commandExists(binName: string): Promise<boolean> {
93
+ if (!/^[a-zA-Z0-9._-]+$/.test(binName)) return false;
94
+ const isWindows = process.platform === 'win32';
95
+ const pathExts = isWindows
96
+ ? (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)
97
+ : [''];
98
+
99
+ return (process.env.PATH || '').split(path.delimiter).some((dir) => {
100
+ if (!dir) return false;
101
+ const cleanDir = dir.replace(/^"|"$/g, '');
102
+ for (const ext of pathExts) {
103
+ try {
104
+ const file = path.join(
105
+ cleanDir,
106
+ isWindows && !path.extname(binName) ? `${binName}${ext}` : binName
107
+ );
108
+ fs.accessSync(file, isWindows ? fs.constants.F_OK : fs.constants.X_OK);
109
+ if (fs.statSync(file).isFile()) return true;
110
+ } catch {
111
+ // continue
112
+ }
113
+ }
114
+ return false;
115
+ });
116
+ }