agenv-cli 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 (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/adapters/claude/index.d.ts +2 -0
  4. package/dist/adapters/claude/index.js +50 -0
  5. package/dist/adapters/claude/index.js.map +1 -0
  6. package/dist/adapters/codex/index.d.ts +2 -0
  7. package/dist/adapters/codex/index.js +31 -0
  8. package/dist/adapters/codex/index.js.map +1 -0
  9. package/dist/adapters/copilot/index.d.ts +2 -0
  10. package/dist/adapters/copilot/index.js +34 -0
  11. package/dist/adapters/copilot/index.js.map +1 -0
  12. package/dist/adapters/index.d.ts +3 -0
  13. package/dist/adapters/index.js +18 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/mcp/index.d.ts +2 -0
  16. package/dist/adapters/mcp/index.js +45 -0
  17. package/dist/adapters/mcp/index.js.map +1 -0
  18. package/dist/adapters/types.d.ts +23 -0
  19. package/dist/adapters/types.js +2 -0
  20. package/dist/adapters/types.js.map +1 -0
  21. package/dist/cli/commands/diff.d.ts +18 -0
  22. package/dist/cli/commands/diff.js +65 -0
  23. package/dist/cli/commands/diff.js.map +1 -0
  24. package/dist/cli/commands/doctor.d.ts +2 -0
  25. package/dist/cli/commands/doctor.js +26 -0
  26. package/dist/cli/commands/doctor.js.map +1 -0
  27. package/dist/cli/commands/generate.d.ts +21 -0
  28. package/dist/cli/commands/generate.js +73 -0
  29. package/dist/cli/commands/generate.js.map +1 -0
  30. package/dist/cli/commands/init.d.ts +2 -0
  31. package/dist/cli/commands/init.js +93 -0
  32. package/dist/cli/commands/init.js.map +1 -0
  33. package/dist/cli/commands/templates-list.d.ts +2 -0
  34. package/dist/cli/commands/templates-list.js +20 -0
  35. package/dist/cli/commands/templates-list.js.map +1 -0
  36. package/dist/cli/index.d.ts +3 -0
  37. package/dist/cli/index.js +30 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/prompts/init-flow.d.ts +5 -0
  40. package/dist/cli/prompts/init-flow.js +23 -0
  41. package/dist/cli/prompts/init-flow.js.map +1 -0
  42. package/dist/cli/prompts/sessions/auth.d.ts +5 -0
  43. package/dist/cli/prompts/sessions/auth.js +6 -0
  44. package/dist/cli/prompts/sessions/auth.js.map +1 -0
  45. package/dist/cli/prompts/sessions/data.d.ts +5 -0
  46. package/dist/cli/prompts/sessions/data.js +6 -0
  47. package/dist/cli/prompts/sessions/data.js.map +1 -0
  48. package/dist/cli/prompts/sessions/output.d.ts +5 -0
  49. package/dist/cli/prompts/sessions/output.js +6 -0
  50. package/dist/cli/prompts/sessions/output.js.map +1 -0
  51. package/dist/cli/prompts/sessions/project-type.d.ts +5 -0
  52. package/dist/cli/prompts/sessions/project-type.js +6 -0
  53. package/dist/cli/prompts/sessions/project-type.js.map +1 -0
  54. package/dist/cli/prompts/sessions/quality.d.ts +5 -0
  55. package/dist/cli/prompts/sessions/quality.js +6 -0
  56. package/dist/cli/prompts/sessions/quality.js.map +1 -0
  57. package/dist/cli/prompts/sessions/setup-depth.d.ts +5 -0
  58. package/dist/cli/prompts/sessions/setup-depth.js +6 -0
  59. package/dist/cli/prompts/sessions/setup-depth.js.map +1 -0
  60. package/dist/cli/prompts/sessions/stack.d.ts +5 -0
  61. package/dist/cli/prompts/sessions/stack.js +6 -0
  62. package/dist/cli/prompts/sessions/stack.js.map +1 -0
  63. package/dist/cli/prompts/sessions/tooling.d.ts +5 -0
  64. package/dist/cli/prompts/sessions/tooling.js +6 -0
  65. package/dist/cli/prompts/sessions/tooling.js.map +1 -0
  66. package/dist/cli/prompts/sessions/tools.d.ts +5 -0
  67. package/dist/cli/prompts/sessions/tools.js +6 -0
  68. package/dist/cli/prompts/sessions/tools.js.map +1 -0
  69. package/dist/cli/prompts/sessions/ui.d.ts +5 -0
  70. package/dist/cli/prompts/sessions/ui.js +6 -0
  71. package/dist/cli/prompts/sessions/ui.js.map +1 -0
  72. package/dist/detect/dependencies.d.ts +8 -0
  73. package/dist/detect/dependencies.js +19 -0
  74. package/dist/detect/dependencies.js.map +1 -0
  75. package/dist/detect/existing-ai-files.d.ts +1 -0
  76. package/dist/detect/existing-ai-files.js +26 -0
  77. package/dist/detect/existing-ai-files.js.map +1 -0
  78. package/dist/detect/frameworks.d.ts +2 -0
  79. package/dist/detect/frameworks.js +13 -0
  80. package/dist/detect/frameworks.js.map +1 -0
  81. package/dist/detect/package-json.d.ts +7 -0
  82. package/dist/detect/package-json.js +20 -0
  83. package/dist/detect/package-json.js.map +1 -0
  84. package/dist/detect/repo-inspector.d.ts +10 -0
  85. package/dist/detect/repo-inspector.js +35 -0
  86. package/dist/detect/repo-inspector.js.map +1 -0
  87. package/dist/doctor/checks/compatibility.d.ts +4 -0
  88. package/dist/doctor/checks/compatibility.js +16 -0
  89. package/dist/doctor/checks/compatibility.js.map +1 -0
  90. package/dist/doctor/checks/env.d.ts +3 -0
  91. package/dist/doctor/checks/env.js +14 -0
  92. package/dist/doctor/checks/env.js.map +1 -0
  93. package/dist/doctor/checks/manifest.d.ts +3 -0
  94. package/dist/doctor/checks/manifest.js +31 -0
  95. package/dist/doctor/checks/manifest.js.map +1 -0
  96. package/dist/doctor/checks/paths.d.ts +3 -0
  97. package/dist/doctor/checks/paths.js +29 -0
  98. package/dist/doctor/checks/paths.js.map +1 -0
  99. package/dist/doctor/checks/repo-match.d.ts +4 -0
  100. package/dist/doctor/checks/repo-match.js +16 -0
  101. package/dist/doctor/checks/repo-match.js.map +1 -0
  102. package/dist/doctor/checks/security.d.ts +3 -0
  103. package/dist/doctor/checks/security.js +16 -0
  104. package/dist/doctor/checks/security.js.map +1 -0
  105. package/dist/doctor/run.d.ts +7 -0
  106. package/dist/doctor/run.js +47 -0
  107. package/dist/doctor/run.js.map +1 -0
  108. package/dist/doctor/types.d.ts +12 -0
  109. package/dist/doctor/types.js +2 -0
  110. package/dist/doctor/types.js.map +1 -0
  111. package/dist/fs/backups.d.ts +1 -0
  112. package/dist/fs/backups.js +4 -0
  113. package/dist/fs/backups.js.map +1 -0
  114. package/dist/fs/diff.d.ts +8 -0
  115. package/dist/fs/diff.js +39 -0
  116. package/dist/fs/diff.js.map +1 -0
  117. package/dist/fs/headers.d.ts +6 -0
  118. package/dist/fs/headers.js +32 -0
  119. package/dist/fs/headers.js.map +1 -0
  120. package/dist/fs/write.d.ts +8 -0
  121. package/dist/fs/write.js +42 -0
  122. package/dist/fs/write.js.map +1 -0
  123. package/dist/manifest/defaults.d.ts +11 -0
  124. package/dist/manifest/defaults.js +71 -0
  125. package/dist/manifest/defaults.js.map +1 -0
  126. package/dist/manifest/load.d.ts +10 -0
  127. package/dist/manifest/load.js +34 -0
  128. package/dist/manifest/load.js.map +1 -0
  129. package/dist/manifest/normalize.d.ts +7 -0
  130. package/dist/manifest/normalize.js +40 -0
  131. package/dist/manifest/normalize.js.map +1 -0
  132. package/dist/manifest/save.d.ts +2 -0
  133. package/dist/manifest/save.js +9 -0
  134. package/dist/manifest/save.js.map +1 -0
  135. package/dist/manifest/schema.d.ts +166 -0
  136. package/dist/manifest/schema.js +96 -0
  137. package/dist/manifest/schema.js.map +1 -0
  138. package/dist/planner/build-plan.d.ts +29 -0
  139. package/dist/planner/build-plan.js +49 -0
  140. package/dist/planner/build-plan.js.map +1 -0
  141. package/dist/planner/output-map.d.ts +18 -0
  142. package/dist/planner/output-map.js +192 -0
  143. package/dist/planner/output-map.js.map +1 -0
  144. package/dist/planner/warnings.d.ts +7 -0
  145. package/dist/planner/warnings.js +26 -0
  146. package/dist/planner/warnings.js.map +1 -0
  147. package/dist/render/render-plan.d.ts +4 -0
  148. package/dist/render/render-plan.js +15 -0
  149. package/dist/render/render-plan.js.map +1 -0
  150. package/dist/render/shared.d.ts +4 -0
  151. package/dist/render/shared.js +426 -0
  152. package/dist/render/shared.js.map +1 -0
  153. package/dist/templates/registry.d.ts +10 -0
  154. package/dist/templates/registry.js +48 -0
  155. package/dist/templates/registry.js.map +1 -0
  156. package/dist/utils/format.d.ts +3 -0
  157. package/dist/utils/format.js +20 -0
  158. package/dist/utils/format.js.map +1 -0
  159. package/dist/utils/json.d.ts +3 -0
  160. package/dist/utils/json.js +12 -0
  161. package/dist/utils/json.js.map +1 -0
  162. package/package.json +53 -0
@@ -0,0 +1,93 @@
1
+ import { inspectRepo } from "../../detect/repo-inspector.js";
2
+ import { buildRecommendedManifest } from "../../manifest/defaults.js";
3
+ import { saveManifest } from "../../manifest/save.js";
4
+ import { buildGenerationPlan } from "../../planner/build-plan.js";
5
+ import { ADAPTER_TARGETS } from "../../planner/output-map.js";
6
+ import { formatCommandOutput, formatTextBlock, parseCommaList } from "../../utils/format.js";
7
+ const SUPPORTED_PROJECT_TYPES = ["dashboard", "web-app"];
8
+ function buildTargetFlags(targets) {
9
+ const selectedTargets = parseCommaList(targets);
10
+ if (selectedTargets.length === 0) {
11
+ return undefined;
12
+ }
13
+ return {
14
+ copilot: selectedTargets.includes("copilot"),
15
+ claude: selectedTargets.includes("claude"),
16
+ codex: selectedTargets.includes("codex"),
17
+ mcp: selectedTargets.includes("mcp"),
18
+ };
19
+ }
20
+ function compactObject(value) {
21
+ return Object.fromEntries(Object.entries(value).filter(([, entryValue]) => entryValue !== undefined));
22
+ }
23
+ function validateTargets(targets) {
24
+ for (const target of parseCommaList(targets)) {
25
+ if (!ADAPTER_TARGETS.includes(target)) {
26
+ throw new Error(`Unsupported target: ${target}`);
27
+ }
28
+ }
29
+ }
30
+ export function registerInitCommand(program) {
31
+ program
32
+ .command("init")
33
+ .description("Create a canonical ai-workspace manifest from repo inspection and defaults.")
34
+ .option("--yes", "accept recommended defaults")
35
+ .option("--dry-run", "preview without writing files")
36
+ .option("--json", "emit machine-readable output")
37
+ .option("--targets <list>", "comma-separated targets such as codex,claude,copilot,mcp")
38
+ .option("--project-type <type>", "project type: dashboard or web-app", "dashboard")
39
+ .option("--framework <value>", "override detected framework")
40
+ .option("--setup-depth <value>", "recommended, semi-custom, or advanced")
41
+ .option("--setup-mode <value>", "base, skills, agents, or full")
42
+ .option("--config-scope <value>", "shared, local, or mixed")
43
+ .option("--prompts <value>", "none, starter, master, or pack")
44
+ .action(async (options) => {
45
+ if (!SUPPORTED_PROJECT_TYPES.includes(options.projectType)) {
46
+ throw new Error("Supported project types are 'dashboard' and 'web-app'.");
47
+ }
48
+ validateTargets(options.targets);
49
+ const cwd = process.cwd();
50
+ const inspection = await inspectRepo(cwd);
51
+ const manifest = buildRecommendedManifest({
52
+ name: inspection.projectName,
53
+ framework: options.framework ?? inspection.framework ?? "react",
54
+ projectType: options.projectType,
55
+ ...compactObject({
56
+ targets: buildTargetFlags(options.targets),
57
+ setup: compactObject({
58
+ depth: options.setupDepth,
59
+ mode: options.setupMode,
60
+ scope: options.configScope,
61
+ }),
62
+ generated: compactObject({
63
+ prompts: options.prompts,
64
+ }),
65
+ }),
66
+ });
67
+ const plan = buildGenerationPlan(manifest);
68
+ const manifestPath = options.dryRun ? "ai-workspace.json" : await saveManifest(cwd, manifest);
69
+ const text = formatTextBlock([
70
+ `Detected framework: ${inspection.framework ?? "unknown"}`,
71
+ `Package manager: ${inspection.packageManager ?? "unknown"}`,
72
+ `Targets: ${Object.entries(manifest.targets)
73
+ .filter(([, enabled]) => enabled)
74
+ .map(([target]) => target)
75
+ .join(", ")}`,
76
+ `Planned files: ${plan.files.length}`,
77
+ `Warnings: ${plan.warnings.length}`,
78
+ options.dryRun ? "Dry run only: manifest was not written." : `Manifest written to ${manifestPath}.`,
79
+ ]);
80
+ const payload = {
81
+ command: "init",
82
+ repo: inspection,
83
+ manifest: {
84
+ path: "ai-workspace.json",
85
+ created: !options.dryRun,
86
+ },
87
+ plan,
88
+ dryRun: Boolean(options.dryRun),
89
+ };
90
+ process.stdout.write(formatCommandOutput(text, payload, Boolean(options.json)));
91
+ });
92
+ }
93
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerTemplatesListCommand(program: Command): void;
@@ -0,0 +1,20 @@
1
+ import { TEMPLATE_REGISTRY } from "../../templates/registry.js";
2
+ import { formatCommandOutput, formatTextBlock } from "../../utils/format.js";
3
+ export function registerTemplatesListCommand(program) {
4
+ const templatesCommand = program
5
+ .command("templates")
6
+ .description("Template discovery commands.");
7
+ templatesCommand
8
+ .command("list")
9
+ .description("List built-in starter templates.")
10
+ .option("--json", "emit machine-readable output")
11
+ .action((options) => {
12
+ const text = formatTextBlock(TEMPLATE_REGISTRY.map((template) => `${template.id} - ${template.framework} (${template.setupDepth}) - ${template.description}`));
13
+ const payload = {
14
+ command: "templates list",
15
+ templates: TEMPLATE_REGISTRY,
16
+ };
17
+ process.stdout.write(formatCommandOutput(text, payload, Boolean(options.json)));
18
+ });
19
+ }
20
+ //# sourceMappingURL=templates-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-list.js","sourceRoot":"","sources":["../../../src/cli/commands/templates-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7E,MAAM,UAAU,4BAA4B,CAAC,OAAgB;IAC3D,MAAM,gBAAgB,GAAG,OAAO;SAC7B,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8BAA8B,CAAC,CAAC;IAE/C,gBAAgB;SACb,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;SAChD,MAAM,CAAC,CAAC,OAA6B,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,eAAe,CAC1B,iBAAiB,CAAC,GAAG,CACnB,CAAC,QAAQ,EAAE,EAAE,CACX,GAAG,QAAQ,CAAC,EAAE,MAAM,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,UAAU,OAAO,QAAQ,CAAC,WAAW,EAAE,CAC9F,CACF,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,iBAAiB;SAC7B,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ export declare function createCli(): Command;
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { registerDiffCommand } from "./commands/diff.js";
4
+ import { registerDoctorCommand } from "./commands/doctor.js";
5
+ import { registerGenerateCommand } from "./commands/generate.js";
6
+ import { registerInitCommand } from "./commands/init.js";
7
+ import { registerTemplatesListCommand } from "./commands/templates-list.js";
8
+ export function createCli() {
9
+ const program = new Command();
10
+ program
11
+ .name("agenv")
12
+ .description("Bootstrap a portable, reviewable AI workspace for web development repositories.")
13
+ .version("0.1.0");
14
+ registerInitCommand(program);
15
+ registerGenerateCommand(program);
16
+ registerDiffCommand(program);
17
+ registerDoctorCommand(program);
18
+ registerTemplatesListCommand(program);
19
+ return program;
20
+ }
21
+ async function main() {
22
+ const program = createCli();
23
+ await program.parseAsync(process.argv);
24
+ }
25
+ main().catch((error) => {
26
+ const message = error instanceof Error ? error.message : "Unknown error";
27
+ console.error(message);
28
+ process.exitCode = 1;
29
+ });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CACV,iFAAiF,CAClF;SACA,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const initFlowSessions: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ }[];
@@ -0,0 +1,23 @@
1
+ import { authSession } from "./sessions/auth.js";
2
+ import { dataSession } from "./sessions/data.js";
3
+ import { outputSession } from "./sessions/output.js";
4
+ import { projectTypeSession } from "./sessions/project-type.js";
5
+ import { qualitySession } from "./sessions/quality.js";
6
+ import { setupDepthSession } from "./sessions/setup-depth.js";
7
+ import { stackSession } from "./sessions/stack.js";
8
+ import { toolsSession } from "./sessions/tools.js";
9
+ import { toolingSession } from "./sessions/tooling.js";
10
+ import { uiSession } from "./sessions/ui.js";
11
+ export const initFlowSessions = [
12
+ toolsSession,
13
+ projectTypeSession,
14
+ setupDepthSession,
15
+ stackSession,
16
+ uiSession,
17
+ dataSession,
18
+ authSession,
19
+ qualitySession,
20
+ toolingSession,
21
+ outputSession,
22
+ ];
23
+ //# sourceMappingURL=init-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-flow.js","sourceRoot":"","sources":["../../../src/cli/prompts/init-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,cAAc;IACd,cAAc;IACd,aAAa;CACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const authSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const authSession = {
2
+ id: "auth",
3
+ title: "Auth and RBAC",
4
+ prompt: "Capture role-based access control and protected UI requirements.",
5
+ };
6
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/auth.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,kEAAkE;CAC3E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const dataSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const dataSession = {
2
+ id: "data",
3
+ title: "Data Patterns",
4
+ prompt: "Capture data fetching, caching, typing, and API client patterns.",
5
+ };
6
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/data.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,kEAAkE;CAC3E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const outputSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const outputSession = {
2
+ id: "output",
3
+ title: "Output Strategy",
4
+ prompt: "Choose setup mode, prompt generation behavior, and shared vs local scope.",
5
+ };
6
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/output.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,2EAA2E;CACpF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const projectTypeSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const projectTypeSession = {
2
+ id: "project-type",
3
+ title: "Project Type",
4
+ prompt: "Confirm the project type. Current support includes dashboard and web-app repositories.",
5
+ };
6
+ //# sourceMappingURL=project-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-type.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/project-type.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,wFAAwF;CACjG,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const qualitySession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const qualitySession = {
2
+ id: "quality",
3
+ title: "Quality Rules",
4
+ prompt: "Capture testing, accessibility, responsive behavior, and review rules.",
5
+ };
6
+ //# sourceMappingURL=quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/quality.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,wEAAwE;CACjF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const setupDepthSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const setupDepthSession = {
2
+ id: "setup-depth",
3
+ title: "Setup Depth",
4
+ prompt: "Choose recommended, semi-custom, or advanced setup depth.",
5
+ };
6
+ //# sourceMappingURL=setup-depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-depth.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/setup-depth.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,2DAA2D;CACpE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const stackSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const stackSession = {
2
+ id: "stack",
3
+ title: "Stack Profile",
4
+ prompt: "Capture the framework and frontend stack choices for the repository.",
5
+ };
6
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/stack.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,sEAAsE;CAC/E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const toolingSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const toolingSession = {
2
+ id: "tooling",
3
+ title: "Tooling and MCP",
4
+ prompt: "Capture MCP presets, docs sources, shell rules, and repo tooling needs.",
5
+ };
6
+ //# sourceMappingURL=tooling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooling.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/tooling.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,yEAAyE;CAClF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const toolsSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const toolsSession = {
2
+ id: "tools",
3
+ title: "Tool Selection",
4
+ prompt: "Choose which AI tools should be configured for this repository.",
5
+ };
6
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/tools.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,iEAAiE;CAC1E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const uiSession: {
2
+ id: string;
3
+ title: string;
4
+ prompt: string;
5
+ };
@@ -0,0 +1,6 @@
1
+ export const uiSession = {
2
+ id: "ui",
3
+ title: "UI Conventions",
4
+ prompt: "Capture component, layout, chart, and form conventions.",
5
+ };
6
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../src/cli/prompts/sessions/ui.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,yDAAyD;CAClE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type DashboardHints = {
2
+ styling: "tailwind" | undefined;
3
+ dataFetching: "tanstack-query" | undefined;
4
+ tables: "tanstack-table" | undefined;
5
+ forms: "react-hook-form-zod" | undefined;
6
+ };
7
+ export declare function hasDependency(dependencies: Record<string, string>, dependencyName: string): boolean;
8
+ export declare function detectDashboardHints(dependencies: Record<string, string>): DashboardHints;
@@ -0,0 +1,19 @@
1
+ export function hasDependency(dependencies, dependencyName) {
2
+ return dependencyName in dependencies;
3
+ }
4
+ export function detectDashboardHints(dependencies) {
5
+ return {
6
+ styling: hasDependency(dependencies, "tailwindcss") ? "tailwind" : undefined,
7
+ dataFetching: hasDependency(dependencies, "@tanstack/react-query")
8
+ ? "tanstack-query"
9
+ : undefined,
10
+ tables: hasDependency(dependencies, "@tanstack/react-table")
11
+ ? "tanstack-table"
12
+ : undefined,
13
+ forms: hasDependency(dependencies, "react-hook-form") &&
14
+ hasDependency(dependencies, "zod")
15
+ ? "react-hook-form-zod"
16
+ : undefined,
17
+ };
18
+ }
19
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/detect/dependencies.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,aAAa,CAC3B,YAAoC,EACpC,cAAsB;IAEtB,OAAO,cAAc,IAAI,YAAY,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,YAAoC;IAEpC,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC5E,YAAY,EAAE,aAAa,CAAC,YAAY,EAAE,uBAAuB,CAAC;YAChE,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE,uBAAuB,CAAC;YAC1D,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,SAAS;QACb,KAAK,EACH,aAAa,CAAC,YAAY,EAAE,iBAAiB,CAAC;YAC9C,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;YAChC,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function detectExistingAiFiles(cwd: string): Promise<string[]>;
@@ -0,0 +1,26 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const KNOWN_AI_PATHS = [
4
+ "AGENTS.md",
5
+ "ai-workspace.json",
6
+ ".github/copilot-instructions.md",
7
+ ".claude",
8
+ ".mcp.json",
9
+ ];
10
+ async function pathExists(filePath) {
11
+ try {
12
+ await access(filePath);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ export async function detectExistingAiFiles(cwd) {
20
+ const results = await Promise.all(KNOWN_AI_PATHS.map(async (relativePath) => {
21
+ const exists = await pathExists(join(cwd, relativePath));
22
+ return exists ? relativePath : null;
23
+ }));
24
+ return results.filter((value) => value !== null);
25
+ }
26
+ //# sourceMappingURL=existing-ai-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"existing-ai-files.js","sourceRoot":"","sources":["../../src/detect/existing-ai-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG;IACrB,WAAW;IACX,mBAAmB;IACnB,iCAAiC;IACjC,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type DetectedFramework = "react" | "nextjs" | "vite-react";
2
+ export declare function detectFrameworkFromDependencies(dependencies: Record<string, string>): DetectedFramework | undefined;
@@ -0,0 +1,13 @@
1
+ export function detectFrameworkFromDependencies(dependencies) {
2
+ if ("next" in dependencies) {
3
+ return "nextjs";
4
+ }
5
+ if ("vite" in dependencies && "react" in dependencies) {
6
+ return "vite-react";
7
+ }
8
+ if ("react" in dependencies) {
9
+ return "react";
10
+ }
11
+ return undefined;
12
+ }
13
+ //# sourceMappingURL=frameworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../../src/detect/frameworks.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,+BAA+B,CAC7C,YAAoC;IAEpC,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,IAAI,YAAY,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;QACtD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type PackageJson = {
2
+ name?: string;
3
+ dependencies?: Record<string, string>;
4
+ devDependencies?: Record<string, string>;
5
+ };
6
+ export declare function loadPackageJson(cwd: string): Promise<PackageJson | null>;
7
+ export declare function getAllDependencies(packageJson: PackageJson | null): Record<string, string>;
@@ -0,0 +1,20 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { readJsonFile } from "../utils/json.js";
4
+ export async function loadPackageJson(cwd) {
5
+ const filePath = join(cwd, "package.json");
6
+ try {
7
+ await access(filePath);
8
+ return await readJsonFile(filePath);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ export function getAllDependencies(packageJson) {
15
+ return {
16
+ ...(packageJson?.dependencies ?? {}),
17
+ ...(packageJson?.devDependencies ?? {}),
18
+ };
19
+ }
20
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/detect/package-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,MAAM,YAAY,CAAc,QAAQ,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAA+B;IAE/B,OAAO;QACL,GAAG,CAAC,WAAW,EAAE,YAAY,IAAI,EAAE,CAAC;QACpC,GAAG,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { detectDashboardHints } from "./dependencies.js";
2
+ import { type DetectedFramework } from "./frameworks.js";
3
+ export type RepoInspection = {
4
+ projectName: string;
5
+ framework: DetectedFramework | undefined;
6
+ packageManager: "npm" | "pnpm" | "yarn" | undefined;
7
+ existingAiFiles: string[];
8
+ hints: ReturnType<typeof detectDashboardHints>;
9
+ };
10
+ export declare function inspectRepo(cwd: string): Promise<RepoInspection>;
@@ -0,0 +1,35 @@
1
+ import { access } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { detectDashboardHints } from "./dependencies.js";
4
+ import { detectExistingAiFiles } from "./existing-ai-files.js";
5
+ import { detectFrameworkFromDependencies } from "./frameworks.js";
6
+ import { getAllDependencies, loadPackageJson } from "./package-json.js";
7
+ async function detectPackageManager(cwd) {
8
+ const candidates = [
9
+ ["package-lock.json", "npm"],
10
+ ["pnpm-lock.yaml", "pnpm"],
11
+ ["yarn.lock", "yarn"],
12
+ ];
13
+ for (const [fileName, manager] of candidates) {
14
+ try {
15
+ await access(join(cwd, fileName));
16
+ return manager;
17
+ }
18
+ catch {
19
+ // Keep looking.
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ export async function inspectRepo(cwd) {
25
+ const packageJson = await loadPackageJson(cwd);
26
+ const dependencies = getAllDependencies(packageJson);
27
+ return {
28
+ projectName: packageJson?.name ?? basename(cwd),
29
+ framework: detectFrameworkFromDependencies(dependencies),
30
+ packageManager: await detectPackageManager(cwd),
31
+ existingAiFiles: await detectExistingAiFiles(cwd),
32
+ hints: detectDashboardHints(dependencies),
33
+ };
34
+ }
35
+ //# sourceMappingURL=repo-inspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-inspector.js","sourceRoot":"","sources":["../../src/detect/repo-inspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,+BAA+B,EAA0B,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUxE,KAAK,UAAU,oBAAoB,CACjC,GAAW;IAEX,MAAM,UAAU,GAAsD;QACpE,CAAC,mBAAmB,EAAE,KAAK,CAAC;QAC5B,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC1B,CAAC,WAAW,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAErD,OAAO;QACL,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC;QAC/C,SAAS,EAAE,+BAA+B,CAAC,YAAY,CAAC;QACxD,cAAc,EAAE,MAAM,oBAAoB,CAAC,GAAG,CAAC;QAC/C,eAAe,EAAE,MAAM,qBAAqB,CAAC,GAAG,CAAC;QACjD,KAAK,EAAE,oBAAoB,CAAC,YAAY,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RepoInspection } from "../../detect/repo-inspector.js";
2
+ import type { Manifest } from "../../manifest/schema.js";
3
+ import type { DiagnosticFinding } from "../types.js";
4
+ export declare function runCompatibilityChecks(manifest: Manifest | undefined, inspection: RepoInspection): DiagnosticFinding[];
@@ -0,0 +1,16 @@
1
+ export function runCompatibilityChecks(manifest, inspection) {
2
+ if (!manifest || !inspection.framework) {
3
+ return [];
4
+ }
5
+ if (manifest.project.framework !== inspection.framework) {
6
+ return [
7
+ {
8
+ severity: "warning",
9
+ code: "framework_mismatch",
10
+ message: `Manifest framework '${manifest.project.framework}' does not match detected repo framework '${inspection.framework}'.`,
11
+ },
12
+ ];
13
+ }
14
+ return [];
15
+ }
16
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/doctor/checks/compatibility.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sBAAsB,CACpC,QAA8B,EAC9B,UAA0B;IAE1B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;QACxD,OAAO;YACL;gBACE,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,oBAAoB;gBAC1B,OAAO,EAAE,uBAAuB,QAAQ,CAAC,OAAO,CAAC,SAAS,6CAA6C,UAAU,CAAC,SAAS,IAAI;aAChI;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Manifest } from "../../manifest/schema.js";
2
+ import type { DiagnosticFinding } from "../types.js";
3
+ export declare function runEnvChecks(manifest: Manifest | undefined): DiagnosticFinding[];