@lingjingai/scriptctl 0.51.2 → 0.51.3

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 CHANGED
@@ -26,7 +26,7 @@ scriptctl --help # 顶层帮助
26
26
  scriptctl doctor # 环境自检
27
27
  scriptctl update # 更新全局安装的 scriptctl
28
28
  scriptctl changelog # 查看当前版本功能变更
29
- scriptctl migrate-v4 -p <v3.json> -o <v4.json>
29
+ scriptctl migrate -p <source.json> -o <target.json> --to <version>
30
30
  scriptctl ingest --source-path <file|dir>
31
31
  scriptctl checkout --script-path workspace/script.json
32
32
  scriptctl actions --in '@ep:2/scn:1' --script-path workspace/script.json
@@ -0,0 +1,13 @@
1
+ # 0.51.3
2
+
3
+ ## Added
4
+ - `scriptctl migrate --to <version>` upgrades a copy through registered adjacent Script schema migrations and writes a manifest containing each migration step's identity map.
5
+
6
+ ## Changed
7
+ - None.
8
+
9
+ ## Fixed
10
+ - None.
11
+
12
+ ## Breaking
13
+ - `scriptctl migrate-v4` is replaced by `scriptctl migrate --to 4`; the new command writes `*.migration.json` manifests instead of standalone identity-map files.
@@ -2,19 +2,20 @@ import { commandIngest } from "../usecases/ingest/command.js";
2
2
  import { commandIngestStatus } from "../usecases/ingest/status.js";
3
3
  import { commandView } from "../usecases/ingest/view-command.js";
4
4
  import { commandExportAuthoring } from "../usecases/script/export-authoring.js";
5
- import { commandMigrateV4 } from "../usecases/script/migrate-v4.js";
5
+ import { commandMigrate } from "../usecases/script/migrate.js";
6
6
  import { commandCheckout, commandWorkingCopyPublish, commandWorkingCopyStatus, } from "../usecases/script/working-copy.js";
7
7
  import { commandWriteAuthoring } from "../usecases/script/write-authoring.js";
8
8
  import { describeArguments, dispatch, withScriptOpts, withWorkingCopyOpts, } from "./registry.js";
9
9
  export function registerWorkflowCommands(program, state, llm) {
10
- program.command("migrate-v4")
11
- .description("Create a Script v4 copy from a structurally readable Script v3 file")
12
- .requiredOption("-p, --script-path <path>", "Source Script v3 JSON file")
13
- .requiredOption("-o, --output <file>", "Destination Script v4 JSON file")
14
- .option("--identity-map <file>", "V3-to-V4 identity map output")
10
+ program.command("migrate")
11
+ .description("Create a newer Script schema copy through the registered migration chain")
12
+ .requiredOption("-p, --script-path <path>", "Source Script JSON file")
13
+ .requiredOption("-o, --output <file>", "Destination Script JSON file")
14
+ .requiredOption("--to <version>", "Target Script version")
15
+ .option("--manifest <file>", "Migration manifest output")
15
16
  .option("--force", "Replace existing migration artifacts")
16
- .addHelpText("after", "\nExample:\n scriptctl migrate-v4 -p ./old-script.json -o ./script-v4.json\n")
17
- .action(dispatch(commandMigrateV4, state));
17
+ .addHelpText("after", "\nExample:\n scriptctl migrate -p ./old-script.json -o ./script-v4.json --to 4\n")
18
+ .action(dispatch(commandMigrate, state));
18
19
  const ingest = program.command("ingest")
19
20
  .description("Convert source files into a Script v4 workspace")
20
21
  .option("-s, --source-path <path>", "Source file or directory")
@@ -1 +1 @@
1
- {"version":3,"file":"register-workflows.js","sourceRoot":"","sources":["../../src/cli/register-workflows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-workflows.js","sourceRoot":"","sources":["../../src/cli/register-workflows.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,13 @@ import type { ScriptV4 } from "./v4/types.js";
3
3
  import type { ValidationResult } from "./shared/validation.js";
4
4
  export type ScriptVersion = 3 | 4;
5
5
  export type ScriptDocument = ScriptV3 | ScriptV4;
6
+ export declare const SUPPORTED_SCRIPT_VERSIONS: readonly ScriptVersion[];
6
7
  export interface ScriptDialect {
7
8
  readonly version: ScriptVersion;
8
9
  readonly require: (value: unknown) => ScriptDocument;
9
10
  readonly validate: (value: unknown) => ValidationResult;
10
11
  }
12
+ export declare function isSupportedScriptVersion(value: unknown): value is ScriptVersion;
11
13
  export declare function scriptVersionOf(value: unknown): ScriptVersion;
12
14
  export declare function dialectFor(value: unknown): ScriptDialect;
13
15
  export declare function requireScriptDocument(value: unknown): ScriptDocument;
@@ -3,6 +3,7 @@ import { requireScriptV3 } from "./v3/parse.js";
3
3
  import { requireScriptV4 } from "./v4/parse.js";
4
4
  import { validateScriptV4 } from "./v4/validation.js";
5
5
  import { validateScriptV3 } from "./v3/validation.js";
6
+ export const SUPPORTED_SCRIPT_VERSIONS = [3, 4];
6
7
  const DIALECTS = {
7
8
  3: {
8
9
  version: 3,
@@ -15,6 +16,10 @@ const DIALECTS = {
15
16
  validate: validateScriptV4,
16
17
  },
17
18
  };
19
+ export function isSupportedScriptVersion(value) {
20
+ return typeof value === "number"
21
+ && SUPPORTED_SCRIPT_VERSIONS.some((version) => version === value);
22
+ }
18
23
  export function scriptVersionOf(value) {
19
24
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
20
25
  throw new CliError("script.json must be an object with an explicit version.", {
@@ -24,7 +29,7 @@ export function scriptVersionOf(value) {
24
29
  });
25
30
  }
26
31
  const version = value.version;
27
- if (version === 3 || version === 4)
32
+ if (isSupportedScriptVersion(version))
28
33
  return version;
29
34
  throw new CliError("script.json must declare version 3 or version 4.", {
30
35
  exitCode: EXIT_INPUT,
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/domain/script/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AActD,MAAM,QAAQ,GAA6B;IACzC,CAAC,EAAE;QACD,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,gBAAgB;KAC3B;IACD,CAAC,EAAE;QACD,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,gBAAgB;KAC3B;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,QAAQ,CAAC,yDAAyD,EAAE;YACtE,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,wBAAwB;YACnC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE;SAC1G,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAI,KAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACnD,MAAM,IAAI,QAAQ,CAAC,kDAAkD,EAAE;QAC/D,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,4BAA4B;QAC1F,IAAI,EAAE,mGAAmG;QACzG,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;KAC5E,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/domain/script/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,MAAM,CAAC,MAAM,yBAAyB,GAA6B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAU1E,MAAM,QAAQ,GAA6B;IACzC,CAAC,EAAE;QACD,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,gBAAgB;KAC3B;IACD,CAAC,EAAE;QACD,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,gBAAgB;KAC3B;CACF,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,yBAAyB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,QAAQ,CAAC,yDAAyD,EAAE;YACtE,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,wBAAwB;YACnC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE;SAC1G,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAI,KAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,wBAAwB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACtD,MAAM,IAAI,QAAQ,CAAC,kDAAkD,EAAE;QAC/D,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,4BAA4B;QAC1F,IAAI,EAAE,mGAAmG;QACzG,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;KAC5E,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ScriptVersion } from "../dispatch.js";
2
+ import type { ScriptMigrationResult, ScriptMigrationStepArtifact } from "./types.js";
3
+ export declare function parseScriptMigrationStepArtifacts(value: unknown): ScriptMigrationStepArtifact[];
4
+ export declare function migrateScriptToVersion(value: unknown, targetVersion: ScriptVersion, priorArtifacts?: readonly ScriptMigrationStepArtifact[]): ScriptMigrationResult;
@@ -0,0 +1,76 @@
1
+ import { CliError, EXIT_INPUT } from "../../../common.js";
2
+ import { isSupportedScriptVersion, requireScriptDocument, scriptVersionOf, } from "../dispatch.js";
3
+ import { isDict } from "../shared.js";
4
+ import { migrate as migrateV3ToV4 } from "./v3-to-v4.js";
5
+ const MIGRATIONS = [
6
+ {
7
+ sourceVersion: 3,
8
+ targetVersion: 4,
9
+ migrate: migrateV3ToV4,
10
+ },
11
+ ];
12
+ function isMigrationArtifact(value) {
13
+ return isDict(value)
14
+ && isSupportedScriptVersion(value["source_version"])
15
+ && isSupportedScriptVersion(value["target_version"])
16
+ && value["source_version"] < value["target_version"]
17
+ && "identity_map" in value;
18
+ }
19
+ export function parseScriptMigrationStepArtifacts(value) {
20
+ if (!Array.isArray(value)) {
21
+ throw new CliError("Migration manifest steps must be an array.", {
22
+ exitCode: EXIT_INPUT,
23
+ errorCode: "MIGRATE_MANIFEST_INVALID",
24
+ });
25
+ }
26
+ return value.map((item) => {
27
+ if (!isMigrationArtifact(item)) {
28
+ throw new CliError("Migration manifest contains an invalid step artifact.", {
29
+ exitCode: EXIT_INPUT,
30
+ errorCode: "MIGRATE_MANIFEST_INVALID",
31
+ });
32
+ }
33
+ return {
34
+ sourceVersion: item.source_version,
35
+ targetVersion: item.target_version,
36
+ identityMap: item.identity_map,
37
+ };
38
+ });
39
+ }
40
+ function migrationFor(sourceVersion, targetVersion) {
41
+ return MIGRATIONS.find((migration) => (migration.sourceVersion === sourceVersion
42
+ && migration.targetVersion <= targetVersion));
43
+ }
44
+ function priorArtifactFor(artifacts, migration) {
45
+ return artifacts.find((artifact) => (artifact.sourceVersion === migration.sourceVersion
46
+ && artifact.targetVersion === migration.targetVersion));
47
+ }
48
+ export function migrateScriptToVersion(value, targetVersion, priorArtifacts = []) {
49
+ const sourceVersion = scriptVersionOf(value);
50
+ if (targetVersion < sourceVersion) {
51
+ throw new CliError("A migration target must be newer than the source script.", {
52
+ exitCode: EXIT_INPUT,
53
+ errorCode: "MIGRATE_TARGET_OLDER",
54
+ data: { expected: [String(sourceVersion)], actual: [String(targetVersion)] },
55
+ });
56
+ }
57
+ let current = requireScriptDocument(value);
58
+ let currentVersion = sourceVersion;
59
+ const steps = [];
60
+ while (currentVersion < targetVersion) {
61
+ const migration = migrationFor(currentVersion, targetVersion);
62
+ if (migration === undefined) {
63
+ throw new CliError(`No migration path exists from Script v${currentVersion} to Script v${targetVersion}.`, {
64
+ exitCode: EXIT_INPUT,
65
+ errorCode: "MIGRATE_PATH_UNSUPPORTED",
66
+ data: { actual: [String(currentVersion), String(targetVersion)] },
67
+ });
68
+ }
69
+ const migrated = migration.migrate(current, priorArtifactFor(priorArtifacts, migration));
70
+ current = migrated.script;
71
+ currentVersion = migration.targetVersion;
72
+ steps.push(migrated.artifact);
73
+ }
74
+ return { sourceVersion, targetVersion, script: current, steps };
75
+ }
76
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/migrations/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ScriptDocument, ScriptVersion } from "../dispatch.js";
2
+ export interface ScriptMigrationStepArtifact {
3
+ readonly sourceVersion: ScriptVersion;
4
+ readonly targetVersion: ScriptVersion;
5
+ readonly identityMap: unknown;
6
+ }
7
+ export interface ScriptMigrationStepResult {
8
+ readonly script: ScriptDocument;
9
+ readonly artifact: ScriptMigrationStepArtifact;
10
+ }
11
+ export type ScriptMigration = (source: ScriptDocument, prior: ScriptMigrationStepArtifact | undefined) => ScriptMigrationStepResult;
12
+ export interface ScriptMigrationResult {
13
+ readonly sourceVersion: ScriptVersion;
14
+ readonly targetVersion: ScriptVersion;
15
+ readonly script: ScriptDocument;
16
+ readonly steps: readonly ScriptMigrationStepArtifact[];
17
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/domain/script/migrations/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { ScriptDocument } from "../dispatch.js";
2
+ import type { ScriptMigrationStepArtifact, ScriptMigrationStepResult } from "./types.js";
3
+ export declare function migrate(source: ScriptDocument, prior: ScriptMigrationStepArtifact | undefined): ScriptMigrationStepResult;
@@ -0,0 +1,57 @@
1
+ import { CliError, EXIT_INPUT } from "../../../common.js";
2
+ import { isDict } from "../shared.js";
3
+ import { requireScriptV3 } from "../v3/parse.js";
4
+ import { newScriptV4FromV3WithIdentity } from "../v4/from-v3.js";
5
+ function v3ActionIdentityKeys(source) {
6
+ const action = {};
7
+ for (const episode of source.episodes) {
8
+ for (const scene of episode.scenes) {
9
+ const sceneAddress = `${episode.episode_id}/${scene.scene_id}`;
10
+ scene.actions.forEach((_item, index) => {
11
+ const address = `${sceneAddress}#${index}`;
12
+ action[address] = address;
13
+ });
14
+ }
15
+ }
16
+ return action;
17
+ }
18
+ function isStringRecord(value) {
19
+ return isDict(value) && Object.values(value).every((item) => typeof item === "string");
20
+ }
21
+ function isNestedStringRecord(value) {
22
+ return isDict(value) && Object.values(value).every(isStringRecord);
23
+ }
24
+ function isV4IdentityMap(value) {
25
+ return isDict(value)
26
+ && value["version"] === 3
27
+ && isStringRecord(value["actor"])
28
+ && isStringRecord(value["location"])
29
+ && isStringRecord(value["prop"])
30
+ && isNestedStringRecord(value["state"])
31
+ && isStringRecord(value["episode"])
32
+ && isStringRecord(value["scene"])
33
+ && isStringRecord(value["action"]);
34
+ }
35
+ function priorIdentityMap(prior) {
36
+ if (prior === undefined)
37
+ return undefined;
38
+ if (isV4IdentityMap(prior.identityMap))
39
+ return prior.identityMap;
40
+ throw new CliError("Migration manifest contains an invalid v3-to-v4 identity map.", {
41
+ exitCode: EXIT_INPUT,
42
+ errorCode: "MIGRATE_MANIFEST_INVALID",
43
+ });
44
+ }
45
+ export function migrate(source, prior) {
46
+ const sourceV3 = requireScriptV3(source);
47
+ const converted = newScriptV4FromV3WithIdentity(sourceV3, priorIdentityMap(prior), { action: v3ActionIdentityKeys(sourceV3) });
48
+ return {
49
+ script: converted.script,
50
+ artifact: {
51
+ sourceVersion: 3,
52
+ targetVersion: 4,
53
+ identityMap: converted.identityMap,
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=v3-to-v4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3-to-v4.js","sourceRoot":"","sources":["../../../../src/domain/script/migrations/v3-to-v4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAsB,MAAM,kBAAkB,CAAC;AAGrF,SAAS,oBAAoB,CAAC,MAA0C;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrC,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,KAAK,EAAE,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC;WACf,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;WACtB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WAC9B,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WACjC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;WAC7B,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WACpC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;WAChC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WAC9B,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8C;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IACjE,MAAM,IAAI,QAAQ,CAAC,+DAA+D,EAAE;QAClF,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,0BAA0B;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,MAAsB,EACtB,KAA8C;IAE9C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,6BAA6B,CAC7C,QAAQ,EACR,gBAAgB,CAAC,KAAK,CAAC,EACvB,EAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAC3C,CAAC;IACF,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,QAAQ,EAAE;YACR,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,SAAS,CAAC,WAAW;SACnC;KACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { type CommandOutput } from "../../common.js";
2
2
  import { type Dict } from "../../domain/script/shared.js";
3
- export declare function commandMigrateV4(opts: Dict): Promise<[CommandOutput, number]>;
3
+ export declare function commandMigrate(opts: Dict): Promise<[CommandOutput, number]>;
@@ -0,0 +1,210 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { CliError, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, sha256Text, } from "../../common.js";
4
+ import { migrateScriptToVersion, parseScriptMigrationStepArtifacts, } from "../../domain/script/migrations/registry.js";
5
+ import { isSupportedScriptVersion, scriptVersionOf, SUPPORTED_SCRIPT_VERSIONS, validateScriptDocument, } from "../../domain/script/dispatch.js";
6
+ import { atomicWriteJson, withScriptFileLock } from "../../infra/script-working-copy.js";
7
+ import { isDict } from "../../domain/script/shared.js";
8
+ function stringOption(opts, name) {
9
+ const value = opts[name];
10
+ return typeof value === "string" ? value.trim() : "";
11
+ }
12
+ function numberOption(opts, name) {
13
+ const value = stringOption(opts, name);
14
+ if (!/^\d+$/.test(value))
15
+ return null;
16
+ return Number(value);
17
+ }
18
+ function requireTargetVersion(opts) {
19
+ const value = numberOption(opts, "to");
20
+ if (isSupportedScriptVersion(value))
21
+ return value;
22
+ throw new CliError("A supported migration target version is required.", {
23
+ exitCode: EXIT_USAGE,
24
+ errorCode: "MIGRATE_TARGET_INVALID",
25
+ hint: "Pass --to <version> with a supported Script version.",
26
+ data: {
27
+ expected: SUPPORTED_SCRIPT_VERSIONS.map(String),
28
+ actual: [stringOption(opts, "to") || "<empty>"],
29
+ },
30
+ });
31
+ }
32
+ function defaultManifestPath(outputPath) {
33
+ const extension = path.extname(outputPath);
34
+ const stem = extension.length > 0
35
+ ? outputPath.slice(0, -extension.length)
36
+ : outputPath;
37
+ return `${stem}.migration.json`;
38
+ }
39
+ function requireDistinctPaths(sourcePath, outputPath, manifestPath) {
40
+ const resolved = [sourcePath, outputPath, manifestPath].map((item) => path.resolve(item));
41
+ if (resolved[0] === resolved[1]) {
42
+ throw new CliError("The migration destination must differ from the source.", {
43
+ exitCode: EXIT_USAGE,
44
+ errorCode: "MIGRATE_SAME_PATH",
45
+ hint: "Choose a separate --output path. The source file stays unchanged.",
46
+ data: { actual: [sourcePath] },
47
+ });
48
+ }
49
+ if (resolved[0] === resolved[2] || resolved[1] === resolved[2]) {
50
+ throw new CliError("The migration manifest needs its own file path.", {
51
+ exitCode: EXIT_USAGE,
52
+ errorCode: "MIGRATE_MANIFEST_PATH",
53
+ hint: "Choose a --manifest path separate from the source and output files.",
54
+ data: { actual: [manifestPath] },
55
+ });
56
+ }
57
+ }
58
+ function assertWritableDestination(filePath, force) {
59
+ if (!force && fs.existsSync(filePath)) {
60
+ throw new CliError("Migration destination already exists.", {
61
+ exitCode: EXIT_USAGE,
62
+ errorCode: "MIGRATE_OUTPUT_EXISTS",
63
+ hint: "Choose a new path, or pass --force to replace the migration artifact.",
64
+ data: { actual: [filePath] },
65
+ });
66
+ }
67
+ }
68
+ function readSource(sourcePath) {
69
+ let raw;
70
+ try {
71
+ raw = fs.readFileSync(sourcePath, "utf8");
72
+ }
73
+ catch (error) {
74
+ throw new CliError("Cannot read the source script.", {
75
+ exitCode: EXIT_USAGE,
76
+ errorCode: "MIGRATE_SOURCE_READ_FAILED",
77
+ hint: "Pass an existing JSON file with --script-path.",
78
+ data: { actual: [sourcePath, error instanceof Error ? error.message : String(error)] },
79
+ });
80
+ }
81
+ try {
82
+ return { raw, value: JSON.parse(raw) };
83
+ }
84
+ catch (error) {
85
+ throw new CliError("The source script is not valid JSON.", {
86
+ exitCode: EXIT_USAGE,
87
+ errorCode: "MIGRATE_SOURCE_JSON_INVALID",
88
+ hint: "Repair the JSON syntax, then rerun migrate.",
89
+ data: { actual: [error instanceof Error ? error.message : String(error)] },
90
+ });
91
+ }
92
+ }
93
+ function readPriorManifest(manifestPath, force) {
94
+ if (!force || !fs.existsSync(manifestPath))
95
+ return undefined;
96
+ let value;
97
+ try {
98
+ value = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
99
+ }
100
+ catch (error) {
101
+ throw new CliError("Cannot reuse the existing migration manifest.", {
102
+ exitCode: EXIT_USAGE,
103
+ errorCode: "MIGRATE_MANIFEST_INVALID",
104
+ hint: "Restore the migration manifest, or choose a new --manifest path.",
105
+ data: { actual: [manifestPath, error instanceof Error ? error.message : String(error)] },
106
+ });
107
+ }
108
+ if (!isDict(value)
109
+ || value["version"] !== 1
110
+ || !isSupportedScriptVersion(value["source_version"])
111
+ || !isSupportedScriptVersion(value["target_version"])
112
+ || typeof value["source_path"] !== "string"
113
+ || typeof value["source_sha256"] !== "string") {
114
+ throw new CliError("Cannot reuse the existing migration manifest.", {
115
+ exitCode: EXIT_USAGE,
116
+ errorCode: "MIGRATE_MANIFEST_INVALID",
117
+ hint: "Restore the migration manifest, or choose a new --manifest path.",
118
+ data: { actual: [manifestPath] },
119
+ });
120
+ }
121
+ return {
122
+ version: 1,
123
+ source_version: value["source_version"],
124
+ target_version: value["target_version"],
125
+ source_path: value["source_path"],
126
+ source_sha256: value["source_sha256"],
127
+ steps: parseScriptMigrationStepArtifacts(value["steps"]),
128
+ };
129
+ }
130
+ export async function commandMigrate(opts) {
131
+ const sourceRawPath = stringOption(opts, "script_path");
132
+ const outputRawPath = stringOption(opts, "output");
133
+ if (!sourceRawPath || !outputRawPath) {
134
+ throw new CliError("Migration paths are required.", {
135
+ exitCode: EXIT_USAGE,
136
+ errorCode: "MIGRATE_PATH_MISSING",
137
+ hint: "Pass --script-path <source.json> and --output <target.json>.",
138
+ data: { expected: ["--script-path <source.json>", "--output <target.json>"] },
139
+ });
140
+ }
141
+ const sourcePath = path.resolve(sourceRawPath);
142
+ const outputPath = path.resolve(outputRawPath);
143
+ const manifestPath = path.resolve(stringOption(opts, "manifest") || defaultManifestPath(outputPath));
144
+ const targetVersion = requireTargetVersion(opts);
145
+ const force = Boolean(opts["force"]);
146
+ requireDistinctPaths(sourcePath, outputPath, manifestPath);
147
+ return withScriptFileLock(outputPath, async () => {
148
+ assertWritableDestination(outputPath, force);
149
+ assertWritableDestination(manifestPath, force);
150
+ const sourceDocument = readSource(sourcePath);
151
+ const sourceVersion = scriptVersionOf(sourceDocument.value);
152
+ if (targetVersion <= sourceVersion) {
153
+ throw new CliError("The migration target must be newer than the source script.", {
154
+ exitCode: EXIT_USAGE,
155
+ errorCode: "MIGRATE_TARGET_NOT_NEWER",
156
+ data: { expected: [`>${sourceVersion}`], actual: [String(targetVersion)] },
157
+ });
158
+ }
159
+ const sourceValidation = validateScriptDocument(sourceDocument.value);
160
+ const priorManifest = readPriorManifest(manifestPath, force);
161
+ const migrated = migrateScriptToVersion(sourceDocument.value, targetVersion, priorManifest?.steps);
162
+ const validation = validateScriptDocument(migrated.script);
163
+ const manifest = {
164
+ version: 1,
165
+ source_version: migrated.sourceVersion,
166
+ target_version: migrated.targetVersion,
167
+ source_path: sourcePath,
168
+ source_sha256: sha256Text(sourceDocument.raw),
169
+ steps: migrated.steps,
170
+ };
171
+ atomicWriteJson(manifestPath, {
172
+ ...manifest,
173
+ steps: manifest.steps.map((step) => ({
174
+ source_version: step.sourceVersion,
175
+ target_version: step.targetVersion,
176
+ identity_map: step.identityMap,
177
+ })),
178
+ });
179
+ atomicWriteJson(outputPath, migrated.script);
180
+ const data = {
181
+ op: "script.migrate",
182
+ changed: true,
183
+ source_script_path: sourcePath,
184
+ script_path: outputPath,
185
+ manifest_path: manifestPath,
186
+ source_version: migrated.sourceVersion,
187
+ target_version: migrated.targetVersion,
188
+ source_validation: {
189
+ ok: sourceValidation.ok,
190
+ errors: sourceValidation.errors.length,
191
+ warnings: sourceValidation.warnings.length,
192
+ },
193
+ validation: {
194
+ ok: validation.ok,
195
+ errors: validation.errors.length,
196
+ warnings: validation.warnings.length,
197
+ issues: validation.errors.slice(0, 100),
198
+ },
199
+ };
200
+ const text = validation.ok
201
+ ? [`Script v${migrated.targetVersion}: ${outputPath}`, `Migration manifest: ${manifestPath}`, "validation: ok"].join("\n")
202
+ : [
203
+ `Script v${migrated.targetVersion}: ${outputPath}`,
204
+ `Migration manifest: ${manifestPath}`,
205
+ `validation: ${validation.errors.length} errors; repair before production use`,
206
+ ].join("\n");
207
+ return [{ text, data }, validation.ok ? EXIT_OK : EXIT_NEEDS_AGENT];
208
+ });
209
+ }
210
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/usecases/script/migrate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingjingai/scriptctl",
3
- "version": "0.51.2",
3
+ "version": "0.51.3",
4
4
  "description": "剧本阶段统一 CLI:素材转 Script v4,并兼容 Script v3 的本地写作、精修、校验和发布。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3,7 +3,7 @@ name: scriptctl
3
3
  description: "剧本 script.json 的本地查询、文件化批量写作、原子精修、素材 ingest 与 revision publish CLI。处理 Script v3/v4、两个 script.json、剧本资产/state、Action、场景引用或 authoring 时使用。"
4
4
  metadata:
5
5
  version: "0.27.2"
6
- scriptctl_version: "0.51.2"
6
+ scriptctl_version: "0.51.3"
7
7
  author: "official"
8
8
  ---
9
9
 
@@ -43,9 +43,6 @@ metadata:
43
43
  [references/bulk-authoring.md](references/bulk-authoring.md)。
44
44
  3. 少量精修:查询定位 → 单 ID 原子 verb;同构多点用 selector;异构多点用
45
45
  `do`。见 [references/atomic-edit-workflow.md](references/atomic-edit-workflow.md)。
46
- 4. 旧视频转录复核:V3 资产修复 → `migrate-v4` → 关联视频 → 补行、校时、
47
- 合并误拆对白 → `validate`。见
48
- [references/video-transcript-repair.md](references/video-transcript-repair.md)。
49
46
 
50
47
  ## 本地文件边界
51
48
 
@@ -180,20 +177,11 @@ scriptctl scene-ref ep_001/scn_003 actor:act_001 --state st_002
180
177
  对 V3 文件运行 `export`、`write`、原子命令、`validate` 和 `publish` 时,CLI
181
178
  会选择 V3 实现并保持原文件结构与既有 ID。
182
179
 
183
- V3 转录稿进入新项目时创建独立 V4 副本:
180
+ ## 版本变更边界
184
181
 
185
- ```bash
186
- scriptctl migrate-v4 \
187
- -p ./source-v3.json \
188
- -o ./script-v4.json \
189
- --identity-map ./script-v4.identity-map.json
190
- ```
191
-
192
- 命令保留源文件,输出 V4 剧本和 V3→V4 身份映射。输出仍有校验错误时,命令返回
193
- `78`,文件继续作为“待人工修复”的 V4 工作副本使用;`validation.issues` 是修复清单。
194
- 使用 `do` 或 `patch` 在一个事务中消除全部 blocking issue,再落盘。
195
- 修正 V3 源后使用同一映射路径和 `--force` 重跑,既有节点复用已分配的 V4 ID。
196
- 结构性插入、删除或调序会改变 V3 的序号身份;完成首次迁移后直接精修 V4。
182
+ Agent 不得自行调用 `migrate` 命令,也不得执行任何 Script schema 升级或生成升级产物。
183
+ 版本变更会重写全局身份与外部引用,可能影响项目上下文、视频锚点和下游工作流;只有用户
184
+ 明确要求时才由应用层处理。面对 V3 文件,按其现有版本读取、查询、修改和校验。
197
185
 
198
186
  ## 多点写与 plan
199
187
 
@@ -5,16 +5,15 @@
5
5
 
6
6
  ## 1. 建立可修复工作副本
7
7
 
8
- 读取 `script.json.version`。V3 先运行:
8
+ 读取 `script.json.version`。对 V3 先运行:
9
9
 
10
10
  ```bash
11
11
  scriptctl validate -p "$V3"
12
- scriptctl migrate-v4 -p "$V3" -o "$V4" --identity-map "$ID_MAP"
13
12
  ```
14
13
 
15
- `migrate-v4` `exit_code=78` 表示 V4 副本已经生成,且 `validation.issues` 仍需复核。
16
- V3 保持不变。V4 有多个 blocking issue 时,把完整修复组织成一个 `do` 或 `patch`
17
- 事务;计划的最终状态通过校验后再 apply。首次 V4 副本建立后,后续内容精修直接写 V4
14
+ V3 保持其现有地址与字段;V4 使用其正式 ID 与计划写入语义。Agent 只在用户指定的
15
+ 现有版本内进行复核和精修,不改变 Script schema。任一版本有多个 blocking issue 时,
16
+ 把完整修复组织成一个 `do` `patch` 事务;计划的最终状态通过校验后再 apply
18
17
 
19
18
  人物重名按剧情身份判断:
20
19
 
@@ -1,194 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import { CliError, EXIT_NEEDS_AGENT, EXIT_OK, EXIT_USAGE, sha256Text, } from "../../common.js";
4
- import { requireScriptV3 } from "../../domain/script/v3/parse.js";
5
- import { validateScriptV3 } from "../../domain/script/v3/validation.js";
6
- import { newScriptV4FromV3WithIdentity, } from "../../domain/script/v4/from-v3.js";
7
- import { validateScriptV4 } from "../../domain/script/v4/validation.js";
8
- import { atomicWriteJson, withScriptFileLock, } from "../../infra/script-working-copy.js";
9
- function stringOption(opts, name) {
10
- const value = opts[name];
11
- return typeof value === "string" ? value.trim() : "";
12
- }
13
- function defaultIdentityMapPath(outputPath) {
14
- const extension = path.extname(outputPath);
15
- const stem = extension.length > 0
16
- ? outputPath.slice(0, -extension.length)
17
- : outputPath;
18
- return `${stem}.identity-map.json`;
19
- }
20
- function requireDistinctPaths(sourcePath, outputPath, identityMapPath) {
21
- const resolved = [sourcePath, outputPath, identityMapPath].map((item) => path.resolve(item));
22
- if (resolved[0] === resolved[1]) {
23
- throw new CliError("The V4 destination must differ from the V3 source.", {
24
- exitCode: EXIT_USAGE,
25
- errorCode: "MIGRATE_SAME_PATH",
26
- hint: "Choose a separate --output path. The source V3 file stays unchanged.",
27
- data: { actual: [sourcePath] },
28
- });
29
- }
30
- if (resolved[0] === resolved[2] || resolved[1] === resolved[2]) {
31
- throw new CliError("The identity map needs its own file path.", {
32
- exitCode: EXIT_USAGE,
33
- errorCode: "MIGRATE_IDENTITY_MAP_PATH",
34
- hint: "Choose an --identity-map path separate from the source and output files.",
35
- data: { actual: [identityMapPath] },
36
- });
37
- }
38
- }
39
- function assertWritableDestination(filePath, force) {
40
- if (!force && fs.existsSync(filePath)) {
41
- throw new CliError("Migration destination already exists.", {
42
- exitCode: EXIT_USAGE,
43
- errorCode: "MIGRATE_OUTPUT_EXISTS",
44
- hint: "Choose a new path, or pass --force to replace the migration artifact.",
45
- data: { actual: [filePath] },
46
- });
47
- }
48
- }
49
- function readSource(sourcePath) {
50
- let raw;
51
- try {
52
- raw = fs.readFileSync(sourcePath, "utf8");
53
- }
54
- catch (error) {
55
- throw new CliError("Cannot read the Script v3 source.", {
56
- exitCode: EXIT_USAGE,
57
- errorCode: "MIGRATE_SOURCE_READ_FAILED",
58
- hint: "Pass an existing JSON file with --script-path.",
59
- data: { actual: [sourcePath, error instanceof Error ? error.message : String(error)] },
60
- });
61
- }
62
- try {
63
- return { raw, value: JSON.parse(raw) };
64
- }
65
- catch (error) {
66
- throw new CliError("The Script v3 source is not valid JSON.", {
67
- exitCode: EXIT_USAGE,
68
- errorCode: "MIGRATE_SOURCE_JSON_INVALID",
69
- hint: "Repair the JSON syntax, then rerun migrate-v4.",
70
- data: { actual: [error instanceof Error ? error.message : String(error)] },
71
- });
72
- }
73
- }
74
- function v3IdentityKeys(source) {
75
- const action = {};
76
- for (const episode of source.episodes) {
77
- for (const scene of episode.scenes) {
78
- const sceneAddress = `${episode.episode_id}/${scene.scene_id}`;
79
- scene.actions.forEach((_item, index) => {
80
- const address = `${sceneAddress}#${index}`;
81
- action[address] = address;
82
- });
83
- }
84
- }
85
- return { action };
86
- }
87
- function readPriorIdentityMap(identityMapPath, force) {
88
- if (!force || !fs.existsSync(identityMapPath))
89
- return undefined;
90
- let value;
91
- try {
92
- value = JSON.parse(fs.readFileSync(identityMapPath, "utf8"));
93
- }
94
- catch (error) {
95
- throw new CliError("Cannot reuse the existing V3-to-V4 identity map.", {
96
- exitCode: EXIT_USAGE,
97
- errorCode: "MIGRATE_IDENTITY_MAP_INVALID",
98
- hint: "Restore the identity map, or choose a new --identity-map path.",
99
- data: { actual: [identityMapPath, error instanceof Error ? error.message : String(error)] },
100
- });
101
- }
102
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
103
- throw new CliError("Cannot reuse the existing V3-to-V4 identity map.", {
104
- exitCode: EXIT_USAGE,
105
- errorCode: "MIGRATE_IDENTITY_MAP_INVALID",
106
- hint: "Restore the identity map, or choose a new --identity-map path.",
107
- data: { actual: [identityMapPath] },
108
- });
109
- }
110
- const record = value;
111
- const identityMap = record["identity_map"] ?? value;
112
- if (identityMap === null
113
- || typeof identityMap !== "object"
114
- || Array.isArray(identityMap)
115
- || identityMap["version"] !== 3) {
116
- throw new CliError("Cannot reuse the existing V3-to-V4 identity map.", {
117
- exitCode: EXIT_USAGE,
118
- errorCode: "MIGRATE_IDENTITY_MAP_INVALID",
119
- hint: "Restore the identity map, or choose a new --identity-map path.",
120
- data: { actual: [identityMapPath] },
121
- });
122
- }
123
- return identityMap;
124
- }
125
- export async function commandMigrateV4(opts) {
126
- const sourceRawPath = stringOption(opts, "script_path");
127
- const outputRawPath = stringOption(opts, "output");
128
- if (!sourceRawPath || !outputRawPath) {
129
- throw new CliError("Migration paths are required.", {
130
- exitCode: EXIT_USAGE,
131
- errorCode: "MIGRATE_PATH_MISSING",
132
- hint: "Pass --script-path <v3.json> and --output <v4.json>.",
133
- data: { expected: ["--script-path <v3.json>", "--output <v4.json>"] },
134
- });
135
- }
136
- const sourcePath = path.resolve(sourceRawPath);
137
- const outputPath = path.resolve(outputRawPath);
138
- const identityMapPath = path.resolve(stringOption(opts, "identity_map") || defaultIdentityMapPath(outputPath));
139
- const force = Boolean(opts["force"]);
140
- requireDistinctPaths(sourcePath, outputPath, identityMapPath);
141
- return withScriptFileLock(outputPath, async () => {
142
- assertWritableDestination(outputPath, force);
143
- assertWritableDestination(identityMapPath, force);
144
- const sourceDocument = readSource(sourcePath);
145
- const source = requireScriptV3(sourceDocument.value);
146
- const sourceValidation = validateScriptV3(source);
147
- const priorIdentityMap = readPriorIdentityMap(identityMapPath, force);
148
- const converted = newScriptV4FromV3WithIdentity(source, priorIdentityMap, v3IdentityKeys(source));
149
- const validation = validateScriptV4(converted.script);
150
- const migrationRecord = {
151
- version: 1,
152
- source_version: 3,
153
- target_version: 4,
154
- source_path: sourcePath,
155
- source_sha256: sha256Text(sourceDocument.raw),
156
- identity_map: converted.identityMap,
157
- };
158
- atomicWriteJson(identityMapPath, migrationRecord);
159
- atomicWriteJson(outputPath, converted.script);
160
- const data = {
161
- op: "script.migrate-v4",
162
- changed: true,
163
- source_script_path: sourcePath,
164
- script_path: outputPath,
165
- identity_map_path: identityMapPath,
166
- source_version: 3,
167
- target_version: 4,
168
- source_validation: {
169
- ok: sourceValidation.ok,
170
- errors: sourceValidation.errors.length,
171
- warnings: sourceValidation.warnings.length,
172
- },
173
- validation: {
174
- ok: validation.ok,
175
- errors: validation.errors.length,
176
- warnings: validation.warnings.length,
177
- issues: validation.errors.slice(0, 100),
178
- },
179
- };
180
- const text = validation.ok
181
- ? [
182
- `V4 script: ${outputPath}`,
183
- `Identity map: ${identityMapPath}`,
184
- "validation: ok",
185
- ].join("\n")
186
- : [
187
- `V4 script: ${outputPath}`,
188
- `Identity map: ${identityMapPath}`,
189
- `validation: ${validation.errors.length} errors; repair before production use`,
190
- ].join("\n");
191
- return [{ text, data }, validation.ok ? EXIT_OK : EXIT_NEEDS_AGENT];
192
- });
193
- }
194
- //# sourceMappingURL=migrate-v4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-v4.js","sourceRoot":"","sources":["../../../src/usecases/script/migrate-v4.ts"],"names":[],"mappings":"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"}