@jeger-ai/opengantry 2.3.0 → 2.4.0
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 +61 -59
- package/dist/cli/commands/arch.d.ts +9 -0
- package/dist/cli/commands/arch.d.ts.map +1 -1
- package/dist/cli/commands/arch.js +65 -0
- package/dist/cli/commands/arch.js.map +1 -1
- package/dist/cli/commands/context-request.d.ts +2 -2
- package/dist/cli/commands/context-request.d.ts.map +1 -1
- package/dist/cli/commands/context-request.js +13 -13
- package/dist/cli/commands/context-request.js.map +1 -1
- package/dist/cli/commands/init.js +2 -2
- package/dist/cli/commands/onboarding.js +4 -4
- package/dist/cli/commands/onboarding.js.map +1 -1
- package/dist/cli/commands/planner.d.ts +11 -0
- package/dist/cli/commands/{teacher.d.ts.map → planner.d.ts.map} +1 -1
- package/dist/cli/commands/{teacher.js → planner.js} +11 -11
- package/dist/cli/commands/{teacher.js.map → planner.js.map} +1 -1
- package/dist/cli/commands/runtime.d.ts +1 -1
- package/dist/cli/commands/runtime.d.ts.map +1 -1
- package/dist/cli/commands/runtime.js +4 -4
- package/dist/cli/commands/runtime.js.map +1 -1
- package/dist/cli/lib/arch-override.d.ts +4 -0
- package/dist/cli/lib/arch-override.d.ts.map +1 -0
- package/dist/cli/lib/arch-override.js +8 -0
- package/dist/cli/lib/arch-override.js.map +1 -0
- package/dist/cli/lib/architecture-fetch.d.ts +24 -0
- package/dist/cli/lib/architecture-fetch.d.ts.map +1 -0
- package/dist/cli/lib/architecture-fetch.js +88 -0
- package/dist/cli/lib/architecture-fetch.js.map +1 -0
- package/dist/cli/lib/audience-output.d.ts +1 -1
- package/dist/cli/lib/audience-output.d.ts.map +1 -1
- package/dist/cli/lib/audience-output.js +16 -16
- package/dist/cli/lib/audience-output.js.map +1 -1
- package/dist/cli/lib/break-glass.js +1 -1
- package/dist/cli/lib/command-reporter.d.ts +1 -0
- package/dist/cli/lib/command-reporter.d.ts.map +1 -1
- package/dist/cli/lib/command-reporter.js +10 -5
- package/dist/cli/lib/command-reporter.js.map +1 -1
- package/dist/cli/lib/config-namespace.d.ts +2 -2
- package/dist/cli/lib/config-namespace.js +2 -2
- package/dist/cli/lib/constants.d.ts +8 -8
- package/dist/cli/lib/constants.d.ts.map +1 -1
- package/dist/cli/lib/constants.js +8 -8
- package/dist/cli/lib/constants.js.map +1 -1
- package/dist/cli/lib/context-request.d.ts +4 -4
- package/dist/cli/lib/context-request.d.ts.map +1 -1
- package/dist/cli/lib/context-request.js +11 -11
- package/dist/cli/lib/context-request.js.map +1 -1
- package/dist/cli/lib/doctor-core.d.ts.map +1 -1
- package/dist/cli/lib/doctor-core.js +49 -22
- package/dist/cli/lib/doctor-core.js.map +1 -1
- package/dist/cli/lib/doctor-types.d.ts +2 -2
- package/dist/cli/lib/errors.js +6 -6
- package/dist/cli/lib/errors.js.map +1 -1
- package/dist/cli/lib/executor-log-integrity.d.ts +4 -0
- package/dist/cli/lib/executor-log-integrity.d.ts.map +1 -0
- package/dist/cli/lib/{worker-log-integrity.js → executor-log-integrity.js} +8 -8
- package/dist/cli/lib/executor-log-integrity.js.map +1 -0
- package/dist/cli/lib/{worker-log-line-map.d.ts → executor-log-line-map.d.ts} +4 -4
- package/dist/cli/lib/executor-log-line-map.d.ts.map +1 -0
- package/dist/cli/lib/{worker-log-line-map.js → executor-log-line-map.js} +4 -4
- package/dist/cli/lib/executor-log-line-map.js.map +1 -0
- package/dist/cli/lib/file-merge-gxt.js +1 -1
- package/dist/cli/lib/file-merge-gxt.js.map +1 -1
- package/dist/cli/lib/fix-hints.d.ts +6 -6
- package/dist/cli/lib/fix-hints.d.ts.map +1 -1
- package/dist/cli/lib/fix-hints.js +36 -30
- package/dist/cli/lib/fix-hints.js.map +1 -1
- package/dist/cli/lib/git-metrics.js +10 -10
- package/dist/cli/lib/git-metrics.js.map +1 -1
- package/dist/cli/lib/git-proof.d.ts +7 -5
- package/dist/cli/lib/git-proof.d.ts.map +1 -1
- package/dist/cli/lib/git-proof.js +48 -19
- package/dist/cli/lib/git-proof.js.map +1 -1
- package/dist/cli/lib/gxt-config.d.ts +9 -0
- package/dist/cli/lib/gxt-config.d.ts.map +1 -0
- package/dist/cli/lib/gxt-config.js +20 -0
- package/dist/cli/lib/gxt-config.js.map +1 -0
- package/dist/cli/lib/gxt-error-codes.d.ts +3 -0
- package/dist/cli/lib/gxt-error-codes.d.ts.map +1 -1
- package/dist/cli/lib/gxt-error-codes.js +8 -3
- package/dist/cli/lib/gxt-error-codes.js.map +1 -1
- package/dist/cli/lib/init-compose.js +1 -1
- package/dist/cli/lib/init-interactive.js +1 -1
- package/dist/cli/lib/init-interactive.js.map +1 -1
- package/dist/cli/lib/init-tutorial.js +14 -14
- package/dist/cli/lib/init-tutorial.js.map +1 -1
- package/dist/cli/lib/kpi-engine.d.ts +1 -1
- package/dist/cli/lib/kpi-engine.d.ts.map +1 -1
- package/dist/cli/lib/kpi-engine.js +17 -11
- package/dist/cli/lib/kpi-engine.js.map +1 -1
- package/dist/cli/lib/legislate-forbidden-zone.d.ts +1 -1
- package/dist/cli/lib/legislate-forbidden-zone.js +1 -1
- package/dist/cli/lib/legislate.js +4 -4
- package/dist/cli/lib/mcp-governance.d.ts +2 -2
- package/dist/cli/lib/mcp-governance.d.ts.map +1 -1
- package/dist/cli/lib/mcp-governance.js +40 -10
- package/dist/cli/lib/mcp-governance.js.map +1 -1
- package/dist/cli/lib/mcp-tools-register.js +3 -3
- package/dist/cli/lib/mcp-tools-register.js.map +1 -1
- package/dist/cli/lib/mcp-upgrade.d.ts.map +1 -1
- package/dist/cli/lib/mcp-upgrade.js +8 -0
- package/dist/cli/lib/mcp-upgrade.js.map +1 -1
- package/dist/cli/lib/mcp-write-guard.d.ts +20 -0
- package/dist/cli/lib/mcp-write-guard.d.ts.map +1 -0
- package/dist/cli/lib/mcp-write-guard.js +82 -0
- package/dist/cli/lib/mcp-write-guard.js.map +1 -0
- package/dist/cli/lib/missions/formatter.d.ts +1 -1
- package/dist/cli/lib/missions/formatter.js +1 -1
- package/dist/cli/lib/onboarding-flow.js +1 -1
- package/dist/cli/lib/out-of-scope-hint.js +1 -1
- package/dist/cli/lib/perimeter.d.ts +1 -1
- package/dist/cli/lib/perimeter.js +10 -10
- package/dist/cli/lib/planner-identity.d.ts +23 -0
- package/dist/cli/lib/{teacher-identity.d.ts.map → planner-identity.d.ts.map} +1 -1
- package/dist/cli/lib/{teacher-identity.js → planner-identity.js} +34 -34
- package/dist/cli/lib/{teacher-identity.js.map → planner-identity.js.map} +1 -1
- package/dist/cli/lib/planner-signature.d.ts +11 -0
- package/dist/cli/lib/planner-signature.d.ts.map +1 -0
- package/dist/cli/lib/planner-signature.js +17 -0
- package/dist/cli/lib/planner-signature.js.map +1 -0
- package/dist/cli/lib/program-audience-hook.js +1 -1
- package/dist/cli/lib/program-audience-hook.js.map +1 -1
- package/dist/cli/lib/register-proposals.js +1 -1
- package/dist/cli/lib/runtime-env.d.ts +3 -3
- package/dist/cli/lib/runtime-env.d.ts.map +1 -1
- package/dist/cli/lib/runtime-env.js +4 -4
- package/dist/cli/lib/runtime-env.js.map +1 -1
- package/dist/cli/lib/runtime-exec.d.ts +4 -4
- package/dist/cli/lib/runtime-exec.d.ts.map +1 -1
- package/dist/cli/lib/runtime-exec.js +14 -14
- package/dist/cli/lib/runtime-exec.js.map +1 -1
- package/dist/cli/lib/staged-tmvc-guard.js +1 -1
- package/dist/cli/lib/staged-tmvc-guard.js.map +1 -1
- package/dist/cli/lib/start-orchestration.js +7 -7
- package/dist/cli/lib/start-orchestration.js.map +1 -1
- package/dist/cli/lib/status-report.d.ts +1 -1
- package/dist/cli/lib/status-report.js +7 -7
- package/dist/cli/lib/status-report.js.map +1 -1
- package/dist/cli/lib/surgeon.d.ts +3 -3
- package/dist/cli/lib/surgeon.d.ts.map +1 -1
- package/dist/cli/lib/surgeon.js +7 -7
- package/dist/cli/lib/surgeon.js.map +1 -1
- package/dist/cli/lib/surgeons/registry.d.ts +1 -1
- package/dist/cli/lib/surgeons/registry.d.ts.map +1 -1
- package/dist/cli/lib/target-architecture.d.ts +37 -0
- package/dist/cli/lib/target-architecture.d.ts.map +1 -0
- package/dist/cli/lib/target-architecture.js +155 -0
- package/dist/cli/lib/target-architecture.js.map +1 -0
- package/dist/cli/lib/telemetry-log.d.ts +1 -1
- package/dist/cli/lib/telemetry-log.d.ts.map +1 -1
- package/dist/cli/lib/telemetry-log.js +4 -4
- package/dist/cli/lib/telemetry-log.js.map +1 -1
- package/dist/cli/lib/tmvc-path.d.ts +1 -1
- package/dist/cli/lib/tmvc-path.d.ts.map +1 -1
- package/dist/cli/lib/tmvc-path.js +1 -1
- package/dist/cli/lib/tmvc-path.js.map +1 -1
- package/dist/cli/lib/trace.d.ts +8 -8
- package/dist/cli/lib/trace.d.ts.map +1 -1
- package/dist/cli/lib/trace.js +21 -21
- package/dist/cli/lib/trace.js.map +1 -1
- package/dist/cli/lib/triage-logic.js +1 -1
- package/dist/cli/lib/types.d.ts +2 -1
- package/dist/cli/lib/types.d.ts.map +1 -1
- package/dist/cli/lib/upgrade-apply.d.ts.map +1 -1
- package/dist/cli/lib/upgrade-apply.js +14 -2
- package/dist/cli/lib/upgrade-apply.js.map +1 -1
- package/dist/cli/lib/upgrade-plan.js +3 -3
- package/dist/cli/lib/verify-engine.d.ts +11 -5
- package/dist/cli/lib/verify-engine.d.ts.map +1 -1
- package/dist/cli/lib/verify-engine.js +47 -30
- package/dist/cli/lib/verify-engine.js.map +1 -1
- package/dist/cli/lib/verify-export.d.ts +6 -0
- package/dist/cli/lib/verify-export.d.ts.map +1 -0
- package/dist/cli/lib/verify-export.js +106 -0
- package/dist/cli/lib/verify-export.js.map +1 -0
- package/dist/cli/lib/verify-failure-normalize-phases.js +1 -1
- package/dist/cli/lib/verify-failure-normalize-phases.js.map +1 -1
- package/dist/cli/lib/verify-hints.d.ts +1 -1
- package/dist/cli/lib/verify-hints.d.ts.map +1 -1
- package/dist/cli/lib/verify-hints.js +16 -16
- package/dist/cli/lib/verify-hints.js.map +1 -1
- package/dist/cli/lib/verify-payload-types.d.ts +1 -0
- package/dist/cli/lib/verify-payload-types.d.ts.map +1 -1
- package/dist/cli/lib/verify-payload.d.ts.map +1 -1
- package/dist/cli/lib/verify-payload.js +3 -0
- package/dist/cli/lib/verify-payload.js.map +1 -1
- package/dist/cli/lib/verify-presenters.d.ts.map +1 -1
- package/dist/cli/lib/verify-presenters.js +12 -6
- package/dist/cli/lib/verify-presenters.js.map +1 -1
- package/dist/cli/lib/verify-sinks.d.ts.map +1 -1
- package/dist/cli/lib/verify-sinks.js +3 -2
- package/dist/cli/lib/verify-sinks.js.map +1 -1
- package/dist/cli/lib/version.gen.d.ts +1 -1
- package/dist/cli/lib/version.gen.js +1 -1
- package/dist/cli/program-arch.d.ts.map +1 -1
- package/dist/cli/program-arch.js +16 -1
- package/dist/cli/program-arch.js.map +1 -1
- package/dist/cli/program-core.js +4 -4
- package/dist/cli/program-core.js.map +1 -1
- package/dist/cli/program-mission.js +15 -15
- package/dist/cli/program-mission.js.map +1 -1
- package/dist/cli/program-planner.d.ts +3 -0
- package/dist/cli/program-planner.d.ts.map +1 -0
- package/dist/cli/program-planner.js +19 -0
- package/dist/cli/{program-teacher.js.map → program-planner.js.map} +1 -1
- package/dist/cli/program-workflow.d.ts.map +1 -1
- package/dist/cli/program-workflow.js +19 -8
- package/dist/cli/program-workflow.js.map +1 -1
- package/dist/cli/program.js +3 -3
- package/dist/cli/program.js.map +1 -1
- package/package.json +1 -1
- package/templates/.cursor/hooks/gxt-before-shell.sh +4 -4
- package/templates/.cursor/hooks/gxt-session-start.sh +2 -2
- package/templates/.cursor/rules/opengantry-gxt-substrate.mdc +4 -4
- package/templates/.gitagent/ARCHITECTURE.pointer.json +2 -2
- package/templates/.gitagent/foreman/MANIFEST.json +3 -3
- package/templates/.gitagent/foreman/PLANNER.allowlist.example +4 -0
- package/templates/.gitagent/missions/README.md +1 -1
- package/templates/.gitagent/{teacher → planner}/ARCHITECTURE-ACCESS.md +3 -3
- package/templates/.gitagent/{teacher → planner}/ARCHITECTURE-DISCOVERY.md +2 -2
- package/templates/.gitagent/planner/ARCHITECTURE_RUBRIC.template.md +25 -0
- package/templates/.gitagent/{teacher/WORKER_LOG.template.md → planner/EXECUTOR_LOG.template.md} +2 -2
- package/templates/.gitagent/{teacher → planner}/MISSION-ARCHITECT.md +11 -11
- package/templates/.gitagent/{teacher → planner}/RULES.md +4 -4
- package/templates/.githooks/post-checkout +4 -4
- package/templates/.githooks/pre-push +1 -1
- package/templates/.github/workflows/gxt-validate.yml +1 -1
- package/templates/.gitignore.gxt +1 -1
- package/templates/.prettierignore.gxt +1 -1
- package/templates/AGENTS.md +6 -6
- package/templates/docs/ARCHITECTURE.md +2 -2
- package/templates/integrations/aider/.aider.conf.yml +1 -1
- package/templates/integrations/antigravity/.agent/rules/gxt.md +1 -1
- package/templates/integrations/asset-catalog.json +7 -7
- package/templates/integrations/claude-code/CLAUDE.md +1 -1
- package/templates/integrations/cline/.clinerules/gxt.md +1 -1
- package/templates/integrations/compatibility.json +1 -1
- package/templates/integrations/junie/.junie/guidelines.md +1 -1
- package/templates/integrations/opencode/opencode.json +1 -1
- package/templates/integrations/openhands/.openhands/microagents/gxt.md +1 -1
- package/templates/integrations/recipes/_footer.md +7 -7
- package/templates/integrations/recipes/_preamble.md +7 -7
- package/templates/integrations/recipes/claude-code.md +1 -1
- package/templates/integrations/recipes/cursor.md +2 -2
- package/templates/scripts/gxt-manifest-lib.mjs +1 -1
- package/templates/scripts/gxt-runtime-env.sh +1 -1
- package/templates/skills/gantry.md +1 -1
- package/templates/skills/substrate.md +1 -1
- package/dist/cli/commands/teacher.d.ts +0 -11
- package/dist/cli/lib/teacher-identity.d.ts +0 -23
- package/dist/cli/lib/worker-log-integrity.d.ts +0 -4
- package/dist/cli/lib/worker-log-integrity.d.ts.map +0 -1
- package/dist/cli/lib/worker-log-integrity.js.map +0 -1
- package/dist/cli/lib/worker-log-line-map.d.ts.map +0 -1
- package/dist/cli/lib/worker-log-line-map.js.map +0 -1
- package/dist/cli/program-teacher.d.ts +0 -3
- package/dist/cli/program-teacher.d.ts.map +0 -1
- package/dist/cli/program-teacher.js +0 -19
- package/templates/.gitagent/foreman/TEACHER.allowlist.example +0 -4
- /package/templates/.gitagent/{teacher → planner}/KPI-REPORT.schema.yaml +0 -0
- /package/templates/.gitagent/{teacher → planner}/MISSION.schema.yaml +0 -0
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { errorMessage } from "./cli-io.js";
|
|
2
2
|
import { getRepoRoot } from "./git.js";
|
|
3
|
+
import { GXT_ERROR } from "./gxt-error-codes.js";
|
|
4
|
+
import { McpWriteDeniedError } from "./mcp-write-guard.js";
|
|
3
5
|
import { assertStableUpgradePlanPayloadV1, toStableUpgradePlanPayloadV1, } from "./upgrade-plan-payload.js";
|
|
4
6
|
import { runUpgradeApply } from "./upgrade-apply.js";
|
|
5
7
|
import { runUpgradePlan } from "./upgrade-plan.js";
|
|
6
8
|
import { GapmanUserError } from "./errors.js";
|
|
7
9
|
function mcpErrorBody(e) {
|
|
10
|
+
if (e instanceof McpWriteDeniedError) {
|
|
11
|
+
return {
|
|
12
|
+
status: "error",
|
|
13
|
+
error: { code: GXT_ERROR.MCP_WRITE_DENIED, message: e.message, retryable: false },
|
|
14
|
+
};
|
|
15
|
+
}
|
|
8
16
|
if (e instanceof GapmanUserError) {
|
|
9
17
|
return {
|
|
10
18
|
status: "error",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-upgrade.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-upgrade.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EACL,gCAAgC,EAChC,4BAA4B,GAE7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAa9C,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,YAAY,mBAAmB,EAAE,CAAC;QACrC,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;SAClF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,YAAY,eAAe,EAAE,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA6B,EAAE;IAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,QAAQ;YACR,GAAG,EAAE,KAAK,CAAC,MAAM;YACjB,MAAM,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI;YAC9B,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACrD,gCAAgC,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,eAAwB;IAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,MAAM,eAAe,CAAC;YAC3B,QAAQ;YACR,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GapmanUserError } from "./errors.js";
|
|
2
|
+
import type { Manifest } from "./types.js";
|
|
3
|
+
export declare const MCP_WRITE_DENIED: "MCP_WRITE_DENIED";
|
|
4
|
+
export declare class McpWriteDeniedError extends GapmanUserError {
|
|
5
|
+
readonly repoRelPath: string;
|
|
6
|
+
constructor(repoRelPath: string, reason: string);
|
|
7
|
+
}
|
|
8
|
+
/** Mission file writes via MCP must stay under `.gitagent/missions/`. */
|
|
9
|
+
export declare function assertMcpMissionWritePath(repoRelPath: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Validate a repo-relative write target for a skill-scoped MCP mutation.
|
|
12
|
+
* Governance transport paths (EXECUTOR_LOG, active-mission pin) are always allowed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function assertMcpSkillWritePath(manifest: Manifest, skillKey: string, repoRelPath: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Tier-3 substrate upgrade: each `planned_writes` entry is Planner-authorized via signed mission.
|
|
17
|
+
* Deny forbidden-zone targets not explicitly listed in `planned_writes`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertMcpSubstrateUpgradeWritePaths(manifest: Manifest, plannedWrites: readonly string[]): void;
|
|
20
|
+
//# sourceMappingURL=mcp-write-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-write-guard.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-write-guard.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,eAAO,MAAM,gBAAgB,EAAG,kBAA2B,CAAC;AAE5D,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAKhD;AASD,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CASnE;AAoBD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,IAAI,CAiBN;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,IAAI,CAYN"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { REL_MISSIONS_PREFIX } from "./git-proof.js";
|
|
2
|
+
import { classifyRepoRelativePath, forbiddenZonesForSkill, isGovernanceTransportPath, isPathUnderRoot, normalizeRepoRelativePath, tmvcRootsForSkill, } from "./tmvc-path.js";
|
|
3
|
+
import { GapmanUserError } from "./errors.js";
|
|
4
|
+
import { resolveManifestSkillKey } from "./skill-key.js";
|
|
5
|
+
export const MCP_WRITE_DENIED = "MCP_WRITE_DENIED";
|
|
6
|
+
export class McpWriteDeniedError extends GapmanUserError {
|
|
7
|
+
repoRelPath;
|
|
8
|
+
constructor(repoRelPath, reason) {
|
|
9
|
+
const norm = normalizeRepoRelativePath(repoRelPath);
|
|
10
|
+
super(MCP_WRITE_DENIED, `MCP write denied: ${reason} (${norm})`);
|
|
11
|
+
this.repoRelPath = norm;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function assertNoPathTraversal(repoRel) {
|
|
15
|
+
const norm = normalizeRepoRelativePath(repoRel);
|
|
16
|
+
if (norm.includes("..") || norm.startsWith("/")) {
|
|
17
|
+
throw new McpWriteDeniedError(norm, "path must be repo-relative without traversal");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Mission file writes via MCP must stay under `.gitagent/missions/`. */
|
|
21
|
+
export function assertMcpMissionWritePath(repoRelPath) {
|
|
22
|
+
assertNoPathTraversal(repoRelPath);
|
|
23
|
+
const norm = normalizeRepoRelativePath(repoRelPath);
|
|
24
|
+
if (!norm.startsWith(REL_MISSIONS_PREFIX)) {
|
|
25
|
+
throw new McpWriteDeniedError(norm, `mission writes must stay under ${REL_MISSIONS_PREFIX}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function allManifestForbiddenZones(manifest) {
|
|
29
|
+
const zones = new Set();
|
|
30
|
+
for (const skill of Object.values(manifest.skills)) {
|
|
31
|
+
for (const fz of skill.forbidden_zones ?? []) {
|
|
32
|
+
zones.add(fz);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return [...zones];
|
|
36
|
+
}
|
|
37
|
+
function pathHitsForbiddenZone(repoRel, forbiddenZones) {
|
|
38
|
+
const norm = normalizeRepoRelativePath(repoRel);
|
|
39
|
+
for (const fz of forbiddenZones) {
|
|
40
|
+
if (isPathUnderRoot(norm, fz))
|
|
41
|
+
return fz;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate a repo-relative write target for a skill-scoped MCP mutation.
|
|
47
|
+
* Governance transport paths (EXECUTOR_LOG, active-mission pin) are always allowed.
|
|
48
|
+
*/
|
|
49
|
+
export function assertMcpSkillWritePath(manifest, skillKey, repoRelPath) {
|
|
50
|
+
assertNoPathTraversal(repoRelPath);
|
|
51
|
+
const norm = normalizeRepoRelativePath(repoRelPath);
|
|
52
|
+
if (isGovernanceTransportPath(norm))
|
|
53
|
+
return;
|
|
54
|
+
const resolvedSkill = resolveManifestSkillKey(manifest, skillKey);
|
|
55
|
+
const forbidden = forbiddenZonesForSkill(manifest, resolvedSkill);
|
|
56
|
+
const hit = pathHitsForbiddenZone(norm, forbidden);
|
|
57
|
+
if (hit) {
|
|
58
|
+
throw new McpWriteDeniedError(norm, `path in forbidden zone ${hit}`);
|
|
59
|
+
}
|
|
60
|
+
const tmvc = tmvcRootsForSkill(manifest, resolvedSkill);
|
|
61
|
+
const classification = classifyRepoRelativePath(norm, tmvc, forbidden);
|
|
62
|
+
if (classification === "inside_tmvc" || classification === "governance_transport")
|
|
63
|
+
return;
|
|
64
|
+
throw new McpWriteDeniedError(norm, `path outside TMVC roots for skill ${resolvedSkill}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Tier-3 substrate upgrade: each `planned_writes` entry is Planner-authorized via signed mission.
|
|
68
|
+
* Deny forbidden-zone targets not explicitly listed in `planned_writes`.
|
|
69
|
+
*/
|
|
70
|
+
export function assertMcpSubstrateUpgradeWritePaths(manifest, plannedWrites) {
|
|
71
|
+
const authorized = new Set(plannedWrites.map((p) => normalizeRepoRelativePath(p)));
|
|
72
|
+
const allForbidden = allManifestForbiddenZones(manifest);
|
|
73
|
+
for (const relPath of plannedWrites) {
|
|
74
|
+
assertNoPathTraversal(relPath);
|
|
75
|
+
const norm = normalizeRepoRelativePath(relPath);
|
|
76
|
+
const hit = pathHitsForbiddenZone(norm, allForbidden);
|
|
77
|
+
if (hit && !authorized.has(norm)) {
|
|
78
|
+
throw new McpWriteDeniedError(norm, `forbidden zone ${hit} not authorized by upgrade mission`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=mcp-write-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-write-guard.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-write-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export interface EmitMissionOptions {
|
|
|
10
10
|
}
|
|
11
11
|
export declare function emitActiveMissionFromTemplate(repoRoot: string, options: EmitMissionOptions): string;
|
|
12
12
|
/**
|
|
13
|
-
* True when the mission file represents
|
|
13
|
+
* True when the mission file represents Planner legislation only — no worker
|
|
14
14
|
* execution evidence claimed yet. Pre-push may pass after git-proof alone.
|
|
15
15
|
*/
|
|
16
16
|
export declare function isLegislativeStub(mission: ParsedMission): boolean;
|
|
@@ -118,7 +118,7 @@ function isPlaceholderQuote(quote) {
|
|
|
118
118
|
return quote.trim() === LEGISLATE_TRACE_PLACEHOLDER;
|
|
119
119
|
}
|
|
120
120
|
/**
|
|
121
|
-
* True when the mission file represents
|
|
121
|
+
* True when the mission file represents Planner legislation only — no worker
|
|
122
122
|
* execution evidence claimed yet. Pre-push may pass after git-proof alone.
|
|
123
123
|
*/
|
|
124
124
|
export function isLegislativeStub(mission) {
|
|
@@ -7,7 +7,7 @@ export function tutorialTeacherStampBlock(missionPath, msnId) {
|
|
|
7
7
|
return [
|
|
8
8
|
`git add ${missionPath}`,
|
|
9
9
|
`git commit -m "[${msnId}] legislate mission"`,
|
|
10
|
-
"gantry
|
|
10
|
+
"gantry planner set \"$(git config user.email)\" # if not already configured",
|
|
11
11
|
].join("\n ");
|
|
12
12
|
}
|
|
13
13
|
export function onboardingRuntimeEnvHint(missionPath) {
|
|
@@ -71,7 +71,7 @@ export function collectOutOfScopeAdrHints(root, intentNorm) {
|
|
|
71
71
|
hints.push({
|
|
72
72
|
id: meta.id,
|
|
73
73
|
title: meta.title,
|
|
74
|
-
note: `Intent may relate to ADR ${meta.id} (match_terms overlap);
|
|
74
|
+
note: `Intent may relate to ADR ${meta.id} (match_terms overlap); Planner must confirm or reject during legislation.`,
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
return hints;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Manifest } from "./types.js";
|
|
2
|
-
export declare const DEFAULT_PERIMETER_PROTECTED: readonly ["**/.gxt-skill.yaml", ".gitagent/foreman/MANIFEST.json", ".gitagent/
|
|
2
|
+
export declare const DEFAULT_PERIMETER_PROTECTED: readonly ["**/.gxt-skill.yaml", ".gitagent/foreman/MANIFEST.json", ".gitagent/planner/RULES.md"];
|
|
3
3
|
export interface PerimeterViolation {
|
|
4
4
|
path: string;
|
|
5
5
|
commit: string;
|
|
@@ -3,11 +3,11 @@ import { GXT_ERROR } from "./gxt-error-codes.js";
|
|
|
3
3
|
import { toPosixRel } from "./cli-io.js";
|
|
4
4
|
import { gitRevParse, gitRun, gitRunOk } from "./git.js";
|
|
5
5
|
import { commitSubjectHasMsnPrefix, listCommitChangedPaths, listMsnSubjectCommits, } from "./git-proof.js";
|
|
6
|
-
import {
|
|
6
|
+
import { resolvePlannerEmails } from "./planner-identity.js";
|
|
7
7
|
export const DEFAULT_PERIMETER_PROTECTED = [
|
|
8
8
|
"**/.gxt-skill.yaml",
|
|
9
9
|
".gitagent/foreman/MANIFEST.json",
|
|
10
|
-
".gitagent/
|
|
10
|
+
".gitagent/planner/RULES.md",
|
|
11
11
|
];
|
|
12
12
|
const SHALLOW_HISTORY_HINT = "Configure CI checkout with fetch-depth: 0 or fetch the base ref explicitly before running gantry perimeter --ci.";
|
|
13
13
|
function perimeterGlobs(manifest) {
|
|
@@ -103,10 +103,10 @@ function signatureStatus(repoRoot, hash) {
|
|
|
103
103
|
function isGoodSignature(status) {
|
|
104
104
|
return status === "G" || status === "U";
|
|
105
105
|
}
|
|
106
|
-
function findTeacherStampForPath(repoRoot, msnId, repoRelPath,
|
|
106
|
+
function findTeacherStampForPath(repoRoot, msnId, repoRelPath, plannerEmails) {
|
|
107
107
|
const rows = listMsnSubjectCommits(repoRoot, msnId);
|
|
108
108
|
for (const row of rows) {
|
|
109
|
-
if (!
|
|
109
|
+
if (!plannerEmails.includes(row.authorEmail.trim().toLowerCase()))
|
|
110
110
|
continue;
|
|
111
111
|
const changed = listCommitChangedPaths(repoRoot, row.hash);
|
|
112
112
|
if (changed.some((p) => p.replace(/\\/g, "/") === repoRelPath.replace(/\\/g, "/"))) {
|
|
@@ -159,7 +159,7 @@ function checkProtectedPathCi(repoRoot, baseRef, filePath, violations, advisorie
|
|
|
159
159
|
advisories.push(`perimeter: ${filePath} — all ${String(range.commits.length)} commit(s) in range are signed`);
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
function checkProtectedPathLocal(repoRoot, filePath,
|
|
162
|
+
function checkProtectedPathLocal(repoRoot, filePath, plannerEmails, violations, advisories) {
|
|
163
163
|
const commit = lastCommitTouchingPath(repoRoot, filePath);
|
|
164
164
|
if (!commit) {
|
|
165
165
|
violations.push({
|
|
@@ -182,11 +182,11 @@ function checkProtectedPathLocal(repoRoot, filePath, teacherEmails, violations,
|
|
|
182
182
|
}
|
|
183
183
|
const msnId = extractMsnFromRecentCommits(repoRoot, commit);
|
|
184
184
|
const emailMatch = row.authorEmail.trim().toLowerCase() &&
|
|
185
|
-
|
|
185
|
+
plannerEmails.includes(row.authorEmail.trim().toLowerCase());
|
|
186
186
|
const subjectMatch = msnId !== null && commitSubjectHasMsnPrefix(row.subject, msnId);
|
|
187
|
-
const stamp = msnId !== null ? findTeacherStampForPath(repoRoot, msnId, filePath,
|
|
187
|
+
const stamp = msnId !== null ? findTeacherStampForPath(repoRoot, msnId, filePath, plannerEmails) : null;
|
|
188
188
|
if (stamp) {
|
|
189
|
-
advisories.push(`perimeter (advisory): ${filePath} —
|
|
189
|
+
advisories.push(`perimeter (advisory): ${filePath} — Planner email + MSN stamp hint matched ${stamp.hash.slice(0, 7)} (forgeable locally; CI verifies signature)`);
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
192
|
advisories.push(`perimeter (advisory): ${filePath} modified in ${commit.slice(0, 7)} — ` +
|
|
@@ -216,7 +216,7 @@ export function checkPerimeter(repoRoot, manifest, options) {
|
|
|
216
216
|
if (protectedChanged.length === 0) {
|
|
217
217
|
return { ok: true, violations: [], advisories: [] };
|
|
218
218
|
}
|
|
219
|
-
const
|
|
219
|
+
const plannerEmails = resolvePlannerEmails(repoRoot).emails;
|
|
220
220
|
const violations = [];
|
|
221
221
|
const advisories = [];
|
|
222
222
|
for (const filePath of protectedChanged) {
|
|
@@ -224,7 +224,7 @@ export function checkPerimeter(repoRoot, manifest, options) {
|
|
|
224
224
|
checkProtectedPathCi(repoRoot, options.baseRef, filePath, violations, advisories);
|
|
225
225
|
}
|
|
226
226
|
else {
|
|
227
|
-
checkProtectedPathLocal(repoRoot, filePath,
|
|
227
|
+
checkProtectedPathLocal(repoRoot, filePath, plannerEmails, violations, advisories);
|
|
228
228
|
}
|
|
229
229
|
}
|
|
230
230
|
const hardFailures = violations.filter((v) => !v.advisoryOnly);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { ENV_PLANNER_EMAILS } from "./config-namespace.js";
|
|
2
|
+
export declare const REL_PLANNER_ALLOWLIST: ".gitagent/foreman/PLANNER.allowlist";
|
|
3
|
+
export declare const REL_PLANNER_ALLOWLIST_LOCAL: ".gitagent/foreman/PLANNER.allowlist.local";
|
|
4
|
+
export type PlannerIdentitySource = "allowlist_file" | "allowlist_local" | "git_config" | "env" | "git_user_email" | "unset";
|
|
5
|
+
export interface ResolvedPlannerIdentity {
|
|
6
|
+
emails: string[];
|
|
7
|
+
source: PlannerIdentitySource;
|
|
8
|
+
/** Human-readable detail for doctor / errors */
|
|
9
|
+
detail: string;
|
|
10
|
+
}
|
|
11
|
+
/** Legacy env-only parser (tests / explicit CI override). */
|
|
12
|
+
export declare function parsePlannerEmailsFromEnv(): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Resolve Planner legislation allowlist for a repository.
|
|
15
|
+
* Repo-local sources win over shell env so multi-project developers are not cross-contaminated.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolvePlannerEmails(repoRoot: string): ResolvedPlannerIdentity;
|
|
18
|
+
export declare function serializePlannerAllowlist(emails: string[]): string;
|
|
19
|
+
export declare function writePlannerAllowlistLocal(repoRoot: string, emails: string[]): void;
|
|
20
|
+
/** Create gitignored local allowlist from repo git user.email when missing. */
|
|
21
|
+
export declare function ensurePlannerAllowlistOnInit(repoRoot: string): boolean;
|
|
22
|
+
export declare function plannerIdentitySetupHint(_repoRoot: string): string;
|
|
23
|
+
//# sourceMappingURL=planner-identity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"planner-identity.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/planner-identity.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,eAAO,MAAM,qBAAqB,EAAG,qCAA8C,CAAC;AACpF,eAAO,MAAM,2BAA2B,EAAG,2CAAoD,CAAC;AAEhG,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,iBAAiB,GACjB,YAAY,GACZ,KAAK,GACL,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,6DAA6D;AAC7D,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,CA2C9E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGlE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAInF;AAED,+EAA+E;AAC/E,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOlE"}
|
|
@@ -2,11 +2,11 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fromPosix } from "./cli-io.js";
|
|
4
4
|
import { CLI_NAME } from "./constants.js";
|
|
5
|
-
import {
|
|
5
|
+
import { ENV_PLANNER_EMAILS, GIT_CONFIG_PLANNER_EMAILS, readEnvWithLegacy, readGitConfigWithLegacy, } from "./config-namespace.js";
|
|
6
6
|
import { gitRunOk } from "./git.js";
|
|
7
|
-
export {
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
7
|
+
export { ENV_PLANNER_EMAILS } from "./config-namespace.js";
|
|
8
|
+
export const REL_PLANNER_ALLOWLIST = ".gitagent/foreman/PLANNER.allowlist";
|
|
9
|
+
export const REL_PLANNER_ALLOWLIST_LOCAL = ".gitagent/foreman/PLANNER.allowlist.local";
|
|
10
10
|
function normalizeEmailList(raw) {
|
|
11
11
|
const parts = raw
|
|
12
12
|
.split(/[\n,]+/)
|
|
@@ -20,8 +20,8 @@ function readAllowlistFile(repoRoot, relPath) {
|
|
|
20
20
|
return [];
|
|
21
21
|
return normalizeEmailList(fs.readFileSync(abs, "utf8"));
|
|
22
22
|
}
|
|
23
|
-
function
|
|
24
|
-
const raw = readGitConfigWithLegacy(repoRoot, "
|
|
23
|
+
function readGitConfigPlannerEmails(repoRoot) {
|
|
24
|
+
const raw = readGitConfigWithLegacy(repoRoot, "plannerEmails");
|
|
25
25
|
if (!raw)
|
|
26
26
|
return [];
|
|
27
27
|
return normalizeEmailList(raw);
|
|
@@ -34,46 +34,46 @@ function readGitUserEmail(repoRoot) {
|
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
36
|
/** Legacy env-only parser (tests / explicit CI override). */
|
|
37
|
-
export function
|
|
38
|
-
const raw = readEnvWithLegacy("
|
|
37
|
+
export function parsePlannerEmailsFromEnv() {
|
|
38
|
+
const raw = readEnvWithLegacy("PLANNER_EMAILS");
|
|
39
39
|
if (!raw)
|
|
40
40
|
return [];
|
|
41
41
|
return normalizeEmailList(raw);
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
* Resolve
|
|
44
|
+
* Resolve Planner legislation allowlist for a repository.
|
|
45
45
|
* Repo-local sources win over shell env so multi-project developers are not cross-contaminated.
|
|
46
46
|
*/
|
|
47
|
-
export function
|
|
48
|
-
const team = readAllowlistFile(repoRoot,
|
|
49
|
-
const local = readAllowlistFile(repoRoot,
|
|
47
|
+
export function resolvePlannerEmails(repoRoot) {
|
|
48
|
+
const team = readAllowlistFile(repoRoot, REL_PLANNER_ALLOWLIST);
|
|
49
|
+
const local = readAllowlistFile(repoRoot, REL_PLANNER_ALLOWLIST_LOCAL);
|
|
50
50
|
const mergedFile = [...new Set([...team, ...local])];
|
|
51
51
|
if (mergedFile.length > 0) {
|
|
52
52
|
const sources = [];
|
|
53
53
|
if (team.length > 0)
|
|
54
|
-
sources.push(
|
|
54
|
+
sources.push(REL_PLANNER_ALLOWLIST);
|
|
55
55
|
if (local.length > 0)
|
|
56
|
-
sources.push(
|
|
56
|
+
sources.push(REL_PLANNER_ALLOWLIST_LOCAL);
|
|
57
57
|
return {
|
|
58
58
|
emails: mergedFile,
|
|
59
59
|
source: local.length > 0 && team.length === 0 ? "allowlist_local" : "allowlist_file",
|
|
60
60
|
detail: sources.join(" + "),
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
-
const fromGitConfig =
|
|
63
|
+
const fromGitConfig = readGitConfigPlannerEmails(repoRoot);
|
|
64
64
|
if (fromGitConfig.length > 0) {
|
|
65
65
|
return {
|
|
66
66
|
emails: fromGitConfig,
|
|
67
67
|
source: "git_config",
|
|
68
|
-
detail: `git config ${
|
|
68
|
+
detail: `git config ${GIT_CONFIG_PLANNER_EMAILS}`,
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
-
const fromEnv =
|
|
71
|
+
const fromEnv = parsePlannerEmailsFromEnv();
|
|
72
72
|
if (fromEnv.length > 0) {
|
|
73
73
|
return {
|
|
74
74
|
emails: fromEnv,
|
|
75
75
|
source: "env",
|
|
76
|
-
detail:
|
|
76
|
+
detail: ENV_PLANNER_EMAILS,
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
const gitEmail = readGitUserEmail(repoRoot);
|
|
@@ -81,40 +81,40 @@ export function resolveTeacherEmails(repoRoot) {
|
|
|
81
81
|
return {
|
|
82
82
|
emails: [gitEmail],
|
|
83
83
|
source: "git_user_email",
|
|
84
|
-
detail: "git config user.email (implicit single
|
|
84
|
+
detail: "git config user.email (implicit single Planner)",
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
|
-
return { emails: [], source: "unset", detail: "no
|
|
87
|
+
return { emails: [], source: "unset", detail: "no Planner identity configured" };
|
|
88
88
|
}
|
|
89
|
-
export function
|
|
89
|
+
export function serializePlannerAllowlist(emails) {
|
|
90
90
|
const unique = [...new Set(emails.map((e) => e.trim().toLowerCase()).filter((e) => e.includes("@")))];
|
|
91
91
|
return `${unique.join("\n")}\n`;
|
|
92
92
|
}
|
|
93
|
-
export function
|
|
94
|
-
const abs = path.join(repoRoot, fromPosix(
|
|
93
|
+
export function writePlannerAllowlistLocal(repoRoot, emails) {
|
|
94
|
+
const abs = path.join(repoRoot, fromPosix(REL_PLANNER_ALLOWLIST_LOCAL));
|
|
95
95
|
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
96
|
-
fs.writeFileSync(abs,
|
|
96
|
+
fs.writeFileSync(abs, serializePlannerAllowlist(emails), "utf8");
|
|
97
97
|
}
|
|
98
98
|
/** Create gitignored local allowlist from repo git user.email when missing. */
|
|
99
|
-
export function
|
|
100
|
-
const abs = path.join(repoRoot, fromPosix(
|
|
99
|
+
export function ensurePlannerAllowlistOnInit(repoRoot) {
|
|
100
|
+
const abs = path.join(repoRoot, fromPosix(REL_PLANNER_ALLOWLIST_LOCAL));
|
|
101
101
|
if (fs.existsSync(abs))
|
|
102
102
|
return false;
|
|
103
|
-
const team = readAllowlistFile(repoRoot,
|
|
103
|
+
const team = readAllowlistFile(repoRoot, REL_PLANNER_ALLOWLIST);
|
|
104
104
|
if (team.length > 0)
|
|
105
105
|
return false;
|
|
106
106
|
const gitEmail = readGitUserEmail(repoRoot);
|
|
107
107
|
if (!gitEmail)
|
|
108
108
|
return false;
|
|
109
|
-
|
|
109
|
+
writePlannerAllowlistLocal(repoRoot, [gitEmail]);
|
|
110
110
|
return true;
|
|
111
111
|
}
|
|
112
|
-
export function
|
|
112
|
+
export function plannerIdentitySetupHint(_repoRoot) {
|
|
113
113
|
return [
|
|
114
|
-
`echo "$(git config user.email)" >> ${
|
|
115
|
-
`or: git config ${
|
|
116
|
-
`or: ${CLI_NAME}
|
|
117
|
-
`# env ${
|
|
114
|
+
`echo "$(git config user.email)" >> ${REL_PLANNER_ALLOWLIST_LOCAL}`,
|
|
115
|
+
`or: git config ${GIT_CONFIG_PLANNER_EMAILS} "$(git config user.email)"`,
|
|
116
|
+
`or: ${CLI_NAME} planner set "$(git config user.email)"`,
|
|
117
|
+
`# env ${ENV_PLANNER_EMAILS} is CI-only fallback; prefer repo-local config`,
|
|
118
118
|
].join("\n ");
|
|
119
119
|
}
|
|
120
|
-
//# sourceMappingURL=
|
|
120
|
+
//# sourceMappingURL=planner-identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"planner-identity.js","sourceRoot":"","sources":["../../../src/cli/lib/planner-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** `git log --format=%G?` signature letter for a commit. */
|
|
2
|
+
export type GitSignatureStatus = "G" | "U" | "B" | "X" | "Y" | "R" | "E" | "N" | string;
|
|
3
|
+
export declare function gitCommitSignatureStatus(repoRoot: string, commitRef: string): GitSignatureStatus;
|
|
4
|
+
/** Good signature per git (%G? = G or U). */
|
|
5
|
+
export declare function isGoodGitSignatureStatus(status: GitSignatureStatus): boolean;
|
|
6
|
+
export interface PlannerStampSignatureCheck {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
status: GitSignatureStatus;
|
|
9
|
+
}
|
|
10
|
+
export declare function checkPlannerStampSignature(repoRoot: string, commitHash: string): PlannerStampSignatureCheck;
|
|
11
|
+
//# sourceMappingURL=planner-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-signature.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/planner-signature.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;AAExF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAKhG;AAED,6CAA6C;AAC7C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAE5E;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAG5B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { gitRunOk } from "./git.js";
|
|
2
|
+
export function gitCommitSignatureStatus(repoRoot, commitRef) {
|
|
3
|
+
const result = gitRunOk(repoRoot, ["log", "-1", `--format=%G?`, commitRef]);
|
|
4
|
+
if (!result.ok)
|
|
5
|
+
return "N";
|
|
6
|
+
const status = result.stdout.trim();
|
|
7
|
+
return status.length > 0 ? status.charAt(0) : "N";
|
|
8
|
+
}
|
|
9
|
+
/** Good signature per git (%G? = G or U). */
|
|
10
|
+
export function isGoodGitSignatureStatus(status) {
|
|
11
|
+
return status === "G" || status === "U";
|
|
12
|
+
}
|
|
13
|
+
export function checkPlannerStampSignature(repoRoot, commitHash) {
|
|
14
|
+
const status = gitCommitSignatureStatus(repoRoot, commitHash);
|
|
15
|
+
return { ok: isGoodGitSignatureStatus(status), status };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=planner-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-signature.js","sourceRoot":"","sources":["../../../src/cli/lib/planner-signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKpC,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,SAAiB;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AAC1C,CAAC;AAOD,MAAM,UAAU,0BAA0B,CACxC,QAAgB,EAChB,UAAkB;IAElB,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9D,OAAO,EAAE,EAAE,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -25,7 +25,7 @@ export function registerAudiencePreActionHook(program) {
|
|
|
25
25
|
const raw = audienceRawFromArgv(actionCommand);
|
|
26
26
|
const applied = applyAudienceFromArgv(raw);
|
|
27
27
|
if (!applied.ok) {
|
|
28
|
-
logError(`invalid --audience "${applied.invalidValue}" (expected
|
|
28
|
+
logError(`invalid --audience "${applied.invalidValue}" (expected executor|planner|verifier|platform)`);
|
|
29
29
|
setExitCode(2);
|
|
30
30
|
throw new Error(`${CLI_NAME}: invalid audience`);
|
|
31
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program-audience-hook.js","sourceRoot":"","sources":["../../../src/cli/lib/program-audience-hook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpD,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAsB;IACjD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAA2B,CAAC;IACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,EAA2B,CAAC;IAC5E,OAAO,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,aAAsB;IAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAwB,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,EAAwB,CAAC;IACzE,OAAO,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,6BAA6B,CAAC,OAAgB;IAC5D,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,QAAQ,CACN,uBAAuB,OAAO,CAAC,YAAY
|
|
1
|
+
{"version":3,"file":"program-audience-hook.js","sourceRoot":"","sources":["../../../src/cli/lib/program-audience-hook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpD,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAsB;IACjD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAA2B,CAAC;IACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,EAA2B,CAAC;IAC5E,OAAO,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,aAAsB;IAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAwB,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,EAAwB,CAAC;IACzE,OAAO,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,6BAA6B,CAAC,OAAgB;IAC5D,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,QAAQ,CACN,uBAAuB,OAAO,CAAC,YAAY,iDAAiD,CAC7F,CAAC;YACF,WAAW,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,oBAAoB,CAAC,CAAC;QACnD,CAAC;QACD,iBAAiB,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -32,7 +32,7 @@ export function formatProposalHuman(proposal) {
|
|
|
32
32
|
lines.push(` suggested forbidden imports: ${proposal.suggested_forbidden_imports.join(", ")}`);
|
|
33
33
|
}
|
|
34
34
|
lines.push("");
|
|
35
|
-
lines.push("
|
|
35
|
+
lines.push("Planner: review proposal, add skill to MANIFEST.json (Rule 4.4), then gantry legislate with --skill-key.");
|
|
36
36
|
return lines.join("\n");
|
|
37
37
|
}
|
|
38
38
|
//# sourceMappingURL=register-proposals.js.map
|
|
@@ -12,11 +12,11 @@ export interface ResolvedRuntimeEnv {
|
|
|
12
12
|
/** Absolute TMVC roots, newline-delimited string for shells */
|
|
13
13
|
tmvc_roots_joined: string;
|
|
14
14
|
forbidden_zones_joined: string;
|
|
15
|
-
/** Absolute
|
|
16
|
-
|
|
15
|
+
/** Absolute EXECUTOR_LOG path */
|
|
16
|
+
executor_log: string;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Resolve
|
|
19
|
+
* Resolve executor runtime variables for a mission (manifest-aligned TMVC/forbidden zones).
|
|
20
20
|
*/
|
|
21
21
|
export declare function resolveRuntimeEnv(workspace: Workspace, missionRepoOrAbsPath: string): ResolvedRuntimeEnv;
|
|
22
22
|
export declare function resolvedRuntimeEnvToJsonPayload(r: ResolvedRuntimeEnv): Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/runtime-env.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B
|
|
1
|
+
{"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/runtime-env.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAgBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,GAAG,kBAAkB,CAoCxG;AAOD,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW7F"}
|
|
@@ -5,7 +5,7 @@ import { CLI_NAME } from "./constants.js";
|
|
|
5
5
|
import { agentErrorAbsolutePath } from "./errors.js";
|
|
6
6
|
import { parseMissionFile } from "./missions/parser.js";
|
|
7
7
|
import { resolveManifestSkillKey } from "./skill-key.js";
|
|
8
|
-
import {
|
|
8
|
+
import { defaultExecutorLogPath } from "./trace.js";
|
|
9
9
|
function toRepoRelativePosix(repoRoot, absolutePath) {
|
|
10
10
|
const rel = toPosixRel(repoRoot, path.resolve(absolutePath));
|
|
11
11
|
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
|
@@ -17,7 +17,7 @@ function resolvePaths(repoRoot, rootsOrZones) {
|
|
|
17
17
|
return rootsOrZones.map((r) => path.resolve(repoRoot, r.replace(/\\/g, path.sep)));
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* Resolve
|
|
20
|
+
* Resolve executor runtime variables for a mission (manifest-aligned TMVC/forbidden zones).
|
|
21
21
|
*/
|
|
22
22
|
export function resolveRuntimeEnv(workspace, missionRepoOrAbsPath) {
|
|
23
23
|
const { root, manifest } = workspace;
|
|
@@ -46,7 +46,7 @@ export function resolveRuntimeEnv(workspace, missionRepoOrAbsPath) {
|
|
|
46
46
|
skill_key: skillKey,
|
|
47
47
|
tmvc_roots_joined: tmvcAbs.join("\n"),
|
|
48
48
|
forbidden_zones_joined: fzAbs.join("\n"),
|
|
49
|
-
|
|
49
|
+
executor_log: defaultExecutorLogPath(root),
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
function lastErrorFileForRepo(repoRoot) {
|
|
@@ -61,7 +61,7 @@ export function resolvedRuntimeEnvToJsonPayload(r) {
|
|
|
61
61
|
GXT_SKILL_KEY: r.skill_key,
|
|
62
62
|
GXT_TMVC_ROOTS: r.tmvc_roots_joined,
|
|
63
63
|
GXT_FORBIDDEN_ZONES: r.forbidden_zones_joined,
|
|
64
|
-
|
|
64
|
+
GXT_EXECUTOR_LOG: r.executor_log,
|
|
65
65
|
GXT_LAST_ERROR_FILE: lastErrorFileForRepo(r.repo_root),
|
|
66
66
|
};
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../../src/cli/lib/runtime-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../../src/cli/lib/runtime-env.ts"],"names":[],"mappings":"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"}
|