promptvc 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.
- package/README.md +78 -0
- package/assets/notify.mp3 +0 -0
- package/bin/promptvc +3 -0
- package/bin/promptvc-codex +8 -0
- package/dist/branding.d.ts +2 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +44 -0
- package/dist/branding.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/git.d.ts +43 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +157 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/proxyCodex.d.ts +5 -0
- package/dist/proxyCodex.d.ts.map +1 -0
- package/dist/proxyCodex.js +299 -0
- package/dist/proxyCodex.js.map +1 -0
- package/dist/store.d.ts +33 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +142 -0
- package/dist/store.js.map +1 -0
- package/dist/watch.d.ts +5 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +131 -0
- package/dist/watch.js.map +1 -0
- package/hooks/codex-notify-debug.sh +20 -0
- package/hooks/codex-notify.sh +285 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# promptvc
|
|
2
|
+
|
|
3
|
+
Local-first, prompt-by-prompt diff tracking for AI coding sessions.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- Node.js 18+
|
|
8
|
+
- Git
|
|
9
|
+
- Codex CLI
|
|
10
|
+
- jq (required for per-prompt capture)
|
|
11
|
+
- macOS/Linux (Windows: use WSL or Git Bash)
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g promptvc
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Setup (recommended)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
promptvc config
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This command finds the installed notify hook and updates `~/.codex/config.toml`. If it cannot edit the file, it prints a ready-to-paste snippet.
|
|
26
|
+
|
|
27
|
+
### Manual setup
|
|
28
|
+
|
|
29
|
+
Add to `~/.codex/config.toml`:
|
|
30
|
+
|
|
31
|
+
```toml
|
|
32
|
+
[hooks]
|
|
33
|
+
notify = "/absolute/path/to/promptvc/hooks/codex-notify.sh"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If installed globally via npm, the hook is typically at:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
$(npm root -g)/promptvc/hooks/codex-notify.sh
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
Initialize a repo:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cd /path/to/your/repo
|
|
48
|
+
promptvc init
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Run Codex:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
codex
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
List sessions:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
promptvc list
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Show a session:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
promptvc show <session-id>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Optional Codex wrapper:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
promptvc-codex
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Troubleshooting
|
|
76
|
+
|
|
77
|
+
- If `promptvc` resolves to a Python shim, run `which promptvc` and ensure your npm global bin is ahead of pyenv on PATH.
|
|
78
|
+
- Ensure `jq` is installed and available on PATH.
|
|
Binary file
|
package/bin/promptvc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,UAAU,QAAO,MAAqD,CAAC"}
|
package/dist/branding.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderLogo = void 0;
|
|
7
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
8
|
+
const LOGO_LINES = [
|
|
9
|
+
' .:.. ..',
|
|
10
|
+
' .:;+;;:....... ..;+;;;:',
|
|
11
|
+
' .:;:. .;:...;;.....:;..::...;...::',
|
|
12
|
+
' ...+;...;;;:..;;..:;;;;;..:.:;;:.:;..:..',
|
|
13
|
+
' .;+++x+;:++;;;:;;:..:......... . .x++;;;:.',
|
|
14
|
+
' ;+;;+;;x;;;+++;;;;;;;++xXXxxxx;;;;;+Xxx++;.',
|
|
15
|
+
' :+xxxxXx+XXXXXx+;;:::;..+XXXXx++;;::;:... ..',
|
|
16
|
+
' ;;;;xXx;.xXXXXxx+++;+;. :xXXxXxxx++x; .. .:;;.',
|
|
17
|
+
' :;;;;.:xXxxxx+;;+:. .;;++++;;:;. ..:;;;.:;;;.',
|
|
18
|
+
' ...;x:....... . . ;:.;;:.:..;;;;.',
|
|
19
|
+
' .....:...... :. . ;;.:;.:;;;..:....',
|
|
20
|
+
' XX;..... . ;+:.;;;;;;;:..;',
|
|
21
|
+
' :xxX:.... ........ . ;+x;::::;:;x;...',
|
|
22
|
+
' :xx: .:... .. .:...::;;;;;:.:;.',
|
|
23
|
+
' :X+ .;;;::.......:;;. .:.........:;;.',
|
|
24
|
+
' .++; ;xx+;:.: .....;',
|
|
25
|
+
' ;x. ;;:... . .. ..',
|
|
26
|
+
' ;X. ;+;:.. .;;... .. .',
|
|
27
|
+
' ;XXX; :xx++x+::.. .:...:.....;;;:. :. .',
|
|
28
|
+
' .xxxX; .;;;;;;;::.::;:.........;;.. .;... .',
|
|
29
|
+
' :;; ..::::;;+;;:;;:.::::;;+;:..;... .',
|
|
30
|
+
' . ....:;:.:...;;;;;;.:....'
|
|
31
|
+
];
|
|
32
|
+
const bandSize = Math.ceil(LOGO_LINES.length / 3);
|
|
33
|
+
const colorizeLogoLine = (line, index) => {
|
|
34
|
+
if (index < bandSize) {
|
|
35
|
+
return kleur_1.default.green(line);
|
|
36
|
+
}
|
|
37
|
+
if (index < bandSize * 2) {
|
|
38
|
+
return kleur_1.default.yellow(line);
|
|
39
|
+
}
|
|
40
|
+
return kleur_1.default.cyan(line);
|
|
41
|
+
};
|
|
42
|
+
const renderLogo = () => LOGO_LINES.map(colorizeLogoLine).join('\n');
|
|
43
|
+
exports.renderLogo = renderLogo;
|
|
44
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,MAAM,UAAU,GAAG;IACjB,8CAA8C;IAC9C,sDAAsD;IACtD,6DAA6D;IAC7D,+DAA+D;IAC/D,gEAAgE;IAChE,gEAAgE;IAChE,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,iFAAiF;IACjF,mFAAmF;IACnF,kFAAkF;IAClF,oFAAoF;IACpF,kFAAkF;IAClF,+EAA+E;IAC/E,qEAAqE;IACrE,oEAAoE;IACpE,kEAAkE;IAClE,iEAAiE;IACjE,gEAAgE;IAChE,+DAA+D;IAC/D,0DAA0D;CAC3D,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAElD,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE;IAC/D,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QACrB,OAAO,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEK,MAAM,UAAU,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAvE,QAAA,UAAU,cAA6D"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,gBAAgB,QAAO,IA+BnC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runConfigCommand = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
11
|
+
const branding_1 = require("./branding");
|
|
12
|
+
const getCodexConfigPath = () => path_1.default.join(os_1.default.homedir(), '.codex', 'config.toml');
|
|
13
|
+
const getNotifyHookPath = () => path_1.default.resolve(__dirname, '..', 'hooks', 'codex-notify.sh');
|
|
14
|
+
const upsertNotifyHook = (content, hookPath) => {
|
|
15
|
+
const usesCrlf = content.includes('\r\n');
|
|
16
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
17
|
+
const notifyLine = `notify = "${hookPath}"`;
|
|
18
|
+
if (!normalized.trim()) {
|
|
19
|
+
const fresh = `[hooks]\n${notifyLine}\n`;
|
|
20
|
+
return usesCrlf ? fresh.replace(/\n/g, '\r\n') : fresh;
|
|
21
|
+
}
|
|
22
|
+
const hooksHeader = /^\s*\[hooks\]\s*$/m;
|
|
23
|
+
const sectionRegex = /^\s*\[hooks\][\s\S]*?(?=^\s*\[|\Z)/m;
|
|
24
|
+
let updated = normalized;
|
|
25
|
+
if (hooksHeader.test(normalized)) {
|
|
26
|
+
const sectionMatch = normalized.match(sectionRegex);
|
|
27
|
+
if (sectionMatch) {
|
|
28
|
+
const section = sectionMatch[0];
|
|
29
|
+
let nextSection = section;
|
|
30
|
+
if (/^\s*notify\s*=.*$/m.test(section)) {
|
|
31
|
+
nextSection = section.replace(/^\s*notify\s*=.*$/m, notifyLine);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
nextSection = `${section.replace(/\s*$/, '')}\n${notifyLine}\n`;
|
|
35
|
+
}
|
|
36
|
+
updated = normalized.replace(sectionRegex, nextSection);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
updated = `${normalized.trimEnd()}\n\n[hooks]\n${notifyLine}\n`;
|
|
41
|
+
}
|
|
42
|
+
return usesCrlf ? updated.replace(/\n/g, '\r\n') : updated;
|
|
43
|
+
};
|
|
44
|
+
const runConfigCommand = () => {
|
|
45
|
+
const hookPath = getNotifyHookPath();
|
|
46
|
+
const configPath = getCodexConfigPath();
|
|
47
|
+
const snippet = `[hooks]\nnotify = "${hookPath}"\n`;
|
|
48
|
+
console.log(kleur_1.default.bold().cyan('PromptVC Config'));
|
|
49
|
+
console.log((0, branding_1.renderLogo)());
|
|
50
|
+
console.log('');
|
|
51
|
+
console.log(`${kleur_1.default.bold('Hook path:')} ${hookPath}`);
|
|
52
|
+
console.log(`${kleur_1.default.bold('Codex config:')} ${configPath}`);
|
|
53
|
+
if (!fs_1.default.existsSync(hookPath)) {
|
|
54
|
+
console.log(kleur_1.default.yellow('Warning: notify hook not found at this path.'));
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
fs_1.default.mkdirSync(path_1.default.dirname(configPath), { recursive: true });
|
|
58
|
+
const existing = fs_1.default.existsSync(configPath) ? fs_1.default.readFileSync(configPath, 'utf-8') : '';
|
|
59
|
+
const updated = upsertNotifyHook(existing, hookPath);
|
|
60
|
+
fs_1.default.writeFileSync(configPath, updated, 'utf-8');
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(kleur_1.default.green('OK: updated Codex config.'));
|
|
63
|
+
console.log('');
|
|
64
|
+
console.log(kleur_1.default.bgBlue('Run "promptvc init" to initialize Prompt Version Controle in your repository.'));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(kleur_1.default.yellow('Manual setup required.'));
|
|
69
|
+
console.log(`Add this to ${configPath}:`);
|
|
70
|
+
console.log(snippet);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.runConfigCommand = runConfigCommand;
|
|
74
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/git.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the root directory of the git repository
|
|
3
|
+
*/
|
|
4
|
+
export declare function getRepoRoot(cwd?: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Get the current branch name
|
|
7
|
+
*/
|
|
8
|
+
export declare function getBranch(cwd?: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Get the current HEAD commit hash
|
|
11
|
+
*/
|
|
12
|
+
export declare function getHeadHash(cwd?: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Get the diff between two commits (or from a commit to working tree)
|
|
15
|
+
* @param from - Starting commit hash (default: HEAD)
|
|
16
|
+
* @param to - Ending commit hash (default: working tree)
|
|
17
|
+
* @param cwd - Working directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDiff(from?: string, to?: string, cwd?: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Get list of files that changed between two commits
|
|
22
|
+
* @param from - Starting commit hash (default: HEAD)
|
|
23
|
+
* @param to - Ending commit hash (default: working tree)
|
|
24
|
+
* @param cwd - Working directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function getChangedFiles(from?: string, to?: string, cwd?: string): Promise<string[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if the working directory is clean (no uncommitted changes)
|
|
29
|
+
*/
|
|
30
|
+
export declare function isWorkingDirClean(cwd?: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Get list of files with uncommitted changes (modified, added, deleted)
|
|
33
|
+
*/
|
|
34
|
+
export declare function getUncommittedFiles(cwd?: string): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get diff of uncommitted changes
|
|
37
|
+
*/
|
|
38
|
+
export declare function getUncommittedDiff(cwd?: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Get short commit hash (7 characters)
|
|
41
|
+
*/
|
|
42
|
+
export declare function getShortHash(hash: string, cwd?: string): Promise<string>;
|
|
43
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,IAAI,GAAE,MAAe,EACrB,EAAE,CAAC,EAAE,MAAM,EACX,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,GAAE,MAAe,EACrB,EAAE,CAAC,EAAE,MAAM,EACX,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAcxF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7F"}
|
package/dist/git.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getRepoRoot = getRepoRoot;
|
|
7
|
+
exports.getBranch = getBranch;
|
|
8
|
+
exports.getHeadHash = getHeadHash;
|
|
9
|
+
exports.getDiff = getDiff;
|
|
10
|
+
exports.getChangedFiles = getChangedFiles;
|
|
11
|
+
exports.isWorkingDirClean = isWorkingDirClean;
|
|
12
|
+
exports.getUncommittedFiles = getUncommittedFiles;
|
|
13
|
+
exports.getUncommittedDiff = getUncommittedDiff;
|
|
14
|
+
exports.getShortHash = getShortHash;
|
|
15
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
16
|
+
/**
|
|
17
|
+
* Get the root directory of the git repository
|
|
18
|
+
*/
|
|
19
|
+
async function getRepoRoot(cwd = process.cwd()) {
|
|
20
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
21
|
+
try {
|
|
22
|
+
const root = await git.revparse(['--show-toplevel']);
|
|
23
|
+
return root.trim();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Not a git repository (or any parent): ${cwd}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the current branch name
|
|
31
|
+
*/
|
|
32
|
+
async function getBranch(cwd = process.cwd()) {
|
|
33
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
34
|
+
try {
|
|
35
|
+
const branch = await git.revparse(['--abbrev-ref', 'HEAD']);
|
|
36
|
+
return branch.trim();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error('Failed to get current branch');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the current HEAD commit hash
|
|
44
|
+
*/
|
|
45
|
+
async function getHeadHash(cwd = process.cwd()) {
|
|
46
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
47
|
+
try {
|
|
48
|
+
const hash = await git.revparse(['HEAD']);
|
|
49
|
+
return hash.trim();
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new Error('Failed to get HEAD hash');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the diff between two commits (or from a commit to working tree)
|
|
57
|
+
* @param from - Starting commit hash (default: HEAD)
|
|
58
|
+
* @param to - Ending commit hash (default: working tree)
|
|
59
|
+
* @param cwd - Working directory
|
|
60
|
+
*/
|
|
61
|
+
async function getDiff(from = 'HEAD', to, cwd = process.cwd()) {
|
|
62
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
63
|
+
try {
|
|
64
|
+
const args = [from];
|
|
65
|
+
if (to) {
|
|
66
|
+
args.push(to);
|
|
67
|
+
}
|
|
68
|
+
const diff = await git.diff(args);
|
|
69
|
+
return diff;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new Error(`Failed to get diff: ${error}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get list of files that changed between two commits
|
|
77
|
+
* @param from - Starting commit hash (default: HEAD)
|
|
78
|
+
* @param to - Ending commit hash (default: working tree)
|
|
79
|
+
* @param cwd - Working directory
|
|
80
|
+
*/
|
|
81
|
+
async function getChangedFiles(from = 'HEAD', to, cwd = process.cwd()) {
|
|
82
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
83
|
+
try {
|
|
84
|
+
const args = ['--name-only', from];
|
|
85
|
+
if (to) {
|
|
86
|
+
args.push(to);
|
|
87
|
+
}
|
|
88
|
+
const diff = await git.diff(args);
|
|
89
|
+
const files = diff
|
|
90
|
+
.split('\n')
|
|
91
|
+
.map(f => f.trim())
|
|
92
|
+
.filter(f => f.length > 0);
|
|
93
|
+
return files;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new Error(`Failed to get changed files: ${error}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if the working directory is clean (no uncommitted changes)
|
|
101
|
+
*/
|
|
102
|
+
async function isWorkingDirClean(cwd = process.cwd()) {
|
|
103
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
104
|
+
try {
|
|
105
|
+
const status = await git.status();
|
|
106
|
+
return status.isClean();
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new Error(`Failed to check working directory status: ${error}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get list of files with uncommitted changes (modified, added, deleted)
|
|
114
|
+
*/
|
|
115
|
+
async function getUncommittedFiles(cwd = process.cwd()) {
|
|
116
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
117
|
+
try {
|
|
118
|
+
const status = await git.status();
|
|
119
|
+
const files = [
|
|
120
|
+
...status.modified,
|
|
121
|
+
...status.created,
|
|
122
|
+
...status.deleted,
|
|
123
|
+
...status.renamed.map(r => r.to),
|
|
124
|
+
];
|
|
125
|
+
return files;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw new Error(`Failed to get uncommitted files: ${error}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get diff of uncommitted changes
|
|
133
|
+
*/
|
|
134
|
+
async function getUncommittedDiff(cwd = process.cwd()) {
|
|
135
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
136
|
+
try {
|
|
137
|
+
const diff = await git.diff();
|
|
138
|
+
return diff;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
throw new Error(`Failed to get uncommitted diff: ${error}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get short commit hash (7 characters)
|
|
146
|
+
*/
|
|
147
|
+
async function getShortHash(hash, cwd = process.cwd()) {
|
|
148
|
+
const git = (0, simple_git_1.default)(cwd);
|
|
149
|
+
try {
|
|
150
|
+
const shortHash = await git.revparse(['--short', hash]);
|
|
151
|
+
return shortHash.trim();
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return hash.substring(0, 7);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":";;;;;AAMA,kCAQC;AAKD,8BAQC;AAKD,kCAQC;AAQD,0BAgBC;AAQD,0CAoBC;AAKD,8CAQC;AAKD,kDAcC;AAKD,gDAQC;AAKD,oCAQC;AAtJD,4DAAkD;AAGlD;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,OAAO,CAC3B,OAAe,MAAM,EACrB,EAAW,EACX,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,eAAe,CACnC,OAAe,MAAM,EACrB,EAAW,EACX,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI;aACf,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG;YACZ,GAAG,MAAM,CAAC,QAAQ;YAClB,GAAG,MAAM,CAAC,OAAO;YACjB,GAAG,MAAM,CAAC,OAAO;YACjB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjC,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1E,MAAM,GAAG,GAAc,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const store_1 = require("./store");
|
|
9
|
+
const git_1 = require("./git");
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
12
|
+
const program = new commander_1.Command();
|
|
13
|
+
program
|
|
14
|
+
.name('promptvc')
|
|
15
|
+
.description('Version control for AI prompts - track, version, and visualize your AI-assisted coding sessions')
|
|
16
|
+
.version('0.1.0');
|
|
17
|
+
program
|
|
18
|
+
.command('init')
|
|
19
|
+
.description('Initialize PromptVC storage in the current git repository')
|
|
20
|
+
.action(async () => {
|
|
21
|
+
try {
|
|
22
|
+
const repoRoot = await (0, git_1.getRepoRoot)();
|
|
23
|
+
const result = (0, store_1.initRepoStorage)(repoRoot);
|
|
24
|
+
console.log(`Initialized PromptVC in ${result.promptvcDir}`);
|
|
25
|
+
console.log(`Sessions: ${result.sessionsFilePath}`);
|
|
26
|
+
console.log(`Settings: ${result.settingsFilePath}`);
|
|
27
|
+
console.log('');
|
|
28
|
+
console.log(kleur_1.default.blue('Run your coding ai. (codex, claude, gemini)'));
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log(kleur_1.default.green('Get the Prompt Version Control VSCode extension to enhance your experience!'));
|
|
31
|
+
console.log(kleur_1.default.blue('https://marketplace.visualstudio.com/items?itemName=your-extension-id'));
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(kleur_1.default.green('Findout more at https://promptvc.dev'));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Error:', error);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
program
|
|
41
|
+
.command('list')
|
|
42
|
+
.description('List recent prompt sessions')
|
|
43
|
+
.option('-n, --limit <number>', 'Number of sessions to show', '10')
|
|
44
|
+
.action(async (options) => {
|
|
45
|
+
try {
|
|
46
|
+
const repoRoot = await (0, git_1.getRepoRoot)();
|
|
47
|
+
(0, store_1.initDb)(repoRoot);
|
|
48
|
+
const limit = parseInt(options.limit, 10);
|
|
49
|
+
const sessions = (0, store_1.getSessions)(limit);
|
|
50
|
+
if (sessions.length === 0) {
|
|
51
|
+
console.log('No sessions found.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.log(`\nShowing ${sessions.length} most recent session(s):\n`);
|
|
55
|
+
sessions.forEach((session, index) => {
|
|
56
|
+
const date = new Date(session.createdAt).toLocaleString();
|
|
57
|
+
const promptPreview = session.prompt.substring(0, 50);
|
|
58
|
+
const filesCount = session.files.length;
|
|
59
|
+
console.log(`${index + 1}. [${session.provider}] ${promptPreview}${session.prompt.length > 50 ? '...' : ''}`);
|
|
60
|
+
console.log(` ID: ${session.id}`);
|
|
61
|
+
console.log(` Date: ${date}`);
|
|
62
|
+
console.log(` Branch: ${session.branch}`);
|
|
63
|
+
console.log(` Files: ${filesCount}`);
|
|
64
|
+
console.log(` Mode: ${session.mode}`);
|
|
65
|
+
console.log('');
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Error:', error);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
program
|
|
74
|
+
.command('show <session-id>')
|
|
75
|
+
.description('Show details of a specific session')
|
|
76
|
+
.action(async (sessionId) => {
|
|
77
|
+
try {
|
|
78
|
+
const repoRoot = await (0, git_1.getRepoRoot)();
|
|
79
|
+
(0, store_1.initDb)(repoRoot);
|
|
80
|
+
const session = (0, store_1.getSessionById)(sessionId);
|
|
81
|
+
if (!session) {
|
|
82
|
+
console.error(`Session not found: ${sessionId}`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
console.log('\n=== Prompt Session ===\n');
|
|
86
|
+
console.log(`ID: ${session.id}`);
|
|
87
|
+
console.log(`Provider: ${session.provider}`);
|
|
88
|
+
console.log(`Date: ${new Date(session.createdAt).toLocaleString()}`);
|
|
89
|
+
console.log(`Branch: ${session.branch}`);
|
|
90
|
+
console.log(`Mode: ${session.mode}`);
|
|
91
|
+
console.log(`\nPrompt:\n${session.prompt}`);
|
|
92
|
+
console.log(`\nResponse:\n${session.responseSnippet}`);
|
|
93
|
+
console.log(`\nFiles (${session.files.length}):`);
|
|
94
|
+
session.files.forEach((file) => console.log(` - ${file}`));
|
|
95
|
+
console.log(`\nDiff:\n${session.diff}`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('Error:', error);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
program
|
|
103
|
+
.command('config')
|
|
104
|
+
.description('Configure the Codex notify hook for PromptVC')
|
|
105
|
+
.action(() => {
|
|
106
|
+
(0, config_1.runConfigCommand)();
|
|
107
|
+
});
|
|
108
|
+
program.parse();
|
|
109
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"proxyCodex.d.ts","sourceRoot":"","sources":["../src/proxyCodex.ts"],"names":[],"mappings":"AAmIA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyJ1C"}
|