@jjlabsio/claude-crew 0.1.47 → 0.1.48

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.
@@ -11,7 +11,7 @@
11
11
  "name": "claude-crew",
12
12
  "source": "./",
13
13
  "description": "오케스트레이터 + PM, 플래너, 개발, QA, 마케팅 에이전트 팀으로 단일 제품의 개발과 마케팅을 통합 관리",
14
- "version": "0.1.47",
14
+ "version": "0.1.48",
15
15
  "author": {
16
16
  "name": "Jaejin Song",
17
17
  "email": "wowlxx28@gmail.com"
@@ -28,5 +28,5 @@
28
28
  "category": "workflow"
29
29
  }
30
30
  ],
31
- "version": "0.1.47"
31
+ "version": "0.1.48"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-crew",
3
- "version": "0.1.47",
3
+ "version": "0.1.48",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": {
6
6
  "name": "Jaejin Song",
@@ -44,7 +44,7 @@
44
44
  "explorer": { "codex_sandbox": "read-only" },
45
45
  "researcher": { "codex_sandbox": "read-only" },
46
46
  "qa": { "codex_sandbox": "read-only" },
47
- "dev": { "codex_sandbox": "workspace-write" },
47
+ "dev": { "codex_sandbox": "workspace-write", "codex_network_access": true },
48
48
  "code-reviewer": { "codex_sandbox": "read-only" }
49
49
  }
50
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlabsio/claude-crew",
3
- "version": "0.1.47",
3
+ "version": "0.1.48",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": "Jaejin Song <wowlxx28@gmail.com>",
6
6
  "license": "MIT",
@@ -56,7 +56,7 @@ function cleanCodexStderr(stderr) {
56
56
 
57
57
  /** @returns {ThreadStartParams} */
58
58
  function buildThreadParams(cwd, options = {}) {
59
- return {
59
+ const params = {
60
60
  cwd,
61
61
  model: options.model ?? null,
62
62
  approvalPolicy: options.approvalPolicy ?? "never",
@@ -65,17 +65,25 @@ function buildThreadParams(cwd, options = {}) {
65
65
  ephemeral: options.ephemeral ?? true,
66
66
  experimentalRawEvents: false
67
67
  };
68
+ if (options.networkAccess) {
69
+ params.networkAccess = true;
70
+ }
71
+ return params;
68
72
  }
69
73
 
70
74
  /** @returns {ThreadResumeParams} */
71
75
  function buildResumeParams(threadId, cwd, options = {}) {
72
- return {
76
+ const params = {
73
77
  threadId,
74
78
  cwd,
75
79
  model: options.model ?? null,
76
80
  approvalPolicy: options.approvalPolicy ?? "never",
77
81
  sandbox: options.sandbox ?? "read-only"
78
82
  };
83
+ if (options.networkAccess) {
84
+ params.networkAccess = true;
85
+ }
86
+ return params;
79
87
  }
80
88
 
81
89
  /** @returns {UserInput[]} */
@@ -977,6 +985,7 @@ export async function runAppServerTurn(cwd, options = {}) {
977
985
  const response = await resumeThread(client, options.resumeThreadId, cwd, {
978
986
  model: options.model,
979
987
  sandbox: options.sandbox,
988
+ networkAccess: options.networkAccess,
980
989
  ephemeral: false
981
990
  });
982
991
  threadId = response.thread.id;
@@ -985,6 +994,7 @@ export async function runAppServerTurn(cwd, options = {}) {
985
994
  const response = await startThread(client, cwd, {
986
995
  model: options.model,
987
996
  sandbox: options.sandbox,
997
+ networkAccess: options.networkAccess,
988
998
  ephemeral: options.persistThread ? false : true,
989
999
  threadName: options.persistThread ? options.threadName : options.threadName ?? null
990
1000
  });
@@ -73,7 +73,7 @@ function printUsage() {
73
73
  console.log(
74
74
  [
75
75
  "Usage:",
76
- " node scripts/crew-codex-companion.mjs task [--background] [--write] [--expect-crew-result] [--resume-last|--resume|--fresh] [--model <model|spark>] [--effort <none|minimal|low|medium|high|xhigh>] [prompt]",
76
+ " node scripts/crew-codex-companion.mjs task [--background] [--write] [--network-access] [--expect-crew-result] [--resume-last|--resume|--fresh] [--model <model|spark>] [--effort <none|minimal|low|medium|high|xhigh>] [prompt]",
77
77
  " node scripts/crew-codex-companion.mjs status [job-id] [--all] [--json]",
78
78
  " node scripts/crew-codex-companion.mjs result [job-id] [--json]",
79
79
  " node scripts/crew-codex-companion.mjs cancel [job-id] [--json]"
@@ -341,6 +341,7 @@ async function executeTaskRun(request) {
341
341
  model: request.model,
342
342
  effort: request.effort,
343
343
  sandbox: request.write ? "workspace-write" : "read-only",
344
+ networkAccess: Boolean(request.networkAccess),
344
345
  onProgress: request.onProgress,
345
346
  persistThread: true,
346
347
  threadName: resumeThreadId ? null : buildPersistentTaskThreadName(request.prompt || DEFAULT_CONTINUE_PROMPT)
@@ -455,13 +456,14 @@ function buildTaskJob(workspaceRoot, taskMetadata, write) {
455
456
  });
456
457
  }
457
458
 
458
- function buildTaskRequest({ cwd, model, effort, prompt, write, resumeLast, expectCrewResult, jobId }) {
459
+ function buildTaskRequest({ cwd, model, effort, prompt, write, networkAccess, resumeLast, expectCrewResult, jobId }) {
459
460
  return {
460
461
  cwd,
461
462
  model,
462
463
  effort,
463
464
  prompt,
464
465
  write,
466
+ networkAccess,
465
467
  resumeLast,
466
468
  expectCrewResult,
467
469
  jobId
@@ -591,7 +593,7 @@ function enqueueBackgroundTask(cwd, job, request) {
591
593
  async function handleTask(argv) {
592
594
  const { options, positionals } = parseCommandInput(argv, {
593
595
  valueOptions: ["model", "effort", "cwd", "prompt-file"],
594
- booleanOptions: ["json", "write", "expect-crew-result", "resume-last", "resume", "fresh", "background"],
596
+ booleanOptions: ["json", "write", "network-access", "expect-crew-result", "resume-last", "resume", "fresh", "background"],
595
597
  aliasMap: {
596
598
  m: "model"
597
599
  }
@@ -609,6 +611,7 @@ async function handleTask(argv) {
609
611
  throw new Error("Choose either --resume/--resume-last or --fresh.");
610
612
  }
611
613
  const write = Boolean(options.write);
614
+ const networkAccess = Boolean(options["network-access"]);
612
615
  const expectCrewResult = Boolean(options["expect-crew-result"]);
613
616
  const taskMetadata = buildTaskRunMetadata({
614
617
  prompt,
@@ -626,6 +629,7 @@ async function handleTask(argv) {
626
629
  effort,
627
630
  prompt,
628
631
  write,
632
+ networkAccess,
629
633
  resumeLast,
630
634
  expectCrewResult,
631
635
  jobId: job.id
@@ -645,6 +649,7 @@ async function handleTask(argv) {
645
649
  effort,
646
650
  prompt,
647
651
  write,
652
+ networkAccess,
648
653
  resumeLast,
649
654
  expectCrewResult,
650
655
  jobId: job.id,
@@ -264,6 +264,10 @@ function buildTaskArgs(input, promptFile) {
264
264
  args.push("--write");
265
265
  }
266
266
 
267
+ if (input.resolved?.codex_network_access) {
268
+ args.push("--network-access");
269
+ }
270
+
267
271
  if (input.resolved?.model) {
268
272
  args.push("--model", input.resolved.model);
269
273
  }
@@ -23,6 +23,7 @@ export function resolveRole(input) {
23
23
  if (!["read-only", "workspace-write"].includes(codexSandbox)) {
24
24
  throw new Error(`Missing codex_sandbox for role ${role}`);
25
25
  }
26
+ const codexNetworkAccess = catalog?.agent_runtime?.[role]?.codex_network_access === true;
26
27
 
27
28
  const warnings = [];
28
29
  const workspaceAccess = contract?.capabilities?.workspaceAccess;
@@ -38,6 +39,7 @@ export function resolveRole(input) {
38
39
  model,
39
40
  reasoning: provider === "codex" ? defaults.reasoning ?? null : null,
40
41
  codex_sandbox: codexSandbox,
42
+ codex_network_access: codexNetworkAccess,
41
43
  contract,
42
44
  dispatch: {
43
45
  path: provider === "codex" ? "codex" : "claude",