nccgs 2.1.0 → 2.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.
Files changed (76) hide show
  1. package/.claude/agents/nccgs-adversarial-reviewer.md +1 -1
  2. package/.claude/agents/nccgs-engine-programmer.md +1 -1
  3. package/.claude/agents/nccgs-fast-implementer.md +1 -1
  4. package/.claude/agents/nccgs-game-designer.md +1 -1
  5. package/.claude/agents/nccgs-gameplay-programmer.md +1 -1
  6. package/.claude/agents/nccgs-qa-engineer.md +1 -1
  7. package/.claude/agents/nccgs-task-scout.md +1 -1
  8. package/.claude/agents/nccgs-ui-programmer.md +1 -1
  9. package/.claude/agents/nccgs-unity-build-specialist.md +1 -1
  10. package/.claude/agents/nccgs-unity-implementer.md +1 -1
  11. package/.claude/agents/nccgs-unity-systems-specialist.md +1 -1
  12. package/.claude/agents/nccgs-unity-ui-specialist.md +1 -1
  13. package/.claude/agents/nccgs-verification-engineer.md +1 -1
  14. package/.claude/nccgs/MEMORY.md +3 -1
  15. package/.claude/nccgs/VERSION +1 -1
  16. package/.claude/nccgs/constitution.md +187 -176
  17. package/.claude/nccgs/hooks/closure-guard.mjs +2 -0
  18. package/.claude/nccgs/hooks/unity-transport-guard.mjs +11 -0
  19. package/.claude/nccgs/pipeline.json +260 -260
  20. package/.claude/nccgs/protocols/context-packets.md +5 -0
  21. package/.claude/nccgs/protocols/model-routing.md +46 -46
  22. package/.claude/nccgs/protocols/review-handoff.md +21 -1
  23. package/.claude/nccgs/protocols/shared-workflow-context.md +33 -0
  24. package/.claude/nccgs/protocols/unity-boundary.md +20 -0
  25. package/.claude/nccgs/routing.generated.md +4 -4
  26. package/.claude/nccgs/settings.fragment.json +84 -24
  27. package/.claude/nccgs/studio.json +53 -53
  28. package/.claude/nccgs/tools/autonomy.mjs +13 -0
  29. package/.claude/nccgs/tools/command-tokens.mjs +22 -0
  30. package/.claude/nccgs/tools/hook-transport.mjs +34 -0
  31. package/.claude/nccgs/tools/native-completion.mjs +10 -1
  32. package/.claude/nccgs/tools/returned-handoff.mjs +11 -2
  33. package/.claude/nccgs/tools/shared-context-guard.mjs +60 -0
  34. package/.claude/nccgs/tools/shared-context.mjs +25 -0
  35. package/.claude/nccgs/tools/tool-guard.mjs +120 -131
  36. package/.claude/nccgs/tools/unity-transport.mjs +170 -0
  37. package/.claude/nccgs/workflow-catalog.json +4 -4
  38. package/CHANGELOG.md +235 -200
  39. package/CLAUDE.md +10 -8
  40. package/MEMORY.md +109 -60
  41. package/README.md +206 -191
  42. package/UPGRADING.md +130 -118
  43. package/VERSION +1 -1
  44. package/docs/ARCHITECTURE.md +131 -131
  45. package/docs/ASSET-PRODUCTION-GRAPHIFY-PLAN.md +230 -0
  46. package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +117 -116
  47. package/docs/NCCGS-1.5.md +237 -237
  48. package/docs/PROJECT-POLICY.md +94 -94
  49. package/docs/RELEASE-STATUS.md +17 -9
  50. package/docs/UNINSTALL.md +3 -3
  51. package/docs/WFK17-HOOK-REPAIR.md +71 -0
  52. package/docs/WORKFLOWS.md +85 -85
  53. package/package.json +1 -1
  54. package/scaffold/.nccgs/project.yaml +109 -108
  55. package/scripts/benchmark-v15.mjs +173 -173
  56. package/scripts/doctor.mjs +261 -261
  57. package/scripts/install.mjs +530 -529
  58. package/scripts/run.mjs +5 -4
  59. package/scripts/supervise.mjs +4 -0
  60. package/scripts/uninstall.mjs +292 -292
  61. package/scripts/validate.mjs +285 -280
  62. package/tests/autonomy.test.mjs +126 -113
  63. package/tests/design-readiness.test.mjs +199 -199
  64. package/tests/fixtures/compiler-shutdown.cs +67 -64
  65. package/tests/fixtures/native-provider.mjs +61 -0
  66. package/tests/framework.test.mjs +740 -740
  67. package/tests/hook-repair.test.mjs +106 -0
  68. package/tests/lifecycle-v15.test.mjs +346 -300
  69. package/tests/native-completion-notices.test.mjs +181 -0
  70. package/tests/phase1.test.mjs +427 -416
  71. package/tests/phase2.test.mjs +250 -250
  72. package/tests/policy-v15.test.mjs +234 -234
  73. package/tests/returned-handoff-notices.test.mjs +170 -0
  74. package/tests/runtime-v15.test.mjs +1197 -1191
  75. package/tests/task-slices.test.mjs +285 -285
  76. package/tests/unity-transport.test.mjs +348 -0
package/scripts/run.mjs CHANGED
@@ -1,10 +1,11 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { spawn } from "node:child_process";
4
- import { autonomyPolicy } from "../.claude/nccgs/tools/autonomy.mjs";
4
+ import { autonomyPolicy, conflictingLaunchOption, permissionModeArgs } from "../.claude/nccgs/tools/autonomy.mjs";
5
5
  import { containedPath } from "../.claude/nccgs/tools/paths.mjs";
6
6
  import { supervise } from "./supervise.mjs";
7
7
  import { acquireInstallationLease, assertInstallationAvailable } from "../.claude/nccgs/tools/installation-guard.mjs";
8
+ import { unityCliMcpArgs, assertStrictUnityCliArgs } from "../.claude/nccgs/tools/unity-transport.mjs";
8
9
 
9
10
  // No shell construction, restrictive tool allowlist, or model override.
10
11
  export function launchPlan(argv, env = process.env) {
@@ -34,8 +35,7 @@ export function launchPlan(argv, env = process.env) {
34
35
  if (!fs.existsSync(containedPath(project, ".claude/nccgs/install-state.json"))) throw new Error("Install/update NCCGS in the target project first");
35
36
  const mode = autonomyPolicy(project).mode;
36
37
  if (env.CLAUDECODE || env.CLAUDE_CODE_ENTRYPOINT) throw new Error("Start nccgs run from the external terminal/operator, not by nesting it inside an active Claude session");
37
- const conflicting = /^(?:--permission-mode|--dangerously-skip-permissions|--allow-dangerously-skip-permissions|--settings|--setting-sources|--worktree|--agent)(?:=|$)|^-w$/;
38
- for (const argument of forwarded) if (conflicting.test(argument)) throw new Error(`NCCGS owns session permission/root settings; conflicting option: ${argument}`);
38
+ for (const argument of forwarded) if (conflictingLaunchOption.test(argument)) throw new Error(`NCCGS owns session permission/root/hook settings; conflicting option: ${argument}`);
39
39
  if (supervised) {
40
40
  if (supervision.recoverRun) {
41
41
  if (forwarded.length || supervision.taskId || supervision.promptFile || supervision.budgetUsd !== undefined || supervision.budgetPhase || options.includes("--max-resumes") || options.includes("--timeout-ms")) throw new Error("Recovery preserves the original prompt, limits and provider arguments");
@@ -46,7 +46,7 @@ export function launchPlan(argv, env = process.env) {
46
46
  for (const argument of forwarded) if (owned.test(argument)) throw new Error(`Supervisor owns native lifecycle option: ${argument}`);
47
47
  }
48
48
  } else if (options.some(option => ["--task", "--prompt-file", "--max-resumes", "--timeout-ms", "--session-budget-usd", "--budget-phase"].includes(option))) throw new Error("Lifecycle options require --supervise");
49
- return { project, binary, dryRun, mode, args: ["--permission-mode", mode === "full" ? "bypassPermissions" : "default", ...forwarded],
49
+ return { project, binary, dryRun, mode, args: unityCliMcpArgs(forwarded, project, permissionModeArgs(mode)),
50
50
  supervision: supervised ? supervision : null, env: { ...env, NCCGS_PROJECT_ROOT: project, NCCGS_TASK_AUTONOMY: mode,
51
51
  // Native auto-backgrounding can otherwise turn a claimed foreground worker
52
52
  // into async_launched mid-flight and invalidate its guarded write identity.
@@ -73,6 +73,7 @@ export async function run(argv) {
73
73
  if (!fs.existsSync(containedPath(plan.project, ".claude/nccgs/install-state.json")))
74
74
  throw new Error("Install/update NCCGS in the target project first; it was removed before launch");
75
75
  if (plan.supervision) return await supervise(plan);
76
+ assertStrictUnityCliArgs(plan.args, plan.project, permissionModeArgs(plan.mode));
76
77
  lease.update({ phase: "spawning" });
77
78
  child = spawn(plan.binary, plan.args, { cwd: plan.project, env: plan.env, stdio: "inherit", windowsHide: true });
78
79
  child.once("spawn", () => lease.update({ phase: "running", child: { pid: child.pid, group: false } }));
@@ -10,6 +10,8 @@ import { acquireLock, delay, pidState } from "../.claude/nccgs/tools/process-loc
10
10
  import { sessionBudgetLock, sessionBudgetCoverage } from "../.claude/nccgs/tools/session-budget.mjs";
11
11
  import { allocateReviewBudget } from "../.claude/nccgs/tools/review-budget.mjs";
12
12
  import { settleWorkHandoff } from "./work-handoff.mjs";
13
+ import { assertStrictUnityCliArgs } from "../.claude/nccgs/tools/unity-transport.mjs";
14
+ import { permissionModeArgs } from "../.claude/nccgs/tools/autonomy.mjs";
13
15
 
14
16
  const need = (condition, message) => { if (!condition) throw new Error(message); };
15
17
  const now = () => new Date().toISOString();
@@ -46,6 +48,7 @@ export async function supervise(plan) {
46
48
  createdAt: now(), deadline: Date.now() + config.timeoutMs, maxResumes: config.maxResumes,
47
49
  budgetUsd: config.budgetUsd, cumulativeCostUsd: 0, costCoverage: "complete", invocations: [], status: "ready" };
48
50
  }
51
+ assertStrictUnityCliArgs(state.providerArgs, project, permissionModeArgs(state.permissionMode));
49
52
  const lock = acquireLock(contained(project, `.nccgs/runs/task-${state.taskId}.lock`), { runId: state.id });
50
53
  let budgetLock;
51
54
  const directory = path.dirname(file), save = () => atomicJson(file, state);
@@ -121,6 +124,7 @@ export async function supervise(plan) {
121
124
  ...(index === 0 ? ["--session-id", state.sessionId] : ["--resume", state.sessionId])];
122
125
  let deadlineTimer;
123
126
  try {
127
+ assertStrictUnityCliArgs(state.providerArgs, project, permissionModeArgs(state.permissionMode));
124
128
  child = spawn(state.binary, args, { cwd: project, windowsHide: true, stdio: ["pipe", "pipe", "pipe"],
125
129
  env: { ...plan.env, NCCGS_SUPERVISED_SESSION: state.sessionId, NCCGS_SUPERVISED_RUN: state.id, NCCGS_TASK_ID: state.taskId } });
126
130
  child.stdin.on("error", () => {}); // early native failure is captured in its terminal/exit evidence