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/README.md +40 -24
- package/README.zh-CN.md +36 -24
- package/docs/core-concepts.md +28 -11
- package/docs/getting-started.md +41 -9
- package/docs/npm-package-releases.md +8 -7
- package/docs/operations.md +60 -23
- package/docs/reference.md +125 -67
- package/docs/repository-tasks.md +29 -23
- package/package.json +3 -3
- package/schema/v1/command-report.schema.json +178 -0
- package/schema/v1/domain-message.schema.json +278 -0
- package/schema/v2/trace-event.schema.json +122 -0
- package/skills/silvermoon/SKILL.md +36 -25
- package/skills/silvermoon/references/adoption.md +8 -9
- package/src/cli.js +63 -9
- package/src/create-idea.js +260 -193
- package/src/dialogue.js +6 -305
- package/src/domain.js +592 -0
- package/src/idea-query.js +230 -0
- package/src/ideas.js +1 -0
- package/src/index.js +76 -31
- package/src/language.js +8 -0
- package/src/list-ideas.js +133 -0
- package/src/response.js +443 -0
- package/src/trace.js +90 -4
- package/src/whatsnext.js +81 -84
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
|
-
|
|
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
|
-
"
|
|
156
|
-
"
|
|
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`.
|
|
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
|
-
- `
|
|
167
|
-
|
|
168
|
-
`
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
|
217
|
-
`
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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
|
|
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
|
|
256
|
-
returns `idea-create-failed` without `createdIdea
|
|
257
|
-
|
|
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
|
|
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
|
|
304
|
-
|
|
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
|
-
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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.
|
package/docs/repository-tasks.md
CHANGED
|
@@ -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
|
|
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.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
56
|
-
contracts, and unchecked Implementation or
|
|
57
|
-
the next work. Update matching world
|
|
58
|
-
reset a checked item when its
|
|
59
|
-
|
|
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
|
-
`
|
|
63
|
-
|
|
64
|
-
`.silvermoon/guidance/<phase>.md` path, never
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
the path after the command, and materialize
|
|
68
|
-
current world contract and matching ledger
|
|
69
|
-
contract, a status fact, a human decision, or
|
|
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
|
|
92
|
-
|
|
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
|
+
"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": "
|
|
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
|
+
}
|