@chronicle.app/shell 0.4.0 → 0.5.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.
@@ -1,4 +1,4 @@
1
- import { Extractor, Record } from '@chronicle.app/etl';
1
+ import { Extractor, Record, type Survey, type SurveyOptions } from '@chronicle.app/etl';
2
2
  import { z } from 'zod';
3
3
  import ShellHistoryTransformer from './ShellHistoryTransformer.js';
4
4
  export declare class ShellHistoryExtractor extends Extractor<typeof ShellHistoryExtractor> {
@@ -41,6 +41,11 @@ export declare class ShellHistoryExtractor extends Extractor<typeof ShellHistory
41
41
  private parseZshHistory;
42
42
  private parseBashHistory;
43
43
  private parseFishHistory;
44
+ /**
45
+ * The commands a run reads and when, from one pass over the history file,
46
+ * which stays small. Commands without a time count, but date nothing.
47
+ */
48
+ survey(options?: SurveyOptions): Promise<Survey>;
44
49
  determineCount(): Promise<number | null>;
45
50
  }
46
51
  //# sourceMappingURL=ShellHistoryExtractor.d.ts.map
@@ -1,4 +1,4 @@
1
- import { Extractor, fileError } from '@chronicle.app/etl';
1
+ import { Extractor, countMonth, fileError, } from '@chronicle.app/etl';
2
2
  import { readFile, access } from 'node:fs/promises';
3
3
  import { z } from 'zod';
4
4
  import os from 'node:os';
@@ -268,6 +268,37 @@ export class ShellHistoryExtractor extends Extractor {
268
268
  }
269
269
  yield* this.yieldNewestFirst(entries);
270
270
  }
271
+ /**
272
+ * The commands a run reads and when, from one pass over the history file,
273
+ * which stays small. Commands without a time count, but date nothing.
274
+ */
275
+ async survey(options = {}) {
276
+ // Every command in range, whatever the run's limit.
277
+ const all = new ShellHistoryExtractor({ ...this.config, limit: undefined });
278
+ let count = 0;
279
+ let earliest;
280
+ let latest;
281
+ const byMonth = {};
282
+ for await (const { data } of all.extract()) {
283
+ count++;
284
+ if (!data.timestamp)
285
+ continue;
286
+ const time = new Date(data.timestamp);
287
+ if (!earliest || time < earliest)
288
+ earliest = time;
289
+ if (!latest || time > latest)
290
+ latest = time;
291
+ if (options.byMonth)
292
+ countMonth(byMonth, time);
293
+ }
294
+ return {
295
+ commands: {
296
+ count,
297
+ ...(earliest && { earliest, latest }),
298
+ ...(options.byMonth && { byMonth }),
299
+ },
300
+ };
301
+ }
271
302
  async determineCount() {
272
303
  const config = this.config;
273
304
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chronicle.app/shell",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [
@@ -19,9 +19,9 @@
19
19
  "type": "module",
20
20
  "description": "Chronicle shell extraction plugin",
21
21
  "devDependencies": {
22
- "@chronicle.app/etl": "0.4.0",
23
- "@chronicle.app/schema": "0.4.0",
24
- "@chronicle.app/tsconfig": "0.4.0",
22
+ "@chronicle.app/etl": "0.5.0",
23
+ "@chronicle.app/schema": "0.5.0",
24
+ "@chronicle.app/tsconfig": "0.5.0",
25
25
  "@types/node": "^22.10.1",
26
26
  "typescript": "^5.7.2"
27
27
  },
@@ -61,7 +61,24 @@
61
61
  "recordTypes": [
62
62
  "commands"
63
63
  ],
64
- "default": true
64
+ "default": true,
65
+ "locations": [
66
+ {
67
+ "path": "~/.zsh_history"
68
+ },
69
+ {
70
+ "path": "~/.bash_history",
71
+ "options": {
72
+ "shell": "bash"
73
+ }
74
+ },
75
+ {
76
+ "path": "~/.local/share/fish/fish_history",
77
+ "options": {
78
+ "shell": "fish"
79
+ }
80
+ }
81
+ ]
65
82
  }
66
83
  }
67
84
  }