pi-crew 0.6.0 → 0.6.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +13 -11
  3. package/package.json +1 -1
  4. package/src/agents/agent-config.ts +2 -1
  5. package/src/benchmark/feedback-loop.ts +4 -2
  6. package/src/extension/cross-extension-rpc.ts +48 -0
  7. package/src/extension/registration/commands.ts +2 -1
  8. package/src/extension/registration/subagent-tools.ts +2 -0
  9. package/src/extension/registration/team-tool.ts +2 -0
  10. package/src/extension/registration/viewers.ts +1 -0
  11. package/src/extension/run-export.ts +16 -1
  12. package/src/extension/run-import.ts +16 -0
  13. package/src/extension/team-tool/anchor.ts +5 -1
  14. package/src/extension/team-tool/api.ts +9 -4
  15. package/src/extension/team-tool/config-patch.ts +15 -1
  16. package/src/extension/team-tool.ts +2 -1
  17. package/src/hooks/registry.ts +9 -1
  18. package/src/hooks/types.ts +3 -3
  19. package/src/i18n.ts +15 -2
  20. package/src/observability/exporters/otlp-exporter.ts +73 -0
  21. package/src/runtime/adaptive-plan.ts +24 -0
  22. package/src/runtime/agent-control.ts +6 -3
  23. package/src/runtime/async-runner.ts +58 -3
  24. package/src/runtime/background-runner.ts +1 -1
  25. package/src/runtime/chain-runner.ts +58 -0
  26. package/src/runtime/child-pi.ts +1 -1
  27. package/src/runtime/crew-agent-records.ts +4 -3
  28. package/src/runtime/cross-extension-rpc.ts +34 -8
  29. package/src/runtime/diagnostic-export.ts +3 -4
  30. package/src/runtime/dynamic-script-runner.ts +7 -7
  31. package/src/runtime/foreground-watchdog.ts +2 -2
  32. package/src/runtime/live-agent-manager.ts +6 -3
  33. package/src/runtime/live-irc.ts +4 -2
  34. package/src/runtime/parallel-utils.ts +2 -1
  35. package/src/runtime/post-checks.ts +10 -3
  36. package/src/runtime/{drift-detectors.ts → run-drift.ts} +1 -1
  37. package/src/runtime/sandbox.ts +26 -20
  38. package/src/runtime/semaphore.ts +2 -1
  39. package/src/runtime/settings-store.ts +14 -2
  40. package/src/runtime/skill-effectiveness.ts +4 -2
  41. package/src/runtime/skill-instructions.ts +4 -1
  42. package/src/runtime/subagent-manager.ts +20 -2
  43. package/src/runtime/subprocess-tool-registry.ts +2 -2
  44. package/src/runtime/task-packet.ts +13 -1
  45. package/src/runtime/task-runner.ts +9 -0
  46. package/src/runtime/usage-tracker.ts +4 -2
  47. package/src/runtime/verification-gates.ts +36 -9
  48. package/src/state/contracts.ts +2 -1
  49. package/src/state/event-log.ts +16 -5
  50. package/src/state/hook-instinct-bridge.ts +2 -1
  51. package/src/state/locks.ts +9 -2
  52. package/src/state/state-store.ts +4 -2
  53. package/src/state/task-claims.ts +9 -2
  54. package/src/tools/safe-bash.ts +69 -20
  55. package/src/types/new-api-types.ts +10 -5
  56. package/src/ui/keybinding-map.ts +2 -1
  57. package/src/ui/run-action-dispatcher.ts +2 -1
  58. package/src/ui/status-colors.ts +2 -1
  59. package/src/ui/syntax-highlight.ts +2 -1
  60. package/src/ui/tool-render.ts +13 -3
  61. package/src/utils/fs-watch.ts +4 -2
  62. package/src/utils/gh-protocol.ts +2 -1
  63. package/src/utils/safe-paths.ts +6 -0
  64. package/src/worktree/cleanup.ts +8 -5
  65. package/src/worktree/worktree-manager.ts +1 -1
@@ -5,6 +5,7 @@ import type { TeamRunManifest } from "../state/types.ts";
5
5
  import { writeArtifact } from "../state/artifact-store.ts";
6
6
  import { projectCrewRoot } from "../utils/paths.ts";
7
7
  import { DEFAULT_PATHS } from "../config/defaults.ts";
8
+ import { sanitizeEnvSecrets } from "../utils/env-filter.ts";
8
9
 
9
10
  export interface WorktreeCleanupResult {
10
11
  removed: string[];
@@ -14,8 +15,10 @@ export interface WorktreeCleanupResult {
14
15
  committedBranches: string[];
15
16
  }
16
17
 
18
+ const GIT_SAFE_ENV = { ...sanitizeEnvSecrets(process.env, { allowList: ["PATH", "HOME", "USER", "USERPROFILE", "SHELL", "TERM", "LANG", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MESSAGES", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME", "NVM_BIN", "NVM_DIR", "NODE_PATH", "GIT_CONFIG_GLOBAL", "GIT_CONFIG_SYSTEM", "GIT_AUTHOR_NAME", "GIT_AUTHOR_EMAIL", "GIT_COMMITTER_NAME", "GIT_COMMITTER_EMAIL", "PI_*", "PI_CREW_*"] }), LANG: "C", LC_ALL: "C" };
19
+
17
20
  function git(cwd: string, args: string[]): string {
18
- return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true }).trim();
21
+ return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: GIT_SAFE_ENV, windowsHide: true }).trim();
19
22
  }
20
23
 
21
24
  function isDirty(worktreePath: string): boolean {
@@ -58,21 +61,21 @@ export function cleanupRunWorktrees(manifest: TeamRunManifest, options: { force?
58
61
  if (dirty) {
59
62
  // Commit changes to a branch instead of just preserving the worktree
60
63
  try {
61
- execFileSync("git", ["add", "-A"], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true });
64
+ execFileSync("git", ["add", "-A"], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: GIT_SAFE_ENV, windowsHide: true });
62
65
  let safeDesc = entry.name.slice(0, 200);
63
66
  // SECURITY: Strip any newlines that could be injected via a malicious worktree name
64
67
  // to prevent newline injection in git commit messages
65
68
  if (safeDesc.includes("\n")) {
66
69
  safeDesc = safeDesc.replace(/[\r\n]+/g, " ");
67
70
  }
68
- execFileSync("git", ["commit", "-m", `pi-crew: ${safeDesc}`], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true });
71
+ execFileSync("git", ["commit", "-m", `pi-crew: ${safeDesc}`], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: GIT_SAFE_ENV, windowsHide: true });
69
72
  // Create branch in the main repo pointing to this worktree's HEAD
70
73
  try {
71
- execFileSync("git", ["branch", branchName], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true });
74
+ execFileSync("git", ["branch", branchName], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: GIT_SAFE_ENV, windowsHide: true });
72
75
  } catch {
73
76
  // Branch already exists — use timestamp suffix
74
77
  const tsBranch = `${branchName}-${Date.now()}`;
75
- execFileSync("git", ["branch", tsBranch], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true });
78
+ execFileSync("git", ["branch", tsBranch], { cwd: worktreePath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: GIT_SAFE_ENV, windowsHide: true });
76
79
  }
77
80
  result.committedBranches.push(branchName);
78
81
  // Remove the worktree (branch persists)
@@ -25,7 +25,7 @@ export interface WorktreeDiffStat {
25
25
  }
26
26
 
27
27
  function git(cwd: string, args: string[]): string {
28
- return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, LANG: "C", LC_ALL: "C" }, windowsHide: true }).trim();
28
+ return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: { ...sanitizeEnvSecrets(process.env, { allowList: ["PATH", "HOME", "USER", "USERPROFILE", "SHELL", "TERM", "LANG", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MESSAGES", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME", "NVM_BIN", "NVM_DIR", "NODE_PATH", "GIT_CONFIG_GLOBAL", "GIT_CONFIG_SYSTEM", "GIT_AUTHOR_NAME", "GIT_AUTHOR_EMAIL", "GIT_COMMITTER_NAME", "GIT_COMMITTER_EMAIL", "PI_*", "PI_CREW_*"] }), LANG: "C", LC_ALL: "C" }, windowsHide: true }).trim();
29
29
  }
30
30
 
31
31
  function sanitizeBranchPart(value: string): string {