silvermoon 0.0.3 → 0.1.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.
@@ -9,23 +9,28 @@ This guide is the authoritative setup and first-use path for Silvermoon.
9
9
  - Permission to fetch that branch and to publish ordinary non-force commits
10
10
  through the repository's normal collaboration path.
11
11
 
12
- ## Install The Project Dependency
12
+ ## Run Silvermoon And Register Its Skill
13
13
 
14
- Install Silvermoon in the repository so every collaborator uses the declared
15
- version:
14
+ Install Silvermoon independently of the target project's dependency graph, or
15
+ invoke a chosen version temporarily:
16
16
 
17
17
  ```sh
18
- npm install --save-dev silvermoon
18
+ npm install --global silvermoon
19
+ silvermoon whats-next
20
+ # or: npx silvermoon@<version> whats-next
19
21
  ```
20
22
 
21
- Register the canonical packaged skill through the supported `skills` interface:
23
+ The setup report gives the exact path for the running installation. Use it to
24
+ register the bundled canonical skill through the universal `skills` target:
22
25
 
23
26
  ```sh
24
- npx skills add ./node_modules/silvermoon/skills --skill silvermoon --agent github-copilot --yes --copy
27
+ npx skills add <path-to-running-silvermoon>/skills --skill silvermoon --agent universal --yes --copy
25
28
  ```
26
29
 
27
- Silvermoon diagnoses whether the project dependency, installed package, and
28
- repository-local skill match. It does not install dependencies or mutate skill
30
+ The registration lives only at `.agents/skills/silvermoon`. Silvermoon checks
31
+ that its content exactly matches the running installation. It does not require
32
+ the target repository to use Node, contain `package.json`, declare a
33
+ Silvermoon dependency, or have `node_modules`, and it never mutates skill
29
34
  registration itself.
30
35
 
31
36
  ## Configure The Shared Primary
@@ -43,10 +48,10 @@ The repository URL is credential-free, canonical shared state. Credentials,
43
48
  named remotes, and URL rewrites remain local Git concerns. Silvermoon metadata
44
49
  paths are fixed and cannot be overridden by configuration.
45
50
 
46
- ## Configure Preferred Language
51
+ ## Configure Content And Output Language
47
52
 
48
53
  All language values are canonical BCP 47 tags such as `en` or `zh-CN`.
49
- Silvermoon resolves natural-language output in this order:
54
+ Silvermoon resolves the language for project-owned content in this order:
50
55
 
51
56
  1. optional idea `status.yaml` `language`;
52
57
  2. optional project `.silvermoon/config.yaml` `preferredLanguage`;
@@ -62,45 +67,82 @@ preferredLanguage: zh-CN
62
67
 
63
68
  Inherited values remain dynamic and are not copied into an idea. Use
64
69
  `create-idea --language <tag>` only when the new idea needs a stable override.
65
- `whats-next` reports both the effective tag and its source.
70
+ That command continues to accept any canonical BCP 47 tag.
71
+
72
+ For one invocation's Silvermoon-owned output, `whats-next` and `check` accept
73
+ only the built-in `en-US` and `zh-CN` locales. Input casing is normalized, so
74
+ `EN-us` and `zh-cn` are accepted. This override has higher display precedence
75
+ than idea, project, or user content language and is never persisted:
76
+
77
+ ```sh
78
+ silvermoon whats-next <idea> --language zh-CN
79
+ silvermoon check --worktree --language en-US
80
+ ```
81
+
82
+ Every observation reports the actual built-in locale as `outputLanguage`.
83
+ When configuration is available, `configuration.preferredLanguage` remains
84
+ the resolved content language and can therefore differ from `outputLanguage`.
85
+ Without a temporary override, Chinese content tags use `zh-CN` output and all
86
+ other content tags use the built-in `en-US` output.
66
87
 
67
88
  ## Create The First Idea
68
89
 
69
90
  Run:
70
91
 
71
92
  ```sh
72
- npx silvermoon create-idea --json
73
- npx silvermoon create-idea --language zh-cn --json
93
+ silvermoon create-idea
94
+ silvermoon create-idea --language zh-cn
74
95
  ```
75
96
 
76
- The command first applies the same repository, worktree, conflict, and ancestry
77
- hygiene used by navigation. When those checks pass, it creates one untracked
78
- idea scaffold with `Idea.md`, `Implementation.md`, `Deployment.md`,
79
- `ledger.md`, and `status.yaml`. It never stages, commits, pushes, or records a
80
- human decision.
81
-
82
- Replace the guidance in `Idea.md` with the desired outcome, scope, and
83
- constraints. Keep implementation and deployment placeholders synchronized
84
- until their lifecycle phases. Review every generated path and publish the
85
- prepared idea through ordinary Git.
97
+ The command requires the configured primary branch and upstream plus a clean
98
+ local worktree. It does not fetch or require local HEAD to match the remote
99
+ tip. When those checks pass, it creates one untracked idea scaffold with
100
+ `Idea.md`, `Implementation.md`, `Deployment.md`, `ledger.md`, and
101
+ `status.yaml`. It never stages, commits, pushes, or records a human decision.
102
+
103
+ Replace the guidance in the `Idea.md` ideal contract with the desired outcome,
104
+ scope, and constraints. Keep the `Implementation.md` inner implementation
105
+ contract and `Deployment.md` real-world deployment contract placeholders
106
+ synchronized until their lifecycle phases. Review every generated path,
107
+ validate the complete candidate, and commit and publish the prepared idea to
108
+ the configured primary through the repository's normal non-force publication
109
+ path. Verify it is reachable from refreshed primary before asking the user to
110
+ review or approve the exact reported ideal revision. If publication requires a
111
+ pull request, wait until it reaches primary; never ask for approval of an
112
+ unpublished local candidate. Publication does not itself approve the idea.
86
113
 
87
114
  Then ask what comes next with the generated ULID or an exact unique alias:
88
115
 
89
116
  ```sh
90
- npx silvermoon whats-next <idea> --json
117
+ silvermoon whats-next <idea>
91
118
  ```
92
119
 
93
- The report contains one highest-priority action. Execute only that action. Run
94
- the same command again only after an expected repository change, an unexpected
95
- input change, or a newly arrived external result.
120
+ The default dialogue uses lightweight Markdown headings for intent,
121
+ observation, and ordered next instructions; actions and outcomes appear only
122
+ when an operation was attempted. Add `--json` only when a programmatic
123
+ consumer needs the `intention / observation / outcomes / instructions`
124
+ envelope. Execute the applicable instructions in order and run the same
125
+ command again only after an expected repository change, an unexpected input
126
+ change, or a newly arrived external result.
96
127
 
97
128
  ## Make Decisions Explicit
98
129
 
99
130
  Silvermoon never infers approval or acceptance. After a person explicitly
100
131
  approves the current ideal, accepts the current implementation, or accepts the
101
132
  current deployment, record the exact revision reported by `whats-next` in the
102
- corresponding `status.yaml` field. Validate the full candidate, stage it,
103
- validate the staged snapshot, and publish a normal non-force commit.
133
+ corresponding `status.yaml` field. Validate the full candidate with
134
+ `silvermoon check --worktree`, stage it, then run `silvermoon check --staged`
135
+ to validate the index before publishing a normal non-force commit. Default
136
+ `check` validates committed `HEAD`, not the pending commit; only a successful
137
+ project validation exits `0`.
138
+
139
+ When requesting any approval or acceptance, include the idea's alias and ULID,
140
+ the decision and exact world revision, plus a clickable permalink to the
141
+ canonical world entry pinned to the published primary commit. Link to
142
+ `Idea.md`, `Implementation.md`, or `Deployment.md` as appropriate. Do not use
143
+ a local workspace path or a branch-floating link; if the host has no known
144
+ permalink format, provide the primary commit and repository-relative path and
145
+ explain the limitation.
104
146
 
105
147
  Continue with [Core Concepts](./core-concepts.md) before changing lifecycle
106
148
  contracts, or use [Operating Silvermoon](./operations.md) for the routine
@@ -14,7 +14,8 @@ pnpm install --frozen-lockfile
14
14
  Use the smallest check that covers a change:
15
15
 
16
16
  ```sh
17
- pnpm sync:skills # refresh the generated GitHub Copilot skill copy
17
+ pnpm sync:skills # refresh the generated universal skill copy
18
+ pnpm lint:markdown # Markdown lint and link checks
18
19
  pnpm test # fast unit and repository contract tests
19
20
  pnpm test:integration # real filesystem and Git behavior
20
21
  pnpm test:e2e # packed and installed CLI behavior
@@ -22,10 +23,18 @@ pnpm check # complete release-grade validation
22
23
  pnpm check:skills # skill discovery and structure
23
24
  ```
24
25
 
26
+ `pnpm check` runs the independent release-grade checks concurrently and waits
27
+ for all of them before reporting every failure. Run the narrower commands above
28
+ while iterating, then use `pnpm check` before delivery.
29
+
25
30
  Edit the canonical skill only under `skills/silvermoon`, then run
26
- `pnpm sync:skills`. The checked-in `.github/skills/silvermoon` directory is a
31
+ `pnpm sync:skills`. The checked-in `.agents/skills/silvermoon` directory is a
27
32
  generated copy so repository skill discovery works without symbolic-link
28
33
  support. `pnpm check:skills` rejects a stale or manually edited copy.
34
+ The repository-only publish skill is maintained directly under
35
+ `.agents/skills/publish`; it is not part of the generated copy or npm package.
36
+ For documentation and skill changes, run `pnpm lint:markdown`,
37
+ `pnpm check:skills`, and `node --test test/contract/skill.test.mjs`.
29
38
 
30
39
  Run `pnpm check` after CLI, schema, repository model, release, or skill changes.
31
40
  Documentation work must also preserve Markdown links, package contents,
@@ -53,4 +62,7 @@ Use [npm package releases](./npm-package-releases.md) for trusted publishing,
53
62
  tag rules, release validation, and failure recovery. Publishing occurs only
54
63
  through `.github/workflows/publish-npm.yml` from an immutable
55
64
  `npm/silvermoon/v<version>` tag whose commit is reachable from `origin/main`.
56
- Never publish locally or add an npm token.
65
+ The workflow generates both package READMEs in an isolated staging tree,
66
+ validates and publishes one tarball, then checks its registry integrity,
67
+ package-level README, provenance, and commit-pinned jsDelivr assets. Never
68
+ publish locally or add an npm token.
@@ -92,13 +92,24 @@ The [`publish-npm.yml`](../.github/workflows/publish-npm.yml) workflow then:
92
92
  1. verifies the tagged commit is reachable from refreshed `origin/main`;
93
93
  2. installs the frozen pnpm dependencies;
94
94
  3. runs the allowlisted release planner and confirms the version is absent
95
- from npm;
95
+ from npm, or records that an exact-version rerun must skip publication;
96
96
  4. runs `pnpm test:unit`, `pnpm test:contract`, `pnpm test:integration`, and
97
97
  `pnpm check:skills`;
98
- 5. runs the selected package's `npm run pack:check` and
99
- `npm run test:e2e`; and
100
- 6. publishes only the selected directory with provenance and the derived npm
101
- dist-tag.
98
+ 5. creates an isolated `git archive` staging tree and generates commit-pinned
99
+ English and Chinese package READMEs without changing the tagged checkout;
100
+ 6. creates one tarball, records its path, SHA-256, npm shasum, registry
101
+ integrity, and complete file list, then passes that same file to
102
+ `npm run pack:check` and `npm run test:e2e`;
103
+ 7. publishes that exact tarball with provenance and the derived npm dist-tag
104
+ when the version was absent; and
105
+ 8. runs `verify-npm-release.mjs` until the registry is consistent or the
106
+ bounded retry window expires.
107
+
108
+ The post-publication verifier requires the exact version and dist-tag, registry
109
+ integrity and tarball bytes, package-level README, both tarball READMEs, npm
110
+ publish and SLSA provenance attestations, tagged Git commit, and commit-pinned
111
+ jsDelivr SVG responses to match the candidate. A successful run prints
112
+ `VERIFY_NPM_RELEASE_OK` with the verified identities.
102
113
 
103
114
  Release runs are serialized within this repository. The registry preflight and
104
115
  `npm publish` cannot form one cross-system transaction, so an external
@@ -110,13 +121,20 @@ duplicate publication without replacing the existing version.
110
121
  Publication stops before `npm publish` when the tag is malformed, the release
111
122
  key is unknown, the package is private, the package name or version differs
112
123
  from the mapping and tag, the npm publish configuration is not public npmjs,
113
- the commit is outside `origin/main`, the version already exists, registry state
114
- cannot be verified, or validation fails.
124
+ the commit is outside `origin/main`, registry state cannot be observed, or
125
+ validation fails. If the exact version already exists during a workflow rerun,
126
+ the publish step is skipped and the verifier must prove that registry content
127
+ is byte-identical to the rebuilt candidate and carries the expected provenance.
128
+ Any mismatch is a hard failure.
115
129
 
116
130
  For a transient GitHub or registry failure before publication, rerun the same
117
131
  workflow run. Do not move or recreate the tag. For a source, manifest, or
118
132
  validation failure, make a new commit on `main`, choose a new version, and push
119
133
  a new tag after the fix is merged. npm versions and release tags are immutable.
134
+ For a transient verification failure after publication, rerun only the failed
135
+ workflow job when GitHub offers that option; the planner recognizes the
136
+ existing version, skips `npm publish`, and performs the same complete
137
+ verification again.
120
138
 
121
139
  ## Add another package
122
140
 
@@ -9,64 +9,91 @@ publishing Silvermoon ideas.
9
9
  npx silvermoon whats-next
10
10
  npx silvermoon whats-next 01M36QGPNTXEPP61DA4KP4AVZF
11
11
  npx silvermoon whats-next publish-documentation --json
12
+ npx silvermoon whats-next publish-documentation --language zh-CN
12
13
  ```
13
14
 
14
15
  Without a selector, Silvermoon asks for a choice among multiple active ideas,
15
- continues a single active idea, or reports that a new idea can be created. A
16
- selector is either a canonical uppercase ULID or an exact, unique,
17
- case-sensitive alias.
18
-
19
- Each successful report includes the effective `language` tag and its `idea`,
20
- `project`, `global`, or `default` source. Its action guidance requires the
21
- Agent to use that language for world entries, same-world supporting artifacts,
22
- the ledger, and user-facing explanations. Commands, identifiers, schema fields,
23
- protocol markers, and verbatim tool output retain their original form.
24
-
25
- Every invocation first checks the configured primary branch, merge conflicts,
26
- worktree changes, and local/remote primary ancestry. It may fetch and inspect,
27
- but it never edits, checks out, merges, commits, stashes, deletes, resets,
28
- fast-forwards, or pushes.
16
+ and the option to discuss and create a new idea. This remains true with zero,
17
+ one, or many active ideas: only a selector chooses work. Completed and abandoned
18
+ ideas are excluded from default candidates. A selector is either a canonical
19
+ uppercase ULID or an exact, unique, case-sensitive alias.
20
+
21
+ The shared observation exposes the resolved content preference as
22
+ `configuration.preferredLanguage` and the built-in rendering locale as
23
+ `outputLanguage`. Instructions use the content preference for world entries,
24
+ same-world supporting artifacts, and the ledger. A caller may use
25
+ `--language en-US|zh-CN` to override only Silvermoon-owned output for one
26
+ `whats-next` invocation. Commands, identifiers, schema fields, protocol
27
+ markers, and verbatim tool output retain their original form.
28
+
29
+ Every invocation follows three strict layers. It first checks Git,
30
+ configuration compatibility, and `.agents/skills/silvermoon`. It then checks
31
+ local conflicts, changes, HEAD, and upstream identity before any remote access.
32
+ Only after those checks pass does it fetch primary, compare ancestry, and
33
+ route idea work. It never edits, checks out, merges, commits, stashes, deletes,
34
+ resets, fast-forwards, or pushes.
29
35
 
30
36
  ## Create An Idea
31
37
 
32
38
  Explicit creation uses:
33
39
 
34
40
  ```sh
35
- npx silvermoon create-idea --json
36
- npx silvermoon create-idea --language zh-cn --json
41
+ silvermoon create-idea
42
+ silvermoon create-idea --language zh-cn
37
43
  ```
38
44
 
39
45
  Creation intent is distinct from active-idea selection. If hygiene blocks the
40
46
  command, perform only the reported remediation and retry `create-idea`; do not
41
47
  replace the request with selector-less navigation.
42
48
 
43
- `--language` is the only command-level language override. It normalizes a valid
44
- BCP 47 tag and writes it to the new idea's `status.yaml`. Without the option,
45
- creation writes no language field and the idea dynamically inherits project,
46
- user, or `en-US` defaults. `whats-next` and `check` do not accept the option.
49
+ Creation checks project readiness, then requires the configured primary branch
50
+ and upstream plus a clean worktree. It does not fetch, compare ancestry, or
51
+ require local HEAD to be aligned with the remote tip. Its preparation reports
52
+ omit the active-idea inventory because existing work does not replace explicit
53
+ creation intent.
54
+
55
+ For `create-idea`, `--language` normalizes any valid BCP 47 tag and writes it
56
+ to the new idea's `status.yaml` as a persistent content-language preference.
57
+ Without the option, creation writes no language field and the idea dynamically
58
+ inherits project, user, or `en-US` defaults. This is distinct from the
59
+ non-persistent `en-US|zh-CN` output override accepted by `whats-next` and
60
+ `check`.
47
61
 
48
62
  The generated files remain untracked for review. Complete `Idea.md`, optionally
49
63
  add a concise unique alias, inspect every path, and publish the initial idea
50
- through ordinary Git.
51
-
52
- ## Execute One Action
53
-
54
- Treat the command, request, `observedPrimaryCommit`, selected idea, and action
55
- as one immutable observation. Execute only the highest-priority action.
56
-
57
- Repository hygiene actions take precedence over lifecycle work. Inspect exact
58
- staged, unstaged, untracked, and conflicted paths; preserve unknown and
59
- concurrent work. Never force-push, use `reset --hard`, broadly clean the
60
- worktree, or silently rewrite history to satisfy guidance.
64
+ through ordinary Git. Validate and commit the complete prepared idea, then make
65
+ that commit reachable from configured primary using the repository's normal
66
+ non-force publication path before asking the user to review or approve it. If
67
+ publication requires a pull request, wait until it reaches primary. Reobserve
68
+ the exact `idealRevision` after publication; never ask for approval of an
69
+ unpublished local candidate, and never treat publication as approval.
70
+
71
+ ## Follow One Observation
72
+
73
+ Treat `intention`, `observation`, `outcomes`, and `instructions` as one
74
+ immutable dialogue report for `whats-next` and `create-idea`. Default output
75
+ uses lightweight Markdown headings and lists for intent, observation, and
76
+ next instructions, including actions and outcomes only if an operation was
77
+ attempted. `--json` serializes the same model, retaining `outcomes: []` when
78
+ none were attempted.
79
+
80
+ Project setup takes precedence over repository synchronization, which takes
81
+ precedence over lifecycle work. Instructions include every known remediation
82
+ for the current layer in priority order. Large change sets report complete
83
+ counts, bounded path samples, omitted counts, and exact commands for the full
84
+ diff. Preserve unknown and concurrent work. Never force-push, use
85
+ `reset --hard`, broadly clean the worktree, or silently rewrite history.
61
86
 
62
87
  After an observable change, run `whats-next` again. Do not poll an unchanged
63
- observation.
88
+ observation. When the invocation used `--language`, every generated retry
89
+ command preserves the same canonical output-language option.
64
90
 
65
91
  ## Author World Contracts
66
92
 
67
- `Idea.md` is the Ideal World entry. `Implementation.md` and `Deployment.md`
68
- contain `## Steps` and `## Acceptance criteria`. Every item uses a stable
69
- level-three heading:
93
+ `Idea.md` is the Ideal World's ideal contract. `Implementation.md` is the
94
+ Inner World's inner implementation contract, and `Deployment.md` is the Outer
95
+ World's real-world deployment contract. The latter two contain `## Steps` and
96
+ `## Acceptance criteria`. Every item uses a stable level-three heading:
70
97
 
71
98
  - implementation steps: `I-Sxx`
72
99
  - implementation criteria: `I-ACxx`
@@ -94,14 +121,46 @@ the current reported world revision. Edit only the corresponding status fact:
94
121
  Validate the complete candidate:
95
122
 
96
123
  ```sh
97
- npx silvermoon check --worktree --json
124
+ silvermoon check --worktree
125
+ silvermoon check --worktree --language zh-CN
98
126
  git add .silvermoon/ideas/<ULID>/status.yaml
99
- npx silvermoon check --staged --json
127
+ silvermoon check --staged
100
128
  ```
101
129
 
130
+ `check` is a project-only validator, not a navigation command. It does not
131
+ check worktree hygiene, upstream, or ancestry and does not suggest next steps.
132
+ Without a target it validates committed `HEAD`, not the pending commit.
133
+ `--worktree` validates the full candidate, while `--staged` validates exactly
134
+ the index and is the pre-commit hook target. Its JSON has `intention` and
135
+ `observation` only; it has no `outcomes` or `instructions`. Exit status `0`
136
+ means the chosen project snapshot is valid; `1` means invalid or unavailable
137
+ and must block the commit; `2` means invalid CLI usage. Do not treat the
138
+ existence of a report as permission to commit.
139
+
140
+ `check --language en-US|zh-CN` changes only Silvermoon-owned report framing.
141
+ It is orthogonal to every check target and never changes the selected snapshot,
142
+ validation conclusion, problems, or exit status.
143
+
144
+ `check` does not infer that a status field was newly written, prove who
145
+ authorized it, compare it with a commit parent, or search history for its
146
+ origin. Those are workflow responsibilities: match an explicit human decision
147
+ to the exact revision reported by `whats-next`, edit only the corresponding
148
+ status fact, review the candidate, and publish without rewriting concurrent
149
+ history. Old decision revisions may remain in status after a world changes;
150
+ their mismatch is what derives the idea's earlier lifecycle state.
151
+
102
152
  Prefer a status-only decision commit, publish through the repository's normal
103
153
  non-force path, and verify the commit is reachable from refreshed primary.
104
154
 
155
+ When asking for approval or acceptance, identify the idea by alias and ULID,
156
+ state the exact reported world revision, and link the corresponding canonical
157
+ entry at the published primary commit: `Idea.md` for ideal approval,
158
+ `Implementation.md` for implementation acceptance, or `Deployment.md` for
159
+ deployment acceptance. Use a commit-pinned web permalink rather than a local
160
+ workspace path or a branch name that can move. The linked revision and
161
+ publication are review context only; the user must still make the decision
162
+ explicitly.
163
+
105
164
  ## Publish Work
106
165
 
107
166
  Before publication, compare with the observed primary tip, run checks focused