@aida-dev/cli 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -14
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var CLIConfig = z.object({
|
|
|
17
17
|
aiPatterns: z.array(z.string()).default([]),
|
|
18
18
|
defaultBranch: z.string().optional(),
|
|
19
19
|
outDir: z.string().default("./aida-output"),
|
|
20
|
-
format: z.enum(["json", "md", "both"]).default("both"),
|
|
20
|
+
format: z.enum(["json", "md", "both"]).default("both").optional(),
|
|
21
21
|
verbose: z.boolean().default(false)
|
|
22
22
|
});
|
|
23
23
|
|
|
@@ -86,7 +86,7 @@ function createAnalyzeCommand() {
|
|
|
86
86
|
|
|
87
87
|
// src/commands/report.ts
|
|
88
88
|
import { Command as Command3 } from "commander";
|
|
89
|
-
import { readJSON as readJSON2,
|
|
89
|
+
import { readJSON as readJSON2, createLogger as createLogger3 } from "@aida-dev/core";
|
|
90
90
|
import { join as join3 } from "path";
|
|
91
91
|
import { promises as fs } from "fs";
|
|
92
92
|
function generateMarkdownReport(metrics) {
|
|
@@ -117,24 +117,17 @@ ${metrics.caveats.map((caveat) => `- ${caveat}`).join("\n")}
|
|
|
117
117
|
`;
|
|
118
118
|
}
|
|
119
119
|
function createReportCommand() {
|
|
120
|
-
return new Command3("report").description("Generate report from metrics.json").option("--out-dir <path>", "Output directory", "./aida-output").option("--
|
|
120
|
+
return new Command3("report").description("Generate report from metrics.json").option("--out-dir <path>", "Output directory", "./aida-output").option("--verbose", "Verbose logging", false).action(async (options) => {
|
|
121
121
|
const config = CLIConfig.parse(options);
|
|
122
122
|
const logger = createLogger3(config.verbose);
|
|
123
123
|
try {
|
|
124
124
|
logger.info("Generating report...");
|
|
125
125
|
const inputPath = join3(config.outDir, "metrics.json");
|
|
126
126
|
const metrics = await readJSON2(inputPath);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
if (config.format === "md" || config.format === "both") {
|
|
133
|
-
const markdown = generateMarkdownReport(metrics);
|
|
134
|
-
const mdPath = join3(config.outDir, "report.md");
|
|
135
|
-
await fs.writeFile(mdPath, markdown, "utf-8");
|
|
136
|
-
logger.info(`Markdown report written to: ${mdPath}`);
|
|
137
|
-
}
|
|
127
|
+
const markdown = generateMarkdownReport(metrics);
|
|
128
|
+
const mdPath = join3(config.outDir, "report.md");
|
|
129
|
+
await fs.writeFile(mdPath, markdown, "utf-8");
|
|
130
|
+
logger.info(`Markdown report written to: ${mdPath}`);
|
|
138
131
|
logger.info("Report generation completed");
|
|
139
132
|
} catch (error) {
|
|
140
133
|
logger.error(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/collect.ts","../src/schema/config.ts","../src/commands/analyze.ts","../src/commands/report.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { createCollectCommand } from './commands/collect.js';\nimport { createAnalyzeCommand } from './commands/analyze.js';\nimport { createReportCommand } from './commands/report.js';\n\nconst program = new Command();\n\nprogram\n .name('aida')\n .description('AIDA (AI Development Accounting) - Metrics for AI-assisted development')\n .version('0.0.0');\n\n// Add commands\nprogram.addCommand(createCollectCommand());\nprogram.addCommand(createAnalyzeCommand());\nprogram.addCommand(createReportCommand());\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { collectCommits, writeJSON, createLogger } from '@aida-dev/core';\nimport { join } from 'path';\nimport { CLIConfig } from '../schema/config.js';\n\nexport function createCollectCommand(): Command {\n return new Command('collect')\n .description('Collect commits and generate commit-stream.json')\n .option('--repo <path>', 'Repository path', process.cwd())\n .option('--since <date>', 'Start date (ISO or relative like 90d)')\n .option('--until <date>', 'End date (ISO or relative)')\n .option(\n '--ai-pattern <pattern>',\n 'AI detection pattern (repeatable)',\n (value, previous) => {\n return previous ? [...previous, value] : [value];\n },\n []\n )\n .option('--default-branch <name>', 'Default branch name')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Starting commit collection...');\n\n const commitStream = await collectCommits({\n repoPath: config.repo,\n since: config.since,\n until: config.until,\n aiPatterns: config.aiPatterns,\n defaultBranch: config.defaultBranch,\n logger,\n });\n\n const outputPath = join(config.outDir, 'commit-stream.json');\n await writeJSON(outputPath, commitStream);\n\n logger.info(`Collected ${commitStream.commits.length} commits`);\n logger.info(`AI-tagged commits: ${commitStream.commits.filter((c) => c.tags.ai).length}`);\n logger.info(`Output written to: ${outputPath}`);\n } catch (error) {\n logger.error(\n `Collection failed: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n }\n });\n}\n","import { z } from 'zod';\n\nexport const CLIConfig = z.object({\n repo: z.string().default(process.cwd()),\n since: z.string().optional(),\n until: z.string().optional(),\n aiPatterns: z.array(z.string()).default([]),\n defaultBranch: z.string().optional(),\n outDir: z.string().default('./aida-output'),\n format: z.enum(['json', 'md', 'both']).default('both'),\n verbose: z.boolean().default(false),\n});\n\nexport type CLIConfig = z.infer<typeof CLIConfig>;\n","import { Command } from 'commander';\nimport { readJSON, writeJSON, createLogger } from '@aida-dev/core';\nimport { calculateMetrics } from '@aida-dev/metrics';\nimport { join } from 'path';\nimport { CLIConfig } from '../schema/config.js';\n\nexport function createAnalyzeCommand(): Command {\n return new Command('analyze')\n .description('Analyze commit stream and generate metrics.json')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Starting metrics analysis...');\n\n const inputPath = join(config.outDir, 'commit-stream.json');\n const commitStream = await readJSON(inputPath);\n\n logger.info(`Analyzing ${commitStream.commits.length} commits`);\n\n const metrics = calculateMetrics(commitStream);\n\n const outputPath = join(config.outDir, 'metrics.json');\n await writeJSON(outputPath, metrics);\n\n logger.info(`Merge ratio: ${(metrics.mergeRatio.mergeRatio * 100).toFixed(1)}%`);\n logger.info(`Average persistence: ${metrics.persistence.avgDays} days`);\n logger.info(`Output written to: ${outputPath}`);\n } catch (error) {\n logger.error(`Analysis failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { readJSON, writeJSON, createLogger } from '@aida-dev/core';\nimport { Metrics } from '@aida-dev/metrics';\nimport { join } from 'path';\nimport { promises as fs } from 'fs';\nimport { CLIConfig } from '../schema/config.js';\n\nfunction generateMarkdownReport(metrics: Metrics): string {\n const mergeRatioPct = (metrics.mergeRatio.mergeRatio * 100).toFixed(1);\n\n return `# AIDA Report\n\n**Repo:** ${metrics.repoPath} \n**Default branch:** ${metrics.defaultBranch} \n**Window:** ${metrics.window.since || 'beginning'} → ${metrics.window.until || 'now'} \n**Generated:** ${metrics.generatedAt}\n\n## Merge Ratio\n- AI-tagged commits (total): ${metrics.mergeRatio.aiCommitsTotal}\n- AI-tagged commits merged: ${metrics.mergeRatio.aiCommitsMerged}\n- **Merge Ratio:** ${mergeRatioPct}%\n\n## Persistence (file-level proxy)\n- Commits considered: ${metrics.persistence.commitsConsidered}\n- Average days: ${metrics.persistence.avgDays}\n- Median days: ${metrics.persistence.medianDays}\n\n| 0–1d | 2–7d | 8–30d | 31–90d | 90d+ |\n|---:|---:|---:|---:|---:|\n| ${metrics.persistence.buckets.d0_1} | ${metrics.persistence.buckets.d2_7} | ${metrics.persistence.buckets.d8_30} | ${metrics.persistence.buckets.d31_90} | ${metrics.persistence.buckets.d90_plus} |\n\n### Caveats\n${metrics.caveats.map((caveat) => `- ${caveat}`).join('\\n')}\n`;\n}\n\nexport function createReportCommand(): Command {\n return new Command('report')\n .description('Generate report from metrics.json')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--format <format>', 'Output format: json, md, both', 'both')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Generating report...');\n\n const inputPath = join(config.outDir, 'metrics.json');\n const metrics: Metrics = await readJSON(inputPath);\n\n if (config.format === 'json' || config.format === 'both') {\n const jsonPath = join(config.outDir, 'report.json');\n await writeJSON(jsonPath, metrics);\n logger.info(`JSON report written to: ${jsonPath}`);\n }\n\n if (config.format === 'md' || config.format === 'both') {\n const markdown = generateMarkdownReport(metrics);\n const mdPath = join(config.outDir, 'report.md');\n await fs.writeFile(mdPath, markdown, 'utf-8');\n logger.info(`Markdown report written to: ${mdPath}`);\n }\n\n logger.info('Report generation completed');\n } catch (error) {\n logger.error(\n `Report generation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["Command","Command","writeJSON","createLogger","join","Command","createLogger","join","writeJSON","Command","readJSON","writeJSON","createLogger","join","Command","createLogger","join","readJSON","writeJSON","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/collect.ts","../src/schema/config.ts","../src/commands/analyze.ts","../src/commands/report.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { createCollectCommand } from './commands/collect.js';\nimport { createAnalyzeCommand } from './commands/analyze.js';\nimport { createReportCommand } from './commands/report.js';\n\nconst program = new Command();\n\nprogram\n .name('aida')\n .description('AIDA (AI Development Accounting) - Metrics for AI-assisted development')\n .version('0.0.0');\n\n// Add commands\nprogram.addCommand(createCollectCommand());\nprogram.addCommand(createAnalyzeCommand());\nprogram.addCommand(createReportCommand());\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { collectCommits, writeJSON, createLogger } from '@aida-dev/core';\nimport { join } from 'path';\nimport { CLIConfig } from '../schema/config.js';\n\nexport function createCollectCommand(): Command {\n return new Command('collect')\n .description('Collect commits and generate commit-stream.json')\n .option('--repo <path>', 'Repository path', process.cwd())\n .option('--since <date>', 'Start date (ISO or relative like 90d)')\n .option('--until <date>', 'End date (ISO or relative)')\n .option(\n '--ai-pattern <pattern>',\n 'AI detection pattern (repeatable)',\n (value, previous) => {\n return previous ? [...previous, value] : [value];\n },\n []\n )\n .option('--default-branch <name>', 'Default branch name')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Starting commit collection...');\n\n const commitStream = await collectCommits({\n repoPath: config.repo,\n since: config.since,\n until: config.until,\n aiPatterns: config.aiPatterns,\n defaultBranch: config.defaultBranch,\n logger,\n });\n\n const outputPath = join(config.outDir, 'commit-stream.json');\n await writeJSON(outputPath, commitStream);\n\n logger.info(`Collected ${commitStream.commits.length} commits`);\n logger.info(`AI-tagged commits: ${commitStream.commits.filter((c) => c.tags.ai).length}`);\n logger.info(`Output written to: ${outputPath}`);\n } catch (error) {\n logger.error(\n `Collection failed: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n }\n });\n}\n","import { z } from 'zod';\n\nexport const CLIConfig = z.object({\n repo: z.string().default(process.cwd()),\n since: z.string().optional(),\n until: z.string().optional(),\n aiPatterns: z.array(z.string()).default([]),\n defaultBranch: z.string().optional(),\n outDir: z.string().default('./aida-output'),\n format: z.enum(['json', 'md', 'both']).default('both').optional(),\n verbose: z.boolean().default(false),\n});\n\nexport type CLIConfig = z.infer<typeof CLIConfig>;\n","import { Command } from 'commander';\nimport { readJSON, writeJSON, createLogger } from '@aida-dev/core';\nimport { calculateMetrics } from '@aida-dev/metrics';\nimport { join } from 'path';\nimport { CLIConfig } from '../schema/config.js';\n\nexport function createAnalyzeCommand(): Command {\n return new Command('analyze')\n .description('Analyze commit stream and generate metrics.json')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Starting metrics analysis...');\n\n const inputPath = join(config.outDir, 'commit-stream.json');\n const commitStream = await readJSON(inputPath);\n\n logger.info(`Analyzing ${commitStream.commits.length} commits`);\n\n const metrics = calculateMetrics(commitStream);\n\n const outputPath = join(config.outDir, 'metrics.json');\n await writeJSON(outputPath, metrics);\n\n logger.info(`Merge ratio: ${(metrics.mergeRatio.mergeRatio * 100).toFixed(1)}%`);\n logger.info(`Average persistence: ${metrics.persistence.avgDays} days`);\n logger.info(`Output written to: ${outputPath}`);\n } catch (error) {\n logger.error(`Analysis failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { readJSON, createLogger } from '@aida-dev/core';\nimport { Metrics } from '@aida-dev/metrics';\nimport { join } from 'path';\nimport { promises as fs } from 'fs';\nimport { CLIConfig } from '../schema/config.js';\n\nfunction generateMarkdownReport(metrics: Metrics): string {\n const mergeRatioPct = (metrics.mergeRatio.mergeRatio * 100).toFixed(1);\n\n return `# AIDA Report\n\n**Repo:** ${metrics.repoPath} \n**Default branch:** ${metrics.defaultBranch} \n**Window:** ${metrics.window.since || 'beginning'} → ${metrics.window.until || 'now'} \n**Generated:** ${metrics.generatedAt}\n\n## Merge Ratio\n- AI-tagged commits (total): ${metrics.mergeRatio.aiCommitsTotal}\n- AI-tagged commits merged: ${metrics.mergeRatio.aiCommitsMerged}\n- **Merge Ratio:** ${mergeRatioPct}%\n\n## Persistence (file-level proxy)\n- Commits considered: ${metrics.persistence.commitsConsidered}\n- Average days: ${metrics.persistence.avgDays}\n- Median days: ${metrics.persistence.medianDays}\n\n| 0–1d | 2–7d | 8–30d | 31–90d | 90d+ |\n|---:|---:|---:|---:|---:|\n| ${metrics.persistence.buckets.d0_1} | ${metrics.persistence.buckets.d2_7} | ${metrics.persistence.buckets.d8_30} | ${metrics.persistence.buckets.d31_90} | ${metrics.persistence.buckets.d90_plus} |\n\n### Caveats\n${metrics.caveats.map((caveat) => `- ${caveat}`).join('\\n')}\n`;\n}\n\nexport function createReportCommand(): Command {\n return new Command('report')\n .description('Generate report from metrics.json')\n .option('--out-dir <path>', 'Output directory', './aida-output')\n .option('--verbose', 'Verbose logging', false)\n .action(async (options) => {\n const config = CLIConfig.parse(options);\n const logger = createLogger(config.verbose);\n\n try {\n logger.info('Generating report...');\n\n const inputPath = join(config.outDir, 'metrics.json');\n const metrics: Metrics = await readJSON(inputPath);\n\n const markdown = generateMarkdownReport(metrics);\n const mdPath = join(config.outDir, 'report.md');\n await fs.writeFile(mdPath, markdown, 'utf-8');\n logger.info(`Markdown report written to: ${mdPath}`);\n\n logger.info('Report generation completed');\n } catch (error) {\n logger.error(\n `Report generation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["Command","Command","writeJSON","createLogger","join","Command","createLogger","join","writeJSON","Command","readJSON","createLogger","join","Command","createLogger","join","readJSON","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aida-dev/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"commander": "^11.1.0",
|
|
19
19
|
"zod": "^3.22.4",
|
|
20
|
-
"@aida-dev/core": "0.
|
|
21
|
-
"@aida-dev/metrics": "0.1.
|
|
20
|
+
"@aida-dev/core": "0.4.0",
|
|
21
|
+
"@aida-dev/metrics": "0.1.5"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"tsup": "^8.0.0",
|