@pinta-ai/pinta-cc 1.2.2 → 1.3.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/CHANGELOG.md +31 -0
- package/dist/env-file.d.ts +9 -0
- package/dist/env-file.js +85 -0
- package/dist/env-file.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to pinta-cc are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.3.0] - 2026-05-26
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- `src/env-file.ts` — graceful loader for `~/.claude/pinta-cc.env`. The adaptor
|
|
10
|
+
now reads `KEY=VALUE` pairs from that file at startup and merges any
|
|
11
|
+
unset keys into `process.env`. Existing values (shell-exported by the
|
|
12
|
+
user, or injected by an older Pinta Manager's shell prefix) are
|
|
13
|
+
preserved — `process.env[k] ??= envFile[k]`.
|
|
14
|
+
- `tests/env-file.test.ts` — covers file-exists, file-missing (silent
|
|
15
|
+
no-op), comment/blank lines, no-overwrite of existing keys, and
|
|
16
|
+
malformed-line tolerance.
|
|
17
|
+
|
|
18
|
+
### Migration
|
|
19
|
+
|
|
20
|
+
This is a forward-compatible release. The new loader is paired with Pinta
|
|
21
|
+
Manager v0.1.6, which writes `~/.claude/pinta-cc.env` instead of
|
|
22
|
+
prefixing the hook `command` with a POSIX shell env assignment
|
|
23
|
+
(`KEY='val' node ...`). The shell-prefix form is broken on native
|
|
24
|
+
Windows shells (cmd.exe / PowerShell); switching to an env file removes
|
|
25
|
+
the shell dependency.
|
|
26
|
+
|
|
27
|
+
- New adaptor (1.3.0) + new manager (v0.1.6+): env file is read, hook
|
|
28
|
+
command is plain `node <plugin-root>/dist/index.js`.
|
|
29
|
+
- New adaptor (1.3.0) + old manager (v0.1.5): env file is missing,
|
|
30
|
+
loader silently no-ops, and the shell prefix's already-injected
|
|
31
|
+
`process.env` values flow through unchanged.
|
|
32
|
+
|
|
33
|
+
See `docs/features/v0.1.6/cc-env-file.md` in pinta-manager for the
|
|
34
|
+
catalog-first rollout plan that this release enables.
|
|
35
|
+
|
|
5
36
|
## [1.2.0] - 2026-04-29 (BREAKING)
|
|
6
37
|
|
|
7
38
|
### BREAKING CHANGES
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function envFilePath(): string;
|
|
2
|
+
export declare function parseEnvFile(content: string): Record<string, string>;
|
|
3
|
+
/**
|
|
4
|
+
* Load `~/.claude/pinta-cc.env` (if it exists) and merge any missing keys into
|
|
5
|
+
* `process.env`. Returns silently on missing file or any read/parse error —
|
|
6
|
+
* this is startup-time best-effort, and the adaptor must keep working against
|
|
7
|
+
* a v0.1.5 manager that still uses the shell-prefix path.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadEnvFile(filePath?: string): void;
|
package/dist/env-file.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
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.envFilePath = envFilePath;
|
|
7
|
+
exports.parseEnvFile = parseEnvFile;
|
|
8
|
+
exports.loadEnvFile = loadEnvFile;
|
|
9
|
+
/**
|
|
10
|
+
* Graceful env-file loader.
|
|
11
|
+
*
|
|
12
|
+
* Pinta Manager v0.1.6+ writes `~/.claude/pinta-cc.env` (KEY=VALUE per line)
|
|
13
|
+
* instead of prefixing the hook command with a POSIX shell env prefix
|
|
14
|
+
* (`KEY='val' node ...`). The shell-prefix form is broken on native
|
|
15
|
+
* Windows shells (cmd.exe / PowerShell). See
|
|
16
|
+
* `docs/features/v0.1.6/cc-env-file.md` in pinta-manager for the migration
|
|
17
|
+
* story.
|
|
18
|
+
*
|
|
19
|
+
* Behavior:
|
|
20
|
+
* - If `~/.claude/pinta-cc.env` exists, parse it and merge into `process.env`,
|
|
21
|
+
* but only for keys that are NOT already set. This preserves any value the
|
|
22
|
+
* user explicitly exported in their shell, and also keeps the v0.1.5
|
|
23
|
+
* manager's shell-prefix values intact (since those reach us as already-set
|
|
24
|
+
* `process.env` keys).
|
|
25
|
+
* - If the file is missing (old manager + new adaptor migration window), this
|
|
26
|
+
* is a silent no-op — `process.env` is left untouched and the rest of the
|
|
27
|
+
* adaptor continues to read what the shell prefix (if any) provided.
|
|
28
|
+
*
|
|
29
|
+
* Parser format (matches sidecar/src/enroll/codex-plugin.ts `parseEnvFile`):
|
|
30
|
+
* - `KEY=VALUE` per line
|
|
31
|
+
* - Blank lines and lines starting with `#` are ignored
|
|
32
|
+
* - Lines without `=` are skipped (no throw)
|
|
33
|
+
* - Surrounding single/double quotes on the value are stripped
|
|
34
|
+
* - No escape handling — manager guarantees tokens don't contain `=` or newline
|
|
35
|
+
*/
|
|
36
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
37
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
38
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
39
|
+
function envFilePath() {
|
|
40
|
+
return node_path_1.default.join(node_os_1.default.homedir(), ".claude", "pinta-cc.env");
|
|
41
|
+
}
|
|
42
|
+
function parseEnvFile(content) {
|
|
43
|
+
const out = {};
|
|
44
|
+
for (const raw of content.split("\n")) {
|
|
45
|
+
const line = raw.trim();
|
|
46
|
+
if (!line || line.startsWith("#"))
|
|
47
|
+
continue;
|
|
48
|
+
const idx = line.indexOf("=");
|
|
49
|
+
if (idx < 0)
|
|
50
|
+
continue;
|
|
51
|
+
const key = line.slice(0, idx).trim();
|
|
52
|
+
let value = line.slice(idx + 1).trim();
|
|
53
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
54
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
55
|
+
value = value.slice(1, -1);
|
|
56
|
+
}
|
|
57
|
+
if (key)
|
|
58
|
+
out[key] = value;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Load `~/.claude/pinta-cc.env` (if it exists) and merge any missing keys into
|
|
64
|
+
* `process.env`. Returns silently on missing file or any read/parse error —
|
|
65
|
+
* this is startup-time best-effort, and the adaptor must keep working against
|
|
66
|
+
* a v0.1.5 manager that still uses the shell-prefix path.
|
|
67
|
+
*/
|
|
68
|
+
function loadEnvFile(filePath = envFilePath()) {
|
|
69
|
+
let content;
|
|
70
|
+
try {
|
|
71
|
+
content = node_fs_1.default.readFileSync(filePath, "utf-8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// File missing (ENOENT) or unreadable — silent no-op so the adaptor keeps
|
|
75
|
+
// working against an older manager that injected env via shell prefix.
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const parsed = parseEnvFile(content);
|
|
79
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
80
|
+
if (process.env[key] === undefined) {
|
|
81
|
+
process.env[key] = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=env-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file.js","sourceRoot":"","sources":["../src/env-file.ts"],"names":[],"mappings":";;;;;AA+BA,kCAEC;AAED,oCAkBC;AAQD,kCAeC;AA5ED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAE7B,SAAgB,WAAW;IACzB,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,WAAmB,WAAW,EAAE;IAC1D,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,uEAAuE;QACvE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Load ~/.claude/pinta-cc.env BEFORE any other import that may read process.env.
|
|
4
|
+
// Manager v0.1.6+ writes the env file; v0.1.5 (shell-prefix) still works because
|
|
5
|
+
// loadEnvFile only fills in unset keys. See src/env-file.ts for the migration
|
|
6
|
+
// rationale.
|
|
7
|
+
const env_file_js_1 = require("./env-file.js");
|
|
8
|
+
(0, env_file_js_1.loadEnvFile)();
|
|
3
9
|
const env_bridge_js_1 = require("./core/env-bridge.js");
|
|
4
10
|
const config_js_1 = require("./core/config.js");
|
|
5
11
|
const types_js_1 = require("./core/types.js");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,wDAAiE;AACjE,gDAA8C;AAC9C,8CASyB;AAEzB,gEAA8D;AAC9D,kEAAgE;AAChE,8DAA6D;AAC7D,sDAAsD;AACtD,wDAAwD;AACxD,gDAAgD;AAChD,4DAA4D;AAC5D,sDAAsD;AAEtD,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,qFAAqF;IACrF,0DAA0D;IAC1D,IAAA,yCAAyB,GAAE,CAAC;IAE5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,IAAA,4BAAiB,EAAC,KAAK,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,IAAA,kCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAA,6BAAkB,EAAC,KAAK,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,MAAM,IAAA,oCAAiB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAA,kCAAuB,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,MAAM,IAAA,iCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAA,yBAAc,EAAC,KAAK,CAAC,EAAE,CAAC;YACjC,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAA,0BAAe,EAAC,KAAK,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,MAAM,IAAA,4BAAc,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAA,sBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,MAAM,IAAA,oBAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAA,4BAAiB,EAAC,KAAK,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,IAAA,gCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;QACnD,QAAQ,GAAG,CAAC,CAAC,CAAC,kDAAkD;IAClE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,iFAAiF;AACjF,iFAAiF;AACjF,8EAA8E;AAC9E,aAAa;AACb,+CAA4C;AAC5C,IAAA,yBAAW,GAAE,CAAC;AAEd,wDAAiE;AACjE,gDAA8C;AAC9C,8CASyB;AAEzB,gEAA8D;AAC9D,kEAAgE;AAChE,8DAA6D;AAC7D,sDAAsD;AACtD,wDAAwD;AACxD,gDAAgD;AAChD,4DAA4D;AAC5D,sDAAsD;AAEtD,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,qFAAqF;IACrF,0DAA0D;IAC1D,IAAA,yCAAyB,GAAE,CAAC;IAE5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,IAAA,4BAAiB,EAAC,KAAK,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,IAAA,kCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAA,6BAAkB,EAAC,KAAK,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,MAAM,IAAA,oCAAiB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAA,kCAAuB,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,MAAM,IAAA,iCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAA,yBAAc,EAAC,KAAK,CAAC,EAAE,CAAC;YACjC,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAA,0BAAe,EAAC,KAAK,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,MAAM,IAAA,4BAAc,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAA,sBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,MAAM,IAAA,oBAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAA,4BAAiB,EAAC,KAAK,CAAC,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,IAAA,gCAAgB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,IAAA,0BAAa,EAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;QACnD,QAAQ,GAAG,CAAC,CAAC,CAAC,kDAAkD;IAClE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC"}
|