@memberjunction/db-auto-doc 2.109.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 (63) hide show
  1. package/README.md +244 -0
  2. package/bin/run.js +5 -0
  3. package/dist/ai/simple-ai-client.d.ts +70 -0
  4. package/dist/ai/simple-ai-client.d.ts.map +1 -0
  5. package/dist/ai/simple-ai-client.js +181 -0
  6. package/dist/ai/simple-ai-client.js.map +1 -0
  7. package/dist/analyzers/analyzer.d.ts +23 -0
  8. package/dist/analyzers/analyzer.d.ts.map +1 -0
  9. package/dist/analyzers/analyzer.js +127 -0
  10. package/dist/analyzers/analyzer.js.map +1 -0
  11. package/dist/cli-old/cli.d.ts +3 -0
  12. package/dist/cli-old/cli.d.ts.map +1 -0
  13. package/dist/cli-old/cli.js +388 -0
  14. package/dist/cli-old/cli.js.map +1 -0
  15. package/dist/commands/analyze.d.ts +13 -0
  16. package/dist/commands/analyze.d.ts.map +1 -0
  17. package/dist/commands/analyze.js +98 -0
  18. package/dist/commands/analyze.js.map +1 -0
  19. package/dist/commands/export.d.ts +13 -0
  20. package/dist/commands/export.d.ts.map +1 -0
  21. package/dist/commands/export.js +117 -0
  22. package/dist/commands/export.js.map +1 -0
  23. package/dist/commands/init.d.ts +11 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +163 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/reset.d.ts +10 -0
  28. package/dist/commands/reset.d.ts.map +1 -0
  29. package/dist/commands/reset.js +37 -0
  30. package/dist/commands/reset.js.map +1 -0
  31. package/dist/commands/review.d.ts +11 -0
  32. package/dist/commands/review.d.ts.map +1 -0
  33. package/dist/commands/review.js +82 -0
  34. package/dist/commands/review.js.map +1 -0
  35. package/dist/database/connection.d.ts +40 -0
  36. package/dist/database/connection.d.ts.map +1 -0
  37. package/dist/database/connection.js +136 -0
  38. package/dist/database/connection.js.map +1 -0
  39. package/dist/database/introspection.d.ts +59 -0
  40. package/dist/database/introspection.d.ts.map +1 -0
  41. package/dist/database/introspection.js +124 -0
  42. package/dist/database/introspection.js.map +1 -0
  43. package/dist/generators/markdown-generator.d.ts +8 -0
  44. package/dist/generators/markdown-generator.d.ts.map +1 -0
  45. package/dist/generators/markdown-generator.js +106 -0
  46. package/dist/generators/markdown-generator.js.map +1 -0
  47. package/dist/generators/sql-generator.d.ts +20 -0
  48. package/dist/generators/sql-generator.d.ts.map +1 -0
  49. package/dist/generators/sql-generator.js +83 -0
  50. package/dist/generators/sql-generator.js.map +1 -0
  51. package/dist/index.d.ts +23 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +39 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/state/state-manager.d.ts +95 -0
  56. package/dist/state/state-manager.d.ts.map +1 -0
  57. package/dist/state/state-manager.js +236 -0
  58. package/dist/state/state-manager.js.map +1 -0
  59. package/dist/types/state-file.d.ts +124 -0
  60. package/dist/types/state-file.d.ts.map +1 -0
  61. package/dist/types/state-file.js +79 -0
  62. package/dist/types/state-file.js.map +1 -0
  63. package/package.json +62 -0
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const core_1 = require("@oclif/core");
30
+ const prompts_1 = require("@inquirer/prompts");
31
+ const ora_1 = __importDefault(require("ora"));
32
+ const chalk_1 = __importDefault(require("chalk"));
33
+ const fs = __importStar(require("fs/promises"));
34
+ const path = __importStar(require("path"));
35
+ const state_manager_1 = require("../state/state-manager");
36
+ const sql_generator_1 = require("../generators/sql-generator");
37
+ const markdown_generator_1 = require("../generators/markdown-generator");
38
+ const connection_1 = require("../database/connection");
39
+ class Export extends core_1.Command {
40
+ async run() {
41
+ const { flags } = await this.parse(Export);
42
+ this.log(chalk_1.default.blue.bold('\n📤 Exporting Documentation\n'));
43
+ try {
44
+ const stateManager = new state_manager_1.StateManager();
45
+ const state = await stateManager.load();
46
+ const outputDir = flags.output;
47
+ await fs.mkdir(outputDir, { recursive: true });
48
+ if (flags.format === 'sql' || flags.format === 'all') {
49
+ const sqlGen = new sql_generator_1.SQLGenerator();
50
+ const sql = sqlGen.generate(state, {
51
+ approvedOnly: flags['approved-only'],
52
+ });
53
+ const sqlPath = path.join(outputDir, 'extended-properties.sql');
54
+ await fs.writeFile(sqlPath, sql);
55
+ this.log(chalk_1.default.green(`✓ Generated SQL: ${sqlPath}`));
56
+ if (flags.execute) {
57
+ const confirmed = await (0, prompts_1.confirm)({
58
+ message: chalk_1.default.yellow('Execute SQL script? This will modify your database.'),
59
+ default: false,
60
+ });
61
+ if (confirmed) {
62
+ const connection = connection_1.DatabaseConnection.fromEnv();
63
+ const spinner = (0, ora_1.default)('Executing SQL...').start();
64
+ try {
65
+ await connection.query(sql);
66
+ spinner.succeed('SQL executed successfully');
67
+ }
68
+ catch (error) {
69
+ spinner.fail('SQL execution failed');
70
+ throw error;
71
+ }
72
+ await connection.close();
73
+ }
74
+ }
75
+ }
76
+ if (flags.format === 'markdown' || flags.format === 'all') {
77
+ const mdGen = new markdown_generator_1.MarkdownGenerator();
78
+ const markdown = mdGen.generate(state);
79
+ const mdPath = path.join(outputDir, 'database-documentation.md');
80
+ await fs.writeFile(mdPath, markdown);
81
+ this.log(chalk_1.default.green(`✓ Generated Markdown: ${mdPath}`));
82
+ }
83
+ this.log(chalk_1.default.green('\n✅ Export complete!'));
84
+ }
85
+ catch (error) {
86
+ this.error(error.message);
87
+ }
88
+ }
89
+ }
90
+ Export.description = 'Generate output files (SQL scripts, markdown documentation)';
91
+ Export.examples = [
92
+ '<%= config.bin %> <%= command.id %>',
93
+ '<%= config.bin %> <%= command.id %> --format sql',
94
+ '<%= config.bin %> <%= command.id %> --format markdown --output ./docs',
95
+ '<%= config.bin %> <%= command.id %> --execute --approved-only',
96
+ ];
97
+ Export.flags = {
98
+ format: core_1.Flags.string({
99
+ description: 'Output format',
100
+ options: ['sql', 'markdown', 'all'],
101
+ default: 'all',
102
+ }),
103
+ output: core_1.Flags.string({
104
+ description: 'Output directory',
105
+ default: './docs',
106
+ }),
107
+ 'approved-only': core_1.Flags.boolean({
108
+ description: 'Only export approved items',
109
+ default: false,
110
+ }),
111
+ execute: core_1.Flags.boolean({
112
+ description: 'Execute SQL script (apply to database)',
113
+ default: false,
114
+ }),
115
+ };
116
+ exports.default = Export;
117
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Init extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ interactive: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
7
+ connection: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAS7C,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAA+C;IAEjE,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;MAQV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA+H3B"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const core_1 = require("@oclif/core");
30
+ const prompts_1 = require("@inquirer/prompts");
31
+ const ora_1 = __importDefault(require("ora"));
32
+ const fs = __importStar(require("fs/promises"));
33
+ const path = __importStar(require("path"));
34
+ const connection_1 = require("../database/connection");
35
+ const state_manager_1 = require("../state/state-manager");
36
+ const chalk_1 = __importDefault(require("chalk"));
37
+ class Init extends core_1.Command {
38
+ async run() {
39
+ const { flags } = await this.parse(Init);
40
+ this.log(chalk_1.default.blue.bold('\n🚀 SQL Server Database Documentation Generator\n'));
41
+ try {
42
+ let server;
43
+ let database;
44
+ let user;
45
+ let pwd;
46
+ if (flags.interactive && !flags.connection) {
47
+ server = await (0, prompts_1.input)({
48
+ message: 'Database server:',
49
+ default: 'localhost',
50
+ });
51
+ database = await (0, prompts_1.input)({
52
+ message: 'Database name:',
53
+ validate: (val) => (val ? true : 'Database name required'),
54
+ });
55
+ user = await (0, prompts_1.input)({
56
+ message: 'Username:',
57
+ default: 'sa',
58
+ });
59
+ pwd = await (0, prompts_1.password)({
60
+ message: 'Password:',
61
+ mask: '*',
62
+ });
63
+ }
64
+ else if (flags.connection) {
65
+ // Parse connection string (simplified)
66
+ server = process.env.DB_SERVER || 'localhost';
67
+ database = process.env.DB_DATABASE || '';
68
+ user = process.env.DB_USER || 'sa';
69
+ pwd = process.env.DB_PASSWORD || '';
70
+ }
71
+ else {
72
+ server = process.env.DB_SERVER || 'localhost';
73
+ database = process.env.DB_DATABASE || '';
74
+ user = process.env.DB_USER || 'sa';
75
+ pwd = process.env.DB_PASSWORD || '';
76
+ }
77
+ // Test connection
78
+ const spinner = (0, ora_1.default)('Testing database connection...').start();
79
+ const connection = new connection_1.DatabaseConnection({
80
+ server,
81
+ database,
82
+ user,
83
+ password: pwd,
84
+ encrypt: true,
85
+ trustServerCertificate: true,
86
+ });
87
+ const connected = await connection.test();
88
+ if (!connected) {
89
+ spinner.fail('Connection failed');
90
+ this.exit(1);
91
+ }
92
+ spinner.succeed('Connection successful');
93
+ // Create .env file
94
+ const envPath = path.join(process.cwd(), '.env');
95
+ const envContent = `
96
+ # Database Connection
97
+ DB_SERVER=${server}
98
+ DB_DATABASE=${database}
99
+ DB_USER=${user}
100
+ DB_PASSWORD=${pwd}
101
+ DB_ENCRYPT=true
102
+ DB_TRUST_SERVER_CERTIFICATE=true
103
+
104
+ # AI Configuration
105
+ AI_PROVIDER=openai
106
+ AI_MODEL=gpt-4
107
+ AI_API_KEY=your-api-key-here
108
+ `.trim();
109
+ await fs.writeFile(envPath, envContent);
110
+ this.log(chalk_1.default.green('✓ Created .env file'));
111
+ // Create state file
112
+ const stateManager = new state_manager_1.StateManager();
113
+ await stateManager.reset(server, database);
114
+ this.log(chalk_1.default.green('✓ Created db-doc-state.json'));
115
+ // Ask seed questions
116
+ if (flags.interactive) {
117
+ const addSeed = await (0, prompts_1.confirm)({
118
+ message: 'Would you like to provide seed context?',
119
+ default: true,
120
+ });
121
+ if (addSeed) {
122
+ const purpose = await (0, prompts_1.input)({
123
+ message: 'Overall database purpose:',
124
+ });
125
+ const domains = await (0, prompts_1.input)({
126
+ message: 'Business domains (comma-separated):',
127
+ });
128
+ const state = stateManager.getState();
129
+ state.seedContext = {
130
+ overallPurpose: purpose,
131
+ businessDomains: domains.split(',').map((d) => d.trim()),
132
+ };
133
+ await stateManager.save();
134
+ this.log(chalk_1.default.green('✓ Saved seed context'));
135
+ }
136
+ }
137
+ this.log(chalk_1.default.green.bold('\n✅ Initialization complete!\n'));
138
+ this.log('Next steps:');
139
+ this.log(' 1. Edit .env and add your AI API key');
140
+ this.log(' 2. Run: db-auto-doc analyze');
141
+ await connection.close();
142
+ }
143
+ catch (error) {
144
+ this.error(error.message);
145
+ }
146
+ }
147
+ }
148
+ Init.description = 'Initialize database documentation project';
149
+ Init.examples = [
150
+ '<%= config.bin %> <%= command.id %>',
151
+ '<%= config.bin %> <%= command.id %> --interactive',
152
+ ];
153
+ Init.flags = {
154
+ interactive: core_1.Flags.boolean({
155
+ description: 'Interactive setup',
156
+ default: true,
157
+ }),
158
+ connection: core_1.Flags.string({
159
+ description: 'Connection string (skip prompts)',
160
+ }),
161
+ };
162
+ exports.default = Init;
163
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Reset extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ all: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,SAAsB;IAExC,MAAM,CAAC,QAAQ,WAEb;IAEF,MAAM,CAAC,KAAK;;MAKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB3B"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_1 = require("@oclif/core");
7
+ const prompts_1 = require("@inquirer/prompts");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const state_manager_1 = require("../state/state-manager");
10
+ class Reset extends core_1.Command {
11
+ async run() {
12
+ const { flags } = await this.parse(Reset);
13
+ if (flags.all) {
14
+ const confirmed = await (0, prompts_1.confirm)({
15
+ message: chalk_1.default.yellow('Reset entire state file? This cannot be undone.'),
16
+ default: false,
17
+ });
18
+ if (confirmed) {
19
+ const stateManager = new state_manager_1.StateManager();
20
+ await stateManager.reset(process.env.DB_SERVER || 'localhost', process.env.DB_DATABASE || 'master');
21
+ this.log(chalk_1.default.green('✅ State file reset'));
22
+ }
23
+ }
24
+ }
25
+ }
26
+ Reset.description = 'Reset state file';
27
+ Reset.examples = [
28
+ '<%= config.bin %> <%= command.id %> --all',
29
+ ];
30
+ Reset.flags = {
31
+ all: core_1.Flags.boolean({
32
+ description: 'Reset entire state file',
33
+ default: false,
34
+ }),
35
+ };
36
+ exports.default = Reset;
37
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":";;;;;AAAA,sCAA6C;AAC7C,+CAA4C;AAC5C,kDAA0B;AAC1B,0DAAsD;AAEtD,MAAqB,KAAM,SAAQ,cAAO;IAcxC,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,IAAA,iBAAO,EAAC;gBAC9B,OAAO,EAAE,eAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC;gBACxE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;gBACxC,MAAM,YAAY,CAAC,KAAK,CACtB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,WAAW,EACpC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,QAAQ,CACpC,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;;AA/BM,iBAAW,GAAG,kBAAkB,CAAC;AAEjC,cAAQ,GAAG;IAChB,2CAA2C;CAC5C,CAAC;AAEK,WAAK,GAAG;IACb,GAAG,EAAE,YAAK,CAAC,OAAO,CAAC;QACjB,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,KAAK;KACf,CAAC;CACH,CAAC;kBAZiB,KAAK"}
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Review extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ schema: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ 'unapproved-only': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,WAAW,SAAmD;IAErE,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,KAAK;;;MAQV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmE3B"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_1 = require("@oclif/core");
7
+ const prompts_1 = require("@inquirer/prompts");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const state_manager_1 = require("../state/state-manager");
10
+ class Review extends core_1.Command {
11
+ async run() {
12
+ const { flags } = await this.parse(Review);
13
+ this.log(chalk_1.default.blue.bold('\n📝 Review Documentation\n'));
14
+ try {
15
+ const stateManager = new state_manager_1.StateManager();
16
+ const state = await stateManager.load();
17
+ const unapproved = stateManager.getUnapprovedTables(flags.schema);
18
+ if (unapproved.length === 0) {
19
+ this.log(chalk_1.default.green('✅ All tables approved!'));
20
+ return;
21
+ }
22
+ this.log(`Found ${unapproved.length} unapproved tables\n`);
23
+ for (const { schema, table } of unapproved) {
24
+ const schemaState = state.schemas[schema];
25
+ const tableState = schemaState.tables[table];
26
+ this.log(chalk_1.default.cyan.bold(`\n${schema}.${table}`));
27
+ this.log('─'.repeat(50));
28
+ if (tableState.aiGenerated) {
29
+ this.log(chalk_1.default.white('Description:'));
30
+ this.log(tableState.aiGenerated.description);
31
+ this.log('');
32
+ this.log(chalk_1.default.gray(`Confidence: ${(tableState.aiGenerated.confidence * 100).toFixed(0)}%`));
33
+ }
34
+ const action = await (0, prompts_1.select)({
35
+ message: 'Action:',
36
+ choices: [
37
+ { name: 'Approve', value: 'approve' },
38
+ { name: 'Add notes', value: 'notes' },
39
+ { name: 'Skip', value: 'skip' },
40
+ { name: 'Exit review', value: 'exit' },
41
+ ],
42
+ });
43
+ if (action === 'exit') {
44
+ break;
45
+ }
46
+ if (action === 'approve') {
47
+ stateManager.approveTable(schema, table);
48
+ this.log(chalk_1.default.green('✓ Approved'));
49
+ }
50
+ if (action === 'notes') {
51
+ const notes = await (0, prompts_1.input)({
52
+ message: 'Enter notes:',
53
+ });
54
+ stateManager.addTableNotes(schema, table, notes);
55
+ this.log(chalk_1.default.green('✓ Notes added'));
56
+ }
57
+ }
58
+ await stateManager.save();
59
+ this.log(chalk_1.default.green('\n✅ Review complete!'));
60
+ }
61
+ catch (error) {
62
+ this.error(error.message);
63
+ }
64
+ }
65
+ }
66
+ Review.description = 'Review and approve AI-generated documentation';
67
+ Review.examples = [
68
+ '<%= config.bin %> <%= command.id %>',
69
+ '<%= config.bin %> <%= command.id %> --schema dbo',
70
+ '<%= config.bin %> <%= command.id %> --unapproved-only',
71
+ ];
72
+ Review.flags = {
73
+ schema: core_1.Flags.string({
74
+ description: 'Review specific schema',
75
+ }),
76
+ 'unapproved-only': core_1.Flags.boolean({
77
+ description: 'Only show unapproved items',
78
+ default: false,
79
+ }),
80
+ };
81
+ exports.default = Review;
82
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import * as sql from 'mssql';
2
+ export interface ConnectionConfig {
3
+ server: string;
4
+ database: string;
5
+ user?: string;
6
+ password?: string;
7
+ port?: number;
8
+ encrypt?: boolean;
9
+ trustServerCertificate?: boolean;
10
+ }
11
+ /**
12
+ * Database connection manager - NO MJ DEPENDENCIES
13
+ */
14
+ export declare class DatabaseConnection {
15
+ private pool?;
16
+ private config;
17
+ constructor(config: ConnectionConfig);
18
+ /**
19
+ * Get connection from environment variables
20
+ */
21
+ static fromEnv(): DatabaseConnection;
22
+ /**
23
+ * Get connection pool
24
+ */
25
+ getConnection(): Promise<sql.ConnectionPool>;
26
+ /**
27
+ * Execute query with retry logic
28
+ */
29
+ query<T = any>(queryText: string, params?: Record<string, any>): Promise<T[]>;
30
+ /**
31
+ * Close connection
32
+ */
33
+ close(): Promise<void>;
34
+ /**
35
+ * Test connection
36
+ */
37
+ test(): Promise<boolean>;
38
+ private sleep;
39
+ }
40
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/database/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAM7B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,gBAAgB;IAoBpC;;OAEG;IACH,MAAM,CAAC,OAAO,IAAI,kBAAkB;IAcpC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAUlD;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAiCnF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.DatabaseConnection = void 0;
27
+ const sql = __importStar(require("mssql"));
28
+ const dotenv = __importStar(require("dotenv"));
29
+ // Load environment variables
30
+ dotenv.config();
31
+ /**
32
+ * Database connection manager - NO MJ DEPENDENCIES
33
+ */
34
+ class DatabaseConnection {
35
+ constructor(config) {
36
+ this.config = {
37
+ server: config.server,
38
+ database: config.database,
39
+ user: config.user,
40
+ password: config.password,
41
+ port: config.port || 1433,
42
+ options: {
43
+ encrypt: config.encrypt !== undefined ? config.encrypt : true,
44
+ trustServerCertificate: config.trustServerCertificate !== undefined ? config.trustServerCertificate : false,
45
+ enableArithAbort: true,
46
+ },
47
+ pool: {
48
+ max: 10,
49
+ min: 2,
50
+ idleTimeoutMillis: 30000,
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Get connection from environment variables
56
+ */
57
+ static fromEnv() {
58
+ const config = {
59
+ server: process.env.DB_SERVER || 'localhost',
60
+ database: process.env.DB_DATABASE || 'master',
61
+ user: process.env.DB_USER,
62
+ password: process.env.DB_PASSWORD,
63
+ port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 1433,
64
+ encrypt: process.env.DB_ENCRYPT === 'true',
65
+ trustServerCertificate: process.env.DB_TRUST_SERVER_CERTIFICATE === 'true',
66
+ };
67
+ return new DatabaseConnection(config);
68
+ }
69
+ /**
70
+ * Get connection pool
71
+ */
72
+ async getConnection() {
73
+ if (this.pool && this.pool.connected) {
74
+ return this.pool;
75
+ }
76
+ this.pool = new sql.ConnectionPool(this.config);
77
+ await this.pool.connect();
78
+ return this.pool;
79
+ }
80
+ /**
81
+ * Execute query with retry logic
82
+ */
83
+ async query(queryText, params) {
84
+ let lastError;
85
+ const maxRetries = 3;
86
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
87
+ try {
88
+ const pool = await this.getConnection();
89
+ const request = pool.request();
90
+ if (params) {
91
+ for (const [key, value] of Object.entries(params)) {
92
+ request.input(key, value);
93
+ }
94
+ }
95
+ const result = await request.query(queryText);
96
+ return result.recordset;
97
+ }
98
+ catch (error) {
99
+ lastError = error;
100
+ if (lastError.message.includes('Incorrect syntax')) {
101
+ throw lastError;
102
+ }
103
+ if (attempt < maxRetries) {
104
+ await this.sleep(Math.pow(2, attempt) * 100);
105
+ }
106
+ }
107
+ }
108
+ throw lastError || new Error('Query failed after retries');
109
+ }
110
+ /**
111
+ * Close connection
112
+ */
113
+ async close() {
114
+ if (this.pool) {
115
+ await this.pool.close();
116
+ this.pool = undefined;
117
+ }
118
+ }
119
+ /**
120
+ * Test connection
121
+ */
122
+ async test() {
123
+ try {
124
+ await this.query('SELECT 1 as Test');
125
+ return true;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ }
131
+ sleep(ms) {
132
+ return new Promise(resolve => setTimeout(resolve, ms));
133
+ }
134
+ }
135
+ exports.DatabaseConnection = DatabaseConnection;
136
+ //# sourceMappingURL=connection.js.map