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,14 @@
1
+ export function runEnvChecks(manifest) {
2
+ if (!manifest || manifest.generated.mcpPresets.length === 0) {
3
+ return [];
4
+ }
5
+ return [
6
+ {
7
+ severity: "info",
8
+ code: "env_placeholders_expected",
9
+ message: "MCP presets are configured. Generated output should include .env.example placeholders.",
10
+ path: ".env.example",
11
+ },
12
+ ];
13
+ }
14
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/doctor/checks/env.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,QAA8B;IACzD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL;YACE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,wFAAwF;YACjG,IAAI,EAAE,cAAc;SACrB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Manifest } from "../../manifest/schema.js";
2
+ import type { DiagnosticFinding } from "../types.js";
3
+ export declare function runManifestChecks(manifest: Manifest | undefined, loadError?: unknown): DiagnosticFinding[];
@@ -0,0 +1,31 @@
1
+ export function runManifestChecks(manifest, loadError) {
2
+ if (loadError) {
3
+ return [
4
+ {
5
+ severity: "error",
6
+ code: "manifest_load_failed",
7
+ message: loadError instanceof Error ? loadError.message : "Failed to load ai-workspace manifest.",
8
+ path: "ai-workspace.json",
9
+ },
10
+ ];
11
+ }
12
+ if (!manifest) {
13
+ return [
14
+ {
15
+ severity: "error",
16
+ code: "manifest_missing",
17
+ message: "No ai-workspace manifest was loaded.",
18
+ path: "ai-workspace.json",
19
+ },
20
+ ];
21
+ }
22
+ return [
23
+ {
24
+ severity: "info",
25
+ code: "manifest_loaded",
26
+ message: "Manifest loaded successfully.",
27
+ path: "ai-workspace.json",
28
+ },
29
+ ];
30
+ }
31
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/doctor/checks/manifest.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAC/B,QAA8B,EAC9B,SAAmB;IAEnB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL;gBACE,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EACL,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;gBAC1F,IAAI,EAAE,mBAAmB;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL;gBACE,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,sCAAsC;gBAC/C,IAAI,EAAE,mBAAmB;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL;YACE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,mBAAmB;SAC1B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Manifest } from "../../manifest/schema.js";
2
+ import type { DiagnosticFinding } from "../types.js";
3
+ export declare function runPathChecks(cwd: string, manifest: Manifest | undefined): Promise<DiagnosticFinding[]>;
@@ -0,0 +1,29 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ async function exists(filePath) {
4
+ try {
5
+ await access(filePath);
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export async function runPathChecks(cwd, manifest) {
13
+ if (!manifest || manifest.setup.scope === "shared") {
14
+ return [];
15
+ }
16
+ const localManifestPath = join(cwd, "ai-workspace.local.json");
17
+ if (!(await exists(localManifestPath))) {
18
+ return [
19
+ {
20
+ severity: "warning",
21
+ code: "local_override_missing",
22
+ message: "Local or mixed scope is selected but no ai-workspace.local.json file exists yet.",
23
+ path: "ai-workspace.local.json",
24
+ },
25
+ ];
26
+ }
27
+ return [];
28
+ }
29
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/doctor/checks/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,KAAK,UAAU,MAAM,CAAC,QAAgB;IACpC,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,aAAa,CACjC,GAAW,EACX,QAA8B;IAE9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAE/D,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO;YACL;gBACE,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,kFAAkF;gBAC3F,IAAI,EAAE,yBAAyB;aAChC;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,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 runRepoMatchChecks(manifest: Manifest | undefined, inspection: RepoInspection): DiagnosticFinding[];
@@ -0,0 +1,16 @@
1
+ export function runRepoMatchChecks(manifest, inspection) {
2
+ if (!manifest) {
3
+ return [];
4
+ }
5
+ if (manifest.project.name !== inspection.projectName) {
6
+ return [
7
+ {
8
+ severity: "warning",
9
+ code: "project_name_mismatch",
10
+ message: `Manifest project name '${manifest.project.name}' differs from repo name '${inspection.projectName}'.`,
11
+ },
12
+ ];
13
+ }
14
+ return [];
15
+ }
16
+ //# sourceMappingURL=repo-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-match.js","sourceRoot":"","sources":["../../../src/doctor/checks/repo-match.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,kBAAkB,CAChC,QAA8B,EAC9B,UAA0B;IAE1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;QACrD,OAAO;YACL;gBACE,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,0BAA0B,QAAQ,CAAC,OAAO,CAAC,IAAI,6BAA6B,UAAU,CAAC,WAAW,IAAI;aAChH;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 runSecurityChecks(manifest: Manifest | undefined): DiagnosticFinding[];
@@ -0,0 +1,16 @@
1
+ export function runSecurityChecks(manifest) {
2
+ if (!manifest) {
3
+ return [];
4
+ }
5
+ const findings = [];
6
+ if (manifest.targets.mcp) {
7
+ findings.push({
8
+ severity: "warning",
9
+ code: "mcp_review_required",
10
+ message: "MCP configuration is enabled and should be reviewed for trust-sensitive commands.",
11
+ path: ".mcp.json",
12
+ });
13
+ }
14
+ return findings;
15
+ }
16
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/doctor/checks/security.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,QAA8B;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,mFAAmF;YAC5F,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DoctorResult } from "./types.js";
2
+ type RunDoctorOptions = {
3
+ strict: boolean;
4
+ targets: string[];
5
+ };
6
+ export declare function runDoctor(cwd: string, options: RunDoctorOptions): Promise<DoctorResult>;
7
+ export {};
@@ -0,0 +1,47 @@
1
+ import { inspectRepo } from "../detect/repo-inspector.js";
2
+ import { loadManifest } from "../manifest/load.js";
3
+ import { runCompatibilityChecks } from "./checks/compatibility.js";
4
+ import { runEnvChecks } from "./checks/env.js";
5
+ import { runManifestChecks } from "./checks/manifest.js";
6
+ import { runPathChecks } from "./checks/paths.js";
7
+ import { runRepoMatchChecks } from "./checks/repo-match.js";
8
+ import { runSecurityChecks } from "./checks/security.js";
9
+ function partitionFindings(findings) {
10
+ const errors = findings.filter((finding) => finding.severity === "error");
11
+ const warnings = findings.filter((finding) => finding.severity === "warning");
12
+ const info = findings.filter((finding) => finding.severity === "info");
13
+ return {
14
+ status: errors.length > 0 ? "error" : "ok",
15
+ errors,
16
+ warnings,
17
+ info,
18
+ };
19
+ }
20
+ export async function runDoctor(cwd, options) {
21
+ const inspection = await inspectRepo(cwd);
22
+ let manifest;
23
+ let manifestLoadError;
24
+ try {
25
+ manifest = (await loadManifest(cwd, { projectName: inspection.projectName })).manifest;
26
+ }
27
+ catch (error) {
28
+ manifestLoadError = error;
29
+ }
30
+ const findings = [
31
+ ...runManifestChecks(manifest, manifestLoadError),
32
+ ...runCompatibilityChecks(manifest, inspection),
33
+ ...runSecurityChecks(manifest),
34
+ ...runEnvChecks(manifest),
35
+ ...(await runPathChecks(cwd, manifest)),
36
+ ...runRepoMatchChecks(manifest, inspection),
37
+ ];
38
+ const result = partitionFindings(findings);
39
+ if (options.strict && result.warnings.length > 0 && result.status !== "error") {
40
+ return {
41
+ ...result,
42
+ status: "error",
43
+ };
44
+ }
45
+ return result;
46
+ }
47
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/doctor/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAQzD,SAAS,iBAAiB,CAAC,QAA6B;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEvE,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC1C,MAAM;QACN,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,OAAyB;IAEzB,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,QAA8B,CAAC;IACnC,IAAI,iBAA0B,CAAC;IAE/B,IAAI,CAAC;QACH,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,CAAC;QACjD,GAAG,sBAAsB,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC/C,GAAG,iBAAiB,CAAC,QAAQ,CAAC;QAC9B,GAAG,YAAY,CAAC,QAAQ,CAAC;QACzB,GAAG,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvC,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC;KAC5C,CAAC;IAEF,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9E,OAAO;YACL,GAAG,MAAM;YACT,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type DiagnosticFinding = {
2
+ severity: "error" | "warning" | "info";
3
+ code: string;
4
+ message: string;
5
+ path?: string;
6
+ };
7
+ export type DoctorResult = {
8
+ status: "ok" | "error";
9
+ errors: DiagnosticFinding[];
10
+ warnings: DiagnosticFinding[];
11
+ info: DiagnosticFinding[];
12
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare function createBackup(_filePath: string): Promise<void>;
@@ -0,0 +1,4 @@
1
+ export async function createBackup(_filePath) {
2
+ throw new Error("Backup creation is not implemented yet.");
3
+ }
4
+ //# sourceMappingURL=backups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backups.js","sourceRoot":"","sources":["../../src/fs/backups.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RenderedFile } from "../adapters/types.js";
2
+ export type DiffSummary = {
3
+ create: string[];
4
+ update: string[];
5
+ unchanged: string[];
6
+ skip: string[];
7
+ };
8
+ export declare function summarizeRenderedDiff(cwd: string, renderedFiles: RenderedFile[]): Promise<DiffSummary>;
@@ -0,0 +1,39 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { canHaveGeneratedHeader, hasGeneratedHeader } from "./headers.js";
4
+ async function pathExists(filePath) {
5
+ try {
6
+ await access(filePath);
7
+ return true;
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }
13
+ export async function summarizeRenderedDiff(cwd, renderedFiles) {
14
+ const summary = {
15
+ create: [],
16
+ update: [],
17
+ unchanged: [],
18
+ skip: [],
19
+ };
20
+ for (const renderedFile of renderedFiles) {
21
+ const absolutePath = join(cwd, renderedFile.path);
22
+ if (!(await pathExists(absolutePath))) {
23
+ summary.create.push(renderedFile.path);
24
+ continue;
25
+ }
26
+ const existingContent = await readFile(absolutePath, "utf8");
27
+ if (existingContent === renderedFile.content) {
28
+ summary.unchanged.push(renderedFile.path);
29
+ continue;
30
+ }
31
+ if (canHaveGeneratedHeader(renderedFile.path) && !hasGeneratedHeader(renderedFile.path, existingContent)) {
32
+ summary.skip.push(renderedFile.path);
33
+ continue;
34
+ }
35
+ summary.update.push(renderedFile.path);
36
+ }
37
+ return summary;
38
+ }
39
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/fs/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAU1E,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,CACzC,GAAW,EACX,aAA6B;IAE7B,MAAM,OAAO,GAAgB;QAC3B,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,EAAE;KACT,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,eAAe,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,sBAAsB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACzG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const GENERATED_NOTICE = "Generated by agenv. Review before editing by hand.";
2
+ export declare function withMarkdownGeneratedHeader(content: string): string;
3
+ export declare function withLineCommentHeader(content: string): string;
4
+ export declare function canHaveGeneratedHeader(filePath: string): boolean;
5
+ export declare function applyGeneratedHeader(filePath: string, content: string): string;
6
+ export declare function hasGeneratedHeader(filePath: string, content: string): boolean;
@@ -0,0 +1,32 @@
1
+ export const GENERATED_NOTICE = "Generated by agenv. Review before editing by hand.";
2
+ export function withMarkdownGeneratedHeader(content) {
3
+ return `<!-- ${GENERATED_NOTICE} -->\n\n${content}`;
4
+ }
5
+ export function withLineCommentHeader(content) {
6
+ return `# ${GENERATED_NOTICE}\n\n${content}`;
7
+ }
8
+ export function canHaveGeneratedHeader(filePath) {
9
+ return (filePath.endsWith(".md") ||
10
+ filePath.endsWith(".txt") ||
11
+ filePath.endsWith(".env") ||
12
+ filePath.endsWith(".example"));
13
+ }
14
+ export function applyGeneratedHeader(filePath, content) {
15
+ if (filePath.endsWith(".md")) {
16
+ return withMarkdownGeneratedHeader(content);
17
+ }
18
+ if (filePath.endsWith(".env") || filePath.endsWith(".example")) {
19
+ return withLineCommentHeader(content);
20
+ }
21
+ return content;
22
+ }
23
+ export function hasGeneratedHeader(filePath, content) {
24
+ if (filePath.endsWith(".md")) {
25
+ return content.startsWith(`<!-- ${GENERATED_NOTICE} -->`);
26
+ }
27
+ if (filePath.endsWith(".env") || filePath.endsWith(".example")) {
28
+ return content.startsWith(`# ${GENERATED_NOTICE}`);
29
+ }
30
+ return false;
31
+ }
32
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/fs/headers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;AAErF,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,OAAO,QAAQ,gBAAgB,WAAW,OAAO,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,KAAK,gBAAgB,OAAO,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,OAAe;IACpE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe;IAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,gBAAgB,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RenderedFile } from "../adapters/types.js";
2
+ export type WriteSummary = {
3
+ created: string[];
4
+ updated: string[];
5
+ unchanged: string[];
6
+ skipped: string[];
7
+ };
8
+ export declare function writeRenderedFiles(cwd: string, renderedFiles: RenderedFile[]): Promise<WriteSummary>;
@@ -0,0 +1,42 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { canHaveGeneratedHeader, hasGeneratedHeader } from "./headers.js";
4
+ async function tryReadFile(filePath) {
5
+ try {
6
+ return await readFile(filePath, "utf8");
7
+ }
8
+ catch {
9
+ return undefined;
10
+ }
11
+ }
12
+ export async function writeRenderedFiles(cwd, renderedFiles) {
13
+ const summary = {
14
+ created: [],
15
+ updated: [],
16
+ unchanged: [],
17
+ skipped: [],
18
+ };
19
+ for (const renderedFile of renderedFiles) {
20
+ const absolutePath = join(cwd, renderedFile.path);
21
+ const existingContent = await tryReadFile(absolutePath);
22
+ if (existingContent === undefined) {
23
+ await mkdir(dirname(absolutePath), { recursive: true });
24
+ await writeFile(absolutePath, renderedFile.content, "utf8");
25
+ summary.created.push(renderedFile.path);
26
+ continue;
27
+ }
28
+ if (existingContent === renderedFile.content) {
29
+ summary.unchanged.push(renderedFile.path);
30
+ continue;
31
+ }
32
+ if (canHaveGeneratedHeader(renderedFile.path) && !hasGeneratedHeader(renderedFile.path, existingContent)) {
33
+ summary.skipped.push(renderedFile.path);
34
+ continue;
35
+ }
36
+ await mkdir(dirname(absolutePath), { recursive: true });
37
+ await writeFile(absolutePath, renderedFile.content, "utf8");
38
+ summary.updated.push(renderedFile.path);
39
+ }
40
+ return summary;
41
+ }
42
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/fs/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAS1E,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,aAA6B;IAE7B,MAAM,OAAO,GAAiB;QAC5B,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAExD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QAED,IAAI,eAAe,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,sBAAsB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACzG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Framework, type Manifest, type ProjectType } from "./schema.js";
2
+ export declare const DEFAULT_SCHEMA_VERSION = "1";
3
+ export type RecommendedManifestOptions = {
4
+ name: string;
5
+ framework: Framework;
6
+ projectType?: ProjectType | undefined;
7
+ targets?: Partial<Manifest["targets"]> | undefined;
8
+ setup?: Partial<Manifest["setup"]> | undefined;
9
+ generated?: Partial<Manifest["generated"]> | undefined;
10
+ };
11
+ export declare function buildRecommendedManifest(options: RecommendedManifestOptions): Manifest;
@@ -0,0 +1,71 @@
1
+ import { manifestSchema, } from "./schema.js";
2
+ export const DEFAULT_SCHEMA_VERSION = "1";
3
+ function buildCodingStyle(projectType) {
4
+ if (projectType === "web-app") {
5
+ return [
6
+ "Use TypeScript strict mode.",
7
+ "Handle loading, empty, error, and success states explicitly.",
8
+ "Prefer reusable page sections and shared UI patterns over one-off code.",
9
+ ];
10
+ }
11
+ return [
12
+ "Use TypeScript strict mode.",
13
+ "Handle loading, empty, error, and success states explicitly.",
14
+ "Prefer reusable dashboard sections over one-off page code.",
15
+ ];
16
+ }
17
+ export function buildRecommendedManifest(options) {
18
+ const projectType = options.projectType ?? "dashboard";
19
+ return manifestSchema.parse({
20
+ schemaVersion: DEFAULT_SCHEMA_VERSION,
21
+ project: {
22
+ name: options.name,
23
+ type: projectType,
24
+ framework: options.framework,
25
+ language: "ts",
26
+ },
27
+ setup: {
28
+ depth: "recommended",
29
+ mode: "full",
30
+ scope: "mixed",
31
+ ...options.setup,
32
+ },
33
+ targets: {
34
+ copilot: true,
35
+ claude: true,
36
+ codex: true,
37
+ mcp: false,
38
+ ...options.targets,
39
+ },
40
+ dashboard: {
41
+ styling: "tailwind",
42
+ components: "shadcn-ui",
43
+ dataFetching: "tanstack-query",
44
+ tables: "tanstack-table",
45
+ charts: "recharts",
46
+ forms: "react-hook-form-zod",
47
+ testing: ["vitest", "rtl"],
48
+ state: "local-first",
49
+ },
50
+ conventions: {
51
+ accessibility: true,
52
+ responsive: true,
53
+ authModel: projectType === "dashboard" ? "rbac" : "custom",
54
+ },
55
+ instructions: {
56
+ codingStyle: buildCodingStyle(projectType),
57
+ reviewRules: [
58
+ "Prefer existing design-system components first.",
59
+ "Do not introduce new UI libraries without approval.",
60
+ ],
61
+ },
62
+ generated: {
63
+ prompts: "master",
64
+ skills: false,
65
+ agents: false,
66
+ mcpPresets: [],
67
+ ...options.generated,
68
+ },
69
+ });
70
+ }
71
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/manifest/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAW1C,SAAS,gBAAgB,CAAC,WAAwB;IAChD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,6BAA6B;YAC7B,8DAA8D;YAC9D,yEAAyE;SAC1E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,6BAA6B;QAC7B,8DAA8D;QAC9D,4DAA4D;KAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAmC;IAEnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC;IAEvD,OAAO,cAAc,CAAC,KAAK,CAAC;QAC1B,aAAa,EAAE,sBAAsB;QACrC,OAAO,EAAE;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,IAAI;SACf;QACD,KAAK,EAAE;YACL,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;YACd,GAAG,OAAO,CAAC,KAAK;SACjB;QACD,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,KAAK;YACV,GAAG,OAAO,CAAC,OAAO;SACnB;QACD,SAAS,EAAE;YACT,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC1B,KAAK,EAAE,aAAa;SACrB;QACD,WAAW,EAAE;YACX,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;SAC3D;QACD,YAAY,EAAE;YACZ,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC;YAC1C,WAAW,EAAE;gBACX,iDAAiD;gBACjD,qDAAqD;aACtD;SACF;QACD,SAAS,EAAE;YACT,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,EAAE;YACd,GAAG,OAAO,CAAC,SAAS;SACrB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Framework, Manifest } from "./schema.js";
2
+ export type LoadedManifest = {
3
+ manifest: Manifest;
4
+ sharedPath: string;
5
+ localPath: string | undefined;
6
+ };
7
+ export declare function loadManifest(cwd: string, fallback?: {
8
+ projectName?: string;
9
+ framework?: Framework;
10
+ }): Promise<LoadedManifest>;
@@ -0,0 +1,34 @@
1
+ import { access } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { readJsonFile } from "../utils/json.js";
4
+ import { normalizeManifest } from "./normalize.js";
5
+ async function fileExists(filePath) {
6
+ try {
7
+ await access(filePath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ export async function loadManifest(cwd, fallback) {
15
+ const sharedPath = join(cwd, "ai-workspace.json");
16
+ const localPath = join(cwd, "ai-workspace.local.json");
17
+ if (!(await fileExists(sharedPath))) {
18
+ throw new Error(`No manifest found at ${sharedPath}`);
19
+ }
20
+ const sharedInput = await readJsonFile(sharedPath);
21
+ const localInput = (await fileExists(localPath))
22
+ ? await readJsonFile(localPath)
23
+ : undefined;
24
+ return {
25
+ manifest: normalizeManifest(sharedInput, {
26
+ projectName: fallback?.projectName ?? basename(cwd),
27
+ ...(fallback?.framework ? { framework: fallback.framework } : {}),
28
+ ...(localInput === undefined ? {} : { localOverride: localInput }),
29
+ }),
30
+ sharedPath,
31
+ localPath: localInput === undefined ? undefined : localPath,
32
+ };
33
+ }
34
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/manifest/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASnD,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,YAAY,CAChC,GAAW,EACX,QAA0D;IAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAEvD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,YAAY,CAAU,UAAU,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,YAAY,CAAU,SAAS,CAAC;QACxC,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE,iBAAiB,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC;YACnD,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SACnE,CAAC;QACF,UAAU;QACV,SAAS,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Framework, type Manifest } from "./schema.js";
2
+ export type NormalizeManifestOptions = {
3
+ projectName: string;
4
+ framework?: Framework;
5
+ localOverride?: unknown;
6
+ };
7
+ export declare function normalizeManifest(sharedInput: unknown, options: NormalizeManifestOptions): Manifest;
@@ -0,0 +1,40 @@
1
+ import { buildRecommendedManifest } from "./defaults.js";
2
+ import { localOverrideSchema, manifestSchema, } from "./schema.js";
3
+ import { isRecord } from "../utils/json.js";
4
+ function mergePlainObjects(base, override) {
5
+ if (override === undefined) {
6
+ return base;
7
+ }
8
+ if (Array.isArray(override)) {
9
+ return override;
10
+ }
11
+ if (!isRecord(base) || !isRecord(override)) {
12
+ return override;
13
+ }
14
+ const merged = { ...base };
15
+ for (const [key, value] of Object.entries(override)) {
16
+ const current = merged[key];
17
+ if (Array.isArray(value)) {
18
+ merged[key] = value;
19
+ continue;
20
+ }
21
+ if (isRecord(current) && isRecord(value)) {
22
+ merged[key] = mergePlainObjects(current, value);
23
+ continue;
24
+ }
25
+ merged[key] = value;
26
+ }
27
+ return merged;
28
+ }
29
+ export function normalizeManifest(sharedInput, options) {
30
+ const baseManifest = buildRecommendedManifest({
31
+ name: options.projectName,
32
+ framework: options.framework ?? "react",
33
+ });
34
+ const mergedShared = mergePlainObjects(baseManifest, sharedInput);
35
+ const mergedWithLocal = options.localOverride === undefined
36
+ ? mergedShared
37
+ : mergePlainObjects(mergedShared, localOverrideSchema.parse(options.localOverride));
38
+ return manifestSchema.parse(mergedWithLocal);
39
+ }
40
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/manifest/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,SAAS,iBAAiB,CAAI,IAAO,EAAE,QAAiB;IACtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAa,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAQD,MAAM,UAAU,iBAAiB,CAC/B,WAAoB,EACpB,OAAiC;IAEjC,MAAM,YAAY,GAAG,wBAAwB,CAAC;QAC5C,IAAI,EAAE,OAAO,CAAC,WAAW;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO;KACxC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,eAAe,GACnB,OAAO,CAAC,aAAa,KAAK,SAAS;QACjC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,iBAAiB,CAAC,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAExF,OAAO,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Manifest } from "./schema.js";
2
+ export declare function saveManifest(cwd: string, manifest: Manifest): Promise<string>;
@@ -0,0 +1,9 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { formatJson } from "../utils/json.js";
4
+ export async function saveManifest(cwd, manifest) {
5
+ const manifestPath = join(cwd, "ai-workspace.json");
6
+ await writeFile(manifestPath, formatJson(manifest), "utf8");
7
+ return manifestPath;
8
+ }
9
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/manifest/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAkB;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAEpD,MAAM,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5D,OAAO,YAAY,CAAC;AACtB,CAAC"}