universal-plugin 0.16.3 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/.cursor-plugin/plugin.json +1 -1
  4. package/CHANGELOG.md +24 -0
  5. package/agents/agentskills-specialist.md +6 -11
  6. package/com.github.copilot/agents/agentskills-specialist.agent.md +6 -11
  7. package/dist/cli.mjs +669 -407
  8. package/package.json +6 -6
  9. package/plugin.json +5 -1
  10. package/readme.md +2 -2
  11. package/references/plugin-design.md +19 -33
  12. package/references/slash-invocation.md +2 -2
  13. package/skills/adopt-upx/scripts/rewrite-upx.mjs +1 -1
  14. package/skills/build-plugin/SKILL.md +2 -3
  15. package/skills/build-plugin/scripts/build.mjs +1 -1
  16. package/skills/doctor-universal-plugin/README.md +1 -1
  17. package/skills/doctor-universal-plugin/SKILL.md +3 -3
  18. package/skills/doctor-universal-plugin/scripts/doctor.mjs +1 -1
  19. package/skills/init-universal-plugin/README.md +1 -1
  20. package/skills/init-universal-plugin/SKILL.md +2 -2
  21. package/skills/init-universal-plugin/references/create.md +7 -7
  22. package/skills/init-universal-plugin/references/detection.md +1 -1
  23. package/skills/init-universal-plugin/references/frontmatter.md +1 -1
  24. package/skills/init-universal-plugin/references/standard.md +3 -3
  25. package/skills/init-universal-plugin/references/vendors/copilot-cli.md +3 -0
  26. package/skills/init-universal-plugin/scripts/init.mjs +1 -1
  27. package/skills/marketplace/README.md +9 -2
  28. package/skills/marketplace/SKILL.md +15 -10
  29. package/skills/marketplace/references/add.md +3 -1
  30. package/skills/marketplace/references/update.md +75 -0
  31. package/skills/marketplace/references/validate.md +1 -1
  32. package/skills/marketplace/scripts/add.mjs +1 -1
  33. package/skills/marketplace/scripts/install-docs.mjs +1 -1
  34. package/skills/marketplace/scripts/marketplace.mjs +1 -1
  35. package/skills/marketplace/scripts/update.mjs +52 -0
  36. package/skills/marketplace/scripts/validate.mjs +1 -1
  37. package/skills/migrate-plugin/SKILL.md +1 -2
  38. package/skills/publish-plugin/SKILL.md +15 -6
  39. package/skills/version/README.md +2 -2
  40. package/skills/version/SKILL.md +4 -4
  41. package/skills/version/scripts/version.mjs +1 -1
@@ -0,0 +1,75 @@
1
+ # Route: update
2
+
3
+ Change one entry the catalogs already list, and keep everything else about it. This is the route
4
+ for an entry that is listed and wrong or stale: a new source, a moved pin, one field.
5
+
6
+ `add --force` is not a substitute. It replaces the entry with what `add` can derive, so it needs
7
+ `--owner` and the other `add` inputs again, and it drops what it cannot derive: `category`,
8
+ `author`, any field a curator wrote by hand. Use `update` whenever the entry already exists.
9
+
10
+ An entry that is not listed yet is `add`'s (`references/add.md`). A plugin this repository holds is
11
+ re-derived by `init` or `plugin build`; reach for `update` there only for a field neither derives,
12
+ such as `category`.
13
+
14
+ ## 1. Work out the change
15
+
16
+ Name the entry by the name the catalogs list it under, then say what changes:
17
+
18
+ | The user wants | Flags |
19
+ | --- | --- |
20
+ | Move the entry to another source, such as the `github` shorthand to an https `url` | `--source <spec>` |
21
+ | Bump or change a pin | `--ref <branch-or-tag>`, `--sha <commit>` |
22
+ | Change one field | `--description`, `--version`, `--homepage`, `--repository`, `--license`, `--keywords`, `--category` |
23
+ | Remove a field or a pin | `--unset <field>`, repeatable; `--unset ref`, `--unset sha` |
24
+
25
+ `--source` is read exactly the way `add` reads its spec, so the same collisions apply: write
26
+ `./plugins/alpha` or pass `--path` for a directory, and `--npm`, `--github`, `--url`, and `--subdir`
27
+ shape it the same way. A `<plugin>@<marketplace>` spec is refused; copying an entry is `add`'s job.
28
+
29
+ Two pin rules to state to the user before running:
30
+
31
+ - **A new git source keeps the old pin** unless `--ref` or `--sha` comes with it. Switching how a
32
+ repository is reached does not move which commit installs.
33
+ - **`--ref` alone keeps an existing `sha`.** A sha pinned for the old ref then names a commit the
34
+ new one has moved past. When bumping a ref, pass `--unset sha` too, or pass the new `--sha`.
35
+
36
+ ## 2. Preview, then write
37
+
38
+ ```bash
39
+ node scripts/update.mjs repobuddy --source https://github.com/cyberuni/repobuddy.git --dry-run
40
+ ```
41
+
42
+ Resolve that path against this skill's own directory; `npx universal-plugin marketplace update` is
43
+ the fallback. Run `--dry-run` first and show the plan. The command never prompts.
44
+
45
+ | Status | Means |
46
+ | --- | --- |
47
+ | `updated` | the entry changed |
48
+ | `unchanged` | already says exactly this |
49
+ | `planned` | `--dry-run` only |
50
+ | `skipped` | that catalog is missing, does not list the entry, or its runtime cannot install the new source; the reason says which |
51
+
52
+ With no target flags all four catalogs are selected, so a `skipped` row for a catalog that never
53
+ listed the entry is normal. Report every skip with its reason anyway. Two deserve a sentence each:
54
+
55
+ - **A runtime that cannot install the new source keeps its old entry.** Moving an entry to `npm`
56
+ leaves Copilot CLI and Cursor on the source they had. Say so; the user may want those entries
57
+ removed, which is a hand decision this skill does not make.
58
+ - **A shield catalog may appear.** Copilot CLI and Cursor read the Claude catalog when they have none
59
+ of their own. If the new source would break them there, their own catalog is written without the
60
+ entry, as `add` does. Tell the user the file appeared and why.
61
+
62
+ The Codex catalog takes only `version` and `category` of the field flags, because that is all its
63
+ entries carry. A description changed everywhere else is not missing from Codex by mistake.
64
+
65
+ ## 3. Validate
66
+
67
+ The command checks every catalog it plans to write, with the same checks as `validate`, before it
68
+ writes anything. An update that would introduce an issue stops and writes nothing; fix the input and
69
+ rerun. An issue the catalogs already had does not stop it.
70
+
71
+ So the write is safe, but the repository may still carry older issues. Follow
72
+ `references/validate.md` and report its result, not just the update's.
73
+
74
+ Then state plainly that nothing was published: the change sits in the repository until it is pushed
75
+ and a user refreshes the marketplace.
@@ -35,7 +35,7 @@ the fix is to run `init` or `add` so the runtime gets a catalog of its own.
35
35
 
36
36
  Fix an issue in the source it comes from, then regenerate. An entry's fields are derived, so an
37
37
  npm-style `repository` object belongs fixed in the plugin's `plugin.json` (for a discovered plugin)
38
- or passed as `--repository <url>` (for an added one).
38
+ or set with `update <name> --repository <url>` (for an added one, `references/update.md`).
39
39
 
40
40
  The top-level `name` and `owner` live in the catalog itself, and `owner` must be an object —
41
41
  `{ "name": "…" }`, never the `"Name <email>"` string `package.json` uses.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/marketplace/scripts/add.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/marketplace/scripts/add.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/install-docs.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/marketplace/scripts/install-docs.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/marketplace/scripts/install-docs.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { execFileSync } from "node:child_process";
5
5
  import * as fs from "node:fs";
6
6
  import * as path from "node:path";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/marketplace/scripts/marketplace.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/marketplace/scripts/marketplace.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/marketplace/scripts/update.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
+ import { spawnSync } from "node:child_process";
5
+ //#region src/compile/scripts.ts
6
+ /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
7
+ * library it inlines, reads it; universal-plugin depends on neither. */
8
+ const SCRIPT_GLOBAL = "__SKILL_SCRIPT__";
9
+ //#endregion
10
+ //#region src/skill-scripts/cli-runner.ts
11
+ /** The data `plugin build` embedded in this compiled script. */
12
+ function skillScript() {
13
+ const data = globalThis[SCRIPT_GLOBAL];
14
+ if (data === void 0) throw new Error("this script runs only as compiled by `plugin build`");
15
+ return data;
16
+ }
17
+ /** Runs the universal-plugin CLI. A skill may be copied away from its package, so it never reaches
18
+ * for a CLI beside it: the project's installed CLI first, then the one pinned to this script's
19
+ * version, which `plugin version` stamps. */
20
+ function runCli(args, options = {}) {
21
+ const { bin, package: pkg, version } = skillScript();
22
+ const name = bin ?? "universal-plugin";
23
+ if (spawnSync("pnpm", [
24
+ "exec",
25
+ name,
26
+ "--version"
27
+ ], { encoding: "utf8" }).status === 0) return spawnSync("pnpm", [
28
+ "exec",
29
+ name,
30
+ ...args
31
+ ], {
32
+ encoding: "utf8",
33
+ ...options
34
+ });
35
+ const pinned = `${pkg ?? "universal-plugin"}@${version ?? "latest"}`;
36
+ return spawnSync("npx", [pinned, ...args], {
37
+ encoding: "utf8",
38
+ ...options
39
+ });
40
+ }
41
+ //#endregion
42
+ //#region src/skill-scripts/run-cli.ts
43
+ const script = skillScript();
44
+ const command = Object.entries(script.commands).find(([, entry]) => entry === script.entry)?.[0];
45
+ if (command === void 0) {
46
+ process.stderr.write(`${script.entry} declares no command in the scripts map\n`);
47
+ process.exit(1);
48
+ }
49
+ const result = runCli([...command.split(" "), ...process.argv.slice(2)], { stdio: "inherit" });
50
+ process.exit(result.status ?? 1);
51
+ //#endregion
52
+ export {};
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/marketplace/scripts/validate.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/marketplace/scripts/validate.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
@@ -87,7 +87,7 @@ configuration is:
87
87
  }
88
88
  ```
89
89
 
90
- Retain existing package entries such as `bin`, `dist`, and `governances`.
90
+ Retain existing package entries such as `bin`, `dist`, and `references`.
91
91
  Never replace the allowlist wholesale.
92
92
 
93
93
  ## 4. Bundle the CLI with tsdown
@@ -173,7 +173,6 @@ as a follow-up instead of doing it inside this migration.
173
173
 
174
174
  Point every version and build step at the new plugin root:
175
175
 
176
- - Set the manifest extension's `packagePath` to `"."`.
177
176
  - `universal-plugin plugin version --from-package --root <pkg>` reads `packagePath` from
178
177
  `<pkg>/.agents/universal-plugin.json`, not from the manifest extension. With
179
178
  no `packagePath` it reads `<pkg>/package.json`, so a package that holds its
@@ -34,7 +34,8 @@ is the common case.
34
34
 
35
35
  ### 0a. Identify the marketplace repo
36
36
 
37
- Default to `cyberuni/cyberplace` unless the user names another one.
37
+ Default to `cyberuni/cyberplace` unless the user names another one. The commands below call it
38
+ `<marketplace-repo>` (`<owner>/<repo>`), and its repository name `<marketplace-repo-name>`.
38
39
 
39
40
  ### 0b. Identify which repo the cwd is
40
41
 
@@ -239,6 +240,14 @@ The `source` field supports the same shapes as Claude Code (`url`, `github`, `gi
239
240
 
240
241
  If the plugin is already listed (this is an update), find its existing entry, update changed fields, and preserve any curator-added fields not in the standard shape. Do not overwrite `publishedAt` if present — add `"updatedAt": "<today>"` instead.
241
242
 
243
+ For a change `marketplace update` covers (a new source, a moved `ref` or `sha` pin, or a field such as `description`, `version`, or `category`), run it in the marketplace checkout rather than editing the catalogs by hand. It keeps every field it is not given, curator fields included, and validates each catalog before writing:
244
+
245
+ ```bash
246
+ npx universal-plugin marketplace update <plugin-name> --source <spec> --dry-run --root .
247
+ ```
248
+
249
+ Drop `--dry-run` once the plan reads right. `updatedAt` and any other field it has no flag for are still set by hand.
250
+
242
251
  Show all prepared entries to the user and ask them to confirm before proceeding.
243
252
 
244
253
  ### 2f. Resolve the plugin's dependencies
@@ -309,15 +318,15 @@ Otherwise, the marketplace repo is elsewhere and needs a working copy. If the us
309
318
  (org member), work directly:
310
319
 
311
320
  ```bash
312
- gh repo clone cyberuni/cyberplace
313
- cd cyberplace
321
+ gh repo clone <marketplace-repo>
322
+ cd <marketplace-repo-name>
314
323
  ```
315
324
 
316
325
  If a fork is needed:
317
326
 
318
327
  ```bash
319
- gh repo fork cyberuni/cyberplace --clone --remote
320
- cd cyberplace
328
+ gh repo fork <marketplace-repo> --clone --remote
329
+ cd <marketplace-repo-name>
321
330
  git fetch upstream && git merge upstream/main
322
331
  ```
323
332
 
@@ -346,7 +355,7 @@ git push origin add-<plugin-name>
346
355
 
347
356
  ```bash
348
357
  gh pr create \
349
- --repo cyberuni/cyberplace \
358
+ --repo <marketplace-repo> \
350
359
  --title "Add <plugin-name> v<version>" \
351
360
  --body "$(cat <<'EOF'
352
361
  ## Plugin
@@ -27,8 +27,8 @@ semantic-release stamps files that exist only in the npm package unless `@semant
27
27
  commits them back. Git-sourced installs read `plugin.json` from the repository, so they need that
28
28
  commit-back.
29
29
 
30
- `plugin bundle` and `publish sync-version` are deprecated aliases and are removed in the next minor
31
- release.
30
+ `plugin bundle` and `publish sync-version` are deprecated aliases. They have warned since 0.14.0 and will be
31
+ removed in a later release.
32
32
 
33
33
  ## The part that is not automatable
34
34
 
@@ -74,7 +74,7 @@ node scripts/version.mjs --from-package
74
74
  ```
75
75
 
76
76
  Resolve that path against this skill's own directory; it runs the project's installed CLI
77
- (`pnpm exec universal-plugin`), else `npx universal-plugin@0.16.3` pinned to this skill's version.
77
+ (`pnpm exec universal-plugin`), else `npx universal-plugin@0.17.1` pinned to this skill's version.
78
78
  `universal-plugin plugin version` on the `PATH` is the fallback. The command never prompts, so it is safe to run unattended once the
79
79
  source is decided.
80
80
 
@@ -138,8 +138,8 @@ Every guard resolves before the first write, so a failed run leaves the tree unt
138
138
  `plugin build`; the bump already re-derived them.
139
139
  - **Run `npm version`.** It knows only `package.json` and leaves the canonical manifest and the
140
140
  skill pins stale.
141
- - **Use the deprecated commands.** `plugin bundle` and `publish sync-version` print a warning and are
142
- removed in the next minor release. `sync-version` now runs `plugin version --from-package`.
141
+ - **Use the deprecated commands.** `plugin bundle` and `publish sync-version` print a deprecation
142
+ warning; use `plugin version` instead. `sync-version` now runs `plugin version --from-package`.
143
143
 
144
144
  ## Related skills
145
145
 
@@ -148,7 +148,7 @@ Every guard resolves before the first write, so a failed run leaves the tree unt
148
148
  | Create, adopt, or change what the plugin declares | `init-universal-plugin` |
149
149
  | Re-derive the vendor manifests by hand | `build-plugin` |
150
150
  | Check whether every place agrees (`unstamped`, `version-drift`) | `doctor-universal-plugin` |
151
- | Add a changeset for the change being released | `add-changeset` |
151
+ | Add a changeset for the change being released | `buddy-changesets:changesets` |
152
152
  | Refresh the repository's own marketplace catalogs after a bump | `marketplace` |
153
153
  | List the released plugin in the shared marketplace | `publish-plugin` |
154
154
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/version/scripts/version.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/version/scripts/version.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the