vonosan-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/__tests__/env-parity.pbt.test.d.ts +15 -0
  2. package/dist/__tests__/env-parity.pbt.test.d.ts.map +1 -0
  3. package/dist/__tests__/env-parity.pbt.test.js +125 -0
  4. package/dist/__tests__/env-parity.pbt.test.js.map +1 -0
  5. package/dist/__tests__/module-generator.pbt.test.d.ts +15 -0
  6. package/dist/__tests__/module-generator.pbt.test.d.ts.map +1 -0
  7. package/dist/__tests__/module-generator.pbt.test.js +130 -0
  8. package/dist/__tests__/module-generator.pbt.test.js.map +1 -0
  9. package/dist/commands/add.d.ts +21 -0
  10. package/dist/commands/add.d.ts.map +1 -0
  11. package/dist/commands/add.js +128 -0
  12. package/dist/commands/add.js.map +1 -0
  13. package/dist/commands/audit.d.ts +18 -0
  14. package/dist/commands/audit.d.ts.map +1 -0
  15. package/dist/commands/audit.js +73 -0
  16. package/dist/commands/audit.js.map +1 -0
  17. package/dist/commands/branch-finish.d.ts +19 -0
  18. package/dist/commands/branch-finish.d.ts.map +1 -0
  19. package/dist/commands/branch-finish.js +80 -0
  20. package/dist/commands/branch-finish.js.map +1 -0
  21. package/dist/commands/branch-new.d.ts +17 -0
  22. package/dist/commands/branch-new.d.ts.map +1 -0
  23. package/dist/commands/branch-new.js +70 -0
  24. package/dist/commands/branch-new.js.map +1 -0
  25. package/dist/commands/commit.d.ts +21 -0
  26. package/dist/commands/commit.d.ts.map +1 -0
  27. package/dist/commands/commit.js +79 -0
  28. package/dist/commands/commit.js.map +1 -0
  29. package/dist/commands/db.d.ts +28 -0
  30. package/dist/commands/db.d.ts.map +1 -0
  31. package/dist/commands/db.js +83 -0
  32. package/dist/commands/db.js.map +1 -0
  33. package/dist/commands/env-add.d.ts +17 -0
  34. package/dist/commands/env-add.d.ts.map +1 -0
  35. package/dist/commands/env-add.js +73 -0
  36. package/dist/commands/env-add.js.map +1 -0
  37. package/dist/commands/fix-headers.d.ts +15 -0
  38. package/dist/commands/fix-headers.d.ts.map +1 -0
  39. package/dist/commands/fix-headers.js +37 -0
  40. package/dist/commands/fix-headers.js.map +1 -0
  41. package/dist/commands/fix-logs.d.ts +15 -0
  42. package/dist/commands/fix-logs.d.ts.map +1 -0
  43. package/dist/commands/fix-logs.js +87 -0
  44. package/dist/commands/fix-logs.js.map +1 -0
  45. package/dist/commands/jobs.d.ts +17 -0
  46. package/dist/commands/jobs.d.ts.map +1 -0
  47. package/dist/commands/jobs.js +107 -0
  48. package/dist/commands/jobs.js.map +1 -0
  49. package/dist/commands/lint.d.ts +15 -0
  50. package/dist/commands/lint.d.ts.map +1 -0
  51. package/dist/commands/lint.js +49 -0
  52. package/dist/commands/lint.js.map +1 -0
  53. package/dist/commands/make.d.ts +31 -0
  54. package/dist/commands/make.d.ts.map +1 -0
  55. package/dist/commands/make.js +176 -0
  56. package/dist/commands/make.js.map +1 -0
  57. package/dist/commands/migrate.d.ts +43 -0
  58. package/dist/commands/migrate.d.ts.map +1 -0
  59. package/dist/commands/migrate.js +120 -0
  60. package/dist/commands/migrate.js.map +1 -0
  61. package/dist/commands/schema-sync.d.ts +17 -0
  62. package/dist/commands/schema-sync.d.ts.map +1 -0
  63. package/dist/commands/schema-sync.js +48 -0
  64. package/dist/commands/schema-sync.js.map +1 -0
  65. package/dist/commands/test.d.ts +19 -0
  66. package/dist/commands/test.d.ts.map +1 -0
  67. package/dist/commands/test.js +113 -0
  68. package/dist/commands/test.js.map +1 -0
  69. package/dist/commands/upgrade.d.ts +24 -0
  70. package/dist/commands/upgrade.d.ts.map +1 -0
  71. package/dist/commands/upgrade.js +177 -0
  72. package/dist/commands/upgrade.js.map +1 -0
  73. package/dist/generators/deployment/docker-compose.d.ts +20 -0
  74. package/dist/generators/deployment/docker-compose.d.ts.map +1 -0
  75. package/dist/generators/deployment/docker-compose.js +95 -0
  76. package/dist/generators/deployment/docker-compose.js.map +1 -0
  77. package/dist/generators/deployment/dockerfile.d.ts +18 -0
  78. package/dist/generators/deployment/dockerfile.d.ts.map +1 -0
  79. package/dist/generators/deployment/dockerfile.js +99 -0
  80. package/dist/generators/deployment/dockerfile.js.map +1 -0
  81. package/dist/generators/deployment/pm2.d.ts +17 -0
  82. package/dist/generators/deployment/pm2.d.ts.map +1 -0
  83. package/dist/generators/deployment/pm2.js +59 -0
  84. package/dist/generators/deployment/pm2.js.map +1 -0
  85. package/dist/generators/deployment/secrets.d.ts +19 -0
  86. package/dist/generators/deployment/secrets.d.ts.map +1 -0
  87. package/dist/generators/deployment/secrets.js +41 -0
  88. package/dist/generators/deployment/secrets.js.map +1 -0
  89. package/dist/generators/deployment/shutdown.d.ts +17 -0
  90. package/dist/generators/deployment/shutdown.d.ts.map +1 -0
  91. package/dist/generators/deployment/shutdown.js +61 -0
  92. package/dist/generators/deployment/shutdown.js.map +1 -0
  93. package/dist/generators/deployment/wrangler.d.ts +25 -0
  94. package/dist/generators/deployment/wrangler.d.ts.map +1 -0
  95. package/dist/generators/deployment/wrangler.js +93 -0
  96. package/dist/generators/deployment/wrangler.js.map +1 -0
  97. package/dist/generators/file-generators.d.ts +38 -0
  98. package/dist/generators/file-generators.d.ts.map +1 -0
  99. package/dist/generators/file-generators.js +546 -0
  100. package/dist/generators/file-generators.js.map +1 -0
  101. package/dist/generators/module-generator.d.ts +33 -0
  102. package/dist/generators/module-generator.d.ts.map +1 -0
  103. package/dist/generators/module-generator.js +61 -0
  104. package/dist/generators/module-generator.js.map +1 -0
  105. package/dist/header-generator.d.ts +34 -0
  106. package/dist/header-generator.d.ts.map +1 -0
  107. package/dist/header-generator.js +77 -0
  108. package/dist/header-generator.js.map +1 -0
  109. package/dist/index.d.ts +12 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +177 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/linter/env-parity.d.ts +28 -0
  114. package/dist/linter/env-parity.d.ts.map +1 -0
  115. package/dist/linter/env-parity.js +59 -0
  116. package/dist/linter/env-parity.js.map +1 -0
  117. package/dist/linter.d.ts +23 -0
  118. package/dist/linter.d.ts.map +1 -0
  119. package/dist/linter.js +207 -0
  120. package/dist/linter.js.map +1 -0
  121. package/package.json +32 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ import { existsSync, readFileSync, rmSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
14
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
15
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
16
+ const BRANCH_STATE_PATH = join(process.cwd(), '.vonosan', 'branch-state.json');
17
+ function readBranchState() {
18
+ if (!existsSync(BRANCH_STATE_PATH))
19
+ return null;
20
+ try {
21
+ return JSON.parse(readFileSync(BRANCH_STATE_PATH, 'utf8'));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function hasUncommittedChanges() {
28
+ try {
29
+ const output = execSync('git status --porcelain', { encoding: 'utf8' });
30
+ return output.trim().length > 0;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ function currentBranch() {
37
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim();
38
+ }
39
+ /**
40
+ * `vonosan branch:finish`
41
+ *
42
+ * 1. Checks for uncommitted changes — halts if any.
43
+ * 2. Merges the current feature branch into the recorded parent.
44
+ * 3. Deletes the feature branch.
45
+ * 4. Checks out the parent branch.
46
+ */
47
+ export async function runBranchFinish(_args) {
48
+ const state = readBranchState();
49
+ if (!state) {
50
+ process.stderr.write(red('No branch state found. Did you run `vonosan branch:new <feature-name>` first?\n'));
51
+ process.exit(1);
52
+ }
53
+ const current = currentBranch();
54
+ if (current !== state.feature) {
55
+ process.stderr.write(red(`Current branch "${current}" does not match the recorded feature branch "${state.feature}".\n` +
56
+ `Check out the feature branch first.\n`));
57
+ process.exit(1);
58
+ }
59
+ // Guard: uncommitted changes
60
+ if (hasUncommittedChanges()) {
61
+ process.stderr.write(red('✖ You have uncommitted changes. Please commit or stash them before running `vonosan branch:finish`.\n'));
62
+ process.exit(1);
63
+ }
64
+ process.stdout.write(`Merging ${dim(state.feature)} → ${dim(state.parent)} …\n`);
65
+ try {
66
+ execSync(`git checkout ${state.parent}`, { stdio: 'inherit' });
67
+ execSync(`git merge --no-ff ${state.feature} -m "feat: merge ${state.feature} into ${state.parent}"`, {
68
+ stdio: 'inherit',
69
+ });
70
+ execSync(`git branch -d ${state.feature}`, { stdio: 'inherit' });
71
+ }
72
+ catch {
73
+ process.stderr.write(red('Merge failed. Resolve conflicts and try again.\n'));
74
+ process.exit(1);
75
+ }
76
+ // Clean up branch state file
77
+ rmSync(BRANCH_STATE_PATH, { force: true });
78
+ process.stdout.write(`\n${green(`✔ Merged "${state.feature}" into "${state.parent}" and deleted the feature branch.`)}\n`);
79
+ }
80
+ //# sourceMappingURL=branch-finish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-finish.js","sourceRoot":"","sources":["../../src/commands/branch-finish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan branch:new <feature-name>`
12
+ *
13
+ * Records the current branch as parent in .vonosan/branch-state.json,
14
+ * then creates and checks out feature/<feature-name>.
15
+ */
16
+ export declare function runBranchNew(args: string[]): Promise<void>;
17
+ //# sourceMappingURL=branch-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-new.d.ts","sourceRoot":"","sources":["../../src/commands/branch-new.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
14
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
15
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
16
+ const BRANCH_STATE_PATH = join(process.cwd(), '.vonosan', 'branch-state.json');
17
+ function readBranchState() {
18
+ if (!existsSync(BRANCH_STATE_PATH))
19
+ return null;
20
+ try {
21
+ return JSON.parse(readFileSync(BRANCH_STATE_PATH, 'utf8'));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function writeBranchState(state) {
28
+ const dir = join(process.cwd(), '.vonosan');
29
+ if (!existsSync(dir))
30
+ mkdirSync(dir, { recursive: true });
31
+ writeFileSync(BRANCH_STATE_PATH, JSON.stringify(state, null, 2), 'utf8');
32
+ }
33
+ function currentBranch() {
34
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim();
35
+ }
36
+ /**
37
+ * `vonosan branch:new <feature-name>`
38
+ *
39
+ * Records the current branch as parent in .vonosan/branch-state.json,
40
+ * then creates and checks out feature/<feature-name>.
41
+ */
42
+ export async function runBranchNew(args) {
43
+ const [featureName] = args;
44
+ if (!featureName) {
45
+ process.stderr.write(red('Usage: vonosan branch:new <feature-name>\n'));
46
+ process.exit(1);
47
+ }
48
+ // Validate feature name (no spaces, no slashes)
49
+ if (!/^[a-zA-Z0-9_-]+$/.test(featureName)) {
50
+ process.stderr.write(red(`Invalid feature name "${featureName}". Use only letters, numbers, hyphens, and underscores.\n`));
51
+ process.exit(1);
52
+ }
53
+ const parent = currentBranch();
54
+ const branchName = `feature/${featureName}`;
55
+ // Warn if there's already an active branch state
56
+ const existing = readBranchState();
57
+ if (existing) {
58
+ process.stdout.write(`\x1b[33m⚠ Overwriting existing branch state (was on feature "${existing.feature}").\x1b[0m\n`);
59
+ }
60
+ writeBranchState({ parent, feature: branchName, createdAt: new Date().toISOString() });
61
+ try {
62
+ execSync(`git checkout -b ${branchName}`, { stdio: 'inherit' });
63
+ }
64
+ catch {
65
+ process.stderr.write(red(`Failed to create branch "${branchName}". Does it already exist?\n`));
66
+ process.exit(1);
67
+ }
68
+ process.stdout.write(`\n${green(`✔ Created and checked out branch "${branchName}".`)} ${dim(`(parent: ${parent})`)}\n`);
69
+ }
70
+ //# sourceMappingURL=branch-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-new.js","sourceRoot":"","sources":["../../src/commands/branch-new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * Returns `true` when `message` conforms to the Conventional Commits spec.
12
+ */
13
+ export declare function isConventionalCommit(message: string): boolean;
14
+ /**
15
+ * `vonosan commit "<message>"`
16
+ *
17
+ * Validates the commit message against the Conventional Commits format,
18
+ * then runs `git commit -m "<message>"`.
19
+ */
20
+ export declare function runCommit(args: string[]): Promise<void>;
21
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsCH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC7D"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
12
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
13
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
14
+ /**
15
+ * Valid Conventional Commits type prefixes.
16
+ * https://www.conventionalcommits.org/en/v1.0.0/
17
+ */
18
+ const CONVENTIONAL_TYPES = [
19
+ 'feat',
20
+ 'fix',
21
+ 'chore',
22
+ 'docs',
23
+ 'refactor',
24
+ 'test',
25
+ 'style',
26
+ 'perf',
27
+ 'ci',
28
+ 'build',
29
+ 'revert',
30
+ ];
31
+ /**
32
+ * Matches: <type>[optional scope][optional !]: <description>
33
+ * Examples:
34
+ * feat: add user auth
35
+ * fix(auth): handle expired tokens
36
+ * feat!: breaking change
37
+ * chore(deps): update packages
38
+ */
39
+ const CONVENTIONAL_COMMIT_RE = new RegExp(`^(${CONVENTIONAL_TYPES.join('|')})(\\([^)]+\\))?(!)?:\\s.+`);
40
+ /**
41
+ * Returns `true` when `message` conforms to the Conventional Commits spec.
42
+ */
43
+ export function isConventionalCommit(message) {
44
+ return CONVENTIONAL_COMMIT_RE.test(message.trim());
45
+ }
46
+ /**
47
+ * `vonosan commit "<message>"`
48
+ *
49
+ * Validates the commit message against the Conventional Commits format,
50
+ * then runs `git commit -m "<message>"`.
51
+ */
52
+ export async function runCommit(args) {
53
+ const message = args.join(' ').trim();
54
+ if (!message) {
55
+ process.stderr.write(red('Usage: vonosan commit "<message>"\n'));
56
+ process.exit(1);
57
+ }
58
+ if (!isConventionalCommit(message)) {
59
+ process.stderr.write(red(`✖ Commit message does not conform to the Conventional Commits format.\n\n` +
60
+ ` Message: "${message}"\n\n` +
61
+ ` Expected format: <type>[optional scope]: <description>\n\n` +
62
+ ` Valid types: ${CONVENTIONAL_TYPES.join(', ')}\n\n` +
63
+ ` Examples:\n` +
64
+ ` feat: add user authentication\n` +
65
+ ` fix(auth): handle expired JWT tokens\n` +
66
+ ` chore(deps): update drizzle-orm to latest\n` +
67
+ ` feat!: redesign API response format (breaking change)\n`));
68
+ process.exit(1);
69
+ }
70
+ try {
71
+ execSync(`git commit -m "${message.replace(/"/g, '\\"')}"`, { stdio: 'inherit' });
72
+ process.stdout.write(`\n${green('✔ Committed:')} ${dim(`"${message}"`)}\n`);
73
+ }
74
+ catch {
75
+ process.stderr.write(red('git commit failed. Make sure you have staged changes.\n'));
76
+ process.exit(1);
77
+ }
78
+ }
79
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAA;AAClD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAA;AAChD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAA;AAE/C;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,UAAU;IACV,MAAM;IACN,OAAO;IACP,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;CACA,CAAA;AAEV;;;;;;;GAOG;AACH,MAAM,sBAAsB,GAAG,IAAI,MAAM,CACvC,KAAK,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAC7D,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAErC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAA;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CACD,2EAA2E;YACzE,eAAe,OAAO,OAAO;YAC7B,8DAA8D;YAC9D,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YACrD,eAAe;YACf,qCAAqC;YACrC,4CAA4C;YAC5C,iDAAiD;YACjD,6DAA6D,CAChE,CACF,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAA;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan db:push` — pushes the current schema to the database without generating
12
+ * a migration file (useful during development).
13
+ */
14
+ export declare function runDbPush(_args: string[]): Promise<void>;
15
+ /**
16
+ * `vonosan db:studio` — opens Drizzle Studio in the browser.
17
+ * This is a long-running process; we spawn it without waiting.
18
+ */
19
+ export declare function runDbStudio(_args: string[]): Promise<void>;
20
+ /**
21
+ * `vonosan db:seed [name]`
22
+ *
23
+ * Runs seed files from `src/db/seeds/`.
24
+ * - With no argument: runs `src/db/seeds/index.ts`
25
+ * - With a name: runs `src/db/seeds/<name>.ts`
26
+ */
27
+ export declare function runDbSeed(args: string[]): Promise<void>;
28
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;AAID;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7D"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { execSync, spawnSync } from 'node:child_process';
11
+ import { existsSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import fg from 'fast-glob';
14
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
15
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
16
+ const bold = (s) => `\x1b[1m${s}\x1b[0m`;
17
+ function run(cmd) {
18
+ execSync(cmd, { stdio: 'inherit', cwd: process.cwd() });
19
+ }
20
+ // ─── db:push ─────────────────────────────────────────────────────────────────
21
+ /**
22
+ * `vonosan db:push` — pushes the current schema to the database without generating
23
+ * a migration file (useful during development).
24
+ */
25
+ export async function runDbPush(_args) {
26
+ process.stdout.write(bold('Pushing schema to database …\n'));
27
+ run('bunx drizzle-kit push');
28
+ process.stdout.write(green('✔ Schema pushed.\n'));
29
+ }
30
+ // ─── db:studio ───────────────────────────────────────────────────────────────
31
+ /**
32
+ * `vonosan db:studio` — opens Drizzle Studio in the browser.
33
+ * This is a long-running process; we spawn it without waiting.
34
+ */
35
+ export async function runDbStudio(_args) {
36
+ process.stdout.write(bold('Opening Drizzle Studio …\n'));
37
+ // Use spawnSync so the process inherits the terminal and the user can Ctrl+C
38
+ spawnSync('bunx', ['drizzle-kit', 'studio'], { stdio: 'inherit', cwd: process.cwd() });
39
+ }
40
+ // ─── db:seed ─────────────────────────────────────────────────────────────────
41
+ /**
42
+ * `vonosan db:seed [name]`
43
+ *
44
+ * Runs seed files from `src/db/seeds/`.
45
+ * - With no argument: runs `src/db/seeds/index.ts`
46
+ * - With a name: runs `src/db/seeds/<name>.ts`
47
+ */
48
+ export async function runDbSeed(args) {
49
+ const [name] = args;
50
+ const seedsDir = join(process.cwd(), 'src', 'db', 'seeds');
51
+ if (name) {
52
+ const seedFile = join(seedsDir, `${name}.ts`);
53
+ if (!existsSync(seedFile)) {
54
+ process.stderr.write(red(`Seed file not found: ${seedFile}\n`));
55
+ process.exit(1);
56
+ }
57
+ process.stdout.write(bold(`Running seed "${name}" …\n`));
58
+ run(`bun run ${seedFile}`);
59
+ process.stdout.write(green(`✔ Seed "${name}" complete.\n`));
60
+ return;
61
+ }
62
+ // No name — run all seeds via index.ts or discover *.ts files
63
+ const indexFile = join(seedsDir, 'index.ts');
64
+ if (existsSync(indexFile)) {
65
+ process.stdout.write(bold('Running seeds via index.ts …\n'));
66
+ run(`bun run ${indexFile}`);
67
+ process.stdout.write(green('✔ Seeds complete.\n'));
68
+ return;
69
+ }
70
+ // Fallback: run all seed files in order
71
+ const pattern = join(seedsDir, '*.ts').replace(/\\/g, '/');
72
+ const seedFiles = await fg(pattern, { absolute: true });
73
+ if (seedFiles.length === 0) {
74
+ process.stdout.write(`No seed files found in ${seedsDir}.\n`);
75
+ return;
76
+ }
77
+ for (const seedFile of seedFiles.sort()) {
78
+ process.stdout.write(bold(`Running ${seedFile} …\n`));
79
+ run(`bun run ${seedFile}`);
80
+ }
81
+ process.stdout.write(green(`✔ All seeds complete.\n`));
82
+ }
83
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,WAAW,CAAA;AAE1B,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAA;AAClD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAA;AAChD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAA;AAEhD,SAAS,GAAG,CAAC,GAAW;IACtB,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAe;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAA;IAC5D,GAAG,CAAC,uBAAuB,CAAC,CAAA;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAA;AACnD,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAe;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAA;IACxD,6EAA6E;IAC7E,SAAS,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACxF,CAAC;AAED,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAE1D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,KAAK,CAAC,CAAA;QAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,QAAQ,IAAI,CAAC,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,CAAC,CAAA;QACxD,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAA;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,eAAe,CAAC,CAAC,CAAA;QAC3D,OAAM;IACR,CAAC;IAED,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC5C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAA;QAC5D,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAA;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,KAAK,CAAC,CAAA;QAC7D,OAAM;IACR,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,MAAM,CAAC,CAAC,CAAA;QACrD,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAA;AACxD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan env:add <KEY> [description]`
12
+ *
13
+ * Appends KEY= to .env and KEY= # description to .env.example.
14
+ * Skips silently if the key already exists in either file.
15
+ */
16
+ export declare function runEnvAdd(args: string[]): Promise<void>;
17
+ //# sourceMappingURL=env-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-add.d.ts","sourceRoot":"","sources":["../../src/commands/env-add.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6BH;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C7D"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { existsSync, readFileSync, appendFileSync, writeFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { parseEnvKeys } from '../linter/env-parity.js';
13
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
14
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
15
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
16
+ /**
17
+ * Appends a key to an env file if it does not already exist.
18
+ * Returns `true` when the key was added, `false` when it already existed.
19
+ */
20
+ function appendKey(filePath, key, comment) {
21
+ // Create the file if it doesn't exist
22
+ if (!existsSync(filePath))
23
+ writeFileSync(filePath, '', 'utf8');
24
+ const content = readFileSync(filePath, 'utf8');
25
+ const keys = parseEnvKeys(content);
26
+ if (keys.has(key))
27
+ return false;
28
+ const line = comment ? `${key}= # ${comment}` : `${key}=`;
29
+ const separator = content.endsWith('\n') || content === '' ? '' : '\n';
30
+ appendFileSync(filePath, `${separator}${line}\n`, 'utf8');
31
+ return true;
32
+ }
33
+ /**
34
+ * `vonosan env:add <KEY> [description]`
35
+ *
36
+ * Appends KEY= to .env and KEY= # description to .env.example.
37
+ * Skips silently if the key already exists in either file.
38
+ */
39
+ export async function runEnvAdd(args) {
40
+ const [key, ...descParts] = args;
41
+ const description = descParts.join(' ');
42
+ if (!key) {
43
+ process.stderr.write(red('Usage: vonosan env:add <KEY> [description]\n'));
44
+ process.exit(1);
45
+ }
46
+ // Validate key format
47
+ if (!/^[A-Z][A-Z0-9_]*$/.test(key)) {
48
+ process.stderr.write(red(`Invalid key "${key}". Environment variable keys must be UPPER_SNAKE_CASE.\n`));
49
+ process.exit(1);
50
+ }
51
+ const root = process.cwd();
52
+ const envPath = join(root, '.env');
53
+ const examplePath = join(root, '.env.example');
54
+ const addedToEnv = appendKey(envPath, key);
55
+ const addedToExample = appendKey(examplePath, key, description || undefined);
56
+ if (!addedToEnv && !addedToExample) {
57
+ process.stdout.write(yellow(`⚠ Key "${key}" already exists in both .env and .env.example — skipping.\n`));
58
+ return;
59
+ }
60
+ if (addedToEnv) {
61
+ process.stdout.write(green(`✔ Added ${key}= to .env\n`));
62
+ }
63
+ else {
64
+ process.stdout.write(yellow(` Key "${key}" already in .env — skipped.\n`));
65
+ }
66
+ if (addedToExample) {
67
+ process.stdout.write(green(`✔ Added ${key}=${description ? ` # ${description}` : ''} to .env.example\n`));
68
+ }
69
+ else {
70
+ process.stdout.write(yellow(` Key "${key}" already in .env.example — skipped.\n`));
71
+ }
72
+ }
73
+ //# sourceMappingURL=env-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-add.js","sourceRoot":"","sources":["../../src/commands/env-add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan fix:headers` — injects missing Bonifade headers into all .ts / .vue
12
+ * files under src/ without touching any other content.
13
+ */
14
+ export declare function runFixHeaders(args: string[]): Promise<void>;
15
+ //# sourceMappingURL=fix-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-headers.d.ts","sourceRoot":"","sources":["../../src/commands/fix-headers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBjE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ import { join } from 'node:path';
11
+ import fg from 'fast-glob';
12
+ import { fixHeaderInFile } from '../header-generator.js';
13
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
14
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
15
+ /**
16
+ * `vonosan fix:headers` — injects missing Bonifade headers into all .ts / .vue
17
+ * files under src/ without touching any other content.
18
+ */
19
+ export async function runFixHeaders(args) {
20
+ const srcDir = join(process.cwd(), args[0] ?? 'src');
21
+ const pattern = join(srcDir, '**/*.{ts,vue}').replace(/\\/g, '/');
22
+ const files = await fg(pattern, { absolute: true, ignore: ['**/node_modules/**', '**/dist/**'] });
23
+ let fixed = 0;
24
+ let skipped = 0;
25
+ for (const filePath of files) {
26
+ const wasFixed = fixHeaderInFile(filePath);
27
+ if (wasFixed) {
28
+ process.stdout.write(` ${green('+')} ${filePath}\n`);
29
+ fixed++;
30
+ }
31
+ else {
32
+ skipped++;
33
+ }
34
+ }
35
+ process.stdout.write(`\n${green(`✔ Fixed ${fixed} file${fixed === 1 ? '' : 's'}.`)} ${dim(`(${skipped} already had headers)`)}\n`);
36
+ }
37
+ //# sourceMappingURL=fix-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-headers.js","sourceRoot":"","sources":["../../src/commands/fix-headers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,WAAW,CAAA;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAA;AAClD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC,EAAE,CAAC,CAAA;IAEjG,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAA;YACrD,KAAK,EAAE,CAAA;QACT,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,KAAK,CAAC,WAAW,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,uBAAuB,CAAC,IAAI,CAC7G,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ──────────────────────────────────────────────────────────────────
3
+ * 🏢 Company Name: Bonifade Technologies
4
+ * 👨‍💻 Developer: Bowofade Oyerinde
5
+ * 🐙 GitHub: oyenet1
6
+ * 📅 Created Date: 2026-04-05
7
+ * 🔄 Updated Date: 2026-04-05
8
+ * ──────────────────────────────────────────────────────────────────
9
+ */
10
+ /**
11
+ * `vonosan fix:logs` — replaces raw `console.*` calls with `Logger.*` equivalents
12
+ * across all .ts files under src/.
13
+ */
14
+ export declare function runFixLogs(args: string[]): Promise<void>;
15
+ //# sourceMappingURL=fix-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-logs.d.ts","sourceRoot":"","sources":["../../src/commands/fix-logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC9D"}