@spences10/pi-child-env 0.1.0 → 0.1.1

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 CHANGED
@@ -3,9 +3,9 @@
3
3
  Shared safe environment builder for Pi child processes.
4
4
 
5
5
  By default it passes only a minimal non-secret baseline (`PATH`,
6
- locale, terminal, temp, home/user, color, and `LC_*` vars). Secrets
7
- and provider credentials are not inherited unless explicitly
8
- allowlisted.
6
+ `PI_CODING_AGENT_DIR`, locale, terminal, temp, home/user, color, and
7
+ `LC_*` vars). Secrets and provider credentials are not inherited
8
+ unless explicitly allowlisted.
9
9
 
10
10
  ## Usage
11
11
 
package/dist/index.js CHANGED
@@ -1,6 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.create_child_process_env = create_child_process_env;
4
1
  const BASE_CHILD_ENV_KEYS = new Set([
5
2
  'CI',
6
3
  'COLORTERM',
@@ -10,6 +7,7 @@ const BASE_CHILD_ENV_KEYS = new Set([
10
7
  'LOGNAME',
11
8
  'NO_COLOR',
12
9
  'PATH',
10
+ 'PI_CODING_AGENT_DIR',
13
11
  'SHELL',
14
12
  'TEMP',
15
13
  'TERM',
@@ -24,7 +22,7 @@ const PROFILE_ENV_ALLOWLIST_KEYS = {
24
22
  hooks: 'MY_PI_HOOKS_ENV_ALLOWLIST',
25
23
  'team-mode': 'MY_PI_TEAM_MODE_ENV_ALLOWLIST',
26
24
  };
27
- function create_child_process_env(options = {}) {
25
+ export function create_child_process_env(options = {}) {
28
26
  const source_env = options.source_env ?? process.env;
29
27
  const env = {};
30
28
  const allowed_keys = new Set(BASE_CHILD_ENV_KEYS);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAoCA,4DA0CC;AApED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACnC,IAAI;IACJ,WAAW;IACX,aAAa;IACb,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;CACN,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAE7D,MAAM,0BAA0B,GAAoC;IACnE,GAAG,EAAE,yBAAyB;IAC9B,GAAG,EAAE,yBAAyB;IAC9B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EAAE,+BAA+B;CAC5C,CAAC;AAEF,SAAgB,wBAAwB,CACvC,UAAwC,EAAE;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IACrD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC;QACpD,IAAI,GAAG,CAAC,IAAI,EAAE;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,kBAAkB,GAAG;QAC1B,wBAAwB;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO;YAClB,CAAC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,wBAAwB,IAAI,EAAE,CAAC;KAC3C,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,kBAAkB,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,mBAAmB,CACpC,UAAU,CAAC,aAAa,CAAC,CACzB,EAAE,CAAC;YACH,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACxC,OAAO,CAAC,YAAY,IAAI,EAAE,CAC1B,EAAE,CAAC;QACH,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACnC,IAAI;IACJ,WAAW;IACX,aAAa;IACb,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,qBAAqB;IACrB,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;CACN,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAE7D,MAAM,0BAA0B,GAAoC;IACnE,GAAG,EAAE,yBAAyB;IAC9B,GAAG,EAAE,yBAAyB;IAC9B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EAAE,+BAA+B;CAC5C,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACvC,UAAwC,EAAE;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IACrD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC;QACpD,IAAI,GAAG,CAAC,IAAI,EAAE;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,kBAAkB,GAAG;QAC1B,wBAAwB;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO;YAClB,CAAC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,wBAAwB,IAAI,EAAE,CAAC;KAC3C,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,kBAAkB,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,mBAAmB,CACpC,UAAU,CAAC,aAAa,CAAC,CACzB,EAAE,CAAC;YACH,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACxC,OAAO,CAAC,YAAY,IAAI,EAAE,CAC1B,EAAE,CAAC;QACH,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spences10/pi-child-env",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Shared safe environment builder for Pi child processes",
5
5
  "keywords": [
6
6
  "env",
@@ -15,6 +15,11 @@
15
15
  "url": "git+https://github.com/scottspence/my-pi.git",
16
16
  "directory": "packages/pi-child-env"
17
17
  },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "type": "module",
18
23
  "main": "./dist/index.js",
19
24
  "types": "./dist/index.d.ts",
20
25
  "exports": {
package/CHANGELOG.md DELETED
@@ -1,8 +0,0 @@
1
- # @spences10/pi-child-env
2
-
3
- ## 0.1.0
4
-
5
- ### Minor Changes
6
-
7
- - 6a85bee: Add shared child-process environment helper and prevent
8
- team-mode teammates inheriting full parent env secrets.
package/src/index.test.ts DELETED
@@ -1,78 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { create_child_process_env } from './index.js';
3
-
4
- describe('create_child_process_env', () => {
5
- it('keeps baseline env and strips common secrets by default', () => {
6
- const env = create_child_process_env({
7
- source_env: {
8
- PATH: '/bin',
9
- HOME: '/home/test',
10
- LANG: 'en_GB.UTF-8',
11
- LC_ALL: 'en_GB.UTF-8',
12
- ANTHROPIC_API_KEY: 'secret',
13
- OPENAI_API_KEY: 'secret',
14
- AWS_SECRET_ACCESS_KEY: 'secret',
15
- DATABASE_URL: 'postgres://secret',
16
- },
17
- });
18
-
19
- expect(env).toMatchObject({
20
- PATH: '/bin',
21
- HOME: '/home/test',
22
- LANG: 'en_GB.UTF-8',
23
- LC_ALL: 'en_GB.UTF-8',
24
- });
25
- expect(env.ANTHROPIC_API_KEY).toBeUndefined();
26
- expect(env.OPENAI_API_KEY).toBeUndefined();
27
- expect(env.AWS_SECRET_ACCESS_KEY).toBeUndefined();
28
- expect(env.DATABASE_URL).toBeUndefined();
29
- });
30
-
31
- it('honors shared allowlist entries', () => {
32
- const env = create_child_process_env({
33
- source_env: {
34
- PATH: '/bin',
35
- AWS_PROFILE: 'dev',
36
- MY_PI_CHILD_ENV_ALLOWLIST: ' AWS_PROFILE, , ',
37
- },
38
- });
39
-
40
- expect(env.AWS_PROFILE).toBe('dev');
41
- });
42
-
43
- it('honors profile-specific allowlist entries', () => {
44
- const env = create_child_process_env({
45
- profile: 'team-mode',
46
- source_env: {
47
- PATH: '/bin',
48
- ANTHROPIC_API_KEY: 'secret',
49
- MY_PI_TEAM_MODE_ENV_ALLOWLIST: 'ANTHROPIC_API_KEY',
50
- },
51
- });
52
-
53
- expect(env.ANTHROPIC_API_KEY).toBe('secret');
54
- });
55
-
56
- it('supports explicit env overrides and custom allowlist env keys', () => {
57
- const env = create_child_process_env({
58
- explicit_env: {
59
- API_KEY: 'explicit',
60
- EMPTY: undefined,
61
- },
62
- extra_allowed_keys: ['CUSTOM_HOME'],
63
- extra_allowlist_env_keys: ['CUSTOM_ALLOWLIST'],
64
- source_env: {
65
- PATH: '/bin',
66
- CUSTOM_HOME: '/custom',
67
- EXTRA: 'value',
68
- API_KEY: 'ambient',
69
- CUSTOM_ALLOWLIST: 'EXTRA',
70
- },
71
- });
72
-
73
- expect(env.API_KEY).toBe('explicit');
74
- expect(env.EMPTY).toBeUndefined();
75
- expect(env.CUSTOM_HOME).toBe('/custom');
76
- expect(env.EXTRA).toBe('value');
77
- });
78
- });
package/src/index.ts DELETED
@@ -1,87 +0,0 @@
1
- export type ChildEnvProfile = 'mcp' | 'lsp' | 'hooks' | 'team-mode';
2
-
3
- export interface CreateChildProcessEnvOptions {
4
- profile?: ChildEnvProfile;
5
- explicit_env?: Record<string, string | undefined>;
6
- source_env?: NodeJS.ProcessEnv;
7
- extra_allowed_keys?: readonly string[];
8
- extra_allowlist_env_keys?: readonly string[];
9
- }
10
-
11
- const BASE_CHILD_ENV_KEYS = new Set([
12
- 'CI',
13
- 'COLORTERM',
14
- 'FORCE_COLOR',
15
- 'HOME',
16
- 'LANG',
17
- 'LOGNAME',
18
- 'NO_COLOR',
19
- 'PATH',
20
- 'SHELL',
21
- 'TEMP',
22
- 'TERM',
23
- 'TMP',
24
- 'TMPDIR',
25
- 'USER',
26
- ]);
27
-
28
- const SHARED_ENV_ALLOWLIST_KEY = 'MY_PI_CHILD_ENV_ALLOWLIST';
29
-
30
- const PROFILE_ENV_ALLOWLIST_KEYS: Record<ChildEnvProfile, string> = {
31
- mcp: 'MY_PI_MCP_ENV_ALLOWLIST',
32
- lsp: 'MY_PI_LSP_ENV_ALLOWLIST',
33
- hooks: 'MY_PI_HOOKS_ENV_ALLOWLIST',
34
- 'team-mode': 'MY_PI_TEAM_MODE_ENV_ALLOWLIST',
35
- };
36
-
37
- export function create_child_process_env(
38
- options: CreateChildProcessEnvOptions = {},
39
- ): NodeJS.ProcessEnv {
40
- const source_env = options.source_env ?? process.env;
41
- const env: NodeJS.ProcessEnv = {};
42
- const allowed_keys = new Set(BASE_CHILD_ENV_KEYS);
43
-
44
- for (const key of Object.keys(source_env)) {
45
- if (key.startsWith('LC_')) allowed_keys.add(key);
46
- }
47
-
48
- for (const key of options.extra_allowed_keys ?? []) {
49
- if (key.trim()) allowed_keys.add(key.trim());
50
- }
51
-
52
- const allowlist_env_keys = [
53
- SHARED_ENV_ALLOWLIST_KEY,
54
- ...(options.profile
55
- ? [PROFILE_ENV_ALLOWLIST_KEYS[options.profile]]
56
- : []),
57
- ...(options.extra_allowlist_env_keys ?? []),
58
- ];
59
- for (const allowlist_key of allowlist_env_keys) {
60
- for (const key of parse_env_allowlist(
61
- source_env[allowlist_key],
62
- )) {
63
- allowed_keys.add(key);
64
- }
65
- }
66
-
67
- for (const key of allowed_keys) {
68
- const value = source_env[key];
69
- if (typeof value === 'string') env[key] = value;
70
- }
71
-
72
- for (const [key, value] of Object.entries(
73
- options.explicit_env ?? {},
74
- )) {
75
- if (typeof value === 'string') env[key] = value;
76
- }
77
-
78
- return env;
79
- }
80
-
81
- function parse_env_allowlist(value: string | undefined): string[] {
82
- if (!value) return [];
83
- return value
84
- .split(',')
85
- .map((key) => key.trim())
86
- .filter(Boolean);
87
- }
@@ -1,11 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "outDir": "./dist",
6
- "declaration": true,
7
- "sourceMap": true
8
- },
9
- "include": ["src/**/*.ts"],
10
- "exclude": ["src/**/*.test.ts", "node_modules", "dist"]
11
- }
package/tsconfig.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "nodenext",
5
- "moduleResolution": "nodenext",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "allowSyntheticDefaultImports": true,
9
- "skipLibCheck": true,
10
- "types": ["node", "vitest/globals"]
11
- },
12
- "include": ["src/**/*"],
13
- "exclude": ["node_modules"]
14
- }