proofscan 0.5.5 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +369 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/record.d.ts +88 -0
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/record.js +394 -0
- package/dist/commands/record.js.map +1 -0
- package/dist/config/add.d.ts +46 -0
- package/dist/config/add.d.ts.map +1 -0
- package/dist/config/add.js +195 -0
- package/dist/config/add.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/snapshot.d.ts +91 -0
- package/dist/config/snapshot.d.ts.map +1 -0
- package/dist/config/snapshot.js +226 -0
- package/dist/config/snapshot.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
package/dist/config/index.js
CHANGED
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config snapshot management
|
|
3
|
+
*
|
|
4
|
+
* Stores snapshots of config in state/config-snapshots/
|
|
5
|
+
* Maintains an index file with metadata for each snapshot.
|
|
6
|
+
*/
|
|
7
|
+
import type { Config } from '../types/index.js';
|
|
8
|
+
/** Snapshot metadata */
|
|
9
|
+
export interface SnapshotMeta {
|
|
10
|
+
id: string;
|
|
11
|
+
created_at: string;
|
|
12
|
+
note: string | null;
|
|
13
|
+
file_name: string;
|
|
14
|
+
connector_count: number;
|
|
15
|
+
hash: string;
|
|
16
|
+
}
|
|
17
|
+
/** Snapshot index */
|
|
18
|
+
export interface SnapshotIndex {
|
|
19
|
+
version: 1;
|
|
20
|
+
snapshots: SnapshotMeta[];
|
|
21
|
+
}
|
|
22
|
+
/** Snapshot with full config */
|
|
23
|
+
export interface Snapshot {
|
|
24
|
+
meta: SnapshotMeta;
|
|
25
|
+
config: Config;
|
|
26
|
+
}
|
|
27
|
+
/** Diff between two configs */
|
|
28
|
+
export interface ConfigDiff {
|
|
29
|
+
added: string[];
|
|
30
|
+
removed: string[];
|
|
31
|
+
changed: string[];
|
|
32
|
+
unchanged: string[];
|
|
33
|
+
}
|
|
34
|
+
export declare class SnapshotManager {
|
|
35
|
+
private snapshotDir;
|
|
36
|
+
private indexPath;
|
|
37
|
+
constructor(configDir: string);
|
|
38
|
+
/**
|
|
39
|
+
* Ensure snapshot directory exists
|
|
40
|
+
*/
|
|
41
|
+
private ensureDir;
|
|
42
|
+
/**
|
|
43
|
+
* Load snapshot index
|
|
44
|
+
*/
|
|
45
|
+
loadIndex(): Promise<SnapshotIndex>;
|
|
46
|
+
/**
|
|
47
|
+
* Save snapshot index
|
|
48
|
+
*/
|
|
49
|
+
private saveIndex;
|
|
50
|
+
/**
|
|
51
|
+
* Compute hash of config for comparison
|
|
52
|
+
*/
|
|
53
|
+
computeHash(config: Config): string;
|
|
54
|
+
/**
|
|
55
|
+
* Generate snapshot ID from timestamp
|
|
56
|
+
*/
|
|
57
|
+
private generateId;
|
|
58
|
+
/**
|
|
59
|
+
* Save a snapshot of current config
|
|
60
|
+
*/
|
|
61
|
+
save(config: Config, note?: string): Promise<SnapshotMeta>;
|
|
62
|
+
/**
|
|
63
|
+
* List all snapshots (newest first)
|
|
64
|
+
*/
|
|
65
|
+
list(): Promise<SnapshotMeta[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Get snapshot by display number (1-indexed, newest first)
|
|
68
|
+
*/
|
|
69
|
+
getByNumber(num: number): Promise<Snapshot | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Delete snapshot by display number
|
|
72
|
+
*/
|
|
73
|
+
delete(num: number): Promise<SnapshotMeta | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Find snapshot matching current config by hash
|
|
76
|
+
*/
|
|
77
|
+
findMatchingSnapshot(config: Config): Promise<number | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Compare two configs and return diff
|
|
80
|
+
*/
|
|
81
|
+
diffConfigs(current: Config, target: Config): ConfigDiff;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format snapshot for display
|
|
85
|
+
*/
|
|
86
|
+
export declare function formatSnapshotLine(num: number, meta: SnapshotMeta, isCurrent?: boolean): string;
|
|
87
|
+
/**
|
|
88
|
+
* Format config diff for display
|
|
89
|
+
*/
|
|
90
|
+
export declare function formatConfigDiff(diff: ConfigDiff): string;
|
|
91
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/config/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD,wBAAwB;AACxB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAK7B;;OAEG;YACW,SAAS;IAIvB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAazC;;OAEG;YACW,SAAS;IAKvB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKnC;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA6BhE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAsBxD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAqBvD;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAalE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;CAiCzD;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,YAAY,EAClB,SAAS,GAAE,OAAe,GACzB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAqBzD"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config snapshot management
|
|
3
|
+
*
|
|
4
|
+
* Stores snapshots of config in state/config-snapshots/
|
|
5
|
+
* Maintains an index file with metadata for each snapshot.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { mkdir, unlink } from 'fs/promises';
|
|
10
|
+
import { atomicWriteFile, readFileSafe, fileExists } from '../utils/fs.js';
|
|
11
|
+
// ============================================================
|
|
12
|
+
// Snapshot Manager
|
|
13
|
+
// ============================================================
|
|
14
|
+
export class SnapshotManager {
|
|
15
|
+
snapshotDir;
|
|
16
|
+
indexPath;
|
|
17
|
+
constructor(configDir) {
|
|
18
|
+
this.snapshotDir = join(configDir, 'config-snapshots');
|
|
19
|
+
this.indexPath = join(this.snapshotDir, 'index.json');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ensure snapshot directory exists
|
|
23
|
+
*/
|
|
24
|
+
async ensureDir() {
|
|
25
|
+
await mkdir(this.snapshotDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load snapshot index
|
|
29
|
+
*/
|
|
30
|
+
async loadIndex() {
|
|
31
|
+
const content = await readFileSafe(this.indexPath);
|
|
32
|
+
if (!content) {
|
|
33
|
+
return { version: 1, snapshots: [] };
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(content);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { version: 1, snapshots: [] };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Save snapshot index
|
|
44
|
+
*/
|
|
45
|
+
async saveIndex(index) {
|
|
46
|
+
await this.ensureDir();
|
|
47
|
+
await atomicWriteFile(this.indexPath, JSON.stringify(index, null, 2) + '\n');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute hash of config for comparison
|
|
51
|
+
*/
|
|
52
|
+
computeHash(config) {
|
|
53
|
+
const canonical = JSON.stringify(config);
|
|
54
|
+
return createHash('sha256').update(canonical).digest('hex').slice(0, 16);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate snapshot ID from timestamp
|
|
58
|
+
*/
|
|
59
|
+
generateId() {
|
|
60
|
+
return new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Save a snapshot of current config
|
|
64
|
+
*/
|
|
65
|
+
async save(config, note) {
|
|
66
|
+
await this.ensureDir();
|
|
67
|
+
const id = this.generateId();
|
|
68
|
+
const hash = this.computeHash(config);
|
|
69
|
+
const noteSuffix = note ? `_${note.replace(/[^a-zA-Z0-9-]/g, '_').slice(0, 30)}` : '';
|
|
70
|
+
const fileName = `${id}${noteSuffix}.json`;
|
|
71
|
+
const filePath = join(this.snapshotDir, fileName);
|
|
72
|
+
// Save snapshot file
|
|
73
|
+
await atomicWriteFile(filePath, JSON.stringify(config, null, 2) + '\n');
|
|
74
|
+
// Update index
|
|
75
|
+
const index = await this.loadIndex();
|
|
76
|
+
const meta = {
|
|
77
|
+
id,
|
|
78
|
+
created_at: new Date().toISOString(),
|
|
79
|
+
note: note || null,
|
|
80
|
+
file_name: fileName,
|
|
81
|
+
connector_count: config.connectors.length,
|
|
82
|
+
hash,
|
|
83
|
+
};
|
|
84
|
+
index.snapshots.unshift(meta); // newest first
|
|
85
|
+
await this.saveIndex(index);
|
|
86
|
+
return meta;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* List all snapshots (newest first)
|
|
90
|
+
*/
|
|
91
|
+
async list() {
|
|
92
|
+
const index = await this.loadIndex();
|
|
93
|
+
return index.snapshots;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get snapshot by display number (1-indexed, newest first)
|
|
97
|
+
*/
|
|
98
|
+
async getByNumber(num) {
|
|
99
|
+
const index = await this.loadIndex();
|
|
100
|
+
if (num < 1 || num > index.snapshots.length) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const meta = index.snapshots[num - 1];
|
|
104
|
+
const filePath = join(this.snapshotDir, meta.file_name);
|
|
105
|
+
const content = await readFileSafe(filePath);
|
|
106
|
+
if (!content) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const config = JSON.parse(content);
|
|
111
|
+
return { meta, config };
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Delete snapshot by display number
|
|
119
|
+
*/
|
|
120
|
+
async delete(num) {
|
|
121
|
+
const index = await this.loadIndex();
|
|
122
|
+
if (num < 1 || num > index.snapshots.length) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const meta = index.snapshots[num - 1];
|
|
126
|
+
const filePath = join(this.snapshotDir, meta.file_name);
|
|
127
|
+
// Remove file if exists
|
|
128
|
+
if (await fileExists(filePath)) {
|
|
129
|
+
await unlink(filePath);
|
|
130
|
+
}
|
|
131
|
+
// Remove from index
|
|
132
|
+
index.snapshots.splice(num - 1, 1);
|
|
133
|
+
await this.saveIndex(index);
|
|
134
|
+
return meta;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Find snapshot matching current config by hash
|
|
138
|
+
*/
|
|
139
|
+
async findMatchingSnapshot(config) {
|
|
140
|
+
const hash = this.computeHash(config);
|
|
141
|
+
const index = await this.loadIndex();
|
|
142
|
+
for (let i = 0; i < index.snapshots.length; i++) {
|
|
143
|
+
if (index.snapshots[i].hash === hash) {
|
|
144
|
+
return i + 1; // 1-indexed
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Compare two configs and return diff
|
|
151
|
+
*/
|
|
152
|
+
diffConfigs(current, target) {
|
|
153
|
+
const currentIds = new Set(current.connectors.map(c => c.id));
|
|
154
|
+
const targetIds = new Set(target.connectors.map(c => c.id));
|
|
155
|
+
const added = [];
|
|
156
|
+
const removed = [];
|
|
157
|
+
const changed = [];
|
|
158
|
+
const unchanged = [];
|
|
159
|
+
// Find removed (in current but not in target)
|
|
160
|
+
for (const id of currentIds) {
|
|
161
|
+
if (!targetIds.has(id)) {
|
|
162
|
+
removed.push(id);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Find added and changed
|
|
166
|
+
for (const targetConn of target.connectors) {
|
|
167
|
+
if (!currentIds.has(targetConn.id)) {
|
|
168
|
+
added.push(targetConn.id);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Check if changed
|
|
172
|
+
const currentConn = current.connectors.find(c => c.id === targetConn.id);
|
|
173
|
+
if (JSON.stringify(currentConn) !== JSON.stringify(targetConn)) {
|
|
174
|
+
changed.push(targetConn.id);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
unchanged.push(targetConn.id);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { added, removed, changed, unchanged };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ============================================================
|
|
185
|
+
// Formatting helpers
|
|
186
|
+
// ============================================================
|
|
187
|
+
/**
|
|
188
|
+
* Format snapshot for display
|
|
189
|
+
*/
|
|
190
|
+
export function formatSnapshotLine(num, meta, isCurrent = false) {
|
|
191
|
+
const date = new Date(meta.created_at);
|
|
192
|
+
const dateStr = date.toLocaleString('ja-JP', {
|
|
193
|
+
year: 'numeric',
|
|
194
|
+
month: '2-digit',
|
|
195
|
+
day: '2-digit',
|
|
196
|
+
hour: '2-digit',
|
|
197
|
+
minute: '2-digit',
|
|
198
|
+
});
|
|
199
|
+
const note = meta.note ? ` "${meta.note}"` : '';
|
|
200
|
+
const current = isCurrent ? ' [current]' : '';
|
|
201
|
+
const connectors = `${meta.connector_count} connectors`;
|
|
202
|
+
return ` ${num}. ${dateStr} - ${connectors}${note}${current}`;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Format config diff for display
|
|
206
|
+
*/
|
|
207
|
+
export function formatConfigDiff(diff) {
|
|
208
|
+
const lines = [];
|
|
209
|
+
if (diff.added.length > 0) {
|
|
210
|
+
lines.push(` + Added: ${diff.added.join(', ')}`);
|
|
211
|
+
}
|
|
212
|
+
if (diff.removed.length > 0) {
|
|
213
|
+
lines.push(` - Removed: ${diff.removed.join(', ')}`);
|
|
214
|
+
}
|
|
215
|
+
if (diff.changed.length > 0) {
|
|
216
|
+
lines.push(` ~ Changed: ${diff.changed.join(', ')}`);
|
|
217
|
+
}
|
|
218
|
+
if (diff.unchanged.length > 0) {
|
|
219
|
+
lines.push(` = Unchanged: ${diff.unchanged.join(', ')}`);
|
|
220
|
+
}
|
|
221
|
+
if (lines.length === 0) {
|
|
222
|
+
lines.push(' No changes');
|
|
223
|
+
}
|
|
224
|
+
return lines.join('\n');
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/config/snapshot.ts"],"names":[],"mappings":"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"}
|