silvermoon 0.1.3 → 0.2.0-rc.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.
package/docs/reference.md CHANGED
@@ -133,12 +133,21 @@ State is derived in order:
133
133
  ## Public Commands
134
134
 
135
135
  ```sh
136
+ silvermoon list-ideas [--state <state>] [--all] [--query <text>] [--created-since <RFC3339>] [--created-before <RFC3339>] [--sort <newest|oldest>] [--limit <positive-integer>] [--trace <file.trace.jsonl>]
136
137
  silvermoon whats-next [idea] [--language <en-US|zh-CN>] [--trace <file.trace.jsonl>]
137
138
  silvermoon create-idea [--language <tag>] [--trace <file.trace.jsonl>]
138
139
  silvermoon check [--remote | --commit <revision> | --staged | --worktree] [--language <en-US|zh-CN>] [--trace <file.trace.jsonl>]
139
140
  ```
140
141
 
141
- `whats-next` and `create-idea` build one dialogue envelope:
142
+ Every valid invocation starts one ordered domain-message stream with
143
+ `intention.accepted`. Observation facts are folded through one immutable
144
+ reducer. Side effects are represented by exactly one `action.requested` and
145
+ one `action.finished` message with the same run-local action ID. A final
146
+ `response.created` message is emitted only after the observation is terminal
147
+ and no action is pending.
148
+
149
+ All successful and trustworthy blocked commands return exactly four
150
+ projections:
142
151
 
143
152
  ```json
144
153
  {
@@ -152,81 +161,93 @@ silvermoon check [--remote | --commit <revision> | --staged | --worktree] [--lan
152
161
  "observation": {
153
162
  "outputLanguage": "en-US"
154
163
  },
155
- "outcomes": [],
156
- "instructions": ""
164
+ "actions": [],
165
+ "response": {
166
+ "kind": "choice-required",
167
+ "language": "en-US",
168
+ "summary": "No active ideas are available.",
169
+ "choices": [],
170
+ "nextSteps": []
171
+ }
157
172
  }
158
173
  ```
159
174
 
160
175
  - `intention` contains the command and normalized business arguments. For
161
176
  `whats-next` and `check`, `args.language` is the canonical temporary output
162
- override or `null`. Output format is not part of the intention.
177
+ override or `null`. For `list-ideas`, args contain the expanded canonical
178
+ state set, normalized UTC bounds, sort, and numeric limit. Output format is
179
+ not part of the intention.
163
180
  - `observation` describes the reliable facts for the requested command and
164
181
  intent, not a mandatory global idea inventory. `outputLanguage` is present
165
182
  even when Git, configuration, or a requested snapshot is unavailable.
166
- - `outcomes` records only high-level repository side effects actually
167
- attempted by this invocation. Each item has `type`, `status` (`success` or
168
- `failure`), and `summary`. An empty array means no side effect was attempted.
169
- - `instructions` contains all ordered next-step guidance for the current
170
- readiness layer. A single remediation is plain text; multiple remediations
171
- are numbered in priority order.
183
+ - `actions` projects only side effects already attempted by this invocation.
184
+ Each item has a unique `id`, stable `type`, `success` or `failure` status,
185
+ and a structured `result` or `problem`. An empty array means no side effect
186
+ was attempted. Probes and future work do not appear here.
187
+ - `response` is a command-specific discriminated union produced only from the
188
+ intention and final internal observation. Its variants are `blocked`,
189
+ `choice-required`, `idea-created`, `idea-list`, `next-steps`, and
190
+ `validation-result`. It contains the localized summary and any ordered
191
+ `nextSteps`, choices, items, validation result, or guidance needed by the
192
+ caller.
172
193
 
173
194
  After readiness, an actionable selected idea or successful creation may add
174
- `guidance` to the command-specific observation:
195
+ content-free `guidance` provenance to the public observation:
175
196
 
176
197
  ```json
177
198
  {
178
199
  "guidance": {
179
200
  "phase": "implementing",
180
201
  "path": ".silvermoon/guidance/implementing.md",
181
- "contentRevision": "<git-blob-object-id>",
182
- "content": "Repository-owned Markdown captured from the snapshot.\n"
202
+ "contentRevision": "<git-blob-object-id>"
183
203
  }
184
204
  }
185
205
  ```
186
206
 
187
- `path`, `contentRevision`, and `content` come from one Git snapshot. The object
188
- ID follows the repository's SHA-1 or SHA-256 object format. Guidance never
189
- appears at the top level or inside canonical `instructions`, and an absent file
190
- does not produce an empty field.
191
-
192
- Default dialogue output renders the same report with concise lists under
193
- `## Current instruction`, `## Project status`, and `## Suggested next steps`
194
- (in Chinese: `## 本次指示`, `## 项目现状`, `## 下一步建议`). The optional
195
- `## Actions and results` (`## 本次操作及结果`) appears only when a visible
196
- outcome remains. A successful fetch is omitted from text when local HEAD
197
- matches the fetched primary; failed fetches and synchronization problems remain
198
- visible. JSON always records attempted outcomes, even when text omits routine
199
- success. `--json` serializes the same decision; there is no YAML output or
200
- second reasoning path. Within the project-status section, nonempty navigation
201
- candidates and observed problems appear under `### Ideas you can continue` and
202
- `### Issues to address` (in Chinese: `### 可继续推进的想法` and
203
- `### 需要处理的问题`). Suggested next steps refer to these candidates without
204
- repeating their inventory. When guidance is present, a separate
205
- `## Project phase guidance` section follows suggested next steps, identifies
206
- its project provenance and metadata, and blockquotes every content line.
207
- Empty sections are omitted. Dialogue exit status `0` means a trustworthy
208
- report was formed, even when it reports readiness blocks or a failed
209
- operation; `1` means an internal failure prevented a trustworthy report; `2`
210
- means invalid CLI usage.
207
+ The matching `response.guidance` carries the same three provenance fields plus
208
+ the captured `content`. All fields come from one Git snapshot, and the object
209
+ ID follows the repository's SHA-1 or SHA-256 format. An absent file produces
210
+ neither field. The public observation intentionally omits content so the
211
+ response is the only rendered payload while still remaining a deterministic
212
+ projection.
213
+
214
+ Default Markdown renders only `response`, never the intention, observation, or
215
+ action history. It begins with the answer, then includes only relevant idea
216
+ references, inventory details, validation details, problems, next steps, and
217
+ blockquoted guidance. `--json` serializes the four projections from the same
218
+ domain stream; there is no YAML output or second reasoning path. A trustworthy
219
+ blocked report still exits `0` for `whats-next` and `create-idea`.
220
+ `list-ideas` exits `0` only for a trustworthy inventory (including an empty
221
+ result) and exits `1` for setup or layout unavailability. `check` exits `0`
222
+ only for a valid snapshot and otherwise exits `1`. Internal failures also exit
223
+ `1`; invalid CLI usage exits `2`.
211
224
 
212
225
  All commands accept `--trace <file.trace.jsonl>`. If the supplied path does not
213
226
  end with the exact lowercase `.trace.jsonl` suffix, Silvermoon appends it while
214
227
  preserving the directory and original name. Repository-local `*.trace.jsonl`
215
228
  files are ignored by the canonical repository. The trace is newline-delimited
216
- JSON with paired `span-start` and `span-end` events, UTC timestamps, monotonic
217
- `durationMs`, parent span IDs, and success or error status. It covers the
218
- command, snapshot observation, adoption, user configuration, idea layout,
219
- repository readiness, temporary snapshot materialization, and individual Git
220
- commands. Git events record the subcommand and result but not command arguments,
221
- stdout, or stderr. The path is relative to the caller's working directory when
222
- not absolute. Events are buffered so a trace inside the repository cannot
223
- affect that invocation's worktree observation. The file is written after the
224
- measured command work finishes and uses exclusive creation, so an existing
225
- normalized target is never overwritten. The top command span records the
226
- canonical output-language override or `null` for `whats-next` and `check`.
227
-
228
- Unsupported output locales, empty values, and invalid BCP 47 tags are usage
229
- errors with exit status `2`, before repository inspection or fetch.
229
+ JSON using trace schema version 2. Every record shares one `traceId`, global
230
+ monotonic `sequence`, and UTC timestamp:
231
+
232
+ - `channel: "domain"` records allowlisted summaries of intention,
233
+ observation transitions, action lifecycle, and response metadata. It
234
+ includes domain `messageSequence` for replay correlation.
235
+ - `channel: "telemetry"` records paired `span-start` and `span-end` events,
236
+ parent span IDs, monotonic `durationMs`, and success or error status.
237
+
238
+ Action telemetry carries the corresponding action ID. Trace projection never
239
+ includes guidance or file content, Git arguments/stdout/stderr, environment
240
+ data, credentials, tokens, or unbounded error text. Turning trace off, replacing
241
+ the domain sink with a no-op, or deleting every telemetry event does not change
242
+ the domain stream or final report. The path is relative to the caller's working
243
+ directory when not absolute. Events are buffered so a trace inside the
244
+ repository cannot affect that invocation's worktree observation. The file is
245
+ written after measured command work finishes and uses exclusive creation, so
246
+ an existing normalized target is never overwritten.
247
+
248
+ Unsupported output locales, empty values, invalid BCP 47 tags, and invalid
249
+ `list-ideas` filters are usage errors with exit status `2`, before repository
250
+ inspection, trace creation, or fetch.
230
251
 
231
252
  Observations are discriminated by command intent and `state`:
232
253
 
@@ -244,7 +265,7 @@ Observations are discriminated by command intent and `state`:
244
265
  (`id`, optional `alias`, lifecycle `state`), including terminal ideas.
245
266
  Unknown selectors return `idea-not-found` with `candidates`, not a
246
267
  fabricated selected idea. An actionable selection may also contain
247
- snapshot-bound `guidance`.
268
+ snapshot-bound guidance provenance; captured content is in the response.
248
269
  - `phase-guidance-invalid` means command readiness reached the current
249
270
  actionable phase, but that phase's optional file exists and is invalid. It
250
271
  contains problems and repair instructions, not lifecycle instructions or
@@ -252,15 +273,23 @@ Observations are discriminated by command intent and `state`:
252
273
  - After a successful `create-idea` preflight, `idea-created` carries
253
274
  `createdIdea` (`id`, `path`, `state: "preparing"`). This confirms
254
275
  pre-creation readiness, not a clean post-creation worktree, and may also
255
- contain captured preparing `guidance`. An attempted but failed scaffold
256
- returns `idea-create-failed` without `createdIdea`; preflight failures retain
257
- their setup or local preparation state.
276
+ contain preparing-guidance provenance. An attempted but failed scaffold
277
+ returns `idea-create-failed` without `createdIdea`, records separate
278
+ scaffold and cleanup actions, and exposes cleanup facts; preflight failures
279
+ retain their setup or local preparation state.
280
+ - Successful `list-ideas` returns `ideas-listed`. Its observation contains the
281
+ normalized snapshot facts, all-five-state counts for the filtered set,
282
+ matched/returned/truncated totals, and ordered items with ID, lifecycle
283
+ state, UTC `createdAt`, and optional alias/title. Its empty `actions` and
284
+ `idea-list` response are deterministic projections of the same command run.
285
+ Setup or layout failures remain cumulative `project-setup-required`
286
+ observations and never return a partial inventory.
258
287
 
259
288
  Dialogue versions have `version.type: "worktree"`. When present, `ideas.counts` has
260
289
  `preparing`, `implementing`, `deploying`, `completed`, and `abandoned`;
261
290
  `activeIdeas` contains only minimal references for the first three states.
262
291
  Problems have only stable `type` and natural-language `summary`; remediation
263
- belongs in dialogue `instructions`.
292
+ belongs in `response.nextSteps`.
264
293
 
265
294
  Project setup is ecosystem-neutral. It checks Git, configuration schema
266
295
  compatibility, and canonical skill content at `.agents/skills/silvermoon`.
@@ -286,6 +315,21 @@ content-language choice accepts any canonical BCP 47 tag, is normalized before
286
315
  preflight, and is persisted to the new idea; without it the status remains
287
316
  dynamically inherited. It does not stage, commit, push, or record approval.
288
317
 
318
+ `list-ideas` is a local worktree query, not lifecycle navigation. With no
319
+ filters it selects the three active states. Repeated `--state` values form a
320
+ deduplicated union and `active` expands to those states; `--all` selects all
321
+ five states and is mutually exclusive with `--state`. Case-insensitive literal
322
+ `--query` matches ID, alias, or the first level-one `Idea.md` heading. RFC 3339
323
+ creation bounds use `[created-since, created-before)` against the timestamp
324
+ encoded in each ULID. Sorting defaults to stable newest-first, and limit is
325
+ applied after filtering and sorting without changing matched counts.
326
+
327
+ The query validates Git presence, configuration, canonical skill, and the
328
+ complete idea layout before filtering. It reads staged, unstaged, and
329
+ untracked idea changes from the current worktree snapshot but never checks
330
+ worktree hygiene, branch, upstream, or primary ancestry, and never fetches or
331
+ accesses the network. It has no temporary `--language` option.
332
+
289
333
  ## Validation Targets
290
334
 
291
335
  - `check` validates only the committed `HEAD` snapshot. It is not a
@@ -300,8 +344,8 @@ dynamically inherited. It does not stage, commit, push, or record approval.
300
344
  locating and validating the remote snapshot.
301
345
 
302
346
  Targets are mutually exclusive and never change the caller's branch, index, or
303
- worktree. `--remote` may fetch Git objects, but it does not produce dialogue
304
- outcomes. `check` validates the selected snapshot's project contract only:
347
+ worktree. `--remote` may fetch Git objects and records that attempt as an
348
+ action. `check` validates the selected snapshot's project contract only:
305
349
  Git, configuration, canonical skill, idea layout, world revisions, status, and
306
350
  the complete optional phase guidance directory.
307
351
  Its result depends on the materialized tree, not commit parents, parent order,
@@ -311,8 +355,7 @@ fact and naturally derives an earlier lifecycle state; it need not still exist
311
355
  in the local object database. `check` does not check local worktree cleanliness,
312
356
  upstream, or ancestry readiness, route ideas, or give next-step instructions.
313
357
 
314
- Unlike dialogue commands, `check --json` contains **only** `intention` and
315
- `observation`:
358
+ Like every public command, `check --json` contains all four projections:
316
359
 
317
360
  ```json
318
361
  {
@@ -344,6 +387,18 @@ Unlike dialogue commands, `check --json` contains **only** `intention` and
344
387
  "activeIdeas": []
345
388
  },
346
389
  "problems": []
390
+ },
391
+ "actions": [],
392
+ "response": {
393
+ "kind": "validation-result",
394
+ "language": "en-US",
395
+ "summary": "The requested Silvermoon snapshot is valid.",
396
+ "validation": {
397
+ "target": { "type": "staged" },
398
+ "valid": true,
399
+ "version": { "type": "staged" }
400
+ },
401
+ "problems": []
347
402
  }
348
403
  }
349
404
  ```
@@ -370,13 +425,13 @@ The `check` observation has its own discriminated states:
370
425
  when the target cannot be resolved, fetched, or materialized; it does not
371
426
  pretend the project was checked.
372
427
 
373
- There are no `outcomes` or `instructions` keys in a check report. Its default
374
- human-readable output gives only the target, validation conclusion, and
375
- problems, not the dialogue's four sections. Text and JSON derive from the same
376
- validation result. Exit code `0` means `project-ready` and is the **only**
377
- pre-commit/CI pass condition. Exit code `1` means invalid, unavailable, or an
378
- internal failure and must fail closed; `2` means invalid CLI usage. Do not
379
- infer success merely from a rendered report or empty-looking output.
428
+ Its default human-readable output renders only the validation response. Text
429
+ and JSON derive from the same validation result. `actions` is empty for local
430
+ targets and contains the paired fetch result for `--remote`. Exit code `0`
431
+ means `project-ready` and is the **only** pre-commit/CI pass condition. Exit
432
+ code `1` means invalid, unavailable, or an internal failure and must fail
433
+ closed; `2` means invalid CLI usage. Do not infer success merely from a
434
+ rendered report or empty-looking output.
380
435
 
381
436
  Runtime checks verify canonical YAML, fixed paths, the three world entries,
382
437
  unique aliases, Git object format, current world tree resolution, phase
@@ -386,10 +441,13 @@ decision provenance through history.
386
441
 
387
442
  ## Schemas
388
443
 
444
+ - [Command report](../schema/v1/command-report.schema.json)
445
+ - [Domain message](../schema/v1/domain-message.schema.json)
389
446
  - [Repository configuration](../schema/v1/config.schema.json)
390
447
  - [User configuration](../schema/v1/user-config.schema.json)
391
448
  - [Idea status](../schema/v1/idea-status.schema.json)
392
449
  - [Shared definitions](../schema/v1/definitions.schema.json)
450
+ - [Unified trace event](../schema/v2/trace-event.schema.json)
393
451
 
394
452
  Phase guidance has no schema or configuration key. Its fixed filenames,
395
453
  Git-entry constraints, and Markdown byte rules are the complete contract.
@@ -10,6 +10,7 @@ The shared authority is `https://github.com/shazhou-ww/silvermoon.git` on
10
10
  optional transport and are not protocol state.
11
11
 
12
12
  ```sh
13
+ silvermoon list-ideas
13
14
  silvermoon whats-next [idea]
14
15
  silvermoon whats-next [idea] --language zh-CN
15
16
  silvermoon create-idea
@@ -24,16 +25,19 @@ silvermoon check --remote
24
25
  Use the primary commit stated in the report as the expected remote tip. When
25
26
  primary moves, reobserve instead of replaying approval or acceptance.
26
27
 
27
- Choose the entry command from the user's intent. Explicit new-idea requests use
28
+ Choose the entry command from the user's intent. Explicit inventory requests
29
+ use `silvermoon list-ideas`; explicit new-idea requests use
28
30
  `silvermoon create-idea` even when unrelated active ideas exist; all navigation
29
31
  uses `silvermoon whats-next [idea]`. Add `--json` only for a programmatic
30
- consumer. Both commands apply the
31
- same project checks, but their repository readiness differs. `whats-next`
32
- checks local hygiene and remote ancestry. `create-idea` requires the configured
33
- primary branch and upstream plus a clean worktree, without fetching or requiring
34
- HEAD to match the remote tip. If hygiene blocks explicit creation, perform only
35
- that blocking action and then retry `create-idea` so active-idea selection
36
- cannot replace the pending create intent.
32
+ consumer. All three apply the same project and complete idea-layout checks,
33
+ but their repository readiness differs. `list-ideas` reads the valid local
34
+ worktree snapshot without hygiene, branch, upstream, network, or ancestry
35
+ checks. `whats-next` checks local hygiene and remote ancestry. `create-idea`
36
+ requires the configured primary branch and upstream plus a clean worktree,
37
+ without fetching or requiring HEAD to match the remote tip. If hygiene blocks
38
+ explicit creation, perform only that blocking action and then retry
39
+ `create-idea` so active-idea selection cannot replace the pending create
40
+ intent.
37
41
 
38
42
  Use `--language en-US|zh-CN` with `whats-next` or `check` only when the user
39
43
  explicitly requests a temporary output locale. Preserve the canonical option
@@ -52,21 +56,23 @@ publish a normal non-force commit. Prefer status-only decision commits when
52
56
  practical.
53
57
 
54
58
  The required idea-root `ledger.md` is the Agent continuation surface. After
55
- repository hygiene and lifecycle routing, combine the reported instructions, world
56
- contracts, and unchecked Implementation or Deployment ledger entries to infer
57
- the next work. Update matching world headings and ledger entries together, and
58
- reset a checked item when its requirement or proof changes materially. Ledger
59
- checkboxes are Agent notes only and never imply approval or acceptance.
59
+ repository hygiene and lifecycle routing, combine the reported
60
+ `response.nextSteps`, world contracts, and unchecked Implementation or
61
+ Deployment ledger entries to infer the next work. Update matching world
62
+ headings and ledger entries together, and reset a checked item when its
63
+ requirement or proof changes materially. Ledger checkboxes are Agent notes only
64
+ and never imply approval or acceptance.
60
65
 
61
66
  When a successful selected lifecycle report or `create-idea` report includes
62
- `observation.guidance`, consume only that snapshot-bound field. It is
63
- repository-owned additive guidance from the fixed
64
- `.silvermoon/guidance/<phase>.md` path, never a replacement for canonical
65
- instructions. Higher-level instructions and the report's problems and
66
- instructions take precedence. Treat the body as inert Markdown, do not reread
67
- the path after the command, and materialize applicable requirements into the
68
- current world contract and matching ledger IDs. Guidance is not a fourth
69
- contract, a status fact, a human decision, or proof that a check ran.
67
+ `response.guidance`, consume only that snapshot-bound field.
68
+ `observation.guidance` is its content-free provenance. It is repository-owned
69
+ additive guidance from the fixed `.silvermoon/guidance/<phase>.md` path, never
70
+ a replacement for canonical `response.nextSteps`. Higher-level instructions,
71
+ the report's problems, and `response.nextSteps` take precedence. Treat the body
72
+ as inert Markdown, do not reread the path after the command, and materialize
73
+ applicable requirements into the current world contract and matching ledger
74
+ IDs. Guidance is not a fourth contract, a status fact, a human decision, or
75
+ proof that a check ran.
70
76
 
71
77
  Preserve unknown changes, concurrent history, and previous revision facts.
72
78
  Never force-push, reset, broadly clean, or automatically delete feature
@@ -88,5 +94,5 @@ branches.
88
94
  committed `HEAD`, not the pending index. `check` validates only the chosen
89
95
  project's snapshot, not repository synchronization or idea navigation.
90
96
  Only exit code `0` permits the commit; `1` means invalid or unavailable and
91
- `2` means invalid usage. Its JSON contains `intention` and `observation`,
92
- not dialogue `outcomes` or `instructions`.
97
+ `2` means invalid usage. Its JSON uses all four projections; only
98
+ `check --remote` normally records an action.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silvermoon",
3
- "version": "0.1.3",
3
+ "version": "0.2.0-rc.1",
4
4
  "description": "The project spirit that checks repository state and answers what's next.",
5
5
  "packageManager": "pnpm@11.22.0",
6
6
  "type": "module",
@@ -66,7 +66,7 @@
66
66
  "mdast-util-to-markdown": "^2.1.2",
67
67
  "yaml": "^2.9.1"
68
68
  },
69
- "gitHead": "36f91ea380cfbe132eeda6431dfc81ed6b542557",
70
- "readme": "<!-- markdownlint-disable-file MD041 -->\n\n<p align=\"center\">\n <!-- markdownlint-disable-next-line MD013 -->\n <img src=\"https://cdn.jsdelivr.net/gh/shazhou-ww/silvermoon@36f91ea380cfbe132eeda6431dfc81ed6b542557/assets/silvermoon.svg\" width=\"960\" alt=\"Silvermoon, the artifact spirit of the project\">\n</p>\n\n<p align=\"center\">\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/npm/v/silvermoon?style=flat-square\" alt=\"npm version\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/node/v/silvermoon?style=flat-square\" alt=\"Node.js version\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/npm/unpacked-size/silvermoon?style=flat-square\" alt=\"npm unpacked size\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://github.com/shazhou-ww/silvermoon/actions/workflows/ci.yml?query=branch%3Amain\"><img src=\"https://img.shields.io/github/actions/workflow/status/shazhou-ww/silvermoon/ci.yml?branch=main&style=flat-square&label=CI\" alt=\"CI status\"></a>\n</p>\n\n<p align=\"center\">\n English | <a href=\"https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/README.zh-CN.md\">简体中文</a>\n</p>\n\n# Silvermoon\n\n**The artifact spirit of the project.**\n\n## Quick Start\n\nSilvermoon needs Node.js 22 or newer and Git access to the repository's primary\nbranch.\n\n```sh\nnpm install --global silvermoon\nsilvermoon whats-next\n```\n\nSilvermoon is ecosystem-neutral: the target repository does not need\n`package.json`, a package manager, a Silvermoon dependency, or `node_modules`.\nThe first report lists every applicable setup step in order, including the\nexact `npx skills add ... --agent universal` command that registers the\ncanonical skill at `.agents/skills/silvermoon`.\n\nCreate `.silvermoon/config.yaml`:\n\n```yaml\nversion: 1\nprimaryRepository: https://github.com/example/repository.git\nprimaryBranch: main\npreferredLanguage: en\n```\n\n`preferredLanguage` is optional. A specific idea can override it with\n`language` in `status.yaml`, and `create-idea --language <tag>` can set that\noverride when the idea is created. Otherwise Silvermoon checks\n`~/.config/silvermoon/config.yaml` and finally defaults to `en-US`.\nThese stored values choose the language for project-owned content. To change\nonly one command's built-in output, use `whats-next --language en-US|zh-CN` or\n`check --language en-US|zh-CN`; the temporary override is never persisted.\n\nThen create an idea and let the registered Silvermoon skill guide one safe\nnext action at a time:\n\n```sh\nsilvermoon create-idea\nsilvermoon whats-next <idea>\nsilvermoon whats-next <idea> --language zh-CN\n```\n\nDescribe the desired world in the generated `Idea.md`, review it, and approve\nthat exact revision. From then on, Silvermoon keeps the goal, implementation,\nrepository state, and real-world result connected. See\n[Getting Started](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/getting-started.md) for the complete first workflow.\nDefault dialogue output uses lightweight Markdown headings for intent,\nobservation, and next instructions, plus actions and outcomes only when an\noperation was attempted. Add `--json` only when a programmatic consumer needs\nthe `intention / observation / outcomes / instructions` envelope. For\npre-commit validation, run `silvermoon check --staged`: unlike the default\n`check` (committed `HEAD`), it checks the index and exits `0` only when the\nproject snapshot is valid. See the [Technical Reference](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/reference.md)\nfor validation targets and exit codes. Add `--trace <file.trace.jsonl>` to any\ncommand to write paired task and Git timing spans for performance analysis.\nIf the argument does not end with the exact lowercase `.trace.jsonl` suffix,\nSilvermoon appends it. Repository-local `*.trace.jsonl` files are ignored.\nTrace files are created only after the measured command work completes and\nnever overwrite an existing file.\n\nProjects may optionally add `.silvermoon/guidance/preparing.md`,\n`implementing.md`, and `deploying.md`. Silvermoon returns only the current\nactionable phase's snapshot-bound, repository-owned Markdown after canonical\ninstructions; `create-idea` can return preparing guidance. This guidance is\nadditive, never a fourth contract or decision fact, and `check` validates the\ncomplete fixed directory. See [Core Concepts](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/core-concepts.md).\n\n## Why Silvermoon\n\nLong-running Agent work usually asks people to carry too much invisible state.\nSomeone must remember what was intended, whether the code still matches the\ntask, and which conversation or machine knows the latest truth. Silvermoon\nmakes those concerns part of the project instead.\n\nIt lets people step back from continuous supervision and return at the\ndecisions that belong to them: approving the intended outcome, accepting the\nimplementation, and accepting that the result is true in the outside world.\nBetween those boundaries, an Agent can inspect repository facts and continue\nthe highest-priority safe action.\n\nIt also refuses to let a detached task card declare success. Current artifacts\nand explicit decisions jointly determine state, so a changed goal or\nimplementation naturally invalidates conclusions that depended on the older\nrevision. Because those facts live in Git, work can continue across devices,\nsessions, Agents, and hosting platforms.\n\n## The Project's Artifact Spirit\n\n> Fellow Daoist, you wouldn't want your lifebound project to be without an\n> artifact spirit, would you?\n\n<table>\n <tr>\n <td width=\"160\" align=\"center\" valign=\"top\">\n <!-- markdownlint-disable-next-line MD013 -->\n <img src=\"https://cdn.jsdelivr.net/gh/shazhou-ww/silvermoon@36f91ea380cfbe132eeda6431dfc81ed6b542557/assets/silvermoon-avatar.svg\" width=\"128\" alt=\"Line portrait of Silvermoon, the project's artifact spirit\">\n </td>\n <td valign=\"top\">\n Silvermoon is named after a character in <em>A Record of a Mortal's\n Journey to Immortality</em>. She comes from the Silvermoon Wolf Clan in\n the Spirit Realm and is one of the split souls of Ling Long. After losing\n part of her memory in the human realm, she lives as an artifact spirit\n first in a wolf-headed jade scepter and later in Han Li's Bamboo\n Cloudswarm Swords.\n <br><br>\n That image fits this project: Silvermoon does not belong to one operator\n or one chat. It lives with the project's artifacts, understands their\n state, and helps each companion find what comes next. The biography is\n inspiration, not a prerequisite for using the tool.\n </td>\n </tr>\n</table>\n\nWatch *A Record of a Mortal's Journey to Immortality*:\n\n<!-- markdownlint-disable-next-line MD013 -->\n- YouTube: [Episode 150: Overseas Turmoil 26](https://www.youtube.com/watch?v=GJgezoCBIHM \"A Record of a Mortal's Journey to Immortality — Episode 150: Overseas Turmoil 26\")\n<!-- markdownlint-disable-next-line MD013 -->\n- Bilibili: [Episode 150: Overseas Turmoil 26](https://www.bilibili.com/bangumi/play/ep1231558 \"A Record of a Mortal's Journey to Immortality — Episode 150: Overseas Turmoil 26\")\n\n## From Ideal To Real\n\nA project is more than a task list or a transcript. It is an ideal becoming\nreal through three nested worlds.\n\n**Ideal World (道心)** names the outcome worth pursuing. **Inner World (内景)**\ngives that intent shape in repository artifacts. **Outer World (现世)** asks\nwhether the shaped work is true where it must actually operate.\n\n> 道心立意,内景成形,现世验真。\n\nThe worlds nest from the inside out. Implementation contains the ideal it\nserves, and deployment contains both. This is an engineering relationship, not\njust a metaphor: when an inner world changes, conclusions from an outer world\nno longer have the same foundation and must be proven again.\n\nHumans own approval and acceptance. Agents own continuation: they read the\ncontracts, the ledger, and Git facts; preserve concurrent work; execute one\nsafe action; and reobserve only after something changes. The context belongs to\nthe project, not to a fleeting conversation.\n\n## Further Reading\n\n- [Getting Started](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/getting-started.md) — installation, configuration,\n and the first idea.\n- [Core Concepts](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/core-concepts.md) — project ownership, the three\n worlds, revisions, and decision boundaries.\n- [Operating Silvermoon](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/operations.md) — navigation, creation,\n publication, hygiene, and continuation.\n- [Technical Reference](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/reference.md) — storage, derived state, CLI\n reports, validation targets, and schemas.\n- [Maintaining Silvermoon](https://github.com/shazhou-ww/silvermoon/blob/36f91ea380cfbe132eeda6431dfc81ed6b542557/docs/maintaining.md) — development checks,\n documentation ownership, and release guidance.\n",
69
+ "gitHead": "fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400",
70
+ "readme": "<!-- markdownlint-disable-file MD041 -->\n\n<p align=\"center\">\n <!-- markdownlint-disable-next-line MD013 -->\n <img src=\"https://cdn.jsdelivr.net/gh/shazhou-ww/silvermoon@fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/assets/silvermoon.svg\" width=\"960\" alt=\"Silvermoon, the artifact spirit of the project\">\n</p>\n\n<p align=\"center\">\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/npm/v/silvermoon?style=flat-square\" alt=\"npm version\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/node/v/silvermoon?style=flat-square\" alt=\"Node.js version\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://npmx.dev/package/silvermoon\"><img src=\"https://img.shields.io/npm/unpacked-size/silvermoon?style=flat-square\" alt=\"npm unpacked size\"></a>\n <!-- markdownlint-disable-next-line MD013 -->\n <a href=\"https://github.com/shazhou-ww/silvermoon/actions/workflows/ci.yml?query=branch%3Amain\"><img src=\"https://img.shields.io/github/actions/workflow/status/shazhou-ww/silvermoon/ci.yml?branch=main&style=flat-square&label=CI\" alt=\"CI status\"></a>\n</p>\n\n<p align=\"center\">\n English | <a href=\"https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/README.zh-CN.md\">简体中文</a>\n</p>\n\n# Silvermoon\n\n**The artifact spirit of the project.**\n\n## Quick Start\n\nSilvermoon needs Node.js 22 or newer and Git access to the repository's primary\nbranch.\n\n```sh\nnpm install --global silvermoon\nsilvermoon whats-next\nsilvermoon list-ideas\n```\n\nSilvermoon is ecosystem-neutral: the target repository does not need\n`package.json`, a package manager, a Silvermoon dependency, or `node_modules`.\nThe first report lists every applicable setup step in order, including the\nexact `npx skills add ... --agent universal` command that registers the\ncanonical skill at `.agents/skills/silvermoon`.\n\nCreate `.silvermoon/config.yaml`:\n\n```yaml\nversion: 1\nprimaryRepository: https://github.com/example/repository.git\nprimaryBranch: main\npreferredLanguage: en\n```\n\n`preferredLanguage` is optional. A specific idea can override it with\n`language` in `status.yaml`, and `create-idea --language <tag>` can set that\noverride when the idea is created. Otherwise Silvermoon checks\n`~/.config/silvermoon/config.yaml` and finally defaults to `en-US`.\nThese stored values choose the language for project-owned content. To change\nonly one command's built-in output, use `whats-next --language en-US|zh-CN` or\n`check --language en-US|zh-CN`; the temporary override is never persisted.\n\nUse `list-ideas` when you only need the current local inventory. It defaults to\nactive ideas and supports repeatable `--state`, `--all`, literal `--query`,\nRFC 3339 `--created-since` / `--created-before`, `--sort`, and `--limit`.\nUnlike lifecycle navigation, this read-only query uses the valid worktree\nsnapshot without checking branch, upstream, cleanliness, network, or primary\nsynchronization.\n\nThen create an idea and let the registered Silvermoon skill guide one safe\nnext action at a time:\n\n```sh\nsilvermoon create-idea\nsilvermoon whats-next <idea>\nsilvermoon whats-next <idea> --language zh-CN\n```\n\nDescribe the desired world in the generated `Idea.md`, review it, and approve\nthat exact revision. From then on, Silvermoon keeps the goal, implementation,\nrepository state, and real-world result connected. See\n[Getting Started](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/getting-started.md) for the complete first workflow.\nEvery command processes one ordered, versioned domain-message stream. Add\n`--json` when a programmatic consumer needs its four deterministic projections:\n`intention`, `observation`, `actions`, and `response`. Actions are side effects\nalready attempted; future work belongs only to `response.nextSteps`. Default\nMarkdown renders only the self-contained response instead of exposing the\ninternal projections. For pre-commit validation, run\n`silvermoon check --staged`: unlike the default `check` (committed `HEAD`), it\nchecks the index and exits `0` only when the project snapshot is valid. See the\n[Technical Reference](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/reference.md) for validation targets and exit\ncodes.\n\nAdd `--trace <file.trace.jsonl>` to any command to write one schema-versioned\nJSONL timeline. Its `domain` channel contains allowlisted message summaries,\nand its `telemetry` channel contains paired performance spans; both share one\ntrace ID and global sequence. Trace output never includes guidance or file\ncontent, Git arguments/output, environment data, or credentials. If the\nargument does not end with the exact lowercase `.trace.jsonl` suffix,\nSilvermoon appends it. Repository-local `*.trace.jsonl` files are ignored.\nTrace files are buffered, created only after command work completes, and never\noverwrite an existing file.\n\nProjects may optionally add `.silvermoon/guidance/preparing.md`,\n`implementing.md`, and `deploying.md`. Silvermoon returns only the current\nactionable phase's snapshot-bound, repository-owned Markdown in\n`response.guidance`; `observation.guidance` carries its provenance without\ncontent. `create-idea` can return preparing guidance. This guidance is\nadditive, never a fourth contract or decision fact, and `check` validates the\ncomplete fixed directory. See [Core Concepts](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/core-concepts.md).\n\n## Why Silvermoon\n\nLong-running Agent work usually asks people to carry too much invisible state.\nSomeone must remember what was intended, whether the code still matches the\ntask, and which conversation or machine knows the latest truth. Silvermoon\nmakes those concerns part of the project instead.\n\nIt lets people step back from continuous supervision and return at the\ndecisions that belong to them: approving the intended outcome, accepting the\nimplementation, and accepting that the result is true in the outside world.\nBetween those boundaries, an Agent can inspect repository facts and continue\nthe highest-priority safe action.\n\nIt also refuses to let a detached task card declare success. Current artifacts\nand explicit decisions jointly determine state, so a changed goal or\nimplementation naturally invalidates conclusions that depended on the older\nrevision. Because those facts live in Git, work can continue across devices,\nsessions, Agents, and hosting platforms.\n\n## The Project's Artifact Spirit\n\n> Fellow Daoist, you wouldn't want your lifebound project to be without an\n> artifact spirit, would you?\n\n<table>\n <tr>\n <td width=\"160\" align=\"center\" valign=\"top\">\n <!-- markdownlint-disable-next-line MD013 -->\n <img src=\"https://cdn.jsdelivr.net/gh/shazhou-ww/silvermoon@fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/assets/silvermoon-avatar.svg\" width=\"128\" alt=\"Line portrait of Silvermoon, the project's artifact spirit\">\n </td>\n <td valign=\"top\">\n Silvermoon is named after a character in <em>A Record of a Mortal's\n Journey to Immortality</em>. She comes from the Silvermoon Wolf Clan in\n the Spirit Realm and is one of the split souls of Ling Long. After losing\n part of her memory in the human realm, she lives as an artifact spirit\n first in a wolf-headed jade scepter and later in Han Li's Bamboo\n Cloudswarm Swords.\n <br><br>\n That image fits this project: Silvermoon does not belong to one operator\n or one chat. It lives with the project's artifacts, understands their\n state, and helps each companion find what comes next. The biography is\n inspiration, not a prerequisite for using the tool.\n </td>\n </tr>\n</table>\n\nWatch *A Record of a Mortal's Journey to Immortality*:\n\n<!-- markdownlint-disable-next-line MD013 -->\n- YouTube: [Episode 150: Overseas Turmoil 26](https://www.youtube.com/watch?v=GJgezoCBIHM \"A Record of a Mortal's Journey to Immortality — Episode 150: Overseas Turmoil 26\")\n<!-- markdownlint-disable-next-line MD013 -->\n- Bilibili: [Episode 150: Overseas Turmoil 26](https://www.bilibili.com/bangumi/play/ep1231558 \"A Record of a Mortal's Journey to Immortality — Episode 150: Overseas Turmoil 26\")\n\n## From Ideal To Real\n\nA project is more than a task list or a transcript. It is an ideal becoming\nreal through three nested worlds.\n\n**Ideal World (道心)** names the outcome worth pursuing. **Inner World (内景)**\ngives that intent shape in repository artifacts. **Outer World (现世)** asks\nwhether the shaped work is true where it must actually operate.\n\n> 道心立意,内景成形,现世验真。\n\nThe worlds nest from the inside out. Implementation contains the ideal it\nserves, and deployment contains both. This is an engineering relationship, not\njust a metaphor: when an inner world changes, conclusions from an outer world\nno longer have the same foundation and must be proven again.\n\nHumans own approval and acceptance. Agents own continuation: they read the\ncontracts, the ledger, and Git facts; preserve concurrent work; execute one\nsafe action; and reobserve only after something changes. The context belongs to\nthe project, not to a fleeting conversation.\n\n## Further Reading\n\n- [Getting Started](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/getting-started.md) — installation, configuration,\n and the first idea.\n- [Core Concepts](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/core-concepts.md) — project ownership, the three\n worlds, revisions, and decision boundaries.\n- [Operating Silvermoon](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/operations.md) — navigation, creation,\n publication, hygiene, and continuation.\n- [Technical Reference](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/reference.md) — storage, derived state, CLI\n reports, validation targets, and schemas.\n- [Maintaining Silvermoon](https://github.com/shazhou-ww/silvermoon/blob/fcc881a6a5e7b7f2aad283f3b151a4c15fd6f400/docs/maintaining.md) — development checks,\n documentation ownership, and release guidance.\n",
71
71
  "readmeFilename": "README.md"
72
72
  }
@@ -0,0 +1,178 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/shazhou-ww/silvermoon/raw/refs/heads/main/schema/v1/command-report.schema.json",
4
+ "title": "Silvermoon command report v1",
5
+ "description": "The four public projections returned by every trustworthy Silvermoon command.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "intention",
10
+ "observation",
11
+ "actions",
12
+ "response"
13
+ ],
14
+ "properties": {
15
+ "intention": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": [
19
+ "command",
20
+ "args"
21
+ ],
22
+ "properties": {
23
+ "command": {
24
+ "enum": [
25
+ "whats-next",
26
+ "create-idea",
27
+ "check",
28
+ "list-ideas"
29
+ ]
30
+ },
31
+ "args": {
32
+ "type": "object"
33
+ }
34
+ }
35
+ },
36
+ "observation": {
37
+ "type": "object",
38
+ "required": [
39
+ "state",
40
+ "problems"
41
+ ],
42
+ "properties": {
43
+ "state": {
44
+ "type": "string",
45
+ "minLength": 1
46
+ },
47
+ "problems": {
48
+ "type": "array"
49
+ }
50
+ }
51
+ },
52
+ "actions": {
53
+ "type": "array",
54
+ "items": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "required": [
58
+ "id",
59
+ "type",
60
+ "status"
61
+ ],
62
+ "properties": {
63
+ "id": {
64
+ "type": "string",
65
+ "pattern": "^action-[1-9][0-9]*$"
66
+ },
67
+ "type": {
68
+ "type": "string",
69
+ "minLength": 1
70
+ },
71
+ "status": {
72
+ "enum": [
73
+ "success",
74
+ "failure"
75
+ ]
76
+ },
77
+ "result": {
78
+ "type": "object"
79
+ },
80
+ "problem": {
81
+ "type": "object",
82
+ "required": [
83
+ "type"
84
+ ],
85
+ "properties": {
86
+ "type": {
87
+ "type": "string",
88
+ "minLength": 1
89
+ }
90
+ }
91
+ }
92
+ },
93
+ "allOf": [
94
+ {
95
+ "if": {
96
+ "properties": {
97
+ "status": {
98
+ "const": "success"
99
+ }
100
+ }
101
+ },
102
+ "then": {
103
+ "properties": {
104
+ "result": {
105
+ "type": "object"
106
+ }
107
+ },
108
+ "required": [
109
+ "result"
110
+ ]
111
+ },
112
+ "else": {
113
+ "properties": {
114
+ "problem": {
115
+ "type": "object"
116
+ }
117
+ },
118
+ "required": [
119
+ "problem"
120
+ ]
121
+ }
122
+ }
123
+ ]
124
+ }
125
+ },
126
+ "response": {
127
+ "type": "object",
128
+ "required": [
129
+ "kind",
130
+ "language",
131
+ "summary"
132
+ ],
133
+ "properties": {
134
+ "kind": {
135
+ "enum": [
136
+ "blocked",
137
+ "choice-required",
138
+ "idea-created",
139
+ "idea-list",
140
+ "next-steps",
141
+ "validation-result"
142
+ ]
143
+ },
144
+ "language": {
145
+ "enum": [
146
+ "en-US",
147
+ "zh-CN"
148
+ ]
149
+ },
150
+ "summary": {
151
+ "type": "string",
152
+ "minLength": 1
153
+ },
154
+ "nextSteps": {
155
+ "type": "array",
156
+ "items": {
157
+ "type": "object",
158
+ "additionalProperties": false,
159
+ "required": [
160
+ "type",
161
+ "text"
162
+ ],
163
+ "properties": {
164
+ "type": {
165
+ "type": "string",
166
+ "minLength": 1
167
+ },
168
+ "text": {
169
+ "type": "string",
170
+ "minLength": 1
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+ }