@codluv/versionguard 0.1.1 → 0.2.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.
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import * as path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import chalk from "chalk";
6
6
  import { Command } from "commander";
7
- import { i as initConfig, g as getConfig, a as getPackageVersion, b as getVersionFeedback, v as validate, h as handlePostTag, c as getSyncFeedback, d as getChangelogFeedback, e as doctor, f as fixAll, j as fixSyncIssues, s as suggestNextVersion, k as setPackageVersion, l as createTag, m as installHooks, u as uninstallHooks, n as areHooksInstalled } from "./chunks/index-C6jrxye7.js";
7
+ import { i as initConfig, g as getConfig, a as getPackageVersion, b as getVersionFeedback, v as validate, h as handlePostTag, r as runGuardChecks, c as getSyncFeedback, d as getChangelogFeedback, e as doctor, f as fixAll, j as fixSyncIssues, s as suggestNextVersion, k as setPackageVersion, l as createTag, m as installHooks, u as uninstallHooks, n as areHooksInstalled } from "./chunks/index-BwE_OaV3.js";
8
8
  const CLI_DIR = path.dirname(fileURLToPath(import.meta.url));
9
9
  const CLI_VERSION = JSON.parse(fs.readFileSync(path.join(CLI_DIR, "..", "package.json"), "utf-8")).version;
10
10
  const styles = {
@@ -84,28 +84,33 @@ function createProgram() {
84
84
  process.exit(1);
85
85
  }
86
86
  });
87
- program.command("validate").description("Run full validation with smart feedback").option("-c, --cwd <path>", "Working directory", process.cwd()).option("--hook <name>", "Running as git hook").option("--json", "Print machine-readable JSON output").action((options) => {
87
+ program.command("validate").description("Run full validation with smart feedback").option("-c, --cwd <path>", "Working directory", process.cwd()).option("--hook <name>", "Running as git hook").option("--json", "Print machine-readable JSON output").option("--strict", "Run guard checks and fail on any policy gap or bypass").action((options) => {
88
88
  try {
89
89
  const config = getConfig(options.cwd);
90
90
  const version = getPackageVersion(options.cwd);
91
91
  const result = validate(config, options.cwd);
92
92
  let postTagResult;
93
+ let guardReport;
93
94
  if (options.hook === "post-tag") {
94
95
  postTagResult = handlePostTag(config, options.cwd);
95
96
  }
97
+ if (options.strict) {
98
+ guardReport = runGuardChecks(config, options.cwd);
99
+ }
96
100
  if (options.json) {
97
101
  console.log(
98
102
  JSON.stringify(
99
103
  {
100
104
  ...result,
101
105
  hook: options.hook ?? null,
102
- postTag: postTagResult ?? null
106
+ postTag: postTagResult ?? null,
107
+ guard: guardReport ?? null
103
108
  },
104
109
  null,
105
110
  2
106
111
  )
107
112
  );
108
- if (!result.valid || postTagResult && !postTagResult.success) {
113
+ if (!result.valid || postTagResult && !postTagResult.success || guardReport && !guardReport.safe) {
109
114
  process.exit(1);
110
115
  }
111
116
  return;
@@ -149,7 +154,18 @@ function createProgram() {
149
154
  process.exit(1);
150
155
  }
151
156
  }
152
- if (!result.valid) {
157
+ if (guardReport && guardReport.warnings.length > 0) {
158
+ console.log(styles.bold("Guard Checks:"));
159
+ for (const warning of guardReport.warnings) {
160
+ const icon = warning.severity === "error" ? styles.error("✗") : styles.warning("⚠");
161
+ console.log(` ${icon} [${warning.code}] ${warning.message}`);
162
+ if (warning.fix) {
163
+ console.log(styles.dim(` Fix: ${warning.fix}`));
164
+ }
165
+ }
166
+ console.log("");
167
+ }
168
+ if (!result.valid || guardReport && !guardReport.safe) {
153
169
  console.log(styles.error("✗ Validation failed"));
154
170
  process.exit(1);
155
171
  }
@@ -159,13 +175,14 @@ function createProgram() {
159
175
  process.exit(1);
160
176
  }
161
177
  });
162
- program.command("doctor").description("Report repository readiness in one pass").option("-c, --cwd <path>", "Working directory", process.cwd()).option("--json", "Print machine-readable JSON output").action((options) => {
178
+ program.command("doctor").description("Report repository readiness in one pass").option("-c, --cwd <path>", "Working directory", process.cwd()).option("--json", "Print machine-readable JSON output").option("--strict", "Include guard checks for bypass detection").action((options) => {
163
179
  try {
164
180
  const config = getConfig(options.cwd);
165
181
  const report = doctor(config, options.cwd);
182
+ const guardReport = options.strict ? runGuardChecks(config, options.cwd) : void 0;
166
183
  if (options.json) {
167
- console.log(JSON.stringify(report, null, 2));
168
- if (!report.ready) {
184
+ console.log(JSON.stringify({ ...report, guard: guardReport ?? null }, null, 2));
185
+ if (!report.ready || guardReport && !guardReport.safe) {
169
186
  process.exit(1);
170
187
  }
171
188
  return;
@@ -182,12 +199,24 @@ function createProgram() {
182
199
  console.log(
183
200
  ` Worktree clean: ${report.gitRepository ? report.worktreeClean ? "yes" : "no" : "n/a"}`
184
201
  );
185
- if (!report.ready) {
202
+ if (guardReport) {
203
+ console.log(` Guard safe: ${guardReport.safe ? "yes" : "no"}`);
204
+ }
205
+ if (!report.ready || guardReport && !guardReport.safe) {
186
206
  console.log("");
187
207
  console.log(styles.error("Issues:"));
188
208
  for (const error of report.errors) {
189
209
  console.log(styles.error(` ✗ ${error}`));
190
210
  }
211
+ if (guardReport) {
212
+ for (const warning of guardReport.warnings) {
213
+ const icon = warning.severity === "error" ? "✗" : "⚠";
214
+ console.log(styles.error(` ${icon} [${warning.code}] ${warning.message}`));
215
+ if (warning.fix) {
216
+ console.log(styles.dim(` Fix: ${warning.fix}`));
217
+ }
218
+ }
219
+ }
191
220
  process.exit(1);
192
221
  }
193
222
  console.log("");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nconst CLI_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_VERSION: string = (\n JSON.parse(fs.readFileSync(path.join(CLI_DIR, '..', 'package.json'), 'utf-8')) as {\n version: string;\n }\n).version;\n\nimport * as feedback from './feedback';\nimport * as fix from './fix';\nimport * as versionguard from './index';\nimport * as project from './project';\nimport * as tag from './tag';\n\nconst styles = {\n error: chalk.red,\n warning: chalk.yellow,\n success: chalk.green,\n info: chalk.blue,\n dim: chalk.gray,\n bold: chalk.bold,\n};\n\n/**\n * Creates the VersionGuard CLI program definition.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This function wires all commands, options, and handlers onto a fresh Commander\n * program instance without parsing arguments yet.\n *\n * @returns A configured Commander program for the VersionGuard CLI.\n *\n * @example\n * ```typescript\n * const program = createProgram();\n * console.log(program.name());\n * ```\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('versionguard')\n .description('Strict versioning enforcement for SemVer and CalVer')\n .version(CLI_VERSION);\n\n program\n .command('init')\n .description('Initialize VersionGuard configuration')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const configPath = versionguard.initConfig(options.cwd);\n console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));\n console.log('');\n console.log(styles.info('Next steps:'));\n console.log(' 1. Edit .versionguard.yml to set your versioning type');\n console.log(' 2. Run: npx versionguard hooks install');\n console.log(' 3. Run: npx versionguard check');\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('check')\n .description('Check the current version with actionable feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--prev <version>', 'Previous version for comparison')\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; prev?: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const result = feedback.getVersionFeedback(version, config, options.prev);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n version,\n versioningType: config.versioning.type,\n valid: result.valid,\n errors: result.errors,\n suggestions: result.suggestions,\n },\n null,\n 2,\n ),\n );\n if (!result.valid) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold(`Current version: ${version}`));\n console.log(styles.dim(`Versioning type: ${config.versioning.type}`));\n console.log('');\n\n if (result.valid) {\n console.log(styles.success('✓ Version is valid'));\n return;\n }\n\n console.log(styles.error('✗ Version has issues:'));\n console.log('');\n for (const error of result.errors) {\n console.log(styles.error(` ✗ ${error.message}`));\n }\n if (result.suggestions.length > 0) {\n console.log('');\n console.log(styles.info('How to fix:'));\n for (const suggestion of result.suggestions) {\n console.log(` → ${suggestion.message}`);\n if (suggestion.fix) {\n console.log(styles.dim(` Run: ${suggestion.fix}`));\n }\n }\n }\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('validate')\n .description('Run full validation with smart feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--hook <name>', 'Running as git hook')\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; hook?: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const result = versionguard.validate(config, options.cwd);\n\n let postTagResult: { success: boolean; message: string; actions: string[] } | undefined;\n\n if (options.hook === 'post-tag') {\n postTagResult = tag.handlePostTag(config, options.cwd);\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ...result,\n hook: options.hook ?? null,\n postTag: postTagResult ?? null,\n },\n null,\n 2,\n ),\n );\n\n if (!result.valid || (postTagResult && !postTagResult.success)) {\n process.exit(1);\n }\n\n return;\n }\n\n console.log(styles.bold(`Validating version ${version}...`));\n console.log('');\n\n if (!result.syncValid) {\n console.log(styles.error('Sync Issues:'));\n for (const error of result.errors.filter((item) => item.includes('mismatch'))) {\n const parts = error.match(\n /Version mismatch in (.+):(\\d+) - found \"(.+?)\" but expected \"(.+?)\"/,\n );\n if (!parts) {\n continue;\n }\n const suggestions = feedback.getSyncFeedback(parts[1], parts[3], parts[4]);\n console.log(styles.error(` ✗ ${parts[1]} has wrong version`));\n console.log(styles.dim(` Found: \"${parts[3]}\" Expected: \"${parts[4]}\"`));\n if (suggestions[0]?.fix) {\n console.log(styles.info(` Fix: ${suggestions[0].fix}`));\n }\n }\n console.log('');\n }\n\n if (config.changelog.enabled && !result.changelogValid) {\n console.log(styles.error('Changelog Issues:'));\n for (const error of result.errors.filter((item) =>\n item.toLowerCase().includes('changelog'),\n )) {\n console.log(styles.error(` ✗ ${error}`));\n }\n const suggestions = feedback.getChangelogFeedback(false, version);\n if (suggestions[0]?.fix) {\n console.log(styles.info(`Fix: ${suggestions[0].fix}`));\n }\n console.log('');\n }\n\n if (postTagResult) {\n if (!postTagResult.success) {\n console.log(styles.error(`✗ ${postTagResult.message}`));\n process.exit(1);\n }\n }\n\n if (!result.valid) {\n console.log(styles.error('✗ Validation failed'));\n process.exit(1);\n }\n\n console.log(styles.success('✓ All validations passed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('doctor')\n .description('Report repository readiness in one pass')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const report = versionguard.doctor(config, options.cwd);\n\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n if (!report.ready) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold('VersionGuard Doctor'));\n console.log(` Version: ${report.version || '(missing)'}`);\n console.log(` Version valid: ${report.versionValid ? 'yes' : 'no'}`);\n console.log(` Files in sync: ${report.syncValid ? 'yes' : 'no'}`);\n console.log(` Changelog ready: ${report.changelogValid ? 'yes' : 'no'}`);\n console.log(` Git repository: ${report.gitRepository ? 'yes' : 'no'}`);\n console.log(\n ` Hooks installed: ${report.gitRepository ? (report.hooksInstalled ? 'yes' : 'no') : 'n/a'}`,\n );\n console.log(\n ` Worktree clean: ${report.gitRepository ? (report.worktreeClean ? 'yes' : 'no') : 'n/a'}`,\n );\n\n if (!report.ready) {\n console.log('');\n console.log(styles.error('Issues:'));\n for (const error of report.errors) {\n console.log(styles.error(` ✗ ${error}`));\n }\n process.exit(1);\n }\n\n console.log('');\n console.log(styles.success('✓ Repository is ready'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('fix')\n .description('Auto-fix detected issues')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const results = fix.fixAll(config, version, options.cwd);\n\n console.log(styles.bold(`Fixing issues for version ${version}...`));\n console.log('');\n\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('sync')\n .description('Sync version to all configured files')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const results = fix.fixSyncIssues(config, options.cwd);\n\n console.log(styles.bold(`Syncing version ${version}...`));\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('bump')\n .description('Suggest and optionally apply the next version')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-t, --type <type>', 'Bump type (major, minor, patch, auto)')\n .option('--apply', 'Apply the first suggested version')\n .action(\n (options: { cwd: string; type?: 'major' | 'minor' | 'patch' | 'auto'; apply?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const currentVersion = versionguard.getPackageVersion(options.cwd);\n const suggestions = fix.suggestNextVersion(currentVersion, config, options.type);\n\n console.log(styles.bold(`Current version: ${currentVersion}`));\n console.log('');\n for (const [index, suggestion] of suggestions.entries()) {\n console.log(` ${index + 1}. ${styles.bold(suggestion.version)}`);\n console.log(` ${styles.dim(suggestion.reason)}`);\n }\n\n if (options.apply) {\n const nextVersion = suggestions[0]?.version;\n if (!nextVersion) {\n throw new Error('No version suggestion available');\n }\n project.setPackageVersion(nextVersion, options.cwd);\n fix.fixAll(config, nextVersion, options.cwd);\n console.log(styles.success(`✓ Updated to ${nextVersion}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n program\n .command('tag')\n .description('Create a git tag with automation')\n .argument('[version]', 'Version to tag (defaults to package.json version)')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-m, --message <msg>', 'Tag message')\n .option('--no-fix', 'Skip auto-fixing files before tagging')\n .action(\n (version: string | undefined, options: { cwd: string; message?: string; fix?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const tagVersion = version || versionguard.getPackageVersion(options.cwd);\n const result = tag.createTag(\n tagVersion,\n options.message,\n options.fix !== false,\n config,\n options.cwd,\n );\n\n if (!result.success) {\n console.log(styles.error(`✗ ${result.message}`));\n process.exit(1);\n }\n\n console.log(styles.success(`✓ ${result.message}`));\n for (const action of result.actions) {\n console.log(` • ${action}`);\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n const hooksCommand = program.command('hooks').description('Manage git hooks');\n\n hooksCommand\n .command('install')\n .description('Install git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n versionguard.uninstallHooks(options.cwd);\n console.log(styles.success('✓ Git hooks uninstalled'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('status')\n .description('Check if hooks are installed')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n if (versionguard.areHooksInstalled(options.cwd)) {\n console.log(styles.success('✓ VersionGuard hooks are installed'));\n return;\n }\n\n console.log(styles.warning('✗ VersionGuard hooks are not installed'));\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Parses CLI arguments and executes the matching command.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper delegates argument parsing to the Commander program created by\n * {@link createProgram}. It resolves when the selected command finishes.\n *\n * @param argv - Full argument vector to parse.\n * @see {@link createProgram}\n *\n * @example\n * ```typescript\n * const argv = ['node', 'versionguard', 'check'];\n * await runCli(argv);\n * ```\n */\nexport async function runCli(argv: string[] = process.argv): Promise<void> {\n await createProgram().parseAsync(argv);\n}\n\n/**\n * Determines whether the current module is the invoked CLI entry point.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper compares the resolved script path from `argv` with the current\n * module URL so the CLI runs only during direct execution.\n *\n * @param argv - Full process argument vector.\n * @param metaUrl - Module URL to compare against the invoked entry path.\n * @returns `true` when the current module should launch the CLI.\n *\n * @example\n * ```typescript\n * const shouldRun = shouldRunCli(process.argv, import.meta.url);\n * console.log(shouldRun);\n * ```\n */\nexport function shouldRunCli(\n argv: string[] = process.argv,\n metaUrl: string = import.meta.url,\n): boolean {\n const entryPath = argv[1] ? path.resolve(argv[1]) : null;\n return entryPath === fileURLToPath(metaUrl);\n}\n\n/* v8 ignore start -- exercised only by direct CLI execution */\nif (shouldRunCli()) {\n void runCli();\n}\n/* v8 ignore stop */\n"],"names":["versionguard.initConfig","versionguard.getConfig","versionguard.getPackageVersion","feedback.getVersionFeedback","versionguard.validate","tag.handlePostTag","feedback.getSyncFeedback","feedback.getChangelogFeedback","versionguard.doctor","fix.fixAll","fix.fixSyncIssues","fix.suggestNextVersion","project.setPackageVersion","tag.createTag","versionguard.installHooks","versionguard.uninstallHooks","versionguard.areHooksInstalled"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nconst CLI_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_VERSION: string = (\n JSON.parse(fs.readFileSync(path.join(CLI_DIR, '..', 'package.json'), 'utf-8')) as {\n version: string;\n }\n).version;\n\nimport * as feedback from './feedback';\nimport * as fix from './fix';\nimport * as guard from './guard';\nimport * as versionguard from './index';\nimport * as project from './project';\nimport * as tag from './tag';\n\nconst styles = {\n error: chalk.red,\n warning: chalk.yellow,\n success: chalk.green,\n info: chalk.blue,\n dim: chalk.gray,\n bold: chalk.bold,\n};\n\n/**\n * Creates the VersionGuard CLI program definition.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This function wires all commands, options, and handlers onto a fresh Commander\n * program instance without parsing arguments yet.\n *\n * @returns A configured Commander program for the VersionGuard CLI.\n *\n * @example\n * ```typescript\n * const program = createProgram();\n * console.log(program.name());\n * ```\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('versionguard')\n .description('Strict versioning enforcement for SemVer and CalVer')\n .version(CLI_VERSION);\n\n program\n .command('init')\n .description('Initialize VersionGuard configuration')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const configPath = versionguard.initConfig(options.cwd);\n console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));\n console.log('');\n console.log(styles.info('Next steps:'));\n console.log(' 1. Edit .versionguard.yml to set your versioning type');\n console.log(' 2. Run: npx versionguard hooks install');\n console.log(' 3. Run: npx versionguard check');\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('check')\n .description('Check the current version with actionable feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--prev <version>', 'Previous version for comparison')\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; prev?: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const result = feedback.getVersionFeedback(version, config, options.prev);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n version,\n versioningType: config.versioning.type,\n valid: result.valid,\n errors: result.errors,\n suggestions: result.suggestions,\n },\n null,\n 2,\n ),\n );\n if (!result.valid) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold(`Current version: ${version}`));\n console.log(styles.dim(`Versioning type: ${config.versioning.type}`));\n console.log('');\n\n if (result.valid) {\n console.log(styles.success('✓ Version is valid'));\n return;\n }\n\n console.log(styles.error('✗ Version has issues:'));\n console.log('');\n for (const error of result.errors) {\n console.log(styles.error(` ✗ ${error.message}`));\n }\n if (result.suggestions.length > 0) {\n console.log('');\n console.log(styles.info('How to fix:'));\n for (const suggestion of result.suggestions) {\n console.log(` → ${suggestion.message}`);\n if (suggestion.fix) {\n console.log(styles.dim(` Run: ${suggestion.fix}`));\n }\n }\n }\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('validate')\n .description('Run full validation with smart feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--hook <name>', 'Running as git hook')\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Run guard checks and fail on any policy gap or bypass')\n .action((options: { cwd: string; hook?: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const result = versionguard.validate(config, options.cwd);\n\n let postTagResult: { success: boolean; message: string; actions: string[] } | undefined;\n let guardReport: guard.GuardReport | undefined;\n\n if (options.hook === 'post-tag') {\n postTagResult = tag.handlePostTag(config, options.cwd);\n }\n\n if (options.strict) {\n guardReport = guard.runGuardChecks(config, options.cwd);\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ...result,\n hook: options.hook ?? null,\n postTag: postTagResult ?? null,\n guard: guardReport ?? null,\n },\n null,\n 2,\n ),\n );\n\n if (\n !result.valid ||\n (postTagResult && !postTagResult.success) ||\n (guardReport && !guardReport.safe)\n ) {\n process.exit(1);\n }\n\n return;\n }\n\n console.log(styles.bold(`Validating version ${version}...`));\n console.log('');\n\n if (!result.syncValid) {\n console.log(styles.error('Sync Issues:'));\n for (const error of result.errors.filter((item) => item.includes('mismatch'))) {\n const parts = error.match(\n /Version mismatch in (.+):(\\d+) - found \"(.+?)\" but expected \"(.+?)\"/,\n );\n if (!parts) {\n continue;\n }\n const suggestions = feedback.getSyncFeedback(parts[1], parts[3], parts[4]);\n console.log(styles.error(` ✗ ${parts[1]} has wrong version`));\n console.log(styles.dim(` Found: \"${parts[3]}\" Expected: \"${parts[4]}\"`));\n if (suggestions[0]?.fix) {\n console.log(styles.info(` Fix: ${suggestions[0].fix}`));\n }\n }\n console.log('');\n }\n\n if (config.changelog.enabled && !result.changelogValid) {\n console.log(styles.error('Changelog Issues:'));\n for (const error of result.errors.filter((item) =>\n item.toLowerCase().includes('changelog'),\n )) {\n console.log(styles.error(` ✗ ${error}`));\n }\n const suggestions = feedback.getChangelogFeedback(false, version);\n if (suggestions[0]?.fix) {\n console.log(styles.info(`Fix: ${suggestions[0].fix}`));\n }\n console.log('');\n }\n\n if (postTagResult) {\n if (!postTagResult.success) {\n console.log(styles.error(`✗ ${postTagResult.message}`));\n process.exit(1);\n }\n }\n\n if (guardReport && guardReport.warnings.length > 0) {\n console.log(styles.bold('Guard Checks:'));\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? styles.error('✗') : styles.warning('⚠');\n console.log(` ${icon} [${warning.code}] ${warning.message}`);\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n console.log('');\n }\n\n if (!result.valid || (guardReport && !guardReport.safe)) {\n console.log(styles.error('✗ Validation failed'));\n process.exit(1);\n }\n\n console.log(styles.success('✓ All validations passed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('doctor')\n .description('Report repository readiness in one pass')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Include guard checks for bypass detection')\n .action((options: { cwd: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const report = versionguard.doctor(config, options.cwd);\n const guardReport = options.strict ? guard.runGuardChecks(config, options.cwd) : undefined;\n\n if (options.json) {\n console.log(JSON.stringify({ ...report, guard: guardReport ?? null }, null, 2));\n if (!report.ready || (guardReport && !guardReport.safe)) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold('VersionGuard Doctor'));\n console.log(` Version: ${report.version || '(missing)'}`);\n console.log(` Version valid: ${report.versionValid ? 'yes' : 'no'}`);\n console.log(` Files in sync: ${report.syncValid ? 'yes' : 'no'}`);\n console.log(` Changelog ready: ${report.changelogValid ? 'yes' : 'no'}`);\n console.log(` Git repository: ${report.gitRepository ? 'yes' : 'no'}`);\n console.log(\n ` Hooks installed: ${report.gitRepository ? (report.hooksInstalled ? 'yes' : 'no') : 'n/a'}`,\n );\n console.log(\n ` Worktree clean: ${report.gitRepository ? (report.worktreeClean ? 'yes' : 'no') : 'n/a'}`,\n );\n\n if (guardReport) {\n console.log(` Guard safe: ${guardReport.safe ? 'yes' : 'no'}`);\n }\n\n if (!report.ready || (guardReport && !guardReport.safe)) {\n console.log('');\n console.log(styles.error('Issues:'));\n for (const error of report.errors) {\n console.log(styles.error(` ✗ ${error}`));\n }\n if (guardReport) {\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? '✗' : '⚠';\n console.log(styles.error(` ${icon} [${warning.code}] ${warning.message}`));\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n }\n process.exit(1);\n }\n\n console.log('');\n console.log(styles.success('✓ Repository is ready'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('fix')\n .description('Auto-fix detected issues')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const results = fix.fixAll(config, version, options.cwd);\n\n console.log(styles.bold(`Fixing issues for version ${version}...`));\n console.log('');\n\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('sync')\n .description('Sync version to all configured files')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd);\n const results = fix.fixSyncIssues(config, options.cwd);\n\n console.log(styles.bold(`Syncing version ${version}...`));\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('bump')\n .description('Suggest and optionally apply the next version')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-t, --type <type>', 'Bump type (major, minor, patch, auto)')\n .option('--apply', 'Apply the first suggested version')\n .action(\n (options: { cwd: string; type?: 'major' | 'minor' | 'patch' | 'auto'; apply?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const currentVersion = versionguard.getPackageVersion(options.cwd);\n const suggestions = fix.suggestNextVersion(currentVersion, config, options.type);\n\n console.log(styles.bold(`Current version: ${currentVersion}`));\n console.log('');\n for (const [index, suggestion] of suggestions.entries()) {\n console.log(` ${index + 1}. ${styles.bold(suggestion.version)}`);\n console.log(` ${styles.dim(suggestion.reason)}`);\n }\n\n if (options.apply) {\n const nextVersion = suggestions[0]?.version;\n if (!nextVersion) {\n throw new Error('No version suggestion available');\n }\n project.setPackageVersion(nextVersion, options.cwd);\n fix.fixAll(config, nextVersion, options.cwd);\n console.log(styles.success(`✓ Updated to ${nextVersion}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n program\n .command('tag')\n .description('Create a git tag with automation')\n .argument('[version]', 'Version to tag (defaults to package.json version)')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-m, --message <msg>', 'Tag message')\n .option('--no-fix', 'Skip auto-fixing files before tagging')\n .action(\n (version: string | undefined, options: { cwd: string; message?: string; fix?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const tagVersion = version || versionguard.getPackageVersion(options.cwd);\n const result = tag.createTag(\n tagVersion,\n options.message,\n options.fix !== false,\n config,\n options.cwd,\n );\n\n if (!result.success) {\n console.log(styles.error(`✗ ${result.message}`));\n process.exit(1);\n }\n\n console.log(styles.success(`✓ ${result.message}`));\n for (const action of result.actions) {\n console.log(` • ${action}`);\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n const hooksCommand = program.command('hooks').description('Manage git hooks');\n\n hooksCommand\n .command('install')\n .description('Install git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n versionguard.uninstallHooks(options.cwd);\n console.log(styles.success('✓ Git hooks uninstalled'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('status')\n .description('Check if hooks are installed')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n if (versionguard.areHooksInstalled(options.cwd)) {\n console.log(styles.success('✓ VersionGuard hooks are installed'));\n return;\n }\n\n console.log(styles.warning('✗ VersionGuard hooks are not installed'));\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Parses CLI arguments and executes the matching command.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper delegates argument parsing to the Commander program created by\n * {@link createProgram}. It resolves when the selected command finishes.\n *\n * @param argv - Full argument vector to parse.\n * @see {@link createProgram}\n *\n * @example\n * ```typescript\n * const argv = ['node', 'versionguard', 'check'];\n * await runCli(argv);\n * ```\n */\nexport async function runCli(argv: string[] = process.argv): Promise<void> {\n await createProgram().parseAsync(argv);\n}\n\n/**\n * Determines whether the current module is the invoked CLI entry point.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper compares the resolved script path from `argv` with the current\n * module URL so the CLI runs only during direct execution.\n *\n * @param argv - Full process argument vector.\n * @param metaUrl - Module URL to compare against the invoked entry path.\n * @returns `true` when the current module should launch the CLI.\n *\n * @example\n * ```typescript\n * const shouldRun = shouldRunCli(process.argv, import.meta.url);\n * console.log(shouldRun);\n * ```\n */\nexport function shouldRunCli(\n argv: string[] = process.argv,\n metaUrl: string = import.meta.url,\n): boolean {\n const entryPath = argv[1] ? path.resolve(argv[1]) : null;\n return entryPath === fileURLToPath(metaUrl);\n}\n\n/* v8 ignore start -- exercised only by direct CLI execution */\nif (shouldRunCli()) {\n void runCli();\n}\n/* v8 ignore stop */\n"],"names":["versionguard.initConfig","versionguard.getConfig","versionguard.getPackageVersion","feedback.getVersionFeedback","versionguard.validate","tag.handlePostTag","guard.runGuardChecks","feedback.getSyncFeedback","feedback.getChangelogFeedback","versionguard.doctor","fix.fixAll","fix.fixSyncIssues","fix.suggestNextVersion","project.setPackageVersion","tag.createTag","versionguard.installHooks","versionguard.uninstallHooks","versionguard.areHooksInstalled"],"mappings":"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"}
package/dist/config.d.ts CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,104 @@
1
+ import type { VersionGuardConfig } from './types';
2
+ /**
3
+ * Describes a single guard finding.
4
+ *
5
+ * @public
6
+ * @since 0.2.0
7
+ */
8
+ export interface GuardWarning {
9
+ /** Machine-readable code for filtering and automation. */
10
+ code: string;
11
+ /** Severity: errors block releases, warnings inform. */
12
+ severity: 'error' | 'warning';
13
+ /** Human-readable description of the issue. */
14
+ message: string;
15
+ /** Suggested remediation command when available. */
16
+ fix?: string;
17
+ }
18
+ /**
19
+ * Result of a full guard check pass.
20
+ *
21
+ * @public
22
+ * @since 0.2.0
23
+ */
24
+ export interface GuardReport {
25
+ /** True when no errors were found. Warnings alone do not fail. */
26
+ safe: boolean;
27
+ /** All findings from the guard check. */
28
+ warnings: GuardWarning[];
29
+ }
30
+ /**
31
+ * Checks whether git hooks have been redirected away from the repository.
32
+ *
33
+ * @remarks
34
+ * When `core.hooksPath` is set to a non-default location, git hooks installed
35
+ * in `.git/hooks/` are silently ignored. This is a common bypass vector.
36
+ *
37
+ * @param cwd - Repository directory to inspect.
38
+ * @returns A guard warning when a hooksPath override is detected.
39
+ *
40
+ * @public
41
+ * @since 0.2.0
42
+ */
43
+ export declare function checkHooksPathOverride(cwd: string): GuardWarning | null;
44
+ /**
45
+ * Checks whether the HUSKY environment variable is disabling hooks.
46
+ *
47
+ * @remarks
48
+ * Setting `HUSKY=0` is a documented way to disable Husky hooks. Since
49
+ * VersionGuard hooks may run alongside or through Husky, this bypass
50
+ * can silently disable enforcement.
51
+ *
52
+ * @returns A guard warning when the HUSKY bypass is detected.
53
+ *
54
+ * @public
55
+ * @since 0.2.0
56
+ */
57
+ export declare function checkHuskyBypass(): GuardWarning | null;
58
+ /**
59
+ * Verifies that installed hook scripts match the expected content.
60
+ *
61
+ * @remarks
62
+ * This compares each hook file against what `generateHookScript` would produce.
63
+ * Tampered hooks that still contain "versionguard" pass `areHooksInstalled` but
64
+ * may have had critical lines removed or modified.
65
+ *
66
+ * @param config - VersionGuard configuration that defines which hooks should exist.
67
+ * @param cwd - Repository directory to inspect.
68
+ * @returns Guard warnings for each hook that has been tampered with.
69
+ *
70
+ * @public
71
+ * @since 0.2.0
72
+ */
73
+ export declare function checkHookIntegrity(config: VersionGuardConfig, cwd: string): GuardWarning[];
74
+ /**
75
+ * Checks whether hooks are configured as required but not enforced.
76
+ *
77
+ * @remarks
78
+ * When hooks are enabled in the config but `enforceHooks` is false, validation
79
+ * will not fail for missing hooks. In strict mode this is a policy gap.
80
+ *
81
+ * @param config - VersionGuard configuration to inspect.
82
+ * @returns A guard warning when hooks are enabled but not enforced.
83
+ *
84
+ * @public
85
+ * @since 0.2.0
86
+ */
87
+ export declare function checkEnforceHooksPolicy(config: VersionGuardConfig): GuardWarning | null;
88
+ /**
89
+ * Runs all guard checks and returns a consolidated report.
90
+ *
91
+ * @remarks
92
+ * This is the primary entry point for strict mode. It runs every detection
93
+ * check and returns a report indicating whether the repository is safe from
94
+ * known bypass patterns.
95
+ *
96
+ * @param config - VersionGuard configuration.
97
+ * @param cwd - Repository directory to inspect.
98
+ * @returns A guard report with all findings.
99
+ *
100
+ * @public
101
+ * @since 0.2.0
102
+ */
103
+ export declare function runGuardChecks(config: VersionGuardConfig, cwd: string): GuardReport;
104
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAqBvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAWtD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAkD1F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAcvF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA2BnF"}
package/dist/hooks.d.ts CHANGED
File without changes
File without changes
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export { validateChangelog } from './changelog';
10
10
  export { getConfig, initConfig } from './config';
11
11
  export * from './feedback';
12
12
  export * from './fix';
13
+ export * from './guard';
13
14
  export { areHooksInstalled, installHooks, uninstallHooks } from './hooks';
14
15
  export { getPackageVersion } from './project';
15
16
  export * as semver from './semver';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAEV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CAO7F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,GAAE,MAAsB,GAC1B,oBAAoB,CAwDtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,GAAE,MAAsB,GAAG,YAAY,CA0B5F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CAGlF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CACrB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,kBAAkB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqCtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAEV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CAO7F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,GAAE,MAAsB,GAC1B,oBAAoB,CAwDtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,GAAE,MAAsB,GAAG,YAAY,CA0B5F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CAGlF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CACrB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,kBAAkB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqCtC"}
package/dist/index.js CHANGED
@@ -1,37 +1,42 @@
1
1
  import "node:child_process";
2
2
  import "node:path";
3
- import { n, o, p, q, l, e, f, r, t, j, w, d, g, x, a, c, y, b, h, i, m, z, s, A, B, C, u, v, D, E, F } from "./chunks/index-C6jrxye7.js";
3
+ import { n, o, p, q, t, w, x, y, l, e, f, z, A, j, B, d, g, C, a, c, D, b, h, i, m, r, E, s, F, G, H, u, v, I, J, K } from "./chunks/index-BwE_OaV3.js";
4
4
  export {
5
5
  n as areHooksInstalled,
6
6
  o as calver,
7
7
  p as canBump,
8
- q as checkHardcodedVersions,
8
+ q as checkEnforceHooksPolicy,
9
+ t as checkHardcodedVersions,
10
+ w as checkHookIntegrity,
11
+ x as checkHooksPathOverride,
12
+ y as checkHuskyBypass,
9
13
  l as createTag,
10
14
  e as doctor,
11
15
  f as fixAll,
12
- r as fixChangelog,
13
- t as fixPackageVersion,
16
+ z as fixChangelog,
17
+ A as fixPackageVersion,
14
18
  j as fixSyncIssues,
15
- w as getAllTags,
19
+ B as getAllTags,
16
20
  d as getChangelogFeedback,
17
21
  g as getConfig,
18
- x as getLatestTag,
22
+ C as getLatestTag,
19
23
  a as getPackageVersion,
20
24
  c as getSyncFeedback,
21
- y as getTagFeedback,
25
+ D as getTagFeedback,
22
26
  b as getVersionFeedback,
23
27
  h as handlePostTag,
24
28
  i as initConfig,
25
29
  m as installHooks,
26
- z as semver,
30
+ r as runGuardChecks,
31
+ E as semver,
27
32
  s as suggestNextVersion,
28
- A as suggestTagMessage,
29
- B as sync,
30
- C as syncVersion,
33
+ F as suggestTagMessage,
34
+ G as sync,
35
+ H as syncVersion,
31
36
  u as uninstallHooks,
32
37
  v as validate,
33
- D as validateChangelog,
34
- E as validateTagForPush,
35
- F as validateVersion
38
+ I as validateChangelog,
39
+ J as validateTagForPush,
40
+ K as validateVersion
36
41
  };
37
42
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
File without changes
package/dist/project.d.ts CHANGED
File without changes
File without changes
package/dist/semver.d.ts CHANGED
File without changes
File without changes
package/dist/sync.d.ts CHANGED
File without changes
File without changes
File without changes
File without changes
package/dist/types.d.ts CHANGED
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codluv/versionguard",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Strict versioning enforcement for SemVer and CalVer with git hooks, changelog validation, and file sync from package.json",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -31,10 +31,10 @@
31
31
  "forge:build": "forge-ts build",
32
32
  "forge:docs:init": "forge-ts init docs",
33
33
  "forge:doctor": "forge-ts doctor",
34
- "vg:check": "versionguard check",
35
- "vg:validate": "versionguard validate",
36
- "vg:doctor": "versionguard doctor",
37
- "vg:sync": "versionguard sync",
34
+ "vg:check": "node dist/cli.js check",
35
+ "vg:validate": "node dist/cli.js validate",
36
+ "vg:doctor": "node dist/cli.js doctor",
37
+ "vg:sync": "node dist/cli.js sync",
38
38
  "lint": "npm run lint:biome && npm run lint:eslint",
39
39
  "lint:biome": "biome check .",
40
40
  "lint:eslint": "eslint .",
@@ -73,7 +73,6 @@
73
73
  "@biomejs/biome": "^2.2.4",
74
74
  "@changesets/changelog-github": "^0.6.0",
75
75
  "@changesets/cli": "^2.30.0",
76
- "@codluv/versionguard": "^0.1.1",
77
76
  "@eslint/js": "^9.37.0",
78
77
  "@forge-ts/cli": "0.19.4",
79
78
  "@types/js-yaml": "^4.0.9",