@lingjingai/scriptctl 0.19.2 → 0.21.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/dist/cli.js +99 -11
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +4 -1
- package/dist/common.js +37 -27
- package/dist/common.js.map +1 -1
- package/dist/domain/direct-core.d.ts +6 -3
- package/dist/domain/direct-core.js +89 -72
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/domain/script/address.d.ts +30 -0
- package/dist/domain/script/address.js +141 -0
- package/dist/domain/script/address.js.map +1 -0
- package/dist/domain/script/lookups.d.ts +33 -0
- package/dist/domain/script/lookups.js +309 -0
- package/dist/domain/script/lookups.js.map +1 -0
- package/dist/domain/script/patch/apply.d.ts +4 -0
- package/dist/domain/script/patch/apply.js +38 -0
- package/dist/domain/script/patch/apply.js.map +1 -0
- package/dist/domain/script/patch/helpers.d.ts +11 -0
- package/dist/domain/script/patch/helpers.js +141 -0
- package/dist/domain/script/patch/helpers.js.map +1 -0
- package/dist/domain/script/patch/ops-action.d.ts +12 -0
- package/dist/domain/script/patch/ops-action.js +371 -0
- package/dist/domain/script/patch/ops-action.js.map +1 -0
- package/dist/domain/script/patch/ops-asset.d.ts +13 -0
- package/dist/domain/script/patch/ops-asset.js +363 -0
- package/dist/domain/script/patch/ops-asset.js.map +1 -0
- package/dist/domain/script/patch/ops-dialogue.d.ts +5 -0
- package/dist/domain/script/patch/ops-dialogue.js +233 -0
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -0
- package/dist/domain/script/patch/ops-meta.d.ts +3 -0
- package/dist/domain/script/patch/ops-meta.js +47 -0
- package/dist/domain/script/patch/ops-meta.js.map +1 -0
- package/dist/domain/script/patch/ops-scene.d.ts +6 -0
- package/dist/domain/script/patch/ops-scene.js +345 -0
- package/dist/domain/script/patch/ops-scene.js.map +1 -0
- package/dist/domain/script/patch/ops-state.d.ts +8 -0
- package/dist/domain/script/patch/ops-state.js +146 -0
- package/dist/domain/script/patch/ops-state.js.map +1 -0
- package/dist/domain/script/patch/registry.d.ts +2 -0
- package/dist/domain/script/patch/registry.js +50 -0
- package/dist/domain/script/patch/registry.js.map +1 -0
- package/dist/domain/script/patch/types.d.ts +10 -0
- package/dist/domain/script/patch/types.js +2 -0
- package/dist/domain/script/patch/types.js.map +1 -0
- package/dist/domain/script/refs.d.ts +4 -0
- package/dist/domain/script/refs.js +152 -0
- package/dist/domain/script/refs.js.map +1 -0
- package/dist/domain/script/schema.d.ts +6 -0
- package/dist/domain/script/schema.js +53 -0
- package/dist/domain/script/schema.js.map +1 -0
- package/dist/domain/script/selector.d.ts +45 -0
- package/dist/domain/script/selector.js +187 -0
- package/dist/domain/script/selector.js.map +1 -0
- package/dist/domain/script/shared.d.ts +15 -0
- package/dist/domain/script/shared.js +37 -0
- package/dist/domain/script/shared.js.map +1 -0
- package/dist/domain/script/validate.d.ts +22 -0
- package/dist/domain/script/validate.js +844 -0
- package/dist/domain/script/validate.js.map +1 -0
- package/dist/help-text.js +21 -4
- package/dist/help-text.js.map +1 -1
- package/dist/infra/providers.d.ts +2 -0
- package/dist/infra/providers.js +81 -35
- package/dist/infra/providers.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.js +11 -1
- package/dist/output.js.map +1 -1
- package/dist/usecases/direct.js +1 -1
- package/dist/usecases/direct.js.map +1 -1
- package/dist/usecases/parse.js +1 -1
- package/dist/usecases/parse.js.map +1 -1
- package/dist/usecases/script/actions.d.ts +3 -0
- package/dist/usecases/script/actions.js +71 -0
- package/dist/usecases/script/actions.js.map +1 -0
- package/dist/usecases/script/actor.d.ts +3 -0
- package/dist/usecases/script/actor.js +27 -0
- package/dist/usecases/script/actor.js.map +1 -0
- package/dist/usecases/script/actors.d.ts +3 -0
- package/dist/usecases/script/actors.js +15 -0
- package/dist/usecases/script/actors.js.map +1 -0
- package/dist/usecases/script/add-actor.d.ts +3 -0
- package/dist/usecases/script/add-actor.js +13 -0
- package/dist/usecases/script/add-actor.js.map +1 -0
- package/dist/usecases/script/add-episode.d.ts +3 -0
- package/dist/usecases/script/add-episode.js +9 -0
- package/dist/usecases/script/add-episode.js.map +1 -0
- package/dist/usecases/script/add-location.d.ts +3 -0
- package/dist/usecases/script/add-location.js +11 -0
- package/dist/usecases/script/add-location.js.map +1 -0
- package/dist/usecases/script/add-prop.d.ts +3 -0
- package/dist/usecases/script/add-prop.js +11 -0
- package/dist/usecases/script/add-prop.js.map +1 -0
- package/dist/usecases/script/add-speaker.d.ts +3 -0
- package/dist/usecases/script/add-speaker.js +22 -0
- package/dist/usecases/script/add-speaker.js.map +1 -0
- package/dist/usecases/script/alias.d.ts +3 -0
- package/dist/usecases/script/alias.js +40 -0
- package/dist/usecases/script/alias.js.map +1 -0
- package/dist/usecases/script/assets.d.ts +3 -0
- package/dist/usecases/script/assets.js +21 -0
- package/dist/usecases/script/assets.js.map +1 -0
- package/dist/usecases/script/context.d.ts +3 -0
- package/dist/usecases/script/context.js +20 -0
- package/dist/usecases/script/context.js.map +1 -0
- package/dist/usecases/script/create.d.ts +3 -0
- package/dist/usecases/script/create.js +81 -0
- package/dist/usecases/script/create.js.map +1 -0
- package/dist/usecases/script/delete.d.ts +3 -0
- package/dist/usecases/script/delete.js +79 -0
- package/dist/usecases/script/delete.js.map +1 -0
- package/dist/usecases/script/describe.d.ts +3 -0
- package/dist/usecases/script/describe.js +31 -0
- package/dist/usecases/script/describe.js.map +1 -0
- package/dist/usecases/script/dialogue.d.ts +3 -0
- package/dist/usecases/script/dialogue.js +28 -0
- package/dist/usecases/script/dialogue.js.map +1 -0
- package/dist/usecases/script/do.d.ts +3 -0
- package/dist/usecases/script/do.js +130 -0
- package/dist/usecases/script/do.js.map +1 -0
- package/dist/usecases/script/episodes.d.ts +3 -0
- package/dist/usecases/script/episodes.js +36 -0
- package/dist/usecases/script/episodes.js.map +1 -0
- package/dist/usecases/script/export.d.ts +3 -0
- package/dist/usecases/script/export.js +117 -0
- package/dist/usecases/script/export.js.map +1 -0
- package/dist/usecases/script/insert.d.ts +3 -0
- package/dist/usecases/script/insert.js +87 -0
- package/dist/usecases/script/insert.js.map +1 -0
- package/dist/usecases/script/issues.d.ts +3 -0
- package/dist/usecases/script/issues.js +27 -0
- package/dist/usecases/script/issues.js.map +1 -0
- package/dist/usecases/script/lib.d.ts +77 -0
- package/dist/usecases/script/lib.js +849 -0
- package/dist/usecases/script/lib.js.map +1 -0
- package/dist/usecases/script/locations.d.ts +3 -0
- package/dist/usecases/script/locations.js +15 -0
- package/dist/usecases/script/locations.js.map +1 -0
- package/dist/usecases/script/merge.d.ts +3 -0
- package/dist/usecases/script/merge.js +43 -0
- package/dist/usecases/script/merge.js.map +1 -0
- package/dist/usecases/script/move.d.ts +3 -0
- package/dist/usecases/script/move.js +33 -0
- package/dist/usecases/script/move.js.map +1 -0
- package/dist/usecases/script/overlap.d.ts +3 -0
- package/dist/usecases/script/overlap.js +21 -0
- package/dist/usecases/script/overlap.js.map +1 -0
- package/dist/usecases/script/props.d.ts +3 -0
- package/dist/usecases/script/props.js +15 -0
- package/dist/usecases/script/props.js.map +1 -0
- package/dist/usecases/script/refs.d.ts +3 -0
- package/dist/usecases/script/refs.js +61 -0
- package/dist/usecases/script/refs.js.map +1 -0
- package/dist/usecases/script/rename.d.ts +3 -0
- package/dist/usecases/script/rename.js +17 -0
- package/dist/usecases/script/rename.js.map +1 -0
- package/dist/usecases/script/replace.d.ts +3 -0
- package/dist/usecases/script/replace.js +35 -0
- package/dist/usecases/script/replace.js.map +1 -0
- package/dist/usecases/script/role.d.ts +3 -0
- package/dist/usecases/script/role.js +17 -0
- package/dist/usecases/script/role.js.map +1 -0
- package/dist/usecases/script/scenes.d.ts +3 -0
- package/dist/usecases/script/scenes.js +45 -0
- package/dist/usecases/script/scenes.js.map +1 -0
- package/dist/usecases/script/script-patch.d.ts +3 -0
- package/dist/usecases/script/script-patch.js +187 -0
- package/dist/usecases/script/script-patch.js.map +1 -0
- package/dist/usecases/script/script-validate.d.ts +3 -0
- package/dist/usecases/script/script-validate.js +30 -0
- package/dist/usecases/script/script-validate.js.map +1 -0
- package/dist/usecases/script/session.d.ts +44 -0
- package/dist/usecases/script/session.js +527 -0
- package/dist/usecases/script/session.js.map +1 -0
- package/dist/usecases/script/speakers.d.ts +3 -0
- package/dist/usecases/script/speakers.js +28 -0
- package/dist/usecases/script/speakers.js.map +1 -0
- package/dist/usecases/script/split.d.ts +3 -0
- package/dist/usecases/script/split.js +37 -0
- package/dist/usecases/script/split.js.map +1 -0
- package/dist/usecases/script/state-add.d.ts +3 -0
- package/dist/usecases/script/state-add.js +23 -0
- package/dist/usecases/script/state-add.js.map +1 -0
- package/dist/usecases/script/state-change.d.ts +3 -0
- package/dist/usecases/script/state-change.js +24 -0
- package/dist/usecases/script/state-change.js.map +1 -0
- package/dist/usecases/script/state-delete.d.ts +3 -0
- package/dist/usecases/script/state-delete.js +23 -0
- package/dist/usecases/script/state-delete.js.map +1 -0
- package/dist/usecases/script/state-rename.d.ts +3 -0
- package/dist/usecases/script/state-rename.js +17 -0
- package/dist/usecases/script/state-rename.js.map +1 -0
- package/dist/usecases/script/summary.d.ts +3 -0
- package/dist/usecases/script/summary.js +45 -0
- package/dist/usecases/script/summary.js.map +1 -0
- package/dist/usecases/script/transition.d.ts +3 -0
- package/dist/usecases/script/transition.js +24 -0
- package/dist/usecases/script/transition.js.map +1 -0
- package/dist/usecases/script/type.d.ts +3 -0
- package/dist/usecases/script/type.js +24 -0
- package/dist/usecases/script/type.js.map +1 -0
- package/dist/usecases/script/worldview.d.ts +3 -0
- package/dist/usecases/script/worldview.js +18 -0
- package/dist/usecases/script/worldview.js.map +1 -0
- package/package.json +1 -1
- package/dist/domain/script-core.d.ts +0 -78
- package/dist/domain/script-core.js +0 -3026
- package/dist/domain/script-core.js.map +0 -1
- package/dist/usecases/script.d.ts +0 -67
- package/dist/usecases/script.js +0 -2348
- package/dist/usecases/script.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { applySingleScriptOp, requireNameArg, } from "./lib.js";
|
|
2
|
+
export async function commandAddLocation(opts) {
|
|
3
|
+
const name = requireNameArg(opts, "add-location", "Example: scriptctl add-location \"教室\"");
|
|
4
|
+
return applySingleScriptOp(opts, {
|
|
5
|
+
op: "location.add",
|
|
6
|
+
name,
|
|
7
|
+
location_id: opts["id"],
|
|
8
|
+
description: opts["description"],
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=add-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-location.js","sourceRoot":"","sources":["../../../src/usecases/script/add-location.ts"],"names":[],"mappings":"AAmEA,OAAO,EAC+I,mBAAmB,EAA6U,cAAc,GACngB,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,wCAAwC,CAAC,CAAC;IAC5F,OAAO,mBAAmB,CAAC,IAAI,EAAE;QAC/B,EAAE,EAAE,cAAc;QAClB,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC;QACvB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { applySingleScriptOp, requireNameArg, } from "./lib.js";
|
|
2
|
+
export async function commandAddProp(opts) {
|
|
3
|
+
const name = requireNameArg(opts, "add-prop", "Example: scriptctl add-prop \"怀表\"");
|
|
4
|
+
return applySingleScriptOp(opts, {
|
|
5
|
+
op: "prop.add",
|
|
6
|
+
name,
|
|
7
|
+
prop_id: opts["id"],
|
|
8
|
+
description: opts["description"],
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=add-prop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-prop.js","sourceRoot":"","sources":["../../../src/usecases/script/add-prop.ts"],"names":[],"mappings":"AAmEA,OAAO,EAC+I,mBAAmB,EAA6U,cAAc,GACngB,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU;IAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,oCAAoC,CAAC,CAAC;IACpF,OAAO,mBAAmB,CAAC,IAAI,EAAE;QAC/B,EAAE,EAAE,UAAU;QACd,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QACnB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { applySingleScriptOp, } from "./lib.js";
|
|
2
|
+
export async function commandAddSpeaker(opts) {
|
|
3
|
+
return applySingleScriptOp(opts, {
|
|
4
|
+
op: "speaker.add",
|
|
5
|
+
kind: opts["kind"],
|
|
6
|
+
name: opts["name"],
|
|
7
|
+
source_id: opts["source_id"],
|
|
8
|
+
voice_desc: opts["voice_desc"],
|
|
9
|
+
speaker_id: opts["speaker_id"],
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
// ----- create (blank scaffold) ----------------------------------------------
|
|
13
|
+
// Create an empty schema-v2 script as the starting point for building a script
|
|
14
|
+
// bottom-up with the atomic add/insert verbs (instead of direct/parse/write
|
|
15
|
+
// assembly). Targets the same three destinations as the edit verbs:
|
|
16
|
+
// --script-path <file> local JSON file
|
|
17
|
+
// --draft the direct intermediate (script.initial.json)
|
|
18
|
+
// --project-group-no DB-backed script-output (first write at revision 0)
|
|
19
|
+
// Refuses to clobber an existing target (local: pass --force to overwrite; DB:
|
|
20
|
+
// edit the existing script instead). Validates in incomplete-tolerant mode, so
|
|
21
|
+
// the blank scaffold reports passed.
|
|
22
|
+
//# sourceMappingURL=add-speaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-speaker.js","sourceRoot":"","sources":["../../../src/usecases/script/add-speaker.ts"],"names":[],"mappings":"AAmEA,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU;IAChD,OAAO,mBAAmB,CAAC,IAAI,EAAE;QAC/B,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;QAC5B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;QAC9B,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,+EAA+E;AAC/E,4EAA4E;AAC5E,oEAAoE;AACpE,0CAA0C;AAC1C,wEAAwE;AACxE,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,qCAAqC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { asList, } from "../../domain/script/shared.js";
|
|
3
|
+
import { applySingleScriptOp, } from "./lib.js";
|
|
4
|
+
export async function commandAlias(opts) {
|
|
5
|
+
const args = asList(opts["_args"]);
|
|
6
|
+
if (args.length < 1) {
|
|
7
|
+
throw new CliError("VERB BLOCKED: Asset address missing", "Asset address missing.", {
|
|
8
|
+
exitCode: EXIT_USAGE,
|
|
9
|
+
required: ["<asset-addr>"],
|
|
10
|
+
received: ["<empty>"],
|
|
11
|
+
nextSteps: ["Example: scriptctl alias actor:act_001 --add \"陈总\""],
|
|
12
|
+
errorCode: "ARGS_MISSING",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
// appendStr collectors default to []; empty arrays are truthy, so we MUST
|
|
16
|
+
// check `.length === 0` rather than `!add` (which is always false here).
|
|
17
|
+
// Without this, passing only --add still runs the remove op with alias=[]
|
|
18
|
+
// and crashes mid-write at op layer after the add already succeeded.
|
|
19
|
+
const add = asList(opts["add"]);
|
|
20
|
+
const remove = asList(opts["remove"]);
|
|
21
|
+
if (add.length === 0 && remove.length === 0) {
|
|
22
|
+
throw new CliError("VERB BLOCKED: --add or --remove required", "--add or --remove required.", {
|
|
23
|
+
exitCode: EXIT_USAGE,
|
|
24
|
+
required: ["--add <alias> and/or --remove <alias>"],
|
|
25
|
+
received: ["<empty>"],
|
|
26
|
+
nextSteps: ["Pass --add and/or --remove at least once."],
|
|
27
|
+
errorCode: "ALIAS_EMPTY",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// Run only the ops that have content; either one of them solo, or both.
|
|
31
|
+
let lastReport = null;
|
|
32
|
+
if (add.length > 0) {
|
|
33
|
+
lastReport = await applySingleScriptOp(opts, { op: "asset.alias.add", target: args[0], alias: add });
|
|
34
|
+
}
|
|
35
|
+
if (remove.length > 0) {
|
|
36
|
+
lastReport = await applySingleScriptOp(opts, { op: "asset.alias.remove", target: args[0], alias: remove });
|
|
37
|
+
}
|
|
38
|
+
return lastReport;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.js","sourceRoot":"","sources":["../../../src/usecases/script/alias.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAmCzB,OAAO,EACL,MAAM,GAKP,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAU;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,qCAAqC,EAAE,wBAAwB,EAAE;YAClF,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,cAAc,CAAC;YAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,qDAAqD,CAAC;YAClE,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,qEAAqE;IACrE,MAAM,GAAG,GAAG,MAAM,CAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,0CAA0C,EAAE,6BAA6B,EAAE;YAC5F,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,uCAAuC,CAAC;YACnD,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,2CAA2C,CAAC;YACxD,SAAS,EAAE,aAAa;SACzB,CAAC,CAAC;IACL,CAAC;IACD,wEAAwE;IACxE,IAAI,UAAU,GAA4B,IAAI,CAAC;IAC/C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,UAAU,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,UAAU,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,UAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { EXIT_OK, } from "../../common.js";
|
|
2
|
+
import { parseInSelector, } from "../../domain/script/selector.js";
|
|
3
|
+
import { strOf, } from "../../domain/script/shared.js";
|
|
4
|
+
import { loadScriptForEdit, } from "./session.js";
|
|
5
|
+
import { buildReport, listAssetsByKind, } from "./lib.js";
|
|
6
|
+
export async function commandAssets(opts) {
|
|
7
|
+
const session = await loadScriptForEdit(opts);
|
|
8
|
+
const kindFilter = strOf(opts["kind"]).trim();
|
|
9
|
+
const nameOpt = strOf(opts["name"]).trim();
|
|
10
|
+
const idOpt = strOf(opts["id"]).trim();
|
|
11
|
+
const selector = parseInSelector(strOf(opts["in"]));
|
|
12
|
+
const lines = [];
|
|
13
|
+
for (const kind of ["actor", "location", "prop"]) {
|
|
14
|
+
if (kindFilter && kindFilter !== kind)
|
|
15
|
+
continue;
|
|
16
|
+
lines.push(...listAssetsByKind(session.script, kind, { id: idOpt, name: nameOpt, selector }));
|
|
17
|
+
}
|
|
18
|
+
return [buildReport("query.assets", "ASSETS", lines, session.artifactLabel, ["Use `scriptctl actors` / `locations` / `props` for kind-scoped views."]), EXIT_OK];
|
|
19
|
+
}
|
|
20
|
+
// ----- speakers -------------------------------------------------------------
|
|
21
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/usecases/script/assets.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,OAAO,GAWR,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAIL,eAAe,GAGhB,MAAM,iCAAiC,CAAC;AAwBzC,OAAO,EAKL,KAAK,GACN,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EACwS,WAAW,EAAqI,gBAAgB,GAC9c,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAU,EAAE,CAAC;QAC1D,IAAI,UAAU,IAAI,UAAU,KAAK,IAAI;YAAE,SAAS;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EACxE,CAAC,uEAAuE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAED,+EAA+E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { asList, strOf, } from "../../domain/script/shared.js";
|
|
3
|
+
import { applySingleScriptOp, } from "./lib.js";
|
|
4
|
+
import { contextTemplate } from "./lib.js";
|
|
5
|
+
export async function commandContext(opts) {
|
|
6
|
+
const args = asList(opts["_args"]);
|
|
7
|
+
if (args.length < 2) {
|
|
8
|
+
throw new CliError("VERB BLOCKED: context args missing", "context args missing.", {
|
|
9
|
+
exitCode: EXIT_USAGE,
|
|
10
|
+
required: ["<scene-addr> <asset-addr>"],
|
|
11
|
+
received: args,
|
|
12
|
+
nextSteps: ["Example: scriptctl context ep_001/scn_001 actor:act_001 --state st_calm"],
|
|
13
|
+
errorCode: "ARGS_MISSING",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const template = contextTemplate(strOf(args[1]), { state: opts["state"], clear: Boolean(opts["clear"]), remove: Boolean(opts["remove"]) });
|
|
17
|
+
return applySingleScriptOp(opts, { ...template, at: args[0] });
|
|
18
|
+
}
|
|
19
|
+
// ----- state change / transition --------------------------------------------
|
|
20
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/usecases/script/context.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAmCzB,OAAO,EACL,MAAM,EAIN,KAAK,GACN,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,oCAAoC,EAAE,uBAAuB,EAAE;YAChF,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,2BAA2B,CAAC;YACvC,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,CAAC,yEAAyE,CAAC;YACtF,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3I,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,+EAA+E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { CliError, EXIT_INPUT, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, directDir, exists, writeJson, } from "../../common.js";
|
|
3
|
+
import { blankScript } from "../../domain/script/lookups.js";
|
|
4
|
+
import { ScriptOutputApiError, } from "../../infra/script-output-store.js";
|
|
5
|
+
import { strOf, } from "../../domain/script/shared.js";
|
|
6
|
+
import { ScriptEditSession, scriptOutputClient, apiErrorToCli, currentRevisionOrZero, validateSession, syncValidationResult, requestIdForScriptWrite, } from "./session.js";
|
|
7
|
+
import { blankCreateReport, } from "./lib.js";
|
|
8
|
+
export async function commandCreate(opts) {
|
|
9
|
+
const workspace = strOf(opts["workspace_path"] || "workspace");
|
|
10
|
+
const force = Boolean(opts["force"]);
|
|
11
|
+
const title = strOf(opts["title"]).trim();
|
|
12
|
+
const script = blankScript(title);
|
|
13
|
+
const draft = Boolean(opts["draft"]);
|
|
14
|
+
const scriptPathOpt = strOf(opts["script_path"]).trim();
|
|
15
|
+
if (draft && scriptPathOpt) {
|
|
16
|
+
throw new CliError("CREATE BLOCKED: --draft conflicts with --script-path", "--draft conflicts with --script-path.", {
|
|
17
|
+
exitCode: EXIT_USAGE,
|
|
18
|
+
required: ["either --draft or --script-path, not both"],
|
|
19
|
+
received: ["--draft and --script-path"],
|
|
20
|
+
nextSteps: ["Drop one of the two flags and retry."],
|
|
21
|
+
errorCode: "DRAFT_FLAG_CONFLICT",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (draft && strOf(opts["project_group_no"]).trim()) {
|
|
25
|
+
throw new CliError("CREATE BLOCKED: --draft conflicts with --project-group-no", "--draft conflicts with --project-group-no.", {
|
|
26
|
+
exitCode: EXIT_USAGE,
|
|
27
|
+
required: ["either --draft (local draft) or --project-group-no (DB), not both"],
|
|
28
|
+
received: ["--draft and --project-group-no"],
|
|
29
|
+
nextSteps: ["Drop one of the two flags and retry."],
|
|
30
|
+
errorCode: "DRAFT_FLAG_CONFLICT",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const localPath = draft ? path.join(directDir(workspace), "script.initial.json") : (scriptPathOpt || null);
|
|
34
|
+
if (localPath) {
|
|
35
|
+
if (exists(localPath) && !force) {
|
|
36
|
+
throw new CliError("CREATE BLOCKED: target already exists", "A script already exists at the target.", {
|
|
37
|
+
exitCode: EXIT_INPUT,
|
|
38
|
+
required: ["a non-existent target, or --force to overwrite"],
|
|
39
|
+
received: [localPath],
|
|
40
|
+
nextSteps: ["Edit the existing script with the atomic verbs, or pass --force to overwrite with a blank scaffold."],
|
|
41
|
+
errorCode: "SCRIPT_EXISTS",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
writeJson(localPath, script);
|
|
45
|
+
const session = new ScriptEditSession({ workspace, scriptPath: localPath, script });
|
|
46
|
+
const validation = validateSession(session);
|
|
47
|
+
const passed = Boolean(validation["passed"]);
|
|
48
|
+
return [blankCreateReport(session, validation, null), passed ? EXIT_OK : EXIT_NEEDS_AGENT];
|
|
49
|
+
}
|
|
50
|
+
// DB mode: first write must be at revision 0. We never silently overwrite a
|
|
51
|
+
// populated DB script with a blank one — that would destroy work.
|
|
52
|
+
const client = scriptOutputClient(opts);
|
|
53
|
+
const baseRevision = await currentRevisionOrZero(client);
|
|
54
|
+
if (baseRevision > 0) {
|
|
55
|
+
throw new CliError("CREATE BLOCKED: DB script already exists", "A script already exists for this project.", {
|
|
56
|
+
exitCode: EXIT_INPUT,
|
|
57
|
+
required: ["an empty project (no published script)"],
|
|
58
|
+
received: [`revision=${baseRevision}`],
|
|
59
|
+
nextSteps: ["Edit the existing script with the atomic verbs instead of creating a blank one."],
|
|
60
|
+
errorCode: "SCRIPT_EXISTS",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const requestId = requestIdForScriptWrite(opts, "script.create", { script });
|
|
64
|
+
let res;
|
|
65
|
+
try {
|
|
66
|
+
res = await client.replaceScript({ requestId, baseRevision, script, source: "ctl" });
|
|
67
|
+
}
|
|
68
|
+
catch (exc) {
|
|
69
|
+
if (exc instanceof ScriptOutputApiError) {
|
|
70
|
+
throw apiErrorToCli("SCRIPT API BLOCKED: Create write failed", exc);
|
|
71
|
+
}
|
|
72
|
+
throw exc;
|
|
73
|
+
}
|
|
74
|
+
const revision = Number(res["revision"] ?? 0);
|
|
75
|
+
const session = new ScriptEditSession({ workspace, script, client, projectGroupNo: client.projectGroupNo, revision });
|
|
76
|
+
const validation = validateSession(session);
|
|
77
|
+
await syncValidationResult(session, validation, revision);
|
|
78
|
+
const passed = Boolean(validation["passed"]);
|
|
79
|
+
return [blankCreateReport(session, validation, Boolean(res["idempotent"])), passed ? EXIT_OK : EXIT_NEEDS_AGENT];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/usecases/script/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,OAAO,EAEP,UAAU,EAEV,SAAS,EACT,MAAM,EAKN,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAqB7D,OAAO,EACL,oBAAoB,GAIrB,MAAM,oCAAoC,CAAC;AAO5C,OAAO,EAKL,KAAK,GACN,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,iBAAiB,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EACxD,eAAe,EAAqB,oBAAoB,EACE,uBAAuB,GACrG,MAAM,cAAc,CAAC;AACtB,OAAO,EAC4d,iBAAiB,GACnf,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC,sDAAsD,EAAE,uCAAuC,EAAE;YAClH,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,2CAA2C,CAAC;YACvD,QAAQ,EAAE,CAAC,2BAA2B,CAAC;YACvC,SAAS,EAAE,CAAC,sCAAsC,CAAC;YACnD,SAAS,EAAE,qBAAqB;SACjC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,2DAA2D,EAAE,4CAA4C,EAAE;YAC5H,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,mEAAmE,CAAC;YAC/E,QAAQ,EAAE,CAAC,gCAAgC,CAAC;YAC5C,SAAS,EAAE,CAAC,sCAAsC,CAAC;YACnD,SAAS,EAAE,qBAAqB;SACjC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;IAC3G,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,CAAC,uCAAuC,EAAE,wCAAwC,EAAE;gBACpG,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,CAAC,gDAAgD,CAAC;gBAC5D,QAAQ,EAAE,CAAC,SAAS,CAAC;gBACrB,SAAS,EAAE,CAAC,qGAAqG,CAAC;gBAClH,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7F,CAAC;IAED,4EAA4E;IAC5E,kEAAkE;IAClE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAAC,0CAA0C,EAAE,2CAA2C,EAAE;YAC1G,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,wCAAwC,CAAC;YACpD,QAAQ,EAAE,CAAC,YAAY,YAAY,EAAE,CAAC;YACtC,SAAS,EAAE,CAAC,iFAAiF,CAAC;YAC9F,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,GAAS,CAAC;IACd,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;YACxC,MAAM,aAAa,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtH,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { parseAnyAddress, } from "../../domain/script/address.js";
|
|
3
|
+
import { asList, } from "../../domain/script/shared.js";
|
|
4
|
+
import { applySingleScriptOp, } from "./lib.js";
|
|
5
|
+
export async function commandDelete(opts) {
|
|
6
|
+
const args = asList(opts["_args"]);
|
|
7
|
+
if (args.length < 1) {
|
|
8
|
+
throw new CliError("VERB BLOCKED: Address missing", "Address missing.", {
|
|
9
|
+
exitCode: EXIT_USAGE,
|
|
10
|
+
required: ["address"],
|
|
11
|
+
received: ["<empty>"],
|
|
12
|
+
nextSteps: ["Pass an address (action / scene / asset / speaker)."],
|
|
13
|
+
errorCode: "ADDRESS_MISSING",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const addr = parseAnyAddress(args[0]);
|
|
17
|
+
// Per-kind flag whitelist — silently ignoring wrong-kind flags hid real
|
|
18
|
+
// misuse (e.g. `delete actor:X --force` did NOT bypass ref protection, but
|
|
19
|
+
// the user assumed it did). Surface the mismatch with an explicit error.
|
|
20
|
+
const flagsUsed = {
|
|
21
|
+
strategy: opts["strategy"] !== undefined,
|
|
22
|
+
replacement: opts["replacement"] !== undefined,
|
|
23
|
+
force: Boolean(opts["force"]),
|
|
24
|
+
};
|
|
25
|
+
function rejectFlags(kind, allowed) {
|
|
26
|
+
const allow = new Set(allowed);
|
|
27
|
+
const bad = [];
|
|
28
|
+
for (const f of ["strategy", "replacement", "force"]) {
|
|
29
|
+
if (flagsUsed[f] && !allow.has(f))
|
|
30
|
+
bad.push(`--${f}`);
|
|
31
|
+
}
|
|
32
|
+
if (bad.length > 0) {
|
|
33
|
+
throw new CliError("VERB BLOCKED: flag not applicable", `${bad.join(", ")} cannot be used with ${kind} delete.`, {
|
|
34
|
+
exitCode: EXIT_USAGE,
|
|
35
|
+
required: [`for ${kind} delete: ${allowed.length === 0 ? "no extra flags" : allowed.map((f) => `--${f}`).join(" / ")}`],
|
|
36
|
+
received: bad,
|
|
37
|
+
nextSteps: ["Drop the unsupported flag(s) and retry."],
|
|
38
|
+
errorCode: "DELETE_FLAG_INVALID",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const op = (() => {
|
|
43
|
+
if (addr.kind === "action") {
|
|
44
|
+
rejectFlags("action", []);
|
|
45
|
+
return { op: "action.delete", at: args[0] };
|
|
46
|
+
}
|
|
47
|
+
if (addr.kind === "scene") {
|
|
48
|
+
rejectFlags("scene", ["force"]);
|
|
49
|
+
return { op: "scene.delete", at: args[0], force: Boolean(opts["force"]) };
|
|
50
|
+
}
|
|
51
|
+
if (addr.kind === "asset") {
|
|
52
|
+
rejectFlags("asset", ["strategy", "replacement"]);
|
|
53
|
+
return {
|
|
54
|
+
op: "asset.delete",
|
|
55
|
+
target: args[0],
|
|
56
|
+
strategy: opts["strategy"],
|
|
57
|
+
replacement: opts["replacement"],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (addr.kind === "speaker") {
|
|
61
|
+
rejectFlags("speaker", ["strategy", "replacement"]);
|
|
62
|
+
return {
|
|
63
|
+
op: "speaker.delete",
|
|
64
|
+
target: addr.speakerId,
|
|
65
|
+
strategy: opts["strategy"],
|
|
66
|
+
replacement: opts["replacement"],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
throw new CliError("VERB BLOCKED: delete cannot operate on this address", "delete cannot operate on this address.", {
|
|
70
|
+
exitCode: EXIT_USAGE,
|
|
71
|
+
required: ["action / scene / asset / speaker address"],
|
|
72
|
+
received: [args[0]],
|
|
73
|
+
nextSteps: ["Use a supported address."],
|
|
74
|
+
errorCode: "ADDRESS_UNSUPPORTED",
|
|
75
|
+
});
|
|
76
|
+
})();
|
|
77
|
+
return applySingleScriptOp(opts, op);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/usecases/script/delete.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EACL,eAAe,GAKhB,MAAM,gCAAgC,CAAC;AAiBxC,OAAO,EACL,MAAM,GAKP,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,+BAA+B,EAAE,kBAAkB,EAAE;YACtE,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,qDAAqD,CAAC;YAClE,SAAS,EAAE,iBAAiB;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,SAAS,GAAG;QAChB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS;QACxC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,SAAS;QAC9C,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC9B,CAAC;IACF,SAAS,WAAW,CAAC,IAAY,EAAE,OAAsC;QACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,OAAO,CAAC,CAAC;QACvC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAU,EAAE,CAAC;YAC9D,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,IAAI,UAAU,EAAE;gBAC/G,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,CAAC,OAAO,IAAI,YAAY,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvH,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,CAAC,yCAAyC,CAAC;gBACtD,SAAS,EAAE,qBAAqB;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAS,CAAC,GAAG,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1B,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,WAAW,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;YAClD,OAAO;gBACL,EAAE,EAAE,cAAc;gBAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;gBACf,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;aACjC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;YACpD,OAAO;gBACL,EAAE,EAAE,gBAAgB;gBACpB,MAAM,EAAE,IAAI,CAAC,SAAS;gBACtB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;aACjC,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,qDAAqD,EAAE,wCAAwC,EAAE;YAClH,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,0CAA0C,CAAC;YACtD,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;YACpB,SAAS,EAAE,CAAC,0BAA0B,CAAC;YACvC,SAAS,EAAE,qBAAqB;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { parseAnyAddress, } from "../../domain/script/address.js";
|
|
3
|
+
import { asList, } from "../../domain/script/shared.js";
|
|
4
|
+
import { applySingleScriptOp, } from "./lib.js";
|
|
5
|
+
export async function commandDescribe(opts) {
|
|
6
|
+
const args = asList(opts["_args"]);
|
|
7
|
+
if (args.length < 2) {
|
|
8
|
+
throw new CliError("VERB BLOCKED: Describe args missing", "Describe args missing.", {
|
|
9
|
+
exitCode: EXIT_USAGE,
|
|
10
|
+
required: ["<addr> <text>"],
|
|
11
|
+
received: args,
|
|
12
|
+
nextSteps: ["Example: scriptctl describe actor:act_001 \"男主\" or scriptctl describe actor:act_001/st_calm \"...\""],
|
|
13
|
+
errorCode: "ARGS_MISSING",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const addr = parseAnyAddress(args[0]);
|
|
17
|
+
if (addr.kind === "state") {
|
|
18
|
+
return applySingleScriptOp(opts, { op: "state.describe", target: args[0], description: args[1] });
|
|
19
|
+
}
|
|
20
|
+
if (addr.kind === "asset") {
|
|
21
|
+
return applySingleScriptOp(opts, { op: "asset.describe", target: args[0], description: args[1] });
|
|
22
|
+
}
|
|
23
|
+
throw new CliError("VERB BLOCKED: describe address invalid", "describe address invalid.", {
|
|
24
|
+
exitCode: EXIT_USAGE,
|
|
25
|
+
required: ["asset address (e.g. actor:act_001) or state address (e.g. actor:act_001/st_calm)"],
|
|
26
|
+
received: [args[0]],
|
|
27
|
+
nextSteps: ["Use a supported address."],
|
|
28
|
+
errorCode: "ADDRESS_UNSUPPORTED",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../src/usecases/script/describe.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EACL,eAAe,GAKhB,MAAM,gCAAgC,CAAC;AAiBxC,OAAO,EACL,MAAM,GAKP,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,GACxK,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,qCAAqC,EAAE,wBAAwB,EAAE;YAClF,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,eAAe,CAAC;YAC3B,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,CAAC,sGAAsG,CAAC;YACnH,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,wCAAwC,EAAE,2BAA2B,EAAE;QACxF,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,CAAC,kFAAkF,CAAC;QAC9F,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,SAAS,EAAE,CAAC,0BAA0B,CAAC;QACvC,SAAS,EAAE,qBAAqB;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { asList, } from "../../domain/script/shared.js";
|
|
3
|
+
import { applySingleScriptOp, splitSpeakerList, } from "./lib.js";
|
|
4
|
+
import { dialogueTemplate } from "./lib.js";
|
|
5
|
+
export async function commandDialogue(opts) {
|
|
6
|
+
const args = asList(opts["_args"]);
|
|
7
|
+
if (args.length < 1) {
|
|
8
|
+
throw new CliError("VERB BLOCKED: dialogue action ref missing", "dialogue action ref missing.", {
|
|
9
|
+
exitCode: EXIT_USAGE,
|
|
10
|
+
required: ["<action-addr>"],
|
|
11
|
+
received: ["<empty>"],
|
|
12
|
+
nextSteps: ["Example: scriptctl dialogue ep_001/scn_001#3 --speakers spk_001"],
|
|
13
|
+
errorCode: "ARGS_MISSING",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const speakers = splitSpeakerList(opts["speakers"]);
|
|
17
|
+
if (speakers.length === 0) {
|
|
18
|
+
throw new CliError("VERB BLOCKED: --speakers required", "--speakers required.", {
|
|
19
|
+
exitCode: EXIT_USAGE,
|
|
20
|
+
required: ["--speakers id1[,id2,...]"],
|
|
21
|
+
received: ["<empty>"],
|
|
22
|
+
nextSteps: ["Pass one or more speaker ids."],
|
|
23
|
+
errorCode: "SPEAKERS_EMPTY",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return applySingleScriptOp(opts, { ...dialogueTemplate(speakers, { delivery: opts["delivery"] }), at: args[0] });
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=dialogue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue.js","sourceRoot":"","sources":["../../../src/usecases/script/dialogue.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,QAAQ,EAKR,UAAU,GASX,MAAM,iBAAiB,CAAC;AAmCzB,OAAO,EACL,MAAM,GAKP,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAC+I,mBAAmB,EAAwS,gBAAgB,GAChe,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,2CAA2C,EAAE,8BAA8B,EAAE;YAC9F,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,eAAe,CAAC;YAC3B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,iEAAiE,CAAC;YAC9E,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE,sBAAsB,EAAE;YAC9E,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC,0BAA0B,CAAC;YACtC,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,CAAC,+BAA+B,CAAC;YAC5C,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { CliError, EXIT_INPUT, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, directDir, exists, readText, } from "../../common.js";
|
|
4
|
+
import { applyPatchOperations } from "../../domain/script/patch/apply.js";
|
|
5
|
+
import { summarizeIssues, } from "../direct.js";
|
|
6
|
+
import { asList, strOf, } from "../../domain/script/shared.js";
|
|
7
|
+
import { loadScriptForEdit, validateSession, saveScriptSession, syncValidationResult, scriptSourceText, } from "./session.js";
|
|
8
|
+
import { tokenizeLine, parseDoLine, lineToOp, } from "./lib.js";
|
|
9
|
+
export async function commandDo(opts) {
|
|
10
|
+
const file = strOf(asList(opts["_args"])[0]);
|
|
11
|
+
let text;
|
|
12
|
+
if (!file || file === "-") {
|
|
13
|
+
// No pipe on an interactive terminal: reading fd 0 would block forever
|
|
14
|
+
// waiting for keyboard input. Fail fast instead.
|
|
15
|
+
if (process.stdin.isTTY) {
|
|
16
|
+
throw new CliError("DO BLOCKED: no input", "no verb script piped to stdin.", {
|
|
17
|
+
exitCode: EXIT_USAGE,
|
|
18
|
+
required: ["a file path or piped stdin"],
|
|
19
|
+
received: ["<tty, no pipe>"],
|
|
20
|
+
nextSteps: ["Pass a file (scriptctl do edits.txt) or pipe one (… | scriptctl do -)."],
|
|
21
|
+
errorCode: "DO_NO_INPUT",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
text = fs.readFileSync(0, "utf-8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new CliError("DO BLOCKED: no input", "no verb script on stdin.", {
|
|
29
|
+
exitCode: EXIT_USAGE,
|
|
30
|
+
required: ["a file path or piped stdin"],
|
|
31
|
+
received: ["<no stdin>"],
|
|
32
|
+
nextSteps: ["Pass a file (scriptctl do edits.txt) or pipe one (… | scriptctl do -)."],
|
|
33
|
+
errorCode: "DO_NO_INPUT",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (!exists(file)) {
|
|
39
|
+
throw new CliError("DO BLOCKED: file not found", "verb-script file not found.", {
|
|
40
|
+
exitCode: EXIT_INPUT,
|
|
41
|
+
required: ["an existing file"],
|
|
42
|
+
received: [file],
|
|
43
|
+
nextSteps: ["Check the path, or pipe via stdin with `-`."],
|
|
44
|
+
errorCode: "DO_FILE_NOT_FOUND",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
text = readText(file);
|
|
48
|
+
}
|
|
49
|
+
// Parse: one CLI verb per line; blank lines and `#` comments ignored. Line
|
|
50
|
+
// numbers are reported on parse errors so the agent can locate the bad line.
|
|
51
|
+
const ops = [];
|
|
52
|
+
const rawLines = text.split("\n");
|
|
53
|
+
for (let ln = 0; ln < rawLines.length; ln++) {
|
|
54
|
+
const trimmed = rawLines[ln].trim();
|
|
55
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
56
|
+
continue;
|
|
57
|
+
const tokens = tokenizeLine(rawLines[ln]);
|
|
58
|
+
if (tokens.length === 0)
|
|
59
|
+
continue;
|
|
60
|
+
try {
|
|
61
|
+
const { verb, args, flags } = parseDoLine(tokens);
|
|
62
|
+
ops.push(lineToOp(verb, args, flags));
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const detail = err instanceof CliError ? err.message : String(err);
|
|
66
|
+
throw new CliError(`DO BLOCKED: line ${ln + 1}`, `line ${ln + 1}: ${detail}`, {
|
|
67
|
+
exitCode: EXIT_USAGE,
|
|
68
|
+
required: ["a valid verb line"],
|
|
69
|
+
received: [rawLines[ln].trim()],
|
|
70
|
+
nextSteps: ["Fix this line; the whole script is one transaction (nothing is written until every line is valid)."],
|
|
71
|
+
errorCode: "DO_LINE_INVALID",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (ops.length === 0) {
|
|
76
|
+
throw new CliError("DO BLOCKED: empty script", "no verb lines found.", {
|
|
77
|
+
exitCode: EXIT_USAGE,
|
|
78
|
+
required: ["at least one verb line"],
|
|
79
|
+
received: ["<empty>"],
|
|
80
|
+
nextSteps: ["Provide one CLI verb per line (without the leading `scriptctl`)."],
|
|
81
|
+
errorCode: "DO_EMPTY",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const apply = Boolean(opts["apply"]);
|
|
85
|
+
const workspace = strOf(opts["workspace_path"] || "workspace");
|
|
86
|
+
const session = await loadScriptForEdit(opts);
|
|
87
|
+
const script = session.script;
|
|
88
|
+
// One transaction: all ops applied in a single pass (renumber once at the
|
|
89
|
+
// end). Any op throwing aborts before any write — all-or-nothing.
|
|
90
|
+
const applied = applyPatchOperations(script, scriptSourceText(workspace), ops);
|
|
91
|
+
const head = [`lines: ${ops.length} op(s)`, `${apply ? "applied" : "would-apply"}: ${applied.length}`];
|
|
92
|
+
if (!apply) {
|
|
93
|
+
const validation = validateSession(session);
|
|
94
|
+
const passed = Boolean(validation["passed"]);
|
|
95
|
+
const report = {
|
|
96
|
+
title: "DO DRY-RUN (no write)",
|
|
97
|
+
op: "script.do.dry-run",
|
|
98
|
+
changed: false,
|
|
99
|
+
summary: `${ops.length} op(s) parsed; all apply cleanly — pass --apply to commit`,
|
|
100
|
+
result: [...head, `validation: ${passed ? "would pass" : "would need repair"}`, "dry-run: no write performed"],
|
|
101
|
+
warnings: passed ? [] : summarizeIssues(asList(validation["issues"])),
|
|
102
|
+
issues: summarizeIssues(asList(validation["issues"])),
|
|
103
|
+
artifacts: [session.artifactLabel],
|
|
104
|
+
next: [passed ? "Re-run with --apply to commit." : "Resolve validation issues before committing."],
|
|
105
|
+
};
|
|
106
|
+
return [report, passed ? EXIT_OK : EXIT_NEEDS_AGENT];
|
|
107
|
+
}
|
|
108
|
+
const [newRevision, idempotent] = await saveScriptSession(session, opts, "do");
|
|
109
|
+
const validation = validateSession(session);
|
|
110
|
+
await syncValidationResult(session, validation, newRevision);
|
|
111
|
+
const passed = Boolean(validation["passed"]);
|
|
112
|
+
const resultLines = [...head, `validation: ${passed ? "passed" : "needs repair"}`];
|
|
113
|
+
if (session.remote) {
|
|
114
|
+
resultLines.push(`revision: ${newRevision}`);
|
|
115
|
+
resultLines.push(`idempotent: ${String(idempotent).toLowerCase()}`);
|
|
116
|
+
}
|
|
117
|
+
const report = {
|
|
118
|
+
title: passed ? "DO APPLIED" : "DO APPLIED: Validation needs repair",
|
|
119
|
+
op: "script.do",
|
|
120
|
+
changed: applied.length > 0,
|
|
121
|
+
summary: `applied ${applied.length} op(s) as one transaction`,
|
|
122
|
+
result: resultLines,
|
|
123
|
+
warnings: passed ? [] : summarizeIssues(asList(validation["issues"])),
|
|
124
|
+
issues: summarizeIssues(asList(validation["issues"])),
|
|
125
|
+
artifacts: [session.artifactLabel, path.join(directDir(workspace), "validation.json")],
|
|
126
|
+
next: [passed ? "Continue editing the final script." : "Inspect issues and fix."],
|
|
127
|
+
};
|
|
128
|
+
return [report, passed ? EXIT_OK : EXIT_NEEDS_AGENT];
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=do.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"do.js","sourceRoot":"","sources":["../../../src/usecases/script/do.ts"],"names":[],"mappings":"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"}
|