@hagicode/cli 0.3.0 → 0.6.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.
@@ -0,0 +1,172 @@
1
+ # Session Data
2
+
3
+ Use this reference when an agent runs inside a HagiCode session and the user asks about their own projects, proposals, chat sessions, vaults, scheduled plans or installed skills.
4
+ Read-only inspection comes first. Change state only when the user asked for that change in the conversation.
5
+
6
+ ## Runtime variables
7
+
8
+ A HagiCode session can give you four variables. Each one is defined here, once:
9
+
10
+ | Variable | Carries |
11
+ | --- | --- |
12
+ | `HAGI_API_BASE_URL` | Address of the backend that started the session. `hagi` reads it when no `--base-url` is given. |
13
+ | `HAGI_VERSION` | Version of the HagiCode server that started the session. |
14
+ | `HAGI_DEPLOYMENT_TYPE` | Deployment type of that server. |
15
+ | `HAGI_API_LANG` | The user's effective AI language, `zh-CN` or `en-US`. `hagi` sends it as `Accept-Language`. |
16
+
17
+ The server adds them to an agent run only when all of these hold:
18
+
19
+ - the built-in `hagi` skill is installed and enabled;
20
+ - the run is on Claude Code, Pi, OpenCode, GitHub Copilot or omp, the agent CLIs that load built-in skills at launch;
21
+ - the value is one the server can determine. A value it cannot determine is left out, and the run still starts.
22
+
23
+ A value the user already set in the environment is kept, not replaced.
24
+ The variables carry facts about the server and the language only. They never carry a token or a file path.
25
+
26
+ If a variable you rely on is absent, say that it is absent and ask the user. Do not guess a value, install software, or retry in a loop.
27
+
28
+ ## Connection
29
+
30
+ Run `hagi` with no `--base-url` flag and no token when `HAGI_API_BASE_URL` is set; the variable is enough.
31
+
32
+ - Pass `--base-url <url>` only when the user gives you an address.
33
+ - If the CLI exits with code `2` and says no backend base URL is configured, the variable is missing from this session. Tell the user, and ask for the address. Do not guess one.
34
+ - Use `--json` for every command whose output you will read or summarize.
35
+
36
+ ## Choosing the runner
37
+
38
+ 1. If `hagi` is on `PATH`, run `hagi ...`.
39
+ 2. Otherwise, if `node --version` reports 24 or newer, run `npx @hagicode/cli ...`.
40
+ 3. If neither is available, say that the CLI cannot run here and why. Continue without inventing data, and do not install Node.js or the CLI unless the user asks.
41
+
42
+ ## Read-only commands
43
+
44
+ Run these freely to answer questions. Each list or get command is safe to repeat.
45
+
46
+ ### Projects
47
+
48
+ ```bash
49
+ hagi project list --json
50
+ hagi project repositories --id <project-id> --json
51
+ ```
52
+
53
+ `project repositories` lists one project's repositories. Its paths are the only values a proposal's repository scope may name.
54
+
55
+ ### Proposals
56
+
57
+ ```bash
58
+ hagi proposal list --json
59
+ hagi proposal list --project-id <project-id> --active-only --json
60
+ hagi proposal get --session-id <session-id> --json
61
+ hagi proposal messages --session-id <session-id> --last 1 --json
62
+ ```
63
+
64
+ `proposal get` and `proposal messages` only read. `proposal get --wait` polls the status until it settles and changes nothing.
65
+
66
+ ### Vaults
67
+
68
+ ```bash
69
+ hagi vault list --json
70
+ hagi vault files list --id <vault-id> --path <relative-dir> --json
71
+ hagi vault files preview --id <vault-id> --path <relative-file> --json
72
+ ```
73
+
74
+ `vault files preview` reads one file. Preview only the files the user's question needs.
75
+
76
+ ### Chat sessions
77
+
78
+ ```bash
79
+ hagi chat list --json
80
+ hagi chat list --project-id <project-id> --active-only --json
81
+ ```
82
+
83
+ ### HagiTasks
84
+
85
+ ```bash
86
+ hagi hagitask list --json
87
+ hagi hagitask schema --task-id <task-id> --json
88
+ hagi hagitask get --session-id <session-id> --json
89
+ hagi hagitask messages --session-id <session-id> --last 1 --json
90
+ ```
91
+
92
+ Read the schema before creating a HagiTask session. Its `parameters` give the input keys, and `inputSchema` is the JSON Schema the input must satisfy.
93
+
94
+ ### Scheduled plans
95
+
96
+ ```bash
97
+ hagi plan list --json
98
+ hagi plan get --id <plan-id> --json
99
+ ```
100
+
101
+ ### Sagas
102
+
103
+ ```bash
104
+ hagi saga list --project-id <project-id> --json
105
+ hagi saga status <saga-id> --project-id <project-id> --json
106
+ hagi saga items <saga-id> --project-id <project-id> --json
107
+ ```
108
+
109
+ These queries read the selected project's Saga files without initializing or repairing them, refreshing runtime status,
110
+ or executing acceptance commands. Status is a fresh `saga-status/2` observation; its `updatedAt` is not the stored
111
+ execution heartbeat in `runtime/status.json`. `init` installs resources and `new` creates a Saga, so run either only
112
+ when the user explicitly asks for that change. Contract and lifecycle operations run through `hagi saga` with the execution token rules in `references/saga.md`.
113
+
114
+ ### Skills
115
+
116
+ ```bash
117
+ hagi skills local list --json
118
+ hagi skills gallery search --query <keyword> --json
119
+ hagi skills gallery detail --id <gallery-id> --source <source> --json
120
+ hagi skills trusted list --json
121
+ ```
122
+
123
+ `hagi skills local list --json` returns one item per installed skill. Read these fields from each item:
124
+
125
+ - `origin`: `user` for a skill the user installed, `built-in` for a skill the server ships. An item with no `origin` is a user skill.
126
+ - `builtIn.enabled`: whether a built-in skill is on. It is present only for built-in skills. For user skills, availability does not apply.
127
+ - `builtIn.version`: the version the release recorded for a built-in skill. It may be absent.
128
+ - `managedInstallMetadata.version`: the version of a user skill installed through the gallery, when recorded.
129
+
130
+ ## State-changing commands
131
+
132
+ Run these only when the user has asked for that action in this conversation.
133
+ First name the action and its target (the id, the title or the name), then run it.
134
+ A question such as "what is in my plan" is not a request to run, enable, disable or delete it.
135
+
136
+ | Family | Commands that change state |
137
+ | --- | --- |
138
+ | `project` | `create`, `update`, `delete` |
139
+ | `proposal` | `create`, `optimize-description`, `generate`, `annotate`, `execute`, `archive`, `status`, `complete`, `send` |
140
+ | `vault` | `create`, `update`, `delete` (`delete --delete-local-files` also removes files) |
141
+ | `chat` | `create`, `archive`, `delete`, `send` |
142
+ | `hagitask` | `create`, `send` |
143
+ | `plan` | `create`, `update`, `enable`, `disable`, `delete`, `run` |
144
+ | `saga` | `init`, `new`, `session create` |
145
+ | `skills` | `local enable`, `local disable`, `local uninstall`, `gallery install`, `trusted upsert`, `trusted delete`, `trusted reset` |
146
+
147
+ A `send` or `run` starts agent work, and `execute` and `generate` start it too. Treat those as changes of the same kind.
148
+
149
+ `saga session create` creates a chat session for a Saga Worker and records it in the Saga's `runtime/sessions.md`. Creating a Worker changes state, so run it only when the user or a Saga run explicitly asks for it. It takes the execution token from `SAGA_EXECUTION_TOKEN` only, and with `--path` it calls the backend to find the project. See [`saga.md`](saga.md#worker-sessions).
150
+
151
+ A `send` with Steer (`--steer`, or `HAGI_SEND_STEER` set in the calling shell) inserts its text into a running turn. The result says which happened: `steered` means a running task took it, and `queued` means no running task did, so it went out as the next message. `HAGI_SEND_STEER` belongs to the calling shell; the backend does not set it inside agent sessions.
152
+
153
+ `hagitask create` with a Super Commit prompt (`--prompt-id auto-compose-commit.<locale>`) creates commits in a code repository, and with `--need-push` publishes them. Start it only when the user asked for it in this conversation, and add `--need-push` only when the user asked for a push. See [`super-commit.md`](super-commit.md).
154
+
155
+ `skills local enable` and `skills local disable` change whether a built-in skill loads. The change applies to agent runs that start afterwards; a run already in progress keeps its skills. Built-in skills cannot be uninstalled through the CLI.
156
+
157
+ Before `proposal create`, the proposal's repository scope is settled. Take the writable and read-only repositories from the user's request, or infer them from the session's repository scope when the session states one. When neither gives the scope, ask the user and offer the project's repositories from `project repositories --id <project-id> --json` as the choices. Do not guess the scope, and do not widen the writable list. The scope is written into the chief complaint as a `Repository scope` section; see [`proposal-flow.md`](proposal-flow.md#repository-scope).
158
+
159
+ When you name the action and its target before running `proposal create`, name its repository scope too.
160
+
161
+ ## Failure handling
162
+
163
+ | Exit code | Meaning | What to tell the user |
164
+ | --- | --- | --- |
165
+ | `2` | No base URL, or a usage error | The session did not provide `HAGI_API_BASE_URL`, or the command was malformed. Name the missing piece. |
166
+ | `21` / `23` | Unauthorized / forbidden | The backend rejected the request. Report the code; do not try a token. |
167
+ | `24` | Not found | Name the id that was not found and suggest a `list` command to find the right one. |
168
+ | `30` | Operation failed: the backend refused a change and returned a result with `succeeded` false, for example `skills local enable` or `disable` on a name that is not a built-in skill | Quote the backend message from the output and stop. Nothing changed. |
169
+ | `60` | Transport or connection failure | Say the backend is unreachable at the named base URL. Do not retry in a loop, and do not guess another address. |
170
+ | other non-zero | HTTP or unknown error | Quote the error message and stop. |
171
+
172
+ When a command fails, report the failure. Do not fill the gap with guesses about the user's data.
@@ -0,0 +1,106 @@
1
+ # Super Commit through `hagi`
2
+
3
+ Use this reference when a user asks to commit the uncommitted changes of a code repository, to publish them, or to explain or check a Super Commit run.
4
+
5
+ Super Commit commits the uncommitted changes in a code repository. It runs as a separate session, not as part of the proposal lifecycle. It creates commits, and with `--need-push` it also publishes them. Treat it as a state-changing action: start it only when the user asked for it.
6
+
7
+ For what the archive commit does, and how it differs from Super Commit, see [openspec-workflow.md](openspec-workflow.md#two-kinds-of-commit).
8
+
9
+ ## Start it: a prompt, not a preset task
10
+
11
+ Super Commit is started with a prompt id:
12
+
13
+ ```bash
14
+ hagi hagitask create --title <title> --project-id <project-id> --prompt-id auto-compose-commit.en-US --json
15
+ ```
16
+
17
+ Use the locale that matches the user's language in place of `en-US`. The prompt id alone marks the session as a Super Commit.
18
+
19
+ Super Commit is a prompt, not a preset task. It has no preset task id and no schema, so `hagi hagitask schema` does not apply to it. Do not pass `--task-id` or `--input` for it.
20
+
21
+ Use the name Super Commit in your explanation to the user. The prompt id appears only inside commands.
22
+
23
+ ## Options
24
+
25
+ Every option below is accepted by `hagi hagitask create`. The CLI checks these rules before any network call, and a violation is a usage error with exit code `2`.
26
+
27
+ | Option | Meaning |
28
+ | --- | --- |
29
+ | `--repository-path <path>` | MonoSpecs sub-repository to commit in, for example `repos/cli`. |
30
+ | `--need-push` | Publish the commits after they are created. Add it only when the user asked for a push. |
31
+ | `--pull-rebase` | Run `git pull --rebase` before the push. It has effect only with `--need-push`, and only when the run stays on the current branch. |
32
+ | `--target-branch-mode <mode>` | Which branch the commits go on. Modes are below. |
33
+ | `--target-branch-name <name>` | Name of the branch to create. It needs `--target-branch-mode new-custom`. |
34
+
35
+ Branch modes:
36
+
37
+ - `current`: commit on the branch that is checked out now.
38
+ - `new-custom`: create the branch named by `--target-branch-name` before the first commit. It needs a name. `--target-branch-name` without this mode is a usage error.
39
+ - `ai-generated-new`: create a new branch with a name the backend generates, before the first commit.
40
+
41
+ ## Server-owned choices
42
+
43
+ The Git identity, the co-author trailer and the sign-off setting come from the user's saved server settings. The CLI has no option for them.
44
+
45
+ Do not invent a flag for them, and do not put them in `--message`. If the user wants a different co-author for a run, tell them that the CLI has no option for it and ask them to change the saved setting.
46
+
47
+ ## Read the result
48
+
49
+ After the session settles (see "Who drives each step"), read the final message:
50
+
51
+ ```bash
52
+ hagi hagitask messages --session-id <id> --last 1
53
+ ```
54
+
55
+ The run ends with a result block:
56
+
57
+ - `## Commits Created`: every planned commit was made, and the push happened if one was requested.
58
+ - `## Commits Incomplete`: at least one commit failed, files were left uncommitted, or a requested push was skipped or failed.
59
+
60
+ Then read these lines:
61
+
62
+ - `**Commits:**` the commit count, for example `2`, or `1 of 2` when the run is incomplete.
63
+ - `**Push:**` the push outcome, for example `pushed to origin/<branch>`, or `skipped (reason)`.
64
+ - A numbered list of the commits, without hashes.
65
+
66
+ Report the result as it is:
67
+
68
+ - For `## Commits Created`: report the commit count and, if a push was requested, the push outcome.
69
+ - For `## Commits Incomplete`: report what was left undone. Do not say the commit succeeded.
70
+ - Retry through `hagi hagitask send --session-id <id> --content <text>` only when the user asks for it.
71
+
72
+ The result contains no commit hashes. To read them, run `git log` in the target repository.
73
+
74
+ ## Explicit request
75
+
76
+ Starting a Super Commit creates commits in a repository, and with `--need-push` publishes them. So:
77
+
78
+ - Start one only when the user asked for it in this conversation.
79
+ - Add `--need-push` only when the user asked for a push. If the user asks for a Super Commit and does not mention a push, leave `--need-push` out.
80
+ - After `hagi proposal execute` and a settled wait, if code changes remain uncommitted, offer a Super Commit and wait for the user's answer. Do not start one.
81
+ - Never start one as a side effect of another lifecycle command.
82
+
83
+ The web Git tab runs the same feature.
84
+
85
+ ## Who drives each step
86
+
87
+ | Step | Who |
88
+ | --- | --- |
89
+ | `hagi hagitask create --prompt-id auto-compose-commit.<locale>` | the agent, only on request |
90
+ | The commit work | an AI run inside the backend |
91
+ | Following the run | the agent, with `hagi hagitask get --session-id <id> --wait --json` |
92
+ | Archiving the finished session | automatic, by the default rule `ai-commit-auto-archive` |
93
+
94
+ Monitor the run with:
95
+
96
+ ```bash
97
+ hagi hagitask get --session-id <id> --wait --json
98
+ ```
99
+
100
+ Read the `status` and the `wait` object:
101
+
102
+ - Optimizing, Openspecing, Executing and Archiving mean the run is still going.
103
+ - WaitingForReply means a person must answer.
104
+ - A timeout (exit code `31`) is reported with the last status. Do not retry in a loop.
105
+
106
+ The default rule `ai-commit-auto-archive` archives the finished session automatically. So the agent runs no `archive` or `complete` for a Super Commit session. The rule is a user setting and may be off. Do not assume the session is archived: read `status`, and if the status is not Archived, report it as it is.
@@ -0,0 +1,164 @@
1
+ # Validation
2
+
3
+ Run the smallest relevant set after changes.
4
+ Documentation-only updates do not require the full code validation stack, but cross-links and package metadata assumptions still need confirmation.
5
+
6
+ ## Documentation and skill checks
7
+
8
+ Confirm these paths resolve and link correctly:
9
+
10
+ - `repos/cli/README.md`
11
+ - `repos/cli/skills/README.md`
12
+ - `repos/cli/skills/hagi/SKILL.md`
13
+ - `repos/cli/skills/hagi/agents/openai.yaml`
14
+ - `repos/cli/skills/hagi/references/*.md`
15
+
16
+ Check that every command named in the references is registered: the `hagi` help output after a build lists the same families and subcommands.
17
+
18
+ ## Repository scope rule check
19
+
20
+ The repository scope rule for `proposal create` must appear in three files. Each one is checked on its own, and one file that still has the rule does not stand in for another:
21
+
22
+ - `SKILL.md` carries the core rule: the writable and read-only lists, and the `project repositories` query.
23
+ - `references/proposal-flow.md` carries the `Repository scope` section: the query step, the `Writable repositories:` and `Read-only repositories:` lists, and the example that begins its chief complaint with that section.
24
+ - `references/session-data.md` carries the state-changing rule: the scope is taken from the user or the session, and the agent asks when neither gives it instead of guessing.
25
+
26
+ Run this from `repos/cli` after editing any of the three:
27
+
28
+ ```bash
29
+ grep -n "Repository scope" skills/hagi/SKILL.md skills/hagi/references/proposal-flow.md
30
+ grep -n "Read-only repositories" skills/hagi/SKILL.md skills/hagi/references/proposal-flow.md
31
+ grep -n "project repositories" skills/hagi/SKILL.md skills/hagi/references/proposal-flow.md skills/hagi/references/session-data.md
32
+ grep -n "ask the user" skills/hagi/SKILL.md skills/hagi/references/proposal-flow.md skills/hagi/references/session-data.md
33
+ ```
34
+
35
+ Each of the three files must match the lines listed for it above. A file that is missing a match fails the check, and it is fixed in the skill folder, not by copying the rule from another file.
36
+
37
+ Confirm also that no skill file names `--writable-repo` or `--readonly-repo`, and that every `proposal create` example passes a chief complaint that begins with the `Repository scope` section.
38
+
39
+ ## HagiTask command check
40
+
41
+ The `hagitask` command group must appear in the README and in each skill file that lists command families, and no file may document the retired `autotask` command. Run this from `repos/cli`:
42
+
43
+ ```bash
44
+ for f in README.md skills/hagi/SKILL.md skills/hagi/references/cli-usage.md skills/hagi/references/session-data.md skills/hagi/references/super-commit.md skills/hagi/references/openspec-workflow.md; do
45
+ grep -q "hagitask" "$f" && echo "ok hagitask in $f" || echo "FAIL hagitask missing from $f"
46
+ done
47
+ grep -rniE "autotask|auto-task" README.md skills --exclude=validation.md | grep -vi "migrat" || echo "ok no autotask command documented"
48
+ ```
49
+
50
+ Each file must print `ok`. The last grep lists only the migration notes (lines that say "migrat"), so any other match is a stale `autotask` reference and fails the check. This file is excluded from that grep because it names the pattern itself.
51
+
52
+ ## Workflow and Super Commit check
53
+
54
+ Run this from `repos/cli` after editing `references/openspec-workflow.md`, `references/super-commit.md`, or any file that links them. Each line must print `ok`.
55
+
56
+ 1. Both references exist and are linked from `SKILL.md` and `skills/README.md`:
57
+
58
+ ```bash
59
+ for f in skills/hagi/references/openspec-workflow.md skills/hagi/references/super-commit.md; do
60
+ [ -f "$f" ] && echo "ok exists $f" || echo "FAIL missing $f"
61
+ done
62
+ for f in skills/hagi/SKILL.md skills/README.md; do
63
+ for t in openspec-workflow.md super-commit.md; do
64
+ grep -q "$t" "$f" && echo "ok $f links $t" || echo "FAIL $f does not link $t"
65
+ done
66
+ done
67
+ ```
68
+
69
+ 2. No README or skill file shows the retired `--task-id compose-commit` form. This check does not scan this file, which names the pattern itself. The id may remain as test data in `tests/commands/hagitask.test.ts`, the one allowed place, and that file is outside this scan:
70
+
71
+ ```bash
72
+ grep -rn --exclude=validation.md -e "--task-id compose-commit" README.md skills
73
+ status=$?
74
+ if [ "$status" -eq 0 ]; then
75
+ echo "FAIL retired compose-commit example found above"
76
+ elif [ "$status" -eq 1 ]; then
77
+ echo "ok no --task-id compose-commit in README.md or skills"
78
+ else
79
+ echo "FAIL grep could not run"
80
+ fi
81
+ ```
82
+
83
+ 3. Every option the two references name is registered in the built CLI. Build first (`pnpm run build`), then run:
84
+
85
+ ```bash
86
+ check() {
87
+ local command="$1"; shift
88
+ for option in "$@"; do
89
+ node ./dist/cli.js $command --help | grep -q -- "$option" && echo "ok $command $option" || echo "FAIL $command $option is missing"
90
+ done
91
+ }
92
+ check "proposal get" --session-id --wait --timeout --interval --grace --json
93
+ check "proposal messages" --session-id --last --json
94
+ check "hagitask get" --session-id --wait --timeout --interval --grace --json
95
+ check "hagitask messages" --session-id --last --json
96
+ check "hagitask create" --prompt-id --repository-path --need-push --pull-rebase --target-branch-mode --target-branch-name
97
+ ```
98
+
99
+ 4. Both references have a "Who drives each step" section and both name `--wait`. Each count must be at least `1`:
100
+
101
+ ```bash
102
+ grep -c "Who drives each step" skills/hagi/references/openspec-workflow.md skills/hagi/references/super-commit.md
103
+ grep -l -- "--wait" skills/hagi/references/openspec-workflow.md skills/hagi/references/super-commit.md
104
+ ```
105
+
106
+ ## Built-in copy consistency check
107
+
108
+ The embedded skill exists twice: `repos/cli/skills/hagi` is the only place it is edited, and `repos/built-in-skills/content/hagi` is the copy the server ships as the built-in `hagi` skill. Run this from the monorepo root to confirm the two match:
109
+
110
+ ```bash
111
+ diff -r repos/cli/skills/hagi repos/built-in-skills/content/hagi
112
+ ```
113
+
114
+ The expected result is no output, which means the folders are identical. Any output names a file that differs, is missing from one side, or is extra on one side.
115
+
116
+ - If the check reports a difference, fix it by editing only `repos/cli/skills/hagi`. Never edit the bundle copy by hand.
117
+ - Refreshing the bundle copy and its content hash is a separate follow-up in the bundle repository. It is not part of a CLI change, and a skill change leaves the check reporting differences until that follow-up runs.
118
+ - After the repository scope edit, the bundle copy must be recopied from `repos/cli/skills/hagi` and its hash refreshed. Doing that needs write access to `repos/built-in-skills`. Until then, sessions that load the built-in `hagi` skill run the older text, with no `project repositories` guidance.
119
+ - In a standalone CLI checkout the bundle is not beside the CLI. Replace `repos/built-in-skills/content/hagi` with the path to the `content/hagi` folder of a checked-out built-in skills bundle, for example `<path-to-built-in-skills>/content/hagi`.
120
+
121
+ ## Maintainer validation commands
122
+
123
+ When command behavior, metadata, or packaging changes are involved, run the smallest relevant subset:
124
+
125
+ ```bash
126
+ cd repos/cli
127
+ pnpm run build
128
+ pnpm run typecheck
129
+ pnpm test
130
+ node ./dist/cli.js --help
131
+ node ./dist/cli.js proposal --help
132
+ ```
133
+
134
+ If only a specific command changed, also verify that command's help directly.
135
+
136
+ ## Saga Worker session command
137
+
138
+ Run this when `src/commands/saga/session.ts`, the Saga runtime helpers (`project.ts`, `safeWrite.ts`, `sessionRecord.ts`),
139
+ the run prompt or these references changed:
140
+
141
+ ```bash
142
+ cd repos/cli
143
+ pnpm exec vitest run tests/commands/saga-session-create.test.ts tests/runtime/saga/appendContained.test.ts tests/runtime/saga/project.test.ts tests/runtime/saga/sessionRecord.test.ts
144
+ pnpm exec vitest run tests/runtime/saga/assets.test.ts tests/docs
145
+ node ./dist/cli.js saga session create --help
146
+ ```
147
+
148
+ The command test covers argument validation, token rejection, selector matching, the `saga.*` metadata, the `sessions.md`
149
+ append and the failed-record report. The help check prints the parameters, the metadata keys and the metadata limits.
150
+
151
+ ## Package publish-surface check
152
+
153
+ Run this when `package.json`, publish contents, or release metadata changed. The Saga asset check and the package check
154
+ are offline:
155
+
156
+ ```bash
157
+ cd repos/cli
158
+ pnpm exec vitest run tests/runtime/saga/assets.test.ts
159
+ pnpm run pack:check
160
+ ```
161
+
162
+ The npm tarball ships `dist`, `README.md`, `skills/**`, and only
163
+ the allowlisted Saga resources, including the hidden `.gitignore` template. `pack:check` verifies the actual package
164
+ contents and rejects source maps or unexpected resource files.