@contractspec/bundle.workspace 1.45.4 → 1.45.5

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 (54) hide show
  1. package/dist/adapters/fs.d.ts +2 -1
  2. package/dist/adapters/fs.d.ts.map +1 -1
  3. package/dist/adapters/fs.js +1 -1
  4. package/dist/adapters/fs.js.map +1 -1
  5. package/dist/adapters/git.js +29 -0
  6. package/dist/adapters/git.js.map +1 -1
  7. package/dist/adapters/index.d.ts +1 -1
  8. package/dist/adapters/index.js +1 -1
  9. package/dist/index.d.ts +10 -7
  10. package/dist/index.js +4 -2
  11. package/dist/ports/git.d.ts +14 -1
  12. package/dist/ports/git.d.ts.map +1 -1
  13. package/dist/ports/index.d.ts +1 -1
  14. package/dist/services/doctor/checks/config.js +132 -0
  15. package/dist/services/doctor/checks/config.js.map +1 -1
  16. package/dist/services/hooks/hooks-service.d.ts +24 -0
  17. package/dist/services/hooks/hooks-service.d.ts.map +1 -0
  18. package/dist/services/hooks/hooks-service.js +126 -0
  19. package/dist/services/hooks/hooks-service.js.map +1 -0
  20. package/dist/services/hooks/index.d.ts +10 -0
  21. package/dist/services/hooks/index.d.ts.map +1 -0
  22. package/dist/services/hooks/index.js +12 -0
  23. package/dist/services/hooks/index.js.map +1 -0
  24. package/dist/services/hooks/types.d.ts +56 -0
  25. package/dist/services/hooks/types.d.ts.map +1 -0
  26. package/dist/services/index.d.ts +4 -1
  27. package/dist/services/index.js +2 -0
  28. package/dist/services/setup/config-generators.d.ts.map +1 -1
  29. package/dist/services/setup/config-generators.js +14 -0
  30. package/dist/services/setup/config-generators.js.map +1 -1
  31. package/dist/services/upgrade/index.d.ts +10 -0
  32. package/dist/services/upgrade/index.d.ts.map +1 -0
  33. package/dist/services/upgrade/index.js +15 -0
  34. package/dist/services/upgrade/index.js.map +1 -0
  35. package/dist/services/upgrade/types.d.ts +78 -0
  36. package/dist/services/upgrade/types.d.ts.map +1 -0
  37. package/dist/services/upgrade/upgrade-service.d.ts +38 -0
  38. package/dist/services/upgrade/upgrade-service.d.ts.map +1 -0
  39. package/dist/services/upgrade/upgrade-service.js +201 -0
  40. package/dist/services/upgrade/upgrade-service.js.map +1 -0
  41. package/dist/services/versioning/conventional-commits.d.ts +95 -0
  42. package/dist/services/versioning/conventional-commits.d.ts.map +1 -0
  43. package/dist/services/versioning/conventional-commits.js +184 -0
  44. package/dist/services/versioning/conventional-commits.js.map +1 -0
  45. package/dist/services/versioning/index.d.ts +4 -3
  46. package/dist/services/versioning/index.js +13 -2
  47. package/dist/services/versioning/index.js.map +1 -1
  48. package/dist/services/versioning/types.d.ts +9 -7
  49. package/dist/services/versioning/types.d.ts.map +1 -1
  50. package/dist/services/versioning/versioning-service.d.ts +43 -1
  51. package/dist/services/versioning/versioning-service.d.ts.map +1 -1
  52. package/dist/services/versioning/versioning-service.js +144 -2
  53. package/dist/services/versioning/versioning-service.js.map +1 -1
  54. package/package.json +7 -7
@@ -0,0 +1,126 @@
1
+ import { findWorkspaceRoot } from "../../adapters/workspace.js";
2
+ import { exec } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+
5
+ //#region src/services/hooks/hooks-service.ts
6
+ /**
7
+ * Hooks service.
8
+ *
9
+ * Runs git hook checks configured in .contractsrc.json.
10
+ * This service is platform-agnostic and can be used by CLI, VSCode, or other apps.
11
+ *
12
+ * @module services/hooks
13
+ */
14
+ const execAsync = promisify(exec);
15
+ /**
16
+ * Run a configured git hook.
17
+ *
18
+ * Note: Uses node:child_process for compatibility with VSCode (Node.js) and CLI (Bun).
19
+ * Although Bun shell ($) is preferred for scripts, this shared bundle must support both runtimes.
20
+ */
21
+ async function runHook(adapters, options) {
22
+ const { fs, logger } = adapters;
23
+ const { hookName, dryRun = false } = options;
24
+ const workspaceRoot = findWorkspaceRoot(options.workspaceRoot);
25
+ logger.info(`Running hook: ${hookName}`, {
26
+ workspaceRoot,
27
+ dryRun
28
+ });
29
+ const hooksConfig = await loadHooksConfig(fs, workspaceRoot);
30
+ if (!hooksConfig) return {
31
+ hookName,
32
+ success: false,
33
+ commandResults: [],
34
+ totalCommands: 0,
35
+ successfulCommands: 0,
36
+ summary: "No hooks configuration found in .contractsrc.json"
37
+ };
38
+ const commands = hooksConfig[hookName];
39
+ if (!commands || commands.length === 0) return {
40
+ hookName,
41
+ success: true,
42
+ commandResults: [],
43
+ totalCommands: 0,
44
+ successfulCommands: 0,
45
+ summary: `No commands configured for hook: ${hookName}`
46
+ };
47
+ logger.info(`Found ${commands.length} command(s) for ${hookName}`);
48
+ const commandResults = [];
49
+ let allSuccess = true;
50
+ for (const command of commands) {
51
+ if (dryRun) {
52
+ logger.info(`[DRY RUN] Would execute: ${command}`);
53
+ commandResults.push({
54
+ command,
55
+ success: true,
56
+ exitCode: 0,
57
+ stdout: "",
58
+ stderr: ""
59
+ });
60
+ continue;
61
+ }
62
+ logger.info(`Executing: ${command}`);
63
+ try {
64
+ const { stdout, stderr } = await execAsync(command, {
65
+ cwd: workspaceRoot,
66
+ timeout: 3e5
67
+ });
68
+ commandResults.push({
69
+ command,
70
+ success: true,
71
+ exitCode: 0,
72
+ stdout,
73
+ stderr
74
+ });
75
+ logger.info(`✓ ${command}`);
76
+ } catch (error) {
77
+ allSuccess = false;
78
+ const execError = error;
79
+ commandResults.push({
80
+ command,
81
+ success: false,
82
+ exitCode: execError.code ?? 1,
83
+ stdout: execError.stdout ?? "",
84
+ stderr: execError.stderr ?? execError.message ?? String(error)
85
+ });
86
+ logger.error(`✗ ${command}`, {
87
+ exitCode: execError.code,
88
+ stderr: execError.stderr
89
+ });
90
+ break;
91
+ }
92
+ }
93
+ const successfulCommands = commandResults.filter((r) => r.success).length;
94
+ return {
95
+ hookName,
96
+ success: allSuccess,
97
+ commandResults,
98
+ totalCommands: commands.length,
99
+ successfulCommands,
100
+ summary: allSuccess ? `✓ All ${commands.length} command(s) passed` : `✗ ${successfulCommands}/${commands.length} command(s) passed`
101
+ };
102
+ }
103
+ /**
104
+ * Get available hooks from configuration.
105
+ */
106
+ async function getAvailableHooks(adapters, workspaceRoot) {
107
+ const hooksConfig = await loadHooksConfig(adapters.fs, workspaceRoot);
108
+ return hooksConfig ? Object.keys(hooksConfig) : [];
109
+ }
110
+ /**
111
+ * Load hooks configuration from .contractsrc.json.
112
+ */
113
+ async function loadHooksConfig(fs, workspaceRoot) {
114
+ const configPath = fs.join(workspaceRoot, ".contractsrc.json");
115
+ if (!await fs.exists(configPath)) return null;
116
+ try {
117
+ const content = await fs.readFile(configPath);
118
+ return JSON.parse(content).hooks ?? null;
119
+ } catch {
120
+ return null;
121
+ }
122
+ }
123
+
124
+ //#endregion
125
+ export { getAvailableHooks, runHook };
126
+ //# sourceMappingURL=hooks-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-service.js","names":["commandResults: HookCommandResult[]"],"sources":["../../../src/services/hooks/hooks-service.ts"],"sourcesContent":["/**\n * Hooks service.\n *\n * Runs git hook checks configured in .contractsrc.json.\n * This service is platform-agnostic and can be used by CLI, VSCode, or other apps.\n *\n * @module services/hooks\n */\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport { findWorkspaceRoot } from '../../adapters/workspace';\nimport type {\n HookRunOptions,\n HookRunResult,\n HookCommandResult,\n HooksConfig,\n} from './types';\n\nconst execAsync = promisify(exec);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapters Type\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ServiceAdapters {\n fs: FsAdapter;\n logger: LoggerAdapter;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Run Hooks\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Run a configured git hook.\n *\n * Note: Uses node:child_process for compatibility with VSCode (Node.js) and CLI (Bun).\n * Although Bun shell ($) is preferred for scripts, this shared bundle must support both runtimes.\n */\nexport async function runHook(\n adapters: ServiceAdapters,\n options: HookRunOptions\n): Promise<HookRunResult> {\n const { fs, logger } = adapters;\n const { hookName, dryRun = false } = options;\n const workspaceRoot = findWorkspaceRoot(options.workspaceRoot);\n\n logger.info(`Running hook: ${hookName}`, { workspaceRoot, dryRun });\n\n // Load hooks config\n const hooksConfig = await loadHooksConfig(fs, workspaceRoot);\n\n if (!hooksConfig) {\n return {\n hookName,\n success: false,\n commandResults: [],\n totalCommands: 0,\n successfulCommands: 0,\n summary: 'No hooks configuration found in .contractsrc.json',\n };\n }\n\n const commands = hooksConfig[hookName];\n\n if (!commands || commands.length === 0) {\n return {\n hookName,\n success: true,\n commandResults: [],\n totalCommands: 0,\n successfulCommands: 0,\n summary: `No commands configured for hook: ${hookName}`,\n };\n }\n\n logger.info(`Found ${commands.length} command(s) for ${hookName}`);\n\n const commandResults: HookCommandResult[] = [];\n let allSuccess = true;\n\n for (const command of commands) {\n if (dryRun) {\n logger.info(`[DRY RUN] Would execute: ${command}`);\n commandResults.push({\n command,\n success: true,\n exitCode: 0,\n stdout: '',\n stderr: '',\n });\n continue;\n }\n\n logger.info(`Executing: ${command}`);\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: workspaceRoot,\n timeout: 300_000, // 5 minute timeout\n });\n\n commandResults.push({\n command,\n success: true,\n exitCode: 0,\n stdout,\n stderr,\n });\n\n logger.info(`✓ ${command}`);\n } catch (error) {\n allSuccess = false;\n\n const execError = error as {\n code?: number;\n stdout?: string;\n stderr?: string;\n message?: string;\n };\n\n commandResults.push({\n command,\n success: false,\n exitCode: execError.code ?? 1,\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? execError.message ?? String(error),\n });\n\n logger.error(`✗ ${command}`, {\n exitCode: execError.code,\n stderr: execError.stderr,\n });\n\n // Stop on first failure\n break;\n }\n }\n\n const successfulCommands = commandResults.filter((r) => r.success).length;\n\n return {\n hookName,\n success: allSuccess,\n commandResults,\n totalCommands: commands.length,\n successfulCommands,\n summary: allSuccess\n ? `✓ All ${commands.length} command(s) passed`\n : `✗ ${successfulCommands}/${commands.length} command(s) passed`,\n };\n}\n\n/**\n * Get available hooks from configuration.\n */\nexport async function getAvailableHooks(\n adapters: ServiceAdapters,\n workspaceRoot: string\n): Promise<string[]> {\n const hooksConfig = await loadHooksConfig(adapters.fs, workspaceRoot);\n return hooksConfig ? Object.keys(hooksConfig) : [];\n}\n\n/**\n * Load hooks configuration from .contractsrc.json.\n */\nasync function loadHooksConfig(\n fs: FsAdapter,\n workspaceRoot: string\n): Promise<HooksConfig | null> {\n const configPath = fs.join(workspaceRoot, '.contractsrc.json');\n\n if (!(await fs.exists(configPath))) {\n return null;\n }\n\n try {\n const content = await fs.readFile(configPath);\n const config = JSON.parse(content) as { hooks?: HooksConfig };\n return config.hooks ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,YAAY,UAAU,KAAK;;;;;;;AAqBjC,eAAsB,QACpB,UACA,SACwB;CACxB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,UAAU,SAAS,UAAU;CACrC,MAAM,gBAAgB,kBAAkB,QAAQ,cAAc;AAE9D,QAAO,KAAK,iBAAiB,YAAY;EAAE;EAAe;EAAQ,CAAC;CAGnE,MAAM,cAAc,MAAM,gBAAgB,IAAI,cAAc;AAE5D,KAAI,CAAC,YACH,QAAO;EACL;EACA,SAAS;EACT,gBAAgB,EAAE;EAClB,eAAe;EACf,oBAAoB;EACpB,SAAS;EACV;CAGH,MAAM,WAAW,YAAY;AAE7B,KAAI,CAAC,YAAY,SAAS,WAAW,EACnC,QAAO;EACL;EACA,SAAS;EACT,gBAAgB,EAAE;EAClB,eAAe;EACf,oBAAoB;EACpB,SAAS,oCAAoC;EAC9C;AAGH,QAAO,KAAK,SAAS,SAAS,OAAO,kBAAkB,WAAW;CAElE,MAAMA,iBAAsC,EAAE;CAC9C,IAAI,aAAa;AAEjB,MAAK,MAAM,WAAW,UAAU;AAC9B,MAAI,QAAQ;AACV,UAAO,KAAK,4BAA4B,UAAU;AAClD,kBAAe,KAAK;IAClB;IACA,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;IACT,CAAC;AACF;;AAGF,SAAO,KAAK,cAAc,UAAU;AAEpC,MAAI;GACF,MAAM,EAAE,QAAQ,WAAW,MAAM,UAAU,SAAS;IAClD,KAAK;IACL,SAAS;IACV,CAAC;AAEF,kBAAe,KAAK;IAClB;IACA,SAAS;IACT,UAAU;IACV;IACA;IACD,CAAC;AAEF,UAAO,KAAK,KAAK,UAAU;WACpB,OAAO;AACd,gBAAa;GAEb,MAAM,YAAY;AAOlB,kBAAe,KAAK;IAClB;IACA,SAAS;IACT,UAAU,UAAU,QAAQ;IAC5B,QAAQ,UAAU,UAAU;IAC5B,QAAQ,UAAU,UAAU,UAAU,WAAW,OAAO,MAAM;IAC/D,CAAC;AAEF,UAAO,MAAM,KAAK,WAAW;IAC3B,UAAU,UAAU;IACpB,QAAQ,UAAU;IACnB,CAAC;AAGF;;;CAIJ,MAAM,qBAAqB,eAAe,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAEnE,QAAO;EACL;EACA,SAAS;EACT;EACA,eAAe,SAAS;EACxB;EACA,SAAS,aACL,SAAS,SAAS,OAAO,sBACzB,KAAK,mBAAmB,GAAG,SAAS,OAAO;EAChD;;;;;AAMH,eAAsB,kBACpB,UACA,eACmB;CACnB,MAAM,cAAc,MAAM,gBAAgB,SAAS,IAAI,cAAc;AACrE,QAAO,cAAc,OAAO,KAAK,YAAY,GAAG,EAAE;;;;;AAMpD,eAAe,gBACb,IACA,eAC6B;CAC7B,MAAM,aAAa,GAAG,KAAK,eAAe,oBAAoB;AAE9D,KAAI,CAAE,MAAM,GAAG,OAAO,WAAW,CAC/B,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,WAAW;AAE7C,SADe,KAAK,MAAM,QAAQ,CACpB,SAAS;SACjB;AACN,SAAO"}
@@ -0,0 +1,10 @@
1
+ import { HookCommandResult, HookRunOptions, HookRunResult, HooksConfig } from "./types.js";
2
+ import { getAvailableHooks, runHook } from "./hooks-service.js";
3
+
4
+ //#region src/services/hooks/index.d.ts
5
+ declare namespace index_d_exports {
6
+ export { HookCommandResult, HookRunOptions, HookRunResult, HooksConfig, getAvailableHooks, runHook };
7
+ }
8
+ //#endregion
9
+ export { index_d_exports };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/services/hooks/index.ts"],"sourcesContent":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { __exportAll } from "../../_virtual/rolldown_runtime.js";
2
+ import { getAvailableHooks, runHook } from "./hooks-service.js";
3
+
4
+ //#region src/services/hooks/index.ts
5
+ var hooks_exports = /* @__PURE__ */ __exportAll({
6
+ getAvailableHooks: () => getAvailableHooks,
7
+ runHook: () => runHook
8
+ });
9
+
10
+ //#endregion
11
+ export { hooks_exports };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/services/hooks/index.ts"],"sourcesContent":["/**\n * Hooks service module.\n *\n * Provides hook execution for git hooks configured in .contractsrc.json.\n */\n\nexport * from './types';\nexport { runHook, getAvailableHooks } from './hooks-service';\n"],"mappings":""}
@@ -0,0 +1,56 @@
1
+ //#region src/services/hooks/types.d.ts
2
+ /**
3
+ * Hooks service types.
4
+ *
5
+ * Types for running git hook checks configured in .contractsrc.json.
6
+ */
7
+ /**
8
+ * Options for running hooks.
9
+ */
10
+ interface HookRunOptions {
11
+ /** Name of the hook to run (e.g., 'pre-commit'). */
12
+ hookName: string;
13
+ /** Workspace root directory. */
14
+ workspaceRoot: string;
15
+ /** If true, show commands without executing. */
16
+ dryRun?: boolean;
17
+ }
18
+ /**
19
+ * Result of a single command execution.
20
+ */
21
+ interface HookCommandResult {
22
+ /** The command that was executed. */
23
+ command: string;
24
+ /** Whether the command succeeded. */
25
+ success: boolean;
26
+ /** Exit code. */
27
+ exitCode: number;
28
+ /** stdout output. */
29
+ stdout: string;
30
+ /** stderr output. */
31
+ stderr: string;
32
+ }
33
+ /**
34
+ * Result of running a hook.
35
+ */
36
+ interface HookRunResult {
37
+ /** Hook name that was run. */
38
+ hookName: string;
39
+ /** Whether all commands succeeded. */
40
+ success: boolean;
41
+ /** Results for each command. */
42
+ commandResults: HookCommandResult[];
43
+ /** Total commands executed. */
44
+ totalCommands: number;
45
+ /** Number of successful commands. */
46
+ successfulCommands: number;
47
+ /** Summary message. */
48
+ summary: string;
49
+ }
50
+ /**
51
+ * Hooks configuration from .contractsrc.json.
52
+ */
53
+ type HooksConfig = Record<string, string[]>;
54
+ //#endregion
55
+ export { HookCommandResult, HookRunOptions, HookRunResult, HooksConfig };
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/hooks/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAYA;AAgBA;AAkBA;;;;UA9CiB,cAAA;;;;;;;;;;;UAYA,iBAAA;;;;;;;;;;;;;;;UAgBA,aAAA;;;;;;kBAMC;;;;;;;;;;;KAYN,WAAA,GAAc"}
@@ -84,4 +84,7 @@ import { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs } from "./
84
84
  import "./docs/index.js";
85
85
  import { index_d_exports } from "./impact/index.js";
86
86
  import { FormatterOptions, formatFiles } from "./formatter.js";
87
- import { index_d_exports as index_d_exports$1 } from "./versioning/index.js";
87
+ import { SpecVersionAnalysis } from "./versioning/types.js";
88
+ import { index_d_exports as index_d_exports$1 } from "./versioning/index.js";
89
+ import { index_d_exports as index_d_exports$2 } from "./upgrade/index.js";
90
+ import { index_d_exports as index_d_exports$3 } from "./hooks/index.js";
@@ -82,3 +82,5 @@ import "./docs/index.js";
82
82
  import { impact_exports } from "./impact/index.js";
83
83
  import { formatFiles } from "./formatter.js";
84
84
  import { versioning_exports } from "./versioning/index.js";
85
+ import { upgrade_exports } from "./upgrade/index.js";
86
+ import { hooks_exports } from "./hooks/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"config-generators.d.ts","names":[],"sources":["../../../src/services/setup/config-generators.ts"],"sourcesContent":[],"mappings":";;;;AA0EA;AAgBA;AAwEA;AA4GA;;iBAjQgB,yBAAA,UAAmC;;;;iBA8BnC,sBAAA,CAAA;;;;iBAgBA,uBAAA,CAAA;;;;;iBAeA,uBAAA,CAAA;;;;;;iBAgBA,mBAAA,UAA6B;;;;;;iBAwE7B,gBAAA,UAA0B;;;;iBA4G1B,0BAAA,CAAA"}
1
+ {"version":3,"file":"config-generators.d.ts","names":[],"sources":["../../../src/services/setup/config-generators.ts"],"sourcesContent":[],"mappings":";;;;AA2FA;AAgBA;AAwEA;AA4GA;;iBAlRgB,yBAAA,UAAmC;;;;iBA+CnC,sBAAA,CAAA;;;;iBAgBA,uBAAA,CAAA;;;;;iBAeA,uBAAA,CAAA;;;;;;iBAgBA,mBAAA,UAA6B;;;;;;iBAwE7B,gBAAA,UAA0B;;;;iBA4G1B,0BAAA,CAAA"}
@@ -21,6 +21,20 @@ function generateContractsrcConfig(options) {
21
21
  },
22
22
  defaultOwners: options.defaultOwners ?? ["@team"],
23
23
  defaultTags: [],
24
+ versioning: {
25
+ autoBump: false,
26
+ bumpStrategy: "impact",
27
+ changelogTiers: [
28
+ "spec",
29
+ "library",
30
+ "monorepo"
31
+ ],
32
+ format: "keep-a-changelog",
33
+ commitChanges: false,
34
+ createTags: false,
35
+ integrateWithChangesets: true
36
+ },
37
+ hooks: { "pre-commit": ["contractspec validate **/*.operation.ts", "contractspec integrity check"] },
24
38
  ...isPackageLevel && options.packageName ? { package: options.packageName } : {}
25
39
  };
26
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-generators.js","names":[],"sources":["../../../src/services/setup/config-generators.ts"],"sourcesContent":["/**\n * Config generators for setup targets.\n *\n * Each generator returns the default configuration for a target.\n */\n\nimport type { SetupOptions } from './types';\n\n/**\n * Generate .contractsrc.json content.\n *\n * Adapts defaults based on monorepo scope.\n */\nexport function generateContractsrcConfig(options: SetupOptions): object {\n // For package-level config in monorepo, use simpler relative paths\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n return {\n $schema: 'https://api.contractspec.io/schemas/contractsrc.json',\n aiProvider: 'claude',\n aiModel: 'claude-sonnet-4-20250514',\n agentMode: 'claude-code',\n // outputDir is relative to the config file location\n outputDir: './src',\n conventions: {\n operations: 'contracts/operations',\n events: 'contracts/events',\n presentations: 'contracts/presentations',\n forms: 'contracts/forms',\n features: 'contracts/features',\n },\n defaultOwners: options.defaultOwners ?? ['@team'],\n defaultTags: [],\n // Add monorepo hint if at package level\n ...(isPackageLevel && options.packageName\n ? { package: options.packageName }\n : {}),\n };\n}\n\n/**\n * Generate .vscode/settings.json ContractSpec settings.\n */\nexport function generateVscodeSettings(): object {\n return {\n 'contractspec.validation.enabled': true,\n 'contractspec.validation.validateOnSave': true,\n 'contractspec.validation.validateOnOpen': true,\n 'contractspec.codeLens.enabled': true,\n 'contractspec.diagnostics.showWarnings': true,\n 'contractspec.diagnostics.showHints': true,\n 'contractspec.integrity.enabled': true,\n 'contractspec.integrity.checkOnSave': true,\n };\n}\n\n/**\n * Generate .cursor/mcp.json content.\n */\nexport function generateCursorMcpConfig(): object {\n return {\n mcpServers: {\n 'contractspec-local': {\n command: 'bunx',\n args: ['contractspec-mcp'],\n },\n },\n };\n}\n\n/**\n * Generate Claude Desktop MCP config.\n * Returns the mcpServers section to merge into claude_desktop_config.json.\n */\nexport function generateClaudeMcpConfig(): object {\n return {\n mcpServers: {\n 'contractspec-local': {\n command: 'bunx',\n args: ['contractspec-mcp'],\n },\n },\n };\n}\n\n/**\n * Generate .cursor/rules/contractspec.mdc content.\n *\n * Adapts paths based on monorepo scope.\n */\nexport function generateCursorRules(options: SetupOptions): string {\n const projectName = options.projectName ?? 'this project';\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n // Base contract path depends on scope\n const basePath =\n isPackageLevel && options.packageRoot\n ? `${options.packageRoot.split('/').slice(-2).join('/')}/src/contracts`\n : 'src/contracts';\n\n const monorepoNote = options.isMonorepo\n ? `\\n## Monorepo Structure\\n\\nThis is a monorepo. Contracts may exist at:\\n- Package level: \\`packages/*/src/contracts/\\`\\n- Workspace level: \\`src/contracts/\\`\\n\\nCheck the appropriate level based on the feature scope.\\n`\n : '';\n\n return `# ContractSpec Development Rules\n\nThis project uses ContractSpec for spec-first development. Follow these guidelines when working with AI agents.\n\n## Spec-First Principle\n\n- **Always update contracts first** before changing implementation code.\n- Contracts are the source of truth for operations, events, and presentations.\n- Implementation code should be generated or derived from contracts.\n${monorepoNote}\n## Contract Locations\n\nContracts are located in:\n- \\`${basePath}/operations/\\` - Command and query specs\n- \\`${basePath}/events/\\` - Event specs\n- \\`${basePath}/presentations/\\` - UI presentation specs\n- \\`${basePath}/features/\\` - Feature module specs\n\n## When Making Changes\n\n1. **Before coding**: Check if a contract exists for the feature.\n2. **If contract exists**: Update the contract first, then regenerate code.\n3. **If no contract**: Create a new contract using \\`contractspec create\\`.\n4. **After changes**: Validate with \\`contractspec validate\\`.\n\n## Key Commands\n\n- \\`contractspec create\\` - Scaffold new specs\n- \\`contractspec validate\\` - Validate specs\n- \\`contractspec build\\` - Generate implementation code\n- \\`contractspec integrity\\` - Check contract health\n\n## Contract Structure\n\nOperations follow this pattern:\n\\`\\`\\`typescript\ndefineCommand({\n meta: { name: 'service.action', version: '1.0.0', ... },\n io: { input: InputSchema, output: OutputSchema },\n policy: { auth: 'user', ... },\n handler: async (args, ctx) => { ... }\n});\n\\`\\`\\`\n\n## Rules for ${projectName}\n\n- All API endpoints must have a corresponding operation contract.\n- Events must be declared in contracts before being emitted.\n- UI components should reference presentation contracts.\n- Feature flags should be defined in feature modules.\n`;\n}\n\n/**\n * Generate AGENTS.md content.\n *\n * Adapts paths and instructions based on monorepo scope.\n */\nexport function generateAgentsMd(options: SetupOptions): string {\n const projectName = options.projectName ?? 'This Project';\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n // Contract path depends on scope\n const contractPath = 'src/contracts/';\n\n const monorepoSection = options.isMonorepo\n ? `\n## Monorepo Structure\n\nThis is a monorepo. Contracts can exist at multiple levels:\n\n| Level | Location | Use Case |\n|-------|----------|----------|\n| Package | \\`packages/*/src/contracts/\\` | Package-specific contracts |\n| Workspace | \\`src/contracts/\\` | Shared cross-package contracts |\n\nWhen adding a contract, consider:\n- Is this specific to one package? → Add at package level\n- Is this shared across packages? → Add at workspace level\n\n### Current Scope\n\n${isPackageLevel ? `You are working at the **package level**: \\`${options.packageName ?? options.packageRoot}\\`` : 'You are working at the **workspace level**.'}\n`\n : '';\n\n return `# AI Agent Guide\n\nThis repository uses **ContractSpec** for spec-first development. AI agents should follow these guidelines.\n\n## Project: ${projectName}\n\n## ContractSpec Overview\n\nContractSpec is a deterministic, spec-first compiler that keeps AI-written software coherent, safe, and regenerable.\n\n### Key Principles\n\n1. **Contracts are the source of truth** - Always check/update contracts before modifying implementation.\n2. **Safe regeneration** - Code can be regenerated from specs without breaking invariants.\n3. **Multi-surface consistency** - API, events, and UI stay in sync via shared contracts.\n${monorepoSection}\n## Working in This Repository\n\n### Before Making Changes\n\n1. Check for existing contracts in \\`${contractPath}\\`\n2. If a contract exists, update it first\n3. Regenerate implementation with \\`contractspec build\\`\n4. Validate with \\`contractspec validate\\`\n\n### Creating New Features\n\n1. Create a feature spec: \\`contractspec create --type=feature\\`\n2. Add operations: \\`contractspec create --type=operation\\`\n3. Add events if needed: \\`contractspec create --type=event\\`\n4. Build implementation: \\`contractspec build\\`\n\n### Contract Locations\n\n| Type | Location |\n|------|----------|\n| Operations | \\`${contractPath}operations/\\` |\n| Events | \\`${contractPath}events/\\` |\n| Presentations | \\`${contractPath}presentations/\\` |\n| Features | \\`${contractPath}features/\\` |\n\n## MCP Tools Available\n\nThe ContractSpec MCP server provides these tools:\n\n- \\`integrity.analyze\\` - Check contract health\n- \\`specs.list\\` - List all specs\n- \\`specs.validate\\` - Validate a spec file\n- \\`specs.create\\` - Create new specs\n- \\`deps.analyze\\` - Analyze dependencies\n\n## Common Tasks\n\n### Add a new API endpoint\n\n\\`\\`\\`bash\ncontractspec create --type=operation --name=myService.newAction\n\\`\\`\\`\n\n### Add a new event\n\n\\`\\`\\`bash\ncontractspec create --type=event --name=entity.changed\n\\`\\`\\`\n\n### Check contract integrity\n\n\\`\\`\\`bash\ncontractspec integrity\n\\`\\`\\`\n\n## Nested AGENTS.md\n\nMore specific instructions may exist in subdirectories. Check for \\`AGENTS.md\\` files in the relevant package or module.\n`;\n}\n\n/**\n * Get the file path for Claude Desktop config based on platform.\n */\nexport function getClaudeDesktopConfigPath(): string {\n const platform = process.platform;\n const homeDir = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '';\n\n switch (platform) {\n case 'darwin':\n return `${homeDir}/Library/Application Support/Claude/claude_desktop_config.json`;\n case 'win32':\n return `${process.env['APPDATA'] ?? homeDir}/Claude/claude_desktop_config.json`;\n default:\n // Linux and others\n return `${homeDir}/.config/claude/claude_desktop_config.json`;\n }\n}\n"],"mappings":";;;;;;AAaA,SAAgB,0BAA0B,SAA+B;CAEvE,MAAM,iBAAiB,QAAQ,cAAc,QAAQ,UAAU;AAE/D,QAAO;EACL,SAAS;EACT,YAAY;EACZ,SAAS;EACT,WAAW;EAEX,WAAW;EACX,aAAa;GACX,YAAY;GACZ,QAAQ;GACR,eAAe;GACf,OAAO;GACP,UAAU;GACX;EACD,eAAe,QAAQ,iBAAiB,CAAC,QAAQ;EACjD,aAAa,EAAE;EAEf,GAAI,kBAAkB,QAAQ,cAC1B,EAAE,SAAS,QAAQ,aAAa,GAChC,EAAE;EACP;;;;;AAMH,SAAgB,yBAAiC;AAC/C,QAAO;EACL,mCAAmC;EACnC,0CAA0C;EAC1C,0CAA0C;EAC1C,iCAAiC;EACjC,yCAAyC;EACzC,sCAAsC;EACtC,kCAAkC;EAClC,sCAAsC;EACvC;;;;;AAMH,SAAgB,0BAAkC;AAChD,QAAO,EACL,YAAY,EACV,sBAAsB;EACpB,SAAS;EACT,MAAM,CAAC,mBAAmB;EAC3B,EACF,EACF;;;;;;AAOH,SAAgB,0BAAkC;AAChD,QAAO,EACL,YAAY,EACV,sBAAsB;EACpB,SAAS;EACT,MAAM,CAAC,mBAAmB;EAC3B,EACF,EACF;;;;;;;AAQH,SAAgB,oBAAoB,SAA+B;CACjE,MAAM,cAAc,QAAQ,eAAe;CAI3C,MAAM,WAHiB,QAAQ,cAAc,QAAQ,UAAU,aAI3C,QAAQ,cACtB,GAAG,QAAQ,YAAY,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,kBACtD;AAMN,QAAO;;;;;;;;;EAJc,QAAQ,aACzB,+NACA,GAWS;;;;MAIT,SAAS;MACT,SAAS;MACT,SAAS;MACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4BA,YAAY;;;;;;;;;;;;;AAc3B,SAAgB,iBAAiB,SAA+B;CAC9D,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,iBAAiB,QAAQ,cAAc,QAAQ,UAAU;CAG/D,MAAM,eAAe;AAuBrB,QAAO;;;;cAIK,YAAY;;;;;;;;;;;EAzBA,QAAQ,aAC5B;;;;;;;;;;;;;;;;EAgBJ,iBAAiB,+CAA+C,QAAQ,eAAe,QAAQ,YAAY,MAAM,8CAA8C;IAE3J,GAiBY;;;;;uCAKqB,aAAa;;;;;;;;;;;;;;;;mBAgBjC,aAAa;eACjB,aAAa;sBACN,aAAa;iBAClB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC9B,SAAgB,6BAAqC;CACnD,MAAM,WAAW,QAAQ;CACzB,MAAM,UAAU,QAAQ,IAAI,WAAW,QAAQ,IAAI,kBAAkB;AAErE,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,GAAG,QAAQ;EACpB,KAAK,QACH,QAAO,GAAG,QAAQ,IAAI,cAAc,QAAQ;EAC9C,QAEE,QAAO,GAAG,QAAQ"}
1
+ {"version":3,"file":"config-generators.js","names":[],"sources":["../../../src/services/setup/config-generators.ts"],"sourcesContent":["/**\n * Config generators for setup targets.\n *\n * Each generator returns the default configuration for a target.\n */\n\nimport type { SetupOptions } from './types';\n\n/**\n * Generate .contractsrc.json content.\n *\n * Adapts defaults based on monorepo scope.\n */\nexport function generateContractsrcConfig(options: SetupOptions): object {\n // For package-level config in monorepo, use simpler relative paths\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n return {\n $schema: 'https://api.contractspec.io/schemas/contractsrc.json',\n aiProvider: 'claude',\n aiModel: 'claude-sonnet-4-20250514',\n agentMode: 'claude-code',\n // outputDir is relative to the config file location\n outputDir: './src',\n conventions: {\n operations: 'contracts/operations',\n events: 'contracts/events',\n presentations: 'contracts/presentations',\n forms: 'contracts/forms',\n features: 'contracts/features',\n },\n defaultOwners: options.defaultOwners ?? ['@team'],\n defaultTags: [],\n // Versioning configuration\n versioning: {\n autoBump: false,\n bumpStrategy: 'impact',\n changelogTiers: ['spec', 'library', 'monorepo'],\n format: 'keep-a-changelog',\n commitChanges: false,\n createTags: false,\n integrateWithChangesets: true, // Enable changesets integration by default\n },\n // Git hooks configuration (Husky compatible)\n hooks: {\n 'pre-commit': [\n 'contractspec validate **/*.operation.ts',\n 'contractspec integrity check',\n ],\n },\n // Add monorepo hint if at package level\n ...(isPackageLevel && options.packageName\n ? { package: options.packageName }\n : {}),\n };\n}\n\n/**\n * Generate .vscode/settings.json ContractSpec settings.\n */\nexport function generateVscodeSettings(): object {\n return {\n 'contractspec.validation.enabled': true,\n 'contractspec.validation.validateOnSave': true,\n 'contractspec.validation.validateOnOpen': true,\n 'contractspec.codeLens.enabled': true,\n 'contractspec.diagnostics.showWarnings': true,\n 'contractspec.diagnostics.showHints': true,\n 'contractspec.integrity.enabled': true,\n 'contractspec.integrity.checkOnSave': true,\n };\n}\n\n/**\n * Generate .cursor/mcp.json content.\n */\nexport function generateCursorMcpConfig(): object {\n return {\n mcpServers: {\n 'contractspec-local': {\n command: 'bunx',\n args: ['contractspec-mcp'],\n },\n },\n };\n}\n\n/**\n * Generate Claude Desktop MCP config.\n * Returns the mcpServers section to merge into claude_desktop_config.json.\n */\nexport function generateClaudeMcpConfig(): object {\n return {\n mcpServers: {\n 'contractspec-local': {\n command: 'bunx',\n args: ['contractspec-mcp'],\n },\n },\n };\n}\n\n/**\n * Generate .cursor/rules/contractspec.mdc content.\n *\n * Adapts paths based on monorepo scope.\n */\nexport function generateCursorRules(options: SetupOptions): string {\n const projectName = options.projectName ?? 'this project';\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n // Base contract path depends on scope\n const basePath =\n isPackageLevel && options.packageRoot\n ? `${options.packageRoot.split('/').slice(-2).join('/')}/src/contracts`\n : 'src/contracts';\n\n const monorepoNote = options.isMonorepo\n ? `\\n## Monorepo Structure\\n\\nThis is a monorepo. Contracts may exist at:\\n- Package level: \\`packages/*/src/contracts/\\`\\n- Workspace level: \\`src/contracts/\\`\\n\\nCheck the appropriate level based on the feature scope.\\n`\n : '';\n\n return `# ContractSpec Development Rules\n\nThis project uses ContractSpec for spec-first development. Follow these guidelines when working with AI agents.\n\n## Spec-First Principle\n\n- **Always update contracts first** before changing implementation code.\n- Contracts are the source of truth for operations, events, and presentations.\n- Implementation code should be generated or derived from contracts.\n${monorepoNote}\n## Contract Locations\n\nContracts are located in:\n- \\`${basePath}/operations/\\` - Command and query specs\n- \\`${basePath}/events/\\` - Event specs\n- \\`${basePath}/presentations/\\` - UI presentation specs\n- \\`${basePath}/features/\\` - Feature module specs\n\n## When Making Changes\n\n1. **Before coding**: Check if a contract exists for the feature.\n2. **If contract exists**: Update the contract first, then regenerate code.\n3. **If no contract**: Create a new contract using \\`contractspec create\\`.\n4. **After changes**: Validate with \\`contractspec validate\\`.\n\n## Key Commands\n\n- \\`contractspec create\\` - Scaffold new specs\n- \\`contractspec validate\\` - Validate specs\n- \\`contractspec build\\` - Generate implementation code\n- \\`contractspec integrity\\` - Check contract health\n\n## Contract Structure\n\nOperations follow this pattern:\n\\`\\`\\`typescript\ndefineCommand({\n meta: { name: 'service.action', version: '1.0.0', ... },\n io: { input: InputSchema, output: OutputSchema },\n policy: { auth: 'user', ... },\n handler: async (args, ctx) => { ... }\n});\n\\`\\`\\`\n\n## Rules for ${projectName}\n\n- All API endpoints must have a corresponding operation contract.\n- Events must be declared in contracts before being emitted.\n- UI components should reference presentation contracts.\n- Feature flags should be defined in feature modules.\n`;\n}\n\n/**\n * Generate AGENTS.md content.\n *\n * Adapts paths and instructions based on monorepo scope.\n */\nexport function generateAgentsMd(options: SetupOptions): string {\n const projectName = options.projectName ?? 'This Project';\n const isPackageLevel = options.isMonorepo && options.scope === 'package';\n\n // Contract path depends on scope\n const contractPath = 'src/contracts/';\n\n const monorepoSection = options.isMonorepo\n ? `\n## Monorepo Structure\n\nThis is a monorepo. Contracts can exist at multiple levels:\n\n| Level | Location | Use Case |\n|-------|----------|----------|\n| Package | \\`packages/*/src/contracts/\\` | Package-specific contracts |\n| Workspace | \\`src/contracts/\\` | Shared cross-package contracts |\n\nWhen adding a contract, consider:\n- Is this specific to one package? → Add at package level\n- Is this shared across packages? → Add at workspace level\n\n### Current Scope\n\n${isPackageLevel ? `You are working at the **package level**: \\`${options.packageName ?? options.packageRoot}\\`` : 'You are working at the **workspace level**.'}\n`\n : '';\n\n return `# AI Agent Guide\n\nThis repository uses **ContractSpec** for spec-first development. AI agents should follow these guidelines.\n\n## Project: ${projectName}\n\n## ContractSpec Overview\n\nContractSpec is a deterministic, spec-first compiler that keeps AI-written software coherent, safe, and regenerable.\n\n### Key Principles\n\n1. **Contracts are the source of truth** - Always check/update contracts before modifying implementation.\n2. **Safe regeneration** - Code can be regenerated from specs without breaking invariants.\n3. **Multi-surface consistency** - API, events, and UI stay in sync via shared contracts.\n${monorepoSection}\n## Working in This Repository\n\n### Before Making Changes\n\n1. Check for existing contracts in \\`${contractPath}\\`\n2. If a contract exists, update it first\n3. Regenerate implementation with \\`contractspec build\\`\n4. Validate with \\`contractspec validate\\`\n\n### Creating New Features\n\n1. Create a feature spec: \\`contractspec create --type=feature\\`\n2. Add operations: \\`contractspec create --type=operation\\`\n3. Add events if needed: \\`contractspec create --type=event\\`\n4. Build implementation: \\`contractspec build\\`\n\n### Contract Locations\n\n| Type | Location |\n|------|----------|\n| Operations | \\`${contractPath}operations/\\` |\n| Events | \\`${contractPath}events/\\` |\n| Presentations | \\`${contractPath}presentations/\\` |\n| Features | \\`${contractPath}features/\\` |\n\n## MCP Tools Available\n\nThe ContractSpec MCP server provides these tools:\n\n- \\`integrity.analyze\\` - Check contract health\n- \\`specs.list\\` - List all specs\n- \\`specs.validate\\` - Validate a spec file\n- \\`specs.create\\` - Create new specs\n- \\`deps.analyze\\` - Analyze dependencies\n\n## Common Tasks\n\n### Add a new API endpoint\n\n\\`\\`\\`bash\ncontractspec create --type=operation --name=myService.newAction\n\\`\\`\\`\n\n### Add a new event\n\n\\`\\`\\`bash\ncontractspec create --type=event --name=entity.changed\n\\`\\`\\`\n\n### Check contract integrity\n\n\\`\\`\\`bash\ncontractspec integrity\n\\`\\`\\`\n\n## Nested AGENTS.md\n\nMore specific instructions may exist in subdirectories. Check for \\`AGENTS.md\\` files in the relevant package or module.\n`;\n}\n\n/**\n * Get the file path for Claude Desktop config based on platform.\n */\nexport function getClaudeDesktopConfigPath(): string {\n const platform = process.platform;\n const homeDir = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '';\n\n switch (platform) {\n case 'darwin':\n return `${homeDir}/Library/Application Support/Claude/claude_desktop_config.json`;\n case 'win32':\n return `${process.env['APPDATA'] ?? homeDir}/Claude/claude_desktop_config.json`;\n default:\n // Linux and others\n return `${homeDir}/.config/claude/claude_desktop_config.json`;\n }\n}\n"],"mappings":";;;;;;AAaA,SAAgB,0BAA0B,SAA+B;CAEvE,MAAM,iBAAiB,QAAQ,cAAc,QAAQ,UAAU;AAE/D,QAAO;EACL,SAAS;EACT,YAAY;EACZ,SAAS;EACT,WAAW;EAEX,WAAW;EACX,aAAa;GACX,YAAY;GACZ,QAAQ;GACR,eAAe;GACf,OAAO;GACP,UAAU;GACX;EACD,eAAe,QAAQ,iBAAiB,CAAC,QAAQ;EACjD,aAAa,EAAE;EAEf,YAAY;GACV,UAAU;GACV,cAAc;GACd,gBAAgB;IAAC;IAAQ;IAAW;IAAW;GAC/C,QAAQ;GACR,eAAe;GACf,YAAY;GACZ,yBAAyB;GAC1B;EAED,OAAO,EACL,cAAc,CACZ,2CACA,+BACD,EACF;EAED,GAAI,kBAAkB,QAAQ,cAC1B,EAAE,SAAS,QAAQ,aAAa,GAChC,EAAE;EACP;;;;;AAMH,SAAgB,yBAAiC;AAC/C,QAAO;EACL,mCAAmC;EACnC,0CAA0C;EAC1C,0CAA0C;EAC1C,iCAAiC;EACjC,yCAAyC;EACzC,sCAAsC;EACtC,kCAAkC;EAClC,sCAAsC;EACvC;;;;;AAMH,SAAgB,0BAAkC;AAChD,QAAO,EACL,YAAY,EACV,sBAAsB;EACpB,SAAS;EACT,MAAM,CAAC,mBAAmB;EAC3B,EACF,EACF;;;;;;AAOH,SAAgB,0BAAkC;AAChD,QAAO,EACL,YAAY,EACV,sBAAsB;EACpB,SAAS;EACT,MAAM,CAAC,mBAAmB;EAC3B,EACF,EACF;;;;;;;AAQH,SAAgB,oBAAoB,SAA+B;CACjE,MAAM,cAAc,QAAQ,eAAe;CAI3C,MAAM,WAHiB,QAAQ,cAAc,QAAQ,UAAU,aAI3C,QAAQ,cACtB,GAAG,QAAQ,YAAY,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,kBACtD;AAMN,QAAO;;;;;;;;;EAJc,QAAQ,aACzB,+NACA,GAWS;;;;MAIT,SAAS;MACT,SAAS;MACT,SAAS;MACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4BA,YAAY;;;;;;;;;;;;;AAc3B,SAAgB,iBAAiB,SAA+B;CAC9D,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,iBAAiB,QAAQ,cAAc,QAAQ,UAAU;CAG/D,MAAM,eAAe;AAuBrB,QAAO;;;;cAIK,YAAY;;;;;;;;;;;EAzBA,QAAQ,aAC5B;;;;;;;;;;;;;;;;EAgBJ,iBAAiB,+CAA+C,QAAQ,eAAe,QAAQ,YAAY,MAAM,8CAA8C;IAE3J,GAiBY;;;;;uCAKqB,aAAa;;;;;;;;;;;;;;;;mBAgBjC,aAAa;eACjB,aAAa;sBACN,aAAa;iBAClB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC9B,SAAgB,6BAAqC;CACnD,MAAM,WAAW,QAAQ;CACzB,MAAM,UAAU,QAAQ,IAAI,WAAW,QAAQ,IAAI,kBAAkB;AAErE,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,GAAG,QAAQ;EACpB,KAAK,QACH,QAAO,GAAG,QAAQ,IAAI,cAAc,QAAQ;EAC9C,QAEE,QAAO,GAAG,QAAQ"}
@@ -0,0 +1,10 @@
1
+ import { ConfigUpgradeInfo, PackageUpgradeInfo, UpgradeAnalysisResult, UpgradeApplyResult, UpgradeOptions } from "./types.js";
2
+ import { analyzeUpgrades, applyConfigUpgrades, getDefaultHooksConfig, getDefaultVersioningConfig, getPackageUpgradeCommand } from "./upgrade-service.js";
3
+
4
+ //#region src/services/upgrade/index.d.ts
5
+ declare namespace index_d_exports {
6
+ export { ConfigUpgradeInfo, PackageUpgradeInfo, UpgradeAnalysisResult, UpgradeApplyResult, UpgradeOptions, analyzeUpgrades, applyConfigUpgrades, getDefaultHooksConfig, getDefaultVersioningConfig, getPackageUpgradeCommand };
7
+ }
8
+ //#endregion
9
+ export { index_d_exports };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/services/upgrade/index.ts"],"sourcesContent":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { __exportAll } from "../../_virtual/rolldown_runtime.js";
2
+ import { analyzeUpgrades, applyConfigUpgrades, getDefaultHooksConfig, getDefaultVersioningConfig, getPackageUpgradeCommand } from "./upgrade-service.js";
3
+
4
+ //#region src/services/upgrade/index.ts
5
+ var upgrade_exports = /* @__PURE__ */ __exportAll({
6
+ analyzeUpgrades: () => analyzeUpgrades,
7
+ applyConfigUpgrades: () => applyConfigUpgrades,
8
+ getDefaultHooksConfig: () => getDefaultHooksConfig,
9
+ getDefaultVersioningConfig: () => getDefaultVersioningConfig,
10
+ getPackageUpgradeCommand: () => getPackageUpgradeCommand
11
+ });
12
+
13
+ //#endregion
14
+ export { upgrade_exports };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/services/upgrade/index.ts"],"sourcesContent":["/**\n * Upgrade service module.\n *\n * Provides upgrade analysis and application for ContractSpec SDK and config.\n */\n\nexport * from './types';\nexport {\n analyzeUpgrades,\n applyConfigUpgrades,\n getPackageUpgradeCommand,\n getDefaultVersioningConfig,\n getDefaultHooksConfig,\n} from './upgrade-service';\n"],"mappings":""}
@@ -0,0 +1,78 @@
1
+ //#region src/services/upgrade/types.d.ts
2
+ /**
3
+ * Upgrade service types.
4
+ *
5
+ * Types for upgrading ContractSpec SDK and configuration.
6
+ */
7
+ /**
8
+ * Options for running an upgrade.
9
+ */
10
+ interface UpgradeOptions {
11
+ /** Root directory of the workspace. */
12
+ workspaceRoot: string;
13
+ /** Upgrade SDK packages. */
14
+ upgradePackages?: boolean;
15
+ /** Upgrade configuration. */
16
+ upgradeConfig?: boolean;
17
+ /** Preview changes without applying. */
18
+ dryRun?: boolean;
19
+ /** Use @latest tag instead of caret range. */
20
+ useLatest?: boolean;
21
+ }
22
+ /**
23
+ * Result of a package upgrade check.
24
+ */
25
+ interface PackageUpgradeInfo {
26
+ /** Package name. */
27
+ name: string;
28
+ /** Current version. */
29
+ currentVersion: string;
30
+ /** Latest available version (if known). */
31
+ latestVersion?: string;
32
+ /** Whether this is a dev dependency. */
33
+ isDevDependency: boolean;
34
+ }
35
+ /**
36
+ * Result of a config upgrade check.
37
+ */
38
+ interface ConfigUpgradeInfo {
39
+ /** Config key that needs upgrading. */
40
+ key: string;
41
+ /** Current value (if any). */
42
+ currentValue?: unknown;
43
+ /** Suggested new value. */
44
+ suggestedValue: unknown;
45
+ /** Whether this is a new key. */
46
+ isNew: boolean;
47
+ }
48
+ /**
49
+ * Result of the upgrade analysis.
50
+ */
51
+ interface UpgradeAnalysisResult {
52
+ /** Detected package manager. */
53
+ packageManager: string;
54
+ /** Packages that can be upgraded. */
55
+ packages: PackageUpgradeInfo[];
56
+ /** Config sections that need upgrading. */
57
+ configUpgrades: ConfigUpgradeInfo[];
58
+ /** Whether any upgrades are available. */
59
+ hasUpgrades: boolean;
60
+ }
61
+ /**
62
+ * Result of applying an upgrade.
63
+ */
64
+ interface UpgradeApplyResult {
65
+ /** Whether the upgrade was successful. */
66
+ success: boolean;
67
+ /** Number of packages upgraded. */
68
+ packagesUpgraded: number;
69
+ /** Number of config sections upgraded. */
70
+ configSectionsUpgraded: number;
71
+ /** Error message if failed. */
72
+ error?: string;
73
+ /** Summary message. */
74
+ summary: string;
75
+ }
76
+ //#endregion
77
+ export { ConfigUpgradeInfo, PackageUpgradeInfo, UpgradeAnalysisResult, UpgradeApplyResult, UpgradeOptions };
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/upgrade/types.ts"],"sourcesContent":[],"mappings":";;AAaA;AAgBA;AAcA;AAcA;AAcA;;;UA1DiB,cAAA;;;;;;;;;;;;;;;UAgBA,kBAAA;;;;;;;;;;;;;UAcA,iBAAA;;;;;;;;;;;;;UAcA,qBAAA;;;;YAIL;;kBAEM;;;;;;;UAQD,kBAAA"}
@@ -0,0 +1,38 @@
1
+ import { FsAdapter } from "../../ports/fs.js";
2
+ import { LoggerAdapter } from "../../ports/logger.js";
3
+ import { PackageUpgradeInfo, UpgradeAnalysisResult, UpgradeApplyResult, UpgradeOptions } from "./types.js";
4
+
5
+ //#region src/services/upgrade/upgrade-service.d.ts
6
+
7
+ interface ServiceAdapters {
8
+ fs: FsAdapter;
9
+ logger: LoggerAdapter;
10
+ }
11
+ /**
12
+ * Analyze what upgrades are available.
13
+ */
14
+ declare function analyzeUpgrades(adapters: ServiceAdapters, options: UpgradeOptions): Promise<UpgradeAnalysisResult>;
15
+ /**
16
+ * Apply configuration upgrades.
17
+ *
18
+ * Note: Package upgrades must be applied by the app layer (CLI, VSCode)
19
+ * since they require running npm/bun/yarn commands which is platform-specific.
20
+ */
21
+ declare function applyConfigUpgrades(adapters: ServiceAdapters, options: UpgradeOptions): Promise<UpgradeApplyResult>;
22
+ /**
23
+ * Get the command to upgrade packages.
24
+ *
25
+ * Returns the shell command string that the app layer should execute.
26
+ */
27
+ declare function getPackageUpgradeCommand(packageManager: string, packages: PackageUpgradeInfo[], useLatest: boolean): string;
28
+ /**
29
+ * Get default versioning configuration.
30
+ */
31
+ declare function getDefaultVersioningConfig(): Record<string, unknown>;
32
+ /**
33
+ * Get default hooks configuration.
34
+ */
35
+ declare function getDefaultHooksConfig(): Record<string, string[]>;
36
+ //#endregion
37
+ export { analyzeUpgrades, applyConfigUpgrades, getDefaultHooksConfig, getDefaultVersioningConfig, getPackageUpgradeCommand };
38
+ //# sourceMappingURL=upgrade-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-service.d.ts","names":[],"sources":["../../../src/services/upgrade/upgrade-service.ts"],"sourcesContent":[],"mappings":";;;;;;UAmCU,eAAA,CAeA;EAoJY,EAAA,EAlKhB,SAkKgB;EACV,MAAA,EAlKF,aAkKE;;;;;AA4FI,iBApPM,eAAA,CAoPkB,QAE5B,EArPA,eAqPkB,EAAA,OAAA,EApPnB,cAoPmB,CAAA,EAnP3B,OAmP2B,CAnPnB,qBAmPmB,CAAA;AA0B9B;AAeA;;;;;iBAxIsB,mBAAA,WACV,0BACD,iBACR,QAAQ;;;;;;iBA0FK,wBAAA,mCAEJ;;;;iBA0BI,0BAAA,CAAA,GAA8B;;;;iBAe9B,qBAAA,CAAA,GAAyB"}