@fiale-plus/repo-arch 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.
@@ -0,0 +1,221 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { resolveRepoRoot, getHeadSha } from './git-history.js';
4
+ import { mineHistory } from './git-history.js';
5
+ import { classifyHistory } from './signals.js';
6
+ import { generateCards } from './cards.js';
7
+ import { getStatusOverrideMap } from './review.js';
8
+ import { cachedOrGenerate } from './cache.js';
9
+ export function generateQa(card) {
10
+ const examples = [];
11
+ const fileStr = card.affectedFiles.join(', ');
12
+ // General "why" question
13
+ if (card.type === 'rationale-cluster' || card.type === 'repeated-fix') {
14
+ examples.push({
15
+ messages: [
16
+ { role: 'user', content: `Why should I be careful when changing ${fileStr}?` },
17
+ { role: 'assistant', content: `${card.title}. ${card.suggestion} Evidence: ${card.supportingCommits.map(c => c.subject).join('; ')}.` },
18
+ ],
19
+ sourceCardId: card.id,
20
+ taskType: 'qa',
21
+ });
22
+ }
23
+ // Direct question from card title
24
+ const titleQuestion = card.title.replace(/^High-churn file:/, 'Why does').replace(/^Repeated fixes in:/, 'What keeps breaking in').replace(/^Possible test gap:/, 'Is there test coverage for').replace(/^Reversion pattern:?/, 'Has this been reverted before');
25
+ if (titleQuestion !== card.title) {
26
+ examples.push({
27
+ messages: [
28
+ { role: 'user', content: `${titleQuestion} ${fileStr}?` },
29
+ { role: 'assistant', content: `${card.title}. ${card.suggestion}` },
30
+ ],
31
+ sourceCardId: card.id,
32
+ taskType: 'qa',
33
+ });
34
+ }
35
+ return examples;
36
+ }
37
+ export function generateReviewWarning(card) {
38
+ const examples = [];
39
+ if (card.type === 'repeated-fix' || card.type === 'revert-pattern') {
40
+ examples.push({
41
+ messages: [
42
+ { role: 'user', content: `Review this change touching ${card.affectedFiles.join(', ')}.\nWhat risks should I check?` },
43
+ { role: 'assistant', content: `Warning: ${card.title}. ${card.suggestion} This area has ${card.supportingCommits.length} relevant commits in history.` },
44
+ ],
45
+ sourceCardId: card.id,
46
+ taskType: 'review-warning',
47
+ });
48
+ }
49
+ return examples;
50
+ }
51
+ export function generateRiskClassification(card) {
52
+ const examples = [];
53
+ const riskLevel = card.confidence >= 0.7 ? 'high' : card.confidence >= 0.5 ? 'medium' : 'low';
54
+ examples.push({
55
+ messages: [
56
+ { role: 'user', content: `Classify risk for changing ${card.affectedFiles.join(', ')}.` },
57
+ { role: 'assistant', content: JSON.stringify({
58
+ risk: card.type === 'revert-pattern' ? 'revert_instability' : card.type === 'repeated-fix' ? 'regression_risk' : card.type === 'test-gap' ? 'test_coverage_concern' : 'informational',
59
+ severity: riskLevel,
60
+ confidence: card.confidence,
61
+ reason: card.suggestion,
62
+ }) },
63
+ ],
64
+ sourceCardId: card.id,
65
+ taskType: 'risk-classification',
66
+ });
67
+ return examples;
68
+ }
69
+ function generateNegative(cards) {
70
+ // Generate negative examples from low-confidence or churn-hotspot cards
71
+ const negatives = [];
72
+ for (const card of cards) {
73
+ if (card.type === 'churn-hotspot' && card.confidence < 0.6) {
74
+ negatives.push({
75
+ messages: [
76
+ { role: 'user', content: `Review this change touching ${card.affectedFiles.join(', ')}.\nWhat risks should I check?` },
77
+ { role: 'assistant', content: `No specific historical warnings for this file. It changes frequently but has no repeated fix or revert patterns. Standard review applies.` },
78
+ ],
79
+ sourceCardId: card.id,
80
+ taskType: 'negative',
81
+ });
82
+ }
83
+ }
84
+ // Add a generic negative if few exist
85
+ if (negatives.length === 0) {
86
+ negatives.push({
87
+ messages: [
88
+ { role: 'user', content: 'Review this change touching src/new-feature.ts.\nWhat risks should I check?' },
89
+ { role: 'assistant', content: 'No historical warnings found for this file. Standard review applies.' },
90
+ ],
91
+ sourceCardId: 'generic',
92
+ taskType: 'negative',
93
+ });
94
+ }
95
+ return negatives;
96
+ }
97
+ export function generateDataset(options = {}) {
98
+ const repoRoot = resolveRepoRoot(options.repoPath);
99
+ const headSha = getHeadSha(repoRoot);
100
+ const generateFn = () => {
101
+ const history = mineHistory({ repoPath: options.repoPath });
102
+ const classified = classifyHistory(history.records);
103
+ return generateCards(classified, {}, getStatusOverrideMap(repoRoot));
104
+ };
105
+ const { cards } = cachedOrGenerate(repoRoot, generateFn);
106
+ const acceptedCards = options.includeRejected
107
+ ? cards.filter(c => c.status === 'accepted' || c.status === 'pending')
108
+ : cards.filter(c => c.status === 'accepted');
109
+ const examples = [];
110
+ for (const card of acceptedCards) {
111
+ examples.push(...generateQa(card));
112
+ examples.push(...generateReviewWarning(card));
113
+ examples.push(...generateRiskClassification(card));
114
+ }
115
+ examples.push(...generateNegative(cards));
116
+ const counts = { qa: 0, 'review-warning': 0, 'risk-classification': 0, negative: 0 };
117
+ for (const ex of examples) {
118
+ counts[ex.taskType]++;
119
+ }
120
+ const result = {
121
+ repoRoot,
122
+ headSha: headSha.slice(0, 12),
123
+ totalCards: cards.length,
124
+ acceptedCards: acceptedCards.length,
125
+ examples,
126
+ counts,
127
+ };
128
+ if (options.outPath) {
129
+ const jsonl = examples.map(ex => JSON.stringify(ex)).join('\n') + '\n';
130
+ fs.mkdirSync(path.dirname(path.resolve(options.outPath)), { recursive: true });
131
+ fs.writeFileSync(options.outPath, jsonl, 'utf8');
132
+ }
133
+ return result;
134
+ }
135
+ export function formatDataset(result) {
136
+ const lines = [];
137
+ lines.push(`\n Training dataset for ${result.repoRoot}`);
138
+ lines.push(` ${result.headSha} | ${result.totalCards} cards (${result.acceptedCards} training-relevant)`);
139
+ lines.push(` ${result.examples.length} total examples\n`);
140
+ for (const [type, count] of Object.entries(result.counts)) {
141
+ if (count > 0) {
142
+ lines.push(` ${type.padEnd(22)} ${count}`);
143
+ }
144
+ }
145
+ lines.push('');
146
+ // Show a sample
147
+ const first = result.examples[0];
148
+ if (first) {
149
+ lines.push(` Sample (${first.taskType}):`);
150
+ lines.push(` User: ${first.messages[0].content.slice(0, 80)}...`);
151
+ lines.push(` Assistant: ${first.messages[1].content.slice(0, 80)}...`);
152
+ lines.push('');
153
+ }
154
+ return lines.join('\n');
155
+ }
156
+ export function prepareTrain(options = {}) {
157
+ const repoRoot = resolveRepoRoot(options.repoPath);
158
+ const headSha = getHeadSha(repoRoot);
159
+ // Default output dir inside repo
160
+ const outDir = options.outPath
161
+ ? path.resolve(options.outPath)
162
+ : path.join(repoRoot, '.repo-arch', 'training-data');
163
+ // Generate dataset
164
+ const dataset = generateDataset({ repoPath: options.repoPath });
165
+ const examples = dataset.examples;
166
+ if (examples.length === 0) {
167
+ throw new Error('No training examples generated. Use repo-arch accept on some cards first.');
168
+ }
169
+ // Shuffle and split 90/10
170
+ const shuffled = [...examples].sort(() => Math.random() - 0.5);
171
+ const splitIdx = Math.max(1, Math.floor(shuffled.length * 0.9));
172
+ const train = shuffled.slice(0, splitIdx);
173
+ const valid = shuffled.slice(splitIdx);
174
+ // Write train.jsonl and valid.jsonl (OpenAI chat format)
175
+ fs.mkdirSync(outDir, { recursive: true });
176
+ const trainFile = path.join(outDir, 'train.jsonl');
177
+ const validFile = path.join(outDir, 'valid.jsonl');
178
+ fs.writeFileSync(trainFile, train.map(ex => JSON.stringify({ messages: ex.messages })).join('\n') + '\n');
179
+ fs.writeFileSync(validFile, valid.map(ex => JSON.stringify({ messages: ex.messages })).join('\n') + '\n');
180
+ // Build mlx_lm.lora command
181
+ const model = options.model ?? 'Qwen/Qwen2.5-Coder-1.5B-Instruct';
182
+ const adapterName = options.adapterName ?? `repo-arch-${headSha.slice(0, 7)}`;
183
+ const adapterPath = path.join(repoRoot, '.repo-arch', 'adapters', adapterName);
184
+ const iters = options.iters ?? 100;
185
+ const learningRate = options.learningRate ?? 1e-5;
186
+ const command = [
187
+ 'mlx_lm.lora',
188
+ '--train',
189
+ `--model ${model}`,
190
+ `--data ${outDir}`,
191
+ `--adapter-path ${adapterPath}`,
192
+ `--num-layers 4`,
193
+ `--batch-size 4`,
194
+ `--iters ${iters}`,
195
+ `--val-batches 10`,
196
+ `--learning-rate ${learningRate}`,
197
+ `--steps-per-report 10`,
198
+ `--steps-per-eval 10`,
199
+ ].join(' \\\n ');
200
+ return {
201
+ dataDir: outDir,
202
+ trainFile,
203
+ validFile,
204
+ model,
205
+ adapterPath,
206
+ command,
207
+ examples: examples.length,
208
+ };
209
+ }
210
+ export function formatTrain(plan) {
211
+ const lines = [];
212
+ lines.push(`\n Training data prepared at ${plan.dataDir}`);
213
+ lines.push(` ${plan.examples} examples (train + valid)`);
214
+ lines.push(` Model: ${plan.model}`);
215
+ lines.push(` Adapter: ${plan.adapterPath}\n`);
216
+ lines.push(` To train, run:\n`);
217
+ lines.push(` ${plan.command.replace(/\\n/g, '\n')}`);
218
+ lines.push('');
219
+ return lines.join('\n');
220
+ }
221
+ //# sourceMappingURL=training.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training.js","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
package/dist/why.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { type ClassifiedCommit } from './signals.js';
2
+ import { type InsightCard } from './cards.js';
3
+ export type CoChangePartner = {
4
+ path: string;
5
+ count: number;
6
+ };
7
+ export type WhyResult = {
8
+ filePath: string;
9
+ repoRoot: string;
10
+ headSha: string;
11
+ commitCount: number;
12
+ /** Commits that touched this file */
13
+ touchingCommits: ClassifiedCommit[];
14
+ /** Signal counts scoped to this file */
15
+ signalSummary: {
16
+ type: string;
17
+ label: string;
18
+ count: number;
19
+ }[];
20
+ fixCommits: {
21
+ sha: string;
22
+ subject: string;
23
+ }[];
24
+ rationaleCommits: {
25
+ sha: string;
26
+ subject: string;
27
+ }[];
28
+ revertCommits: {
29
+ sha: string;
30
+ subject: string;
31
+ }[];
32
+ coChangePartners: CoChangePartner[];
33
+ relatedCards: InsightCard[];
34
+ };
35
+ export declare function why(filePath: string, options?: {
36
+ repoPath?: string;
37
+ }): WhyResult;
38
+ export declare function formatWhy(result: WhyResult): string;
package/dist/why.js ADDED
@@ -0,0 +1,131 @@
1
+ import { generateCards } from './cards.js';
2
+ import { mineHistory } from './git-history.js';
3
+ import { classifyHistory } from './signals.js';
4
+ import { getStatusOverrideMap } from './review.js';
5
+ export function why(filePath, options = {}) {
6
+ const repoRoot = mineHistory({ repoPath: options.repoPath }).repoRoot;
7
+ const history = mineHistory({ repoPath: options.repoPath });
8
+ const classified = classifyHistory(history.records);
9
+ const cards = generateCards(classified, { minConfidence: 0.3 }, getStatusOverrideMap(repoRoot));
10
+ // Filter commits that touch the specified file
11
+ const touchingCommits = classified.filter(record => record.files.some(f => f.path === filePath || f.oldPath === filePath));
12
+ // Signal summary (deduplicate by type within each commit)
13
+ const signalCount = new Map();
14
+ for (const commit of touchingCommits) {
15
+ const seen = new Set();
16
+ for (const signal of commit.signals) {
17
+ if (!seen.has(signal.type)) {
18
+ seen.add(signal.type);
19
+ const existing = signalCount.get(signal.type);
20
+ if (existing) {
21
+ existing.count += 1;
22
+ }
23
+ else {
24
+ signalCount.set(signal.type, { label: signal.label, count: 1 });
25
+ }
26
+ }
27
+ }
28
+ }
29
+ const signalSummary = [...signalCount.entries()]
30
+ .map(([type, info]) => ({ type, label: info.label, count: info.count }))
31
+ .sort((a, b) => b.count - a.count);
32
+ // Categorize commits
33
+ const fixCommits = touchingCommits
34
+ .filter(c => c.signals.some(s => s.type === 'fix'))
35
+ .map(c => ({ sha: c.sha.slice(0, 7), subject: c.subject }));
36
+ const rationaleCommits = touchingCommits
37
+ .filter(c => c.signals.some(s => s.type === 'rationale'))
38
+ .map(c => ({ sha: c.sha.slice(0, 7), subject: c.subject }));
39
+ const revertCommits = touchingCommits
40
+ .filter(c => c.signals.some(s => s.type === 'revert'))
41
+ .map(c => ({ sha: c.sha.slice(0, 7), subject: c.subject }));
42
+ // Co-change partners
43
+ const partnerMap = new Map();
44
+ for (const commit of touchingCommits) {
45
+ for (const file of commit.files) {
46
+ if (file.path !== filePath && file.path) {
47
+ partnerMap.set(file.path, (partnerMap.get(file.path) ?? 0) + 1);
48
+ }
49
+ }
50
+ }
51
+ const coChangePartners = [...partnerMap.entries()]
52
+ .sort((a, b) => b[1] - a[1])
53
+ .slice(0, 8)
54
+ .map(([path, count]) => ({ path, count }));
55
+ // Related cards
56
+ const relatedCards = cards.filter(card => card.affectedFiles.some(f => f === filePath));
57
+ return {
58
+ filePath,
59
+ repoRoot,
60
+ headSha: history.headSha,
61
+ commitCount: touchingCommits.length,
62
+ touchingCommits,
63
+ signalSummary,
64
+ fixCommits,
65
+ rationaleCommits,
66
+ revertCommits,
67
+ coChangePartners,
68
+ relatedCards,
69
+ };
70
+ }
71
+ export function formatWhy(result) {
72
+ const lines = [];
73
+ lines.push('');
74
+ lines.push(` 📜 ${result.filePath}`);
75
+ lines.push(` ${result.repoRoot} @ ${result.headSha.slice(0, 12)}`);
76
+ lines.push('');
77
+ // Summary line
78
+ const parts = [`${result.commitCount} commit${result.commitCount !== 1 ? 's' : ''}`];
79
+ for (const sig of result.signalSummary) {
80
+ parts.push(`${sig.count} ${sig.type}`);
81
+ }
82
+ lines.push(` ${parts.join(' · ')}`);
83
+ lines.push('');
84
+ // Fix commits
85
+ if (result.fixCommits.length > 0) {
86
+ lines.push(` ❌ Repeated fixes (${result.fixCommits.length}):`);
87
+ for (const c of result.fixCommits) {
88
+ lines.push(` · ${c.subject} (${c.sha})`);
89
+ }
90
+ lines.push('');
91
+ }
92
+ // Rationale commits
93
+ if (result.rationaleCommits.length > 0) {
94
+ lines.push(` 💡 Rationale:`);
95
+ for (const c of result.rationaleCommits) {
96
+ lines.push(` · ${c.subject} (${c.sha})`);
97
+ }
98
+ lines.push('');
99
+ }
100
+ // Revert commits
101
+ if (result.revertCommits.length > 0) {
102
+ lines.push(` ↩ Reverted:`);
103
+ for (const c of result.revertCommits) {
104
+ lines.push(` · ${c.subject} (${c.sha})`);
105
+ }
106
+ lines.push('');
107
+ }
108
+ // Co-change partners
109
+ if (result.coChangePartners.length > 0) {
110
+ lines.push(` 🔗 Co-changes:`);
111
+ for (const p of result.coChangePartners.slice(0, 5)) {
112
+ lines.push(` · ${p.path} (${p.count} time${p.count !== 1 ? 's' : ''})`);
113
+ }
114
+ lines.push('');
115
+ }
116
+ // Related cards
117
+ if (result.relatedCards.length > 0) {
118
+ lines.push(` ⚠️ Related cards:`);
119
+ for (const card of result.relatedCards) {
120
+ lines.push(` · ${card.title} (confidence ${card.confidence})`);
121
+ }
122
+ lines.push('');
123
+ }
124
+ // Fallback
125
+ if (result.commitCount === 0) {
126
+ lines.push(` No commits found touching this file. It may be untracked or new.`);
127
+ lines.push('');
128
+ }
129
+ return lines.join('\n');
130
+ }
131
+ //# sourceMappingURL=why.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"why.js","sourceRoot":"","sources":["../src/why.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@fiale-plus/repo-arch",
3
+ "version": "0.1.0",
4
+ "description": "Project archaeology and repo memory tooling — CLI-first project-memory engine",
5
+ "type": "module",
6
+ "bin": {
7
+ "repo-arch": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsx src/cli.ts",
20
+ "test": "tsx --test",
21
+ "typecheck": "tsc --noEmit",
22
+ "mine-history": "tsx ./src/cli.ts mine-history",
23
+ "prepublishOnly": "npm run build && npm test"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/fiale-plus/repo-arch.git"
28
+ },
29
+ "author": "fiale-plus",
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@types/node": "^22.15.3",
33
+ "tsx": "^4.19.4",
34
+ "typescript": "^5.8.3"
35
+ },
36
+ "dependencies": {
37
+ "@huggingface/transformers": "4.2.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=20"
41
+ }
42
+ }