@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 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;
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinta-ai/pinta-cc",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "description": "Generic OTLP forwarder for Claude Code hook events",
5
5
  "main": "dist/index.js",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",