proj-track 1.0.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 (58) hide show
  1. package/README.md +253 -0
  2. package/dist/commands/clear.d.ts +5 -0
  3. package/dist/commands/clear.d.ts.map +1 -0
  4. package/dist/commands/clear.js +15 -0
  5. package/dist/commands/clear.js.map +1 -0
  6. package/dist/commands/init.d.ts +6 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +57 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/list.d.ts +5 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +34 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/pause.d.ts +6 -0
  15. package/dist/commands/pause.d.ts.map +1 -0
  16. package/dist/commands/pause.js +24 -0
  17. package/dist/commands/pause.js.map +1 -0
  18. package/dist/commands/remove.d.ts +7 -0
  19. package/dist/commands/remove.d.ts.map +1 -0
  20. package/dist/commands/remove.js +37 -0
  21. package/dist/commands/remove.js.map +1 -0
  22. package/dist/commands/resume.d.ts +6 -0
  23. package/dist/commands/resume.d.ts.map +1 -0
  24. package/dist/commands/resume.js +24 -0
  25. package/dist/commands/resume.js.map +1 -0
  26. package/dist/commands/run.d.ts +5 -0
  27. package/dist/commands/run.d.ts.map +1 -0
  28. package/dist/commands/run.js +39 -0
  29. package/dist/commands/run.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +78 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/logger.d.ts +8 -0
  35. package/dist/logger.d.ts.map +1 -0
  36. package/dist/logger.js +42 -0
  37. package/dist/logger.js.map +1 -0
  38. package/dist/utils/file-handler.d.ts +36 -0
  39. package/dist/utils/file-handler.d.ts.map +1 -0
  40. package/dist/utils/file-handler.js +97 -0
  41. package/dist/utils/file-handler.js.map +1 -0
  42. package/dist/utils/project-detector.d.ts +17 -0
  43. package/dist/utils/project-detector.d.ts.map +1 -0
  44. package/dist/utils/project-detector.js +30 -0
  45. package/dist/utils/project-detector.js.map +1 -0
  46. package/dist/utils/security-filter.d.ts +10 -0
  47. package/dist/utils/security-filter.d.ts.map +1 -0
  48. package/dist/utils/security-filter.js +79 -0
  49. package/dist/utils/security-filter.js.map +1 -0
  50. package/dist/utils/shell-installer.d.ts +16 -0
  51. package/dist/utils/shell-installer.d.ts.map +1 -0
  52. package/dist/utils/shell-installer.js +232 -0
  53. package/dist/utils/shell-installer.js.map +1 -0
  54. package/package.json +78 -0
  55. package/scripts/preuninstall.js +97 -0
  56. package/scripts/release.sh +59 -0
  57. package/src/hooks/bash-hook.sh +67 -0
  58. package/src/hooks/zsh-hook.sh +54 -0
package/dist/index.js ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { listCommand } from './commands/list.js';
5
+ import { runCommand } from './commands/run.js';
6
+ import { clearCommand } from './commands/clear.js';
7
+ import { pauseCommand } from './commands/pause.js';
8
+ import { resumeCommand } from './commands/resume.js';
9
+ import { removeCommand } from './commands/remove.js';
10
+ import { installShellFunction, uninstallShellFunction } from './utils/shell-installer.js';
11
+ import chalk from 'chalk';
12
+ const program = new Command();
13
+ program
14
+ .name('proj-track')
15
+ .description('Track CLI command history per-project with zero terminal interference')
16
+ .version('1.0.0');
17
+ program
18
+ .command('init')
19
+ .description('Initialize proj-track in the current project')
20
+ .action(initCommand);
21
+ program
22
+ .command('list')
23
+ .description('List tracked commands')
24
+ .action(listCommand);
25
+ program
26
+ .command('run <id>')
27
+ .description('Re-run a tracked command by its ID')
28
+ .action(runCommand);
29
+ program
30
+ .command('clear')
31
+ .description('Clear command history')
32
+ .action(clearCommand);
33
+ program
34
+ .command('pause')
35
+ .description('Pause tracking in the current project')
36
+ .action(pauseCommand);
37
+ program
38
+ .command('resume')
39
+ .description('Resume tracking in the current project')
40
+ .action(resumeCommand);
41
+ program
42
+ .command('remove')
43
+ .description('Remove proj-track from the current project (saves history as .txt)')
44
+ .action(removeCommand);
45
+ program
46
+ .command('install')
47
+ .description('Install the shell function to .bashrc/.zshrc')
48
+ .action(() => {
49
+ const modified = installShellFunction();
50
+ if (modified.length > 0) {
51
+ console.log(chalk.green('✓ Shell function installed.'));
52
+ modified.forEach(f => console.log(chalk.dim(` Updated ${f}`)));
53
+ console.log('');
54
+ console.log(chalk.cyan('Run the following to activate:'));
55
+ console.log(chalk.white(` source ${modified[0]}`));
56
+ }
57
+ else {
58
+ console.log(chalk.yellow('No shell config files found.'));
59
+ }
60
+ });
61
+ program
62
+ .command('uninstall')
63
+ .description('Remove the shell function from .bashrc/.zshrc')
64
+ .action(() => {
65
+ const modified = uninstallShellFunction();
66
+ if (modified.length > 0) {
67
+ console.log(chalk.green('✓ Shell function removed.'));
68
+ modified.forEach(f => console.log(chalk.dim(` Updated ${f}`)));
69
+ console.log('');
70
+ console.log(chalk.cyan('Restart your terminal or run:'));
71
+ console.log(chalk.white(` source ${modified[0]}`));
72
+ }
73
+ else {
74
+ console.log(chalk.yellow('Shell function was not installed.'));
75
+ }
76
+ });
77
+ program.parse();
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * proj-track-logger: 100% SILENT command logger.
4
+ * Called by PROMPT_COMMAND (bash) / preexec (zsh) in background.
5
+ * Must NEVER produce any stdout/stderr output.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
package/dist/logger.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * proj-track-logger: 100% SILENT command logger.
4
+ * Called by PROMPT_COMMAND (bash) / preexec (zsh) in background.
5
+ * Must NEVER produce any stdout/stderr output.
6
+ */
7
+ // SUPPRESS ALL OUTPUT (critical for clean terminal UX)
8
+ process.stdout.write = () => true;
9
+ process.stderr.write = () => true;
10
+ import { isSensitive } from './utils/security-filter.js';
11
+ import { appendCommand } from './utils/file-handler.js';
12
+ import { isProjectDirectory, isTrackingPaused, isTrackingDisabled } from './utils/project-detector.js';
13
+ const command = process.argv.slice(2).join(' ').trim();
14
+ // No command provided
15
+ if (!command) {
16
+ process.exit(0);
17
+ }
18
+ // Not a project directory — silent exit
19
+ if (!isProjectDirectory()) {
20
+ process.exit(0);
21
+ }
22
+ // Tracking permanently disabled (proj-track remove) — silent exit
23
+ if (isTrackingDisabled()) {
24
+ process.exit(0);
25
+ }
26
+ // Tracking is paused — silent exit
27
+ if (isTrackingPaused()) {
28
+ process.exit(0);
29
+ }
30
+ // Sensitive command — silent exit
31
+ if (isSensitive(command)) {
32
+ process.exit(0);
33
+ }
34
+ // Save command silently
35
+ try {
36
+ appendCommand(command);
37
+ }
38
+ catch {
39
+ // Silently ignore any errors
40
+ }
41
+ process.exit(0);
42
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,uDAAuD;AACvD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;AAClC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEvG,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAEvD,sBAAsB;AACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,wCAAwC;AACxC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,kEAAkE;AAClE,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,mCAAmC;AACnC,IAAI,gBAAgB,EAAE,EAAE,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,kCAAkC;AAClC,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,wBAAwB;AACxB,IAAI,CAAC;IACH,aAAa,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAAC,MAAM,CAAC;IACP,6BAA6B;AAC/B,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ export interface CommandEntry {
2
+ id: number;
3
+ command: string;
4
+ timestamp: string;
5
+ }
6
+ export interface History {
7
+ projectName: string;
8
+ commands: CommandEntry[];
9
+ }
10
+ /**
11
+ * Read command history from .proj-track.json.
12
+ * Returns a default empty history if the file doesn't exist or is malformed.
13
+ */
14
+ export declare function readHistory(dir?: string): History;
15
+ /**
16
+ * Write command history to .proj-track.json.
17
+ */
18
+ export declare function writeHistory(history: History, dir?: string): void;
19
+ /**
20
+ * Append a command to history with deduplication and size limit.
21
+ */
22
+ export declare function appendCommand(command: string, dir?: string): void;
23
+ /**
24
+ * Clear all commands from history.
25
+ */
26
+ export declare function clearHistory(dir?: string): void;
27
+ /**
28
+ * Convert .proj-track.json to .proj-track.txt (plain text backup).
29
+ * Removes the JSON file after conversion.
30
+ */
31
+ export declare function convertToTxt(dir?: string): void;
32
+ /**
33
+ * Find a command entry by its ID.
34
+ */
35
+ export declare function findCommandById(id: number, dir?: string): CommandEntry | undefined;
36
+ //# sourceMappingURL=file-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-handler.d.ts","sourceRoot":"","sources":["../../src/utils/file-handler.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AASD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAuBjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAuBjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAe/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGlF"}
@@ -0,0 +1,97 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const HISTORY_FILE = '.proj-track.json';
4
+ const MAX_COMMANDS = 50;
5
+ function getHistoryPath(dir) {
6
+ return path.join(dir ?? process.cwd(), HISTORY_FILE);
7
+ }
8
+ /**
9
+ * Read command history from .proj-track.json.
10
+ * Returns a default empty history if the file doesn't exist or is malformed.
11
+ */
12
+ export function readHistory(dir) {
13
+ const filePath = getHistoryPath(dir);
14
+ if (!fs.existsSync(filePath)) {
15
+ return {
16
+ projectName: path.basename(dir ?? process.cwd()),
17
+ commands: [],
18
+ };
19
+ }
20
+ try {
21
+ const raw = fs.readFileSync(filePath, 'utf-8');
22
+ const data = JSON.parse(raw);
23
+ return {
24
+ projectName: data.projectName || path.basename(dir ?? process.cwd()),
25
+ commands: Array.isArray(data.commands) ? data.commands : [],
26
+ };
27
+ }
28
+ catch {
29
+ return {
30
+ projectName: path.basename(dir ?? process.cwd()),
31
+ commands: [],
32
+ };
33
+ }
34
+ }
35
+ /**
36
+ * Write command history to .proj-track.json.
37
+ */
38
+ export function writeHistory(history, dir) {
39
+ const filePath = getHistoryPath(dir);
40
+ fs.writeFileSync(filePath, JSON.stringify(history, null, 2), 'utf-8');
41
+ }
42
+ /**
43
+ * Append a command to history with deduplication and size limit.
44
+ */
45
+ export function appendCommand(command, dir) {
46
+ const history = readHistory(dir);
47
+ // Deduplication: skip if same as last command
48
+ if (history.commands.length > 0) {
49
+ const lastCmd = history.commands[history.commands.length - 1].command;
50
+ if (lastCmd === command) {
51
+ return;
52
+ }
53
+ }
54
+ history.commands.push({
55
+ id: Date.now(),
56
+ command,
57
+ timestamp: new Date().toLocaleString(),
58
+ });
59
+ // Keep only the last MAX_COMMANDS entries
60
+ if (history.commands.length > MAX_COMMANDS) {
61
+ history.commands = history.commands.slice(-MAX_COMMANDS);
62
+ }
63
+ writeHistory(history, dir);
64
+ }
65
+ /**
66
+ * Clear all commands from history.
67
+ */
68
+ export function clearHistory(dir) {
69
+ const history = readHistory(dir);
70
+ history.commands = [];
71
+ writeHistory(history, dir);
72
+ }
73
+ /**
74
+ * Convert .proj-track.json to .proj-track.txt (plain text backup).
75
+ * Removes the JSON file after conversion.
76
+ */
77
+ export function convertToTxt(dir) {
78
+ const cwd = dir ?? process.cwd();
79
+ const history = readHistory(cwd);
80
+ const txtPath = path.join(cwd, '.proj-track.txt');
81
+ const content = history.commands.length > 0
82
+ ? history.commands.map(c => `${c.timestamp} | ${c.command}`).join('\n')
83
+ : '# No commands were tracked';
84
+ fs.writeFileSync(txtPath, content, 'utf-8');
85
+ const jsonPath = getHistoryPath(cwd);
86
+ if (fs.existsSync(jsonPath)) {
87
+ fs.unlinkSync(jsonPath);
88
+ }
89
+ }
90
+ /**
91
+ * Find a command entry by its ID.
92
+ */
93
+ export function findCommandById(id, dir) {
94
+ const history = readHistory(dir);
95
+ return history.commands.find(c => c.id === id);
96
+ }
97
+ //# sourceMappingURL=file-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-handler.js","sourceRoot":"","sources":["../../src/utils/file-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Check if the current directory is a trackable project.
3
+ * A project is detected if any of these exist:
4
+ * - .git/ directory
5
+ * - package.json file
6
+ * - .proj-track.json file
7
+ */
8
+ export declare function isProjectDirectory(dir?: string): boolean;
9
+ /**
10
+ * Check if tracking is paused in the current project.
11
+ */
12
+ export declare function isTrackingPaused(dir?: string): boolean;
13
+ /**
14
+ * Check if tracking has been permanently disabled via `proj-track remove`.
15
+ */
16
+ export declare function isTrackingDisabled(dir?: string): boolean;
17
+ //# sourceMappingURL=project-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAGxD"}
@@ -0,0 +1,30 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ /**
4
+ * Check if the current directory is a trackable project.
5
+ * A project is detected if any of these exist:
6
+ * - .git/ directory
7
+ * - package.json file
8
+ * - .proj-track.json file
9
+ */
10
+ export function isProjectDirectory(dir) {
11
+ const cwd = dir ?? process.cwd();
12
+ return (fs.existsSync(path.join(cwd, '.git')) ||
13
+ fs.existsSync(path.join(cwd, 'package.json')) ||
14
+ fs.existsSync(path.join(cwd, '.proj-track.json')));
15
+ }
16
+ /**
17
+ * Check if tracking is paused in the current project.
18
+ */
19
+ export function isTrackingPaused(dir) {
20
+ const cwd = dir ?? process.cwd();
21
+ return fs.existsSync(path.join(cwd, '.proj-track.json.paused'));
22
+ }
23
+ /**
24
+ * Check if tracking has been permanently disabled via `proj-track remove`.
25
+ */
26
+ export function isTrackingDisabled(dir) {
27
+ const cwd = dir ?? process.cwd();
28
+ return fs.existsSync(path.join(cwd, '.proj-track-disabled'));
29
+ }
30
+ //# sourceMappingURL=project-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAClD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Check if a command is a noise/trivial command not worth tracking.
3
+ */
4
+ export declare function isNoiseCommand(cmd: string): boolean;
5
+ /**
6
+ * Determine if a command contains sensitive information that should NOT be saved.
7
+ * Returns true if the command should be filtered out.
8
+ */
9
+ export declare function isSensitive(cmd: string): boolean;
10
+ //# sourceMappingURL=security-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-filter.d.ts","sourceRoot":"","sources":["../../src/utils/security-filter.ts"],"names":[],"mappings":"AAyCA;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA4BhD"}
@@ -0,0 +1,79 @@
1
+ const SENSITIVE_KEYWORDS = [
2
+ 'password',
3
+ 'passwd',
4
+ 'secret',
5
+ 'token',
6
+ 'key=',
7
+ 'api_key',
8
+ 'apikey',
9
+ 'auth_token',
10
+ 'access_key',
11
+ 'private_key',
12
+ '-p ',
13
+ '--password',
14
+ 'credential',
15
+ ];
16
+ const INTERNAL_PREFIXES = [
17
+ '__vsc',
18
+ '__proj',
19
+ '__git',
20
+ ];
21
+ /**
22
+ * Noise commands that are too trivial to track.
23
+ * Matched as exact command or as prefix followed by a space.
24
+ */
25
+ const NOISE_COMMANDS = [
26
+ 'cd',
27
+ 'ls',
28
+ 'clear',
29
+ 'echo',
30
+ 'cat',
31
+ 'pwd',
32
+ 'exit',
33
+ 'history',
34
+ 'which',
35
+ 'whoami',
36
+ 'true',
37
+ 'false',
38
+ ];
39
+ /**
40
+ * Check if a command is a noise/trivial command not worth tracking.
41
+ */
42
+ export function isNoiseCommand(cmd) {
43
+ const trimmed = cmd.trim();
44
+ for (const noise of NOISE_COMMANDS) {
45
+ if (trimmed === noise || trimmed.startsWith(noise + ' ')) {
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ }
51
+ /**
52
+ * Determine if a command contains sensitive information that should NOT be saved.
53
+ * Returns true if the command should be filtered out.
54
+ */
55
+ export function isSensitive(cmd) {
56
+ // Never filter proj-track's own commands
57
+ if (cmd.startsWith('proj-track') || cmd.startsWith('track ') || cmd === 'track') {
58
+ return false;
59
+ }
60
+ // Filter VS Code and other internal terminal commands
61
+ if (INTERNAL_PREFIXES.some(prefix => cmd.startsWith(prefix))) {
62
+ return true;
63
+ }
64
+ // Filter noise commands
65
+ if (isNoiseCommand(cmd)) {
66
+ return true;
67
+ }
68
+ // Filter commands containing sensitive keywords
69
+ const lowerCmd = cmd.toLowerCase();
70
+ if (SENSITIVE_KEYWORDS.some(keyword => lowerCmd.includes(keyword))) {
71
+ return true;
72
+ }
73
+ // Filter inline environment variable assignments with sensitive names
74
+ if (/\b(password|secret|token|api_key|auth)=/i.test(cmd)) {
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ //# sourceMappingURL=security-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-filter.js","sourceRoot":"","sources":["../../src/utils/security-filter.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG;IACzB,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,KAAK;IACL,YAAY;IACZ,YAAY;CACb,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,OAAO;IACP,QAAQ;IACR,OAAO;CACR,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG;IACrB,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,yCAAyC;IACzC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sEAAsE;IACtE,IAAI,0CAA0C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Install the shell hook into .bashrc/.zshrc.
3
+ * Returns the list of files that were modified.
4
+ */
5
+ export declare function installShellFunction(): string[];
6
+ /**
7
+ * Uninstall the shell hook from all config files.
8
+ * Cleanly removes ALL proj-track content — no leftovers.
9
+ * Returns the list of files that were modified.
10
+ */
11
+ export declare function uninstallShellFunction(): string[];
12
+ /**
13
+ * Check if the shell hook is installed in any config file.
14
+ */
15
+ export declare function isShellFunctionInstalled(): boolean;
16
+ //# sourceMappingURL=shell-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-installer.d.ts","sourceRoot":"","sources":["../../src/utils/shell-installer.ts"],"names":[],"mappings":"AA+MA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAgB/C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAejD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAGlD"}