@udondan/avanti 0.5.0 → 0.7.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 (53) hide show
  1. package/README.md +127 -9
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/diff.d.ts.map +1 -1
  5. package/dist/commands/diff.js +45 -2
  6. package/dist/commands/diff.js.map +1 -1
  7. package/dist/commands/log.d.ts +3 -0
  8. package/dist/commands/log.d.ts.map +1 -0
  9. package/dist/commands/log.js +100 -0
  10. package/dist/commands/log.js.map +1 -0
  11. package/dist/commands/pull.d.ts.map +1 -1
  12. package/dist/commands/pull.js +67 -19
  13. package/dist/commands/pull.js.map +1 -1
  14. package/dist/commands/reset.d.ts +3 -0
  15. package/dist/commands/reset.d.ts.map +1 -0
  16. package/dist/commands/reset.js +106 -0
  17. package/dist/commands/reset.js.map +1 -0
  18. package/dist/commands/revert.d.ts +3 -0
  19. package/dist/commands/revert.d.ts.map +1 -0
  20. package/dist/commands/revert.js +153 -0
  21. package/dist/commands/revert.js.map +1 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +7 -1
  24. package/dist/config.js.map +1 -1
  25. package/dist/diff.d.ts +1 -0
  26. package/dist/diff.d.ts.map +1 -1
  27. package/dist/diff.js +10 -1
  28. package/dist/diff.js.map +1 -1
  29. package/dist/history.d.ts +64 -0
  30. package/dist/history.d.ts.map +1 -0
  31. package/dist/history.js +316 -0
  32. package/dist/history.js.map +1 -0
  33. package/dist/processors/json.d.ts.map +1 -1
  34. package/dist/processors/json.js +8 -5
  35. package/dist/processors/json.js.map +1 -1
  36. package/dist/prompt.d.ts +2 -0
  37. package/dist/prompt.d.ts.map +1 -0
  38. package/dist/prompt.js +42 -0
  39. package/dist/prompt.js.map +1 -0
  40. package/dist/sources/index.d.ts.map +1 -1
  41. package/dist/sources/index.js +33 -4
  42. package/dist/sources/index.js.map +1 -1
  43. package/dist/types.d.ts +1 -1
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/writer.d.ts +1 -1
  46. package/dist/writer.d.ts.map +1 -1
  47. package/dist/writer.js +10 -1
  48. package/dist/writer.js.map +1 -1
  49. package/package.json +6 -1
  50. package/.prettierignore +0 -2
  51. package/CHANGELOG.md +0 -59
  52. package/eslint.config.mjs +0 -25
  53. package/prettier.config.mjs +0 -5
package/README.md CHANGED
@@ -40,8 +40,11 @@ Options:
40
40
  -w, --working-dir <path> working directory for resolving paths (default: current directory)
41
41
 
42
42
  Commands:
43
- diff Show diff between remote sources and local files
43
+ diff [pullId] Show diff between remote sources and local files, or vs a past pull
44
44
  pull [--yes] Pull remote sources and write to local files
45
+ log [file] Show pull history for the current project
46
+ revert [pullId] [--yes] Atomically revert all project files to a past pull state
47
+ reset [--yes] Restore all tracked files to their pre-avanti state
45
48
  ```
46
49
 
47
50
  ### `avanti diff`
@@ -52,6 +55,103 @@ Shows a colored git-diff-like output of what would change. Exits `0` if no chang
52
55
 
53
56
  Fetches all sources, shows the diff, and prompts for confirmation before writing. Use `--yes` to skip the prompt.
54
57
 
58
+ When avanti has previously synced a directory from a remote source and a file is no longer present in that source, the file is treated as stale: if avanti created it, it is deleted; if it existed before avanti first touched it, the original content is restored. Stale file changes appear in the diff before you confirm.
59
+
60
+ ## History
61
+
62
+ Every successful `avanti pull` that writes at least one file is recorded in a local history store. This lets you inspect what changed, preview past states, revert the whole project, or fully undo all avanti changes.
63
+
64
+ History is stored under `~/.config/avanti/` by default. Set `AVANTI_HISTORY_DIR` to override — useful for CI or when you want to keep history inside a repository:
65
+
66
+ ```sh
67
+ AVANTI_HISTORY_DIR=.avanti-history avanti pull
68
+ ```
69
+
70
+ History is scoped by the **combination of config file path and working directory**, so different projects and different configs are always isolated from each other. If the history directory is missing or corrupt, all commands warn and continue — no crash, no data loss.
71
+
72
+ ### `avanti log`
73
+
74
+ List all pull runs for the current project, newest first:
75
+
76
+ ```text
77
+ pull a1b2c3d4 2026-05-08 14:32:11 .avanti.yml
78
+ /project/config.yml → v3 (modified)
79
+ /project/scripts/deploy.sh → v1 (new file)
80
+
81
+ pull 7f8e9a0b 2026-05-07 09:15:44 .avanti.yml
82
+ /project/config.yml → v2 (modified)
83
+ ```
84
+
85
+ Show version history for a specific file by passing it as an argument:
86
+
87
+ ```sh
88
+ avanti log config.yml
89
+ ```
90
+
91
+ ```text
92
+ /project/config.yml
93
+
94
+ v3 2026-05-08 14:32:11 pull a1b2c3d4 (current)
95
+ v2 2026-05-07 09:15:44 pull 7f8e9a0b
96
+ v0 — — (original, before avanti)
97
+ ```
98
+
99
+ `v0` is the content the file had before avanti ever touched it. If the file did not exist before avanti, `v0` is not shown.
100
+
101
+ ### `avanti diff <pullId>`
102
+
103
+ Preview what would change if you reverted to a specific past pull state — without applying anything. Use the short pull ID shown in `avanti log`:
104
+
105
+ ```sh
106
+ avanti diff 7f8e9a0b
107
+ ```
108
+
109
+ Exits `0` if the current files already match that state, `1` if there are differences.
110
+
111
+ ### `avanti revert [pullId]`
112
+
113
+ Atomically revert **all** project files to a past state. Revert always operates on the whole project — there is no per-file revert.
114
+
115
+ **Undo the last pull** (no argument):
116
+
117
+ ```sh
118
+ avanti revert
119
+ ```
120
+
121
+ **Revert to a specific past pull** (files are restored to the state they were in after that pull):
122
+
123
+ ```sh
124
+ avanti revert 7f8e9a0b
125
+ ```
126
+
127
+ Files written by pulls after the target are handled automatically: if avanti created them, they are deleted; if they existed before avanti, their original content is restored.
128
+
129
+ The command always shows a diff before prompting. Use `--yes` to skip the prompt:
130
+
131
+ ```sh
132
+ avanti revert 7f8e9a0b --yes
133
+ ```
134
+
135
+ The history log is not modified by a revert. The next `avanti pull` after a revert records a new history entry as usual.
136
+
137
+ ### `avanti reset`
138
+
139
+ Restore **all** tracked files to their state before avanti ever touched them. Files avanti created are deleted; files avanti modified are restored to their original content:
140
+
141
+ ```sh
142
+ avanti reset
143
+ ```
144
+
145
+ ```text
146
+ This will restore 4 tracked file(s) to their pre-avanti state:
147
+ /project/config.yml v3 → v0 (original)
148
+ /project/deploy.sh v2 → delete (did not exist before avanti)
149
+
150
+ Apply? [y/N]
151
+ ```
152
+
153
+ Use `--yes` to skip the prompt. The history log is preserved — you can still run `avanti log` after a reset.
154
+
55
155
  ## Working Directory
56
156
 
57
157
  All relative `src` and `target` paths are resolved relative to the **working directory** — the directory where you invoke `avanti`, or the path given with `-w`.
@@ -131,7 +231,7 @@ files:
131
231
  | `mode` | No | File permission mode, e.g. `"0755"` |
132
232
  | `replace` | No | List of `{from, to}` replacement rules. `from` may be a plain string or `/pattern/flags` regex. |
133
233
  | `post` | No | Shell script. Content is piped via stdin; stdout is used as the result. Runs after `replace`. |
134
- | `json` | No | JSON merge/format options (see below). When set, sources are parsed as JSON and the result is pretty-printed with 2-space indent. |
234
+ | `json` | No | JSON merge/format options (see below). When omitted, merging is auto-enabled if all sources have a `.json` or `.jsonc` extension. Use `true`/`false` to force on or off regardless of extension. |
135
235
 
136
236
  ### Source Types
137
237
 
@@ -213,7 +313,30 @@ Sources are fetched in order and joined with a newline. Post-processing (`replac
213
313
 
214
314
  ### JSON Merging
215
315
 
216
- Add a `json` block to merge multiple JSON sources into a single valid JSON file, or to pretty-print a single JSON source with 2-space indentation.
316
+ When all sources in a list have a `.json` or `.jsonc` extension, JSON merging is enabled automatically no extra config needed:
317
+
318
+ ```yaml
319
+ files:
320
+ - src:
321
+ - ./team.jsonc
322
+ - ./my.jsonc
323
+ target: merged.jsonc
324
+ ```
325
+
326
+ To merge sources that don't have a JSON extension (e.g. `exec:`, `raw:`, or a URL without `.json`), set `json: true`:
327
+
328
+ ```yaml
329
+ files:
330
+ - src:
331
+ - exec: cat defaults.json
332
+ - ./overrides.json
333
+ target: merged.json
334
+ json: true
335
+ ```
336
+
337
+ To opt out of auto-detection and force plain concatenation, set `json: false`.
338
+
339
+ **Fine-grained options** — pass an object to control merge behavior:
217
340
 
218
341
  ```yaml
219
342
  files:
@@ -229,8 +352,6 @@ files:
229
352
  objects: merge # merge (default) | replace
230
353
  ```
231
354
 
232
- **Options:**
233
-
234
355
  - `conflicts` — what to do when the same key holds a scalar (or an array/object when their strategy is `replace`):
235
356
  - `last_wins` _(default)_ — the last source's value wins
236
357
  - `first_wins` — the first source's value is kept
@@ -242,15 +363,12 @@ files:
242
363
  - `merge` _(default)_ — deep merge, applying the same rules recursively to nested keys
243
364
  - `replace` — the later source's object replaces the earlier one entirely
244
365
 
245
- All options are optional. `json: {}` is valid and just pretty-prints the source.
246
-
247
- **Pretty-printing a single file** — `json` works on single-source entries too:
366
+ **Pretty-printing a single file** `json` works on single-source entries too. Auto-detection applies here as well, so a single `.json` source is pretty-printed automatically:
248
367
 
249
368
  ```yaml
250
369
  files:
251
370
  - src: ./minified.json
252
371
  target: pretty.json
253
- json: {}
254
372
  ```
255
373
 
256
374
  ### Variables
package/dist/cli.js CHANGED
@@ -4,6 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const diff_1 = require("./commands/diff");
6
6
  const pull_1 = require("./commands/pull");
7
+ const log_1 = require("./commands/log");
8
+ const revert_1 = require("./commands/revert");
9
+ const reset_1 = require("./commands/reset");
7
10
  const package_json_1 = require("../package.json");
8
11
  const program = new commander_1.Command();
9
12
  program
@@ -14,5 +17,8 @@ program
14
17
  .option('-w, --working-dir <path>', 'working directory for resolving relative paths (default: current directory)');
15
18
  program.addCommand((0, diff_1.diffCommand)());
16
19
  program.addCommand((0, pull_1.pullCommand)());
20
+ program.addCommand((0, log_1.logCommand)());
21
+ program.addCommand((0, revert_1.revertCommand)());
22
+ program.addCommand((0, reset_1.resetCommand)());
17
23
  program.parse(process.argv);
18
24
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,0CAA8C;AAC9C,0CAA8C;AAC9C,kDAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,kEAAkE,CACnE;KACA,OAAO,CAAC,sBAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CACL,0BAA0B,EAC1B,6EAA6E,CAC9E,CAAC;AAEJ,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,0CAA8C;AAC9C,0CAA8C;AAC9C,wCAA4C;AAC5C,8CAAkD;AAClD,4CAAgD;AAChD,kDAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,kEAAkE,CACnE;KACA,OAAO,CAAC,sBAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CACL,0BAA0B,EAC1B,6EAA6E,CAC9E,CAAC;AAEJ,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,IAAA,gBAAU,GAAE,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,IAAA,oBAAY,GAAE,CAAC,CAAC;AAEnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,WAAW,IAAI,OAAO,CAsDrC"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,WAAW,IAAI,OAAO,CAqErC"}
@@ -31,15 +31,21 @@ const sources_1 = require("../sources");
31
31
  const replace_1 = require("../processors/replace");
32
32
  const post_1 = require("../processors/post");
33
33
  const diff_1 = require("../diff");
34
+ const history_1 = require("../history");
34
35
  function diffCommand() {
35
36
  return new commander_1.Command('diff')
36
- .description('Show diff between remote sources and local files')
37
- .action(async (_options, cmd) => {
37
+ .description('Show diff between remote sources and local files, or between local files and a past pull')
38
+ .argument('[pullId]', 'show diff between current files and a past pull state')
39
+ .action(async (pullId, _options, cmd) => {
38
40
  const configPath = (0, config_1.resolveConfigPath)(cmd.parent?.opts().config);
39
41
  const rawWorkingDir = cmd.parent?.opts().workingDir;
40
42
  const workingDir = rawWorkingDir
41
43
  ? path.resolve(rawWorkingDir)
42
44
  : process.cwd();
45
+ if (pullId !== undefined) {
46
+ diffAgainstHistory(pullId, configPath, workingDir);
47
+ return;
48
+ }
43
49
  let config;
44
50
  try {
45
51
  config = (0, config_1.loadConfig)(configPath);
@@ -77,4 +83,41 @@ function diffCommand() {
77
83
  });
78
84
  }
79
85
  exports.diffCommand = diffCommand;
86
+ function diffAgainstHistory(pullId, configPath, workingDir) {
87
+ const history = new history_1.HistoryManager(configPath, workingDir);
88
+ if (!history.hasHistory()) {
89
+ console.error('No history found. Run avanti pull first.');
90
+ process.exit(2);
91
+ }
92
+ const pulls = history.listPulls();
93
+ const matchedPull = pulls.find((p) => p.pullId === pullId || p.pullId.startsWith(pullId));
94
+ if (!matchedPull) {
95
+ console.error(`No pull found matching ID "${pullId}".`);
96
+ process.exit(2);
97
+ }
98
+ const snapshot = history.getFilesAtPull(matchedPull.pullId);
99
+ if (snapshot.size === 0) {
100
+ console.log('No changes would result from reverting to this pull.');
101
+ process.exit(0);
102
+ }
103
+ const diffs = [];
104
+ for (const [absolutePath, { version }] of snapshot) {
105
+ const historicalContent = history.readVersion(absolutePath, version);
106
+ if (historicalContent === null)
107
+ continue;
108
+ diffs.push((0, diff_1.computeDiff)(absolutePath, historicalContent));
109
+ }
110
+ // Also account for files that would be deleted (tracked files not in this snapshot)
111
+ const allTracked = history.listTrackedFiles();
112
+ const snapshotPaths = new Set(snapshot.keys());
113
+ for (const meta of allTracked) {
114
+ if (snapshotPaths.has(meta.absolutePath))
115
+ continue;
116
+ // This file was created after the target pull — show it as a deletion
117
+ diffs.push((0, diff_1.computeDeleteDiff)(meta.absolutePath));
118
+ }
119
+ (0, diff_1.printDiffs)(diffs);
120
+ const hasChanges = diffs.some((d) => d.hasChanges);
121
+ process.exit(hasChanges ? 1 : 0);
122
+ }
80
123
  //# sourceMappingURL=diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,2CAA6B;AAC7B,sCAA0D;AAC1D,wCAAyC;AACzC,mDAAqD;AACrD,6CAA+C;AAC/C,kCAAqE;AAGrE,SAAgB,WAAW;IACzB,OAAO,IAAI,mBAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,QAAiB,EAAE,GAAY,EAAE,EAAE;QAChD,MAAM,UAAU,GAAG,IAAA,0BAAiB,EAClC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAA4B,CAChD,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,UAAgC,CAAC;QAC1E,MAAM,UAAU,GAAG,aAAa;YAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAElB,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAW,EAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC1D,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjD,IAAI,OAAO,GAAG,UAAU,CAAC;oBACzB,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM;wBACvB,OAAO,GAAG,IAAA,sBAAY,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACvD,IAAI,KAAK,CAAC,IAAI;wBAAE,OAAO,GAAG,IAAA,gBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC/D,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAClC,KAAK,EACL,OAAO,EACP,UAAU,EACV,IAAI,CACL,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,IAAA,kBAAW,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,oBAAoB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAC3E,CAAC;gBACF,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAA,iBAAU,EAAC,QAAQ,CAAC,CAAC;QAErB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC;AAtDD,kCAsDC"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function logCommand(): Command;
3
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,UAAU,IAAI,OAAO,CAqBpC"}
@@ -0,0 +1,100 @@
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.logCommand = void 0;
27
+ const commander_1 = require("commander");
28
+ const path = __importStar(require("path"));
29
+ const config_1 = require("../config");
30
+ const history_1 = require("../history");
31
+ function logCommand() {
32
+ return new commander_1.Command('log')
33
+ .description('Show pull history for the current project')
34
+ .argument('[file]', 'show version history for a specific file')
35
+ .action((file, _options, cmd) => {
36
+ const configPath = (0, config_1.resolveConfigPath)(cmd.parent?.opts().config);
37
+ const rawWorkingDir = cmd.parent?.opts().workingDir;
38
+ const workingDir = rawWorkingDir
39
+ ? path.resolve(rawWorkingDir)
40
+ : process.cwd();
41
+ const history = new history_1.HistoryManager(configPath, workingDir);
42
+ if (file !== undefined) {
43
+ showFileHistory(history, file, workingDir);
44
+ }
45
+ else {
46
+ showPullHistory(history);
47
+ }
48
+ });
49
+ }
50
+ exports.logCommand = logCommand;
51
+ function showPullHistory(history) {
52
+ const pulls = history.listPulls();
53
+ if (pulls.length === 0) {
54
+ console.log('No history recorded yet.');
55
+ return;
56
+ }
57
+ for (const pull of pulls) {
58
+ const shortId = pull.pullId.slice(0, 8);
59
+ const ts = formatTimestamp(pull.timestamp);
60
+ const configName = path.basename(pull.configFile);
61
+ console.log(`pull ${shortId} ${ts} ${configName}`);
62
+ for (const ref of pull.files) {
63
+ const label = ref.wasNew ? '(new file)' : '(modified)';
64
+ console.log(` ${ref.absolutePath} → v${ref.version} ${label}`);
65
+ }
66
+ console.log('');
67
+ }
68
+ }
69
+ function showFileHistory(history, filePath, workingDir) {
70
+ const absolutePath = path.isAbsolute(filePath)
71
+ ? filePath
72
+ : path.resolve(workingDir, filePath);
73
+ const fileHistory = history.getFileHistory(absolutePath);
74
+ if (!fileHistory) {
75
+ console.log(`No history for ${absolutePath}.`);
76
+ return;
77
+ }
78
+ console.log(`${absolutePath}\n`);
79
+ const versions = [...fileHistory.versions].reverse();
80
+ for (const v of versions) {
81
+ const vLabel = `v${v.version}`;
82
+ const ts = v.pulledAt
83
+ ? formatTimestamp(v.pulledAt)
84
+ : '— ';
85
+ const pullRef = v.pullId ? `pull ${v.pullId.slice(0, 8)}` : '— ';
86
+ let suffix = '';
87
+ if (v.version === fileHistory.currentVersion)
88
+ suffix = ' (current)';
89
+ if (v.isOriginal)
90
+ suffix = ' (original, before avanti)';
91
+ console.log(` ${vLabel.padEnd(4)} ${ts} ${pullRef}${suffix}`);
92
+ }
93
+ }
94
+ function formatTimestamp(iso) {
95
+ const d = new Date(iso);
96
+ const pad = (n) => String(n).padStart(2, '0');
97
+ return (`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
98
+ `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`);
99
+ }
100
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,wBAAgB,WAAW,IAAI,OAAO,CAkFrC"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,WAAW,IAAI,OAAO,CAsJrC"}
@@ -26,26 +26,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.pullCommand = void 0;
27
27
  const commander_1 = require("commander");
28
28
  const path = __importStar(require("path"));
29
- const readline = __importStar(require("readline"));
30
29
  const config_1 = require("../config");
31
30
  const sources_1 = require("../sources");
32
31
  const replace_1 = require("../processors/replace");
33
32
  const post_1 = require("../processors/post");
34
33
  const diff_1 = require("../diff");
35
34
  const writer_1 = require("../writer");
36
- async function confirm(question) {
37
- const rl = readline.createInterface({
38
- input: process.stdin,
39
- output: process.stdout,
40
- });
41
- return new Promise((resolve) => {
42
- rl.question(question, (answer) => {
43
- rl.close();
44
- resolve(answer.trim().toLowerCase() === 'y' ||
45
- answer.trim().toLowerCase() === 'yes');
46
- });
47
- });
48
- }
35
+ const history_1 = require("../history");
36
+ const prompt_1 = require("../prompt");
49
37
  function pullCommand() {
50
38
  return new commander_1.Command('pull')
51
39
  .description('Pull remote sources and write to local files')
@@ -64,6 +52,9 @@ function pullCommand() {
64
52
  console.error(err.message);
65
53
  process.exit(2);
66
54
  }
55
+ const history = new history_1.HistoryManager(configPath, workingDir);
56
+ const historyAvailable = history.ensureStorageDir();
57
+ const pullId = historyAvailable ? history.openPullSession() : null;
67
58
  const allDiffs = [];
68
59
  const writeTargets = [];
69
60
  let hasError = false;
@@ -91,28 +82,85 @@ function pullCommand() {
91
82
  console.error('Aborting due to errors.');
92
83
  process.exit(2);
93
84
  }
94
- const hasChanges = allDiffs.some((d) => d.hasChanges);
95
- (0, diff_1.printDiffs)(allDiffs);
85
+ // Detect stale files: present in last pull but no longer in current source fetch
86
+ const staleToDelete = [];
87
+ const staleToRestore = [];
88
+ const staleDiffs = [];
89
+ if (historyAvailable) {
90
+ const lastFiles = history.getLastPullFiles();
91
+ const currentPaths = new Set(writeTargets.map((t) => t.targetPath));
92
+ for (const ref of lastFiles) {
93
+ if (currentPaths.has(ref.absolutePath))
94
+ continue;
95
+ const meta = history.getFileMeta(ref.absolutePath);
96
+ if (!meta)
97
+ continue;
98
+ if (meta.existedBeforeAvanti) {
99
+ const original = history.readVersion(ref.absolutePath, 0);
100
+ if (original !== null) {
101
+ staleToRestore.push({
102
+ targetPath: ref.absolutePath,
103
+ content: original,
104
+ });
105
+ staleDiffs.push((0, diff_1.computeDiff)(ref.absolutePath, original));
106
+ }
107
+ }
108
+ else {
109
+ staleToDelete.push(ref.absolutePath);
110
+ staleDiffs.push((0, diff_1.computeDeleteDiff)(ref.absolutePath));
111
+ }
112
+ }
113
+ }
114
+ const hasChanges = allDiffs.some((d) => d.hasChanges) ||
115
+ staleDiffs.some((d) => d.hasChanges);
116
+ (0, diff_1.printDiffs)([...allDiffs, ...staleDiffs]);
96
117
  if (!hasChanges) {
97
118
  console.log('Nothing to do.');
98
119
  process.exit(0);
99
120
  }
100
121
  const yes = options.yes ?? false;
101
122
  if (!yes) {
102
- const ok = await confirm('Apply changes? [y/N] ');
123
+ const ok = await (0, prompt_1.confirm)('Apply changes? [y/N] ');
103
124
  if (!ok) {
104
125
  console.log('Aborted.');
105
126
  process.exit(0);
106
127
  }
107
128
  }
129
+ // Stage history versions before atomicWrite so v0 is captured before overwrite
130
+ const stagedFileRefs = [];
131
+ if (pullId) {
132
+ for (let i = 0; i < writeTargets.length; i++) {
133
+ if (!allDiffs[i].hasChanges)
134
+ continue;
135
+ try {
136
+ const { fileRef } = history.stageFileVersion(pullId, writeTargets[i].targetPath, writeTargets[i].content, allDiffs[i].isNew);
137
+ stagedFileRefs.push(fileRef);
138
+ }
139
+ catch {
140
+ console.warn(`Warning: could not record history for ${writeTargets[i].targetPath}`);
141
+ }
142
+ }
143
+ }
108
144
  try {
109
- (0, writer_1.atomicWrite)(writeTargets);
110
- console.log(`Wrote ${writeTargets.length} file(s).`);
145
+ (0, writer_1.atomicWrite)([...writeTargets, ...staleToRestore], staleToDelete);
146
+ const written = writeTargets.filter((_, i) => allDiffs[i].hasChanges).length +
147
+ staleToRestore.length +
148
+ staleToDelete.length;
149
+ console.log(`Wrote ${written} file(s).`);
111
150
  }
112
151
  catch (err) {
113
152
  console.error(`Write failed: ${err.message}`);
114
153
  process.exit(2);
115
154
  }
155
+ // Only record to pulls.jsonl if at least one file was actually written
156
+ if (pullId && stagedFileRefs.length > 0) {
157
+ try {
158
+ history.closePullSession(pullId, configPath, stagedFileRefs);
159
+ }
160
+ catch {
161
+ console.warn('Warning: could not save pull history.');
162
+ }
163
+ }
116
164
  });
117
165
  }
118
166
  exports.pullCommand = pullCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function resetCommand(): Command;
3
+ //# 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,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,YAAY,IAAI,OAAO,CAqFtC"}