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.
- package/.claude/agents/nccgs-adversarial-reviewer.md +1 -1
- package/.claude/agents/nccgs-engine-programmer.md +1 -1
- package/.claude/agents/nccgs-fast-implementer.md +1 -1
- package/.claude/agents/nccgs-game-designer.md +1 -1
- package/.claude/agents/nccgs-gameplay-programmer.md +1 -1
- package/.claude/agents/nccgs-qa-engineer.md +1 -1
- package/.claude/agents/nccgs-task-scout.md +1 -1
- package/.claude/agents/nccgs-ui-programmer.md +1 -1
- package/.claude/agents/nccgs-unity-build-specialist.md +1 -1
- package/.claude/agents/nccgs-unity-implementer.md +1 -1
- package/.claude/agents/nccgs-unity-systems-specialist.md +1 -1
- package/.claude/agents/nccgs-unity-ui-specialist.md +1 -1
- package/.claude/agents/nccgs-verification-engineer.md +1 -1
- package/.claude/nccgs/MEMORY.md +3 -1
- package/.claude/nccgs/VERSION +1 -1
- package/.claude/nccgs/constitution.md +187 -176
- package/.claude/nccgs/hooks/closure-guard.mjs +2 -0
- package/.claude/nccgs/hooks/unity-transport-guard.mjs +11 -0
- package/.claude/nccgs/pipeline.json +260 -260
- package/.claude/nccgs/protocols/context-packets.md +5 -0
- package/.claude/nccgs/protocols/model-routing.md +46 -46
- package/.claude/nccgs/protocols/review-handoff.md +21 -1
- package/.claude/nccgs/protocols/shared-workflow-context.md +33 -0
- package/.claude/nccgs/protocols/unity-boundary.md +20 -0
- package/.claude/nccgs/routing.generated.md +4 -4
- package/.claude/nccgs/settings.fragment.json +84 -24
- package/.claude/nccgs/studio.json +53 -53
- package/.claude/nccgs/tools/autonomy.mjs +13 -0
- package/.claude/nccgs/tools/command-tokens.mjs +22 -0
- package/.claude/nccgs/tools/hook-transport.mjs +34 -0
- package/.claude/nccgs/tools/native-completion.mjs +10 -1
- package/.claude/nccgs/tools/returned-handoff.mjs +11 -2
- package/.claude/nccgs/tools/shared-context-guard.mjs +60 -0
- package/.claude/nccgs/tools/shared-context.mjs +25 -0
- package/.claude/nccgs/tools/tool-guard.mjs +120 -131
- package/.claude/nccgs/tools/unity-transport.mjs +170 -0
- package/.claude/nccgs/workflow-catalog.json +4 -4
- package/CHANGELOG.md +235 -200
- package/CLAUDE.md +10 -8
- package/MEMORY.md +109 -60
- package/README.md +206 -191
- package/UPGRADING.md +130 -118
- package/VERSION +1 -1
- package/docs/ARCHITECTURE.md +131 -131
- package/docs/ASSET-PRODUCTION-GRAPHIFY-PLAN.md +230 -0
- package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +117 -116
- package/docs/NCCGS-1.5.md +237 -237
- package/docs/PROJECT-POLICY.md +94 -94
- package/docs/RELEASE-STATUS.md +17 -9
- package/docs/UNINSTALL.md +3 -3
- package/docs/WFK17-HOOK-REPAIR.md +71 -0
- package/docs/WORKFLOWS.md +85 -85
- package/package.json +1 -1
- package/scaffold/.nccgs/project.yaml +109 -108
- package/scripts/benchmark-v15.mjs +173 -173
- package/scripts/doctor.mjs +261 -261
- package/scripts/install.mjs +530 -529
- package/scripts/run.mjs +5 -4
- package/scripts/supervise.mjs +4 -0
- package/scripts/uninstall.mjs +292 -292
- package/scripts/validate.mjs +285 -280
- package/tests/autonomy.test.mjs +126 -113
- package/tests/design-readiness.test.mjs +199 -199
- package/tests/fixtures/compiler-shutdown.cs +67 -64
- package/tests/fixtures/native-provider.mjs +61 -0
- package/tests/framework.test.mjs +740 -740
- package/tests/hook-repair.test.mjs +106 -0
- package/tests/lifecycle-v15.test.mjs +346 -300
- package/tests/native-completion-notices.test.mjs +181 -0
- package/tests/phase1.test.mjs +427 -416
- package/tests/phase2.test.mjs +250 -250
- package/tests/policy-v15.test.mjs +234 -234
- package/tests/returned-handoff-notices.test.mjs +170 -0
- package/tests/runtime-v15.test.mjs +1197 -1191
- package/tests/task-slices.test.mjs +285 -285
- 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
|
|
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:
|
|
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 } }));
|
package/scripts/supervise.mjs
CHANGED
|
@@ -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
|