@warpgogol/forge 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -13,7 +13,7 @@ Portable governance skills and command modules extracted from site-kernel (RFC-0
13
13
 
14
14
  | Module | Commands | Source |
15
15
  | --- | --- | --- |
16
- | `forgeCoreModule` | `forge.create`, `forge.doctor`, `forge.upgrade`, `forge.agents.generate`, `forge.scaffold`, `forge.port.scaffold`, `forge.skill.validate`, `forge.skill.list`, `forge.port.validate`, `forge.profile.validate`, `forge.dev`, `forge.build`, `forge.validate`, `docs.archive` | `os/core/` |
16
+ | `forgeCoreModule` | `create`, `doctor`, `upgrade`, `forge.agents.generate`, `scaffold`, `port.scaffold`, `skill.validate`, `skill.list`, `port.validate`, `profile.validate`, `dev`, `build`, `validate`, `docs.archive` | `os/core/` |
17
17
  | `forgeRfcModule` | `rfc.list`, `rfc.validate`, `rfc.create`, etc. | `os/rfc/` |
18
18
  | `forgeWorkflowModule` | `workflow.lint`, `workflow.list`, `workflow.amend.list` | `os/workflow/` |
19
19
  | `forgeNamingModule` | `naming.convention.lint` | `os/naming/` |
@@ -34,15 +34,15 @@ When archiving terminal artifacts, prefer the `docs.archive` umbrella command ov
34
34
 
35
35
  ## Skills
36
36
 
37
- Skills live in `skills/` and are synced to `.agents/skills/` by `forge.create`. Each skill has a `SKILL.md` with standardized frontmatter (name, description, category, concerns, dependsOn).
37
+ Skills live in `skills/` and are synced to `.agents/skills/` by `create`. Each skill has a `SKILL.md` with standardized frontmatter (name, description, category, concerns, dependsOn).
38
38
 
39
- - **When editing a skill in `packages/forge/skills/`**, the synced copy in `.agents/skills/<name>/SKILL.md` MUST also be committed in the same session — `forge.create` is not run automatically after manual edits. Stale `.agents/skills/` copies cause `forge.doctor` to report drift.
40
- - **Canonical sync path is flat**: `.agents/skills/<name>/SKILL.md` (e.g. `.agents/skills/fo-idea-implement/SKILL.md`). Both `forge.create` (`init.ts`) and `forge.upgrade` (`upgrade.ts`) sync to this flat path. A nested `.agents/skills/fo/<name>/SKILL.md` path is NOT created or maintained by forge — it is a stale artifact if present and should be removed.
39
+ - **When editing a skill in `packages/forge/skills/`**, the synced copy in `.agents/skills/<name>/SKILL.md` MUST also be committed in the same session — `create` is not run automatically after manual edits. Stale `.agents/skills/` copies cause `doctor` to report drift.
40
+ - **Canonical sync path is flat**: `.agents/skills/<name>/SKILL.md` (e.g. `.agents/skills/fo-idea-implement/SKILL.md`). Both `create` (`init.ts`) and `upgrade` (`upgrade.ts`) sync to this flat path. A nested `.agents/skills/fo/<name>/SKILL.md` path is NOT created or maintained by forge — it is a stale artifact if present and should be removed.
41
41
  - **`FORGE_SKILLS[].path` is relative to the forge package root** and already includes the `skills/` prefix — resolve via `path.join(forgeRoot, skill.path)` (see `init.ts`). Never join a `skillsRoot` with `skill.path`: that produces a doubled `skills/skills/` prefix and silently finds nothing.
42
42
 
43
- The `concerns` field uses a four-level taxonomy (RFC-0523): `read-only` (no file modifications), `document-only` (modifies `.md` files only), `content-mutation` (modifies content `.md`/`.yaml` but not executable code), `code-mutation` (modifies `.ts`/`.astro` code). `forge.skill.validate` enforces this via SKILL-12.
43
+ The `concerns` field uses a four-level taxonomy (RFC-0523): `read-only` (no file modifications), `document-only` (modifies `.md` files only), `content-mutation` (modifies content `.md`/`.yaml` but not executable code), `code-mutation` (modifies `.ts`/`.astro` code). `skill.validate` enforces this via SKILL-12.
44
44
 
45
- The optional `knowledge` field (RFC-0524) declares cumulative knowledge files as an array of file names relative to the SKILL.md directory (e.g. `knowledge: [qa-log.md, learned-principles.md]`). `forge.skill.validate` enforces SKILL-13: declared knowledge files must exist. `forge.create` syncs them to `.agents/skills/`. `forge.doctor` detects stale copies. See `writing-great-skills` § Cumulative knowledge pattern for the three-layer reference pattern, entry format, and mutation contract. RFC-0660 adds SKILL-19 (entry schema validity) and SKILL-20 (identifier uniqueness) for structured knowledge entries, and `forge.doctor` reports legacy-section counts. RFC-0661 adds SKILL-21 (hot/warm layer character budget warnings — warnings only, never build gates) and `forge.doctor` reports budget summaries with headroom %.
45
+ The optional `knowledge` field (RFC-0524) declares cumulative knowledge files as an array of file names relative to the SKILL.md directory (e.g. `knowledge: [qa-log.md, learned-principles.md]`). `skill.validate` enforces SKILL-13: declared knowledge files must exist. `create` syncs them to `.agents/skills/`. `doctor` detects stale copies. See `writing-great-skills` § Cumulative knowledge pattern for the three-layer reference pattern, entry format, and mutation contract. RFC-0660 adds SKILL-19 (entry schema validity) and SKILL-20 (identifier uniqueness) for structured knowledge entries, and `doctor` reports legacy-section counts. RFC-0661 adds SKILL-21 (hot/warm layer character budget warnings — warnings only, never build gates) and `doctor` reports budget summaries with headroom %.
46
46
 
47
47
  ### Validator return-type refactoring
48
48
 
@@ -58,12 +58,12 @@ skillPacks:
58
58
  dir: packages/warpgogol-skills/skills
59
59
  ```
60
60
 
61
- - `forge.create` syncs pack skills alongside forge skills into `.agents/skills/`.
62
- - `forge.skill.validate` validates pack skills with SKILL-01..13 plus SKILL-14 (pack skill name must start with pack prefix), SKILL-15 (non-forge skill may not use `fo-` prefix), and SKILL-17 (no platform RFC/ADR ids or platform names).
61
+ - `create` syncs pack skills alongside forge skills into `.agents/skills/`.
62
+ - `skill.validate` validates pack skills with SKILL-01..13 plus SKILL-14 (pack skill name must start with pack prefix), SKILL-15 (non-forge skill may not use `fo-` prefix), and SKILL-17 (no platform RFC/ADR ids or platform names).
63
63
  - SKILL-07 enforces asymmetric dependency direction: pack skills may depend on forge skills, but forge skills may not depend on pack skills (breaks portability).
64
- - `forge.skill.list` includes pack skills with `pack:<prefix>` annotation.
65
- - `forge.doctor` checks for stale/missing pack skill copies and validates `skillPacks` config (unique prefixes, unique dirs, no `fo` prefix, dir exists).
66
- - **RFC-0552:** `forge.create` (via `runInit`) and `forge.upgrade` (via `syncPackSkills`) detect pack skills whose name conflicts with a Forge skill name. Conflicting pack skills are skipped (not copied to `.agents/skills/`) and reported in `skippedSkills` on `InitResult` and `UpgradeResult`. The `forge-bootstrap` skill reports skipped skills to the operator during onboarding. The `forge-bootstrap` skill also runs `git init` for greenfield projects without a `.git` directory and commits synced skills to git.
64
+ - `skill.list` includes pack skills with `pack:<prefix>` annotation.
65
+ - `doctor` checks for stale/missing pack skill copies and validates `skillPacks` config (unique prefixes, unique dirs, no `fo` prefix, dir exists).
66
+ - **RFC-0552:** `create` (via `runInit`) and `upgrade` (via `syncPackSkills`) detect pack skills whose name conflicts with a Forge skill name. Conflicting pack skills are skipped (not copied to `.agents/skills/`) and reported in `skippedSkills` on `InitResult` and `UpgradeResult`. The `forge-bootstrap` skill reports skipped skills to the operator during onboarding. The `forge-bootstrap` skill also runs `git init` for greenfield projects without a `.git` directory and commits synced skills to git.
67
67
 
68
68
  ## Import rules
69
69
 
@@ -82,7 +82,7 @@ The `commands.changed` field in RFC frontmatter must only list **registered CLI
82
82
 
83
83
  ## RFC frontmatter: YAML backtick quoting
84
84
 
85
- YAML plain scalar values that **start with a backtick** (`` ` ``) must be double-quoted. Backtick is a reserved character in YAML plain scalars — the parser fails with "Plain value cannot start with reserved character `" and `rfc.implement.stamp`reports "Could not parse target RFC" (RFC-IMP-01). This commonly affects`successSignals`, `nonGoals`, and other list items in RFC frontmatter that reference code identifiers in backticks. Always quote such strings: `` - "`forge.doctor`reports domain information" `` instead of `` -`forge.doctor` reports domain information ``.
85
+ YAML plain scalar values that **start with a backtick** (`` ` ``) must be double-quoted. Backtick is a reserved character in YAML plain scalars — the parser fails with "Plain value cannot start with reserved character `" and `rfc.implement.stamp`reports "Could not parse target RFC" (RFC-IMP-01). This commonly affects`successSignals`, `nonGoals`, and other list items in RFC frontmatter that reference code identifiers in backticks. Always quote such strings: `` - "`doctor`reports domain information" `` instead of `` -`doctor` reports domain information ``.
86
86
 
87
87
  **Agent action:** After creating an RFC with `rfc.create`, scan the generated `successSignals` and `nonGoals` sections for unquoted backtick entries. Fix them immediately before committing. This prevents a recurring pattern where `ecosystem.manifest.generate` and `rfc.implement.stamp` fail on RFCs created with backtick-heavy frontmatter.
88
88
 
@@ -104,20 +104,20 @@ YAML plain scalar values that **start with a backtick** (`` ` ``) must be double
104
104
 
105
105
  ## forge.yaml (RFC-0391)
106
106
 
107
- `forge.yaml` is the machine-readable project configuration file at the project root. It records project name, stack, package manager, and docs paths. `forge.create` creates it; `forge.doctor` checks for it; `forge.agents.generate` reads it to produce `AGENTS.md`.
107
+ `forge.yaml` is the machine-readable project configuration file at the project root. It records project name, stack, package manager, and docs paths. `create` creates it; `doctor` checks for it; `forge.agents.generate` reads it to produce `AGENTS.md`.
108
108
 
109
109
  - **MUST NOT** run `forge.agents.generate` against this monorepo's root `AGENTS.md` — it is hand-written and carries no generated marker; the edit guard enforces this, do not bypass it.
110
- - **MUST NOT** re-add any `@warpgogol/*` import to `packages/forge` source — `forge.doctor` autonomy guard will fail.
110
+ - **MUST NOT** re-add any `@warpgogol/*` import to `packages/forge` source — `doctor` autonomy guard will fail.
111
111
  - **MUST NOT** hand-edit a generated `AGENTS.md` in bootstrapped projects — edit `forge.yaml` and regenerate.
112
112
 
113
113
  ## Stack profiles (RFC-0392)
114
114
 
115
- Stack profiles are YAML documents under `profiles/` describing a supported stack (detection markers, workspace layout, install steps, baseline files). `forge.scaffold` creates a working pnpm + Turborepo monorepo from a chosen profile in an empty directory. The migration-adapter registry (RFC-0546) detects the stack of an existing project during `forge-bootstrap` transplant mode.
115
+ Stack profiles are YAML documents under `profiles/` describing a supported stack (detection markers, workspace layout, install steps, baseline files). `scaffold` creates a working pnpm + Turborepo monorepo from a chosen profile in an empty directory. The migration-adapter registry (RFC-0546) detects the stack of an existing project during `forge-bootstrap` transplant mode.
116
116
 
117
117
  - **MUST NOT** scaffold into a non-empty directory — no `--force` flag.
118
118
  - **MUST NOT** add stack profiles for stacks forge cannot scaffold end-to-end.
119
119
  - **MUST** reference all template files in `profiles/<profile>-templates/` from the profile YAML (`workspaceTypes[].agentsMdTemplate` or `firstWorkspace.files`) or document them in the `agentsMdTemplate` file. Unreferenced template files are orphan artifacts that operators cannot discover.
120
- - Shipped profiles: `astro-typescript-turborepo`, `phaser-turborepo`, `forge-shell` (minimal — default for `forge.create`), `editframe` (video domain — first non-software profile, RFC-0641, React template RFC-0694).
120
+ - Shipped profiles: `astro-typescript-turborepo`, `phaser-turborepo`, `forge-shell` (minimal — default for `create`), `editframe` (video domain — first non-software profile, RFC-0641, React template RFC-0694).
121
121
  - **MUST** include a `.github/workflows/ci.yml` template in every stack profile's `workspace.files` list. The CI template MUST include `concurrency` (cancel superseded PR runs), `permissions: contents: read` at workflow level, `timeout-minutes` per job, `env: TZ: UTC` per job, `actions/checkout@v5`, and `actions/setup-node@v5` with Node 24. New projects inherit reliable CI from the scaffold — operators should not need to hand-write CI from scratch.
122
122
 
123
123
  ### Domain fields (RFC-0638)
@@ -126,10 +126,10 @@ The `forge/stack-profile@1` schema includes six optional domain-neutral fields t
126
126
 
127
127
  - **`domain`** — string identifying the project domain (e.g. `software`, `video`, `book`, `music`, `game`, `illustration`). Used for profile detection and doctor output.
128
128
  - **`terminology`** — map of universal concept keys to domain-specific terms (e.g. `artifact: "composition"`). Open vocabulary; universal keys have built-in defaults exported as `TERMINOLOGY_DEFAULTS`. Missing keys fall back to the default term.
129
- - **`artifacts`** — array of artifact definitions (id, extensions, produce/validate commands, determinism properties). Used by `forge.doctor` for domain-specific health checks in follow-up RFCs.
129
+ - **`artifacts`** — array of artifact definitions (id, extensions, produce/validate commands, determinism properties). Used by `doctor` for domain-specific health checks in follow-up RFCs.
130
130
  - **`workspaceTypes`** — array of workspace type definitions (id, detection markers, associated skills, AGENTS.md template). Used by `forge.agents.generate` for per-domain workspace detection in follow-up RFCs.
131
131
  - **`invariants`** — array of domain-specific invariant definitions (id matching `^[A-Z]+-\d+$`, rule text, severity). Schema only — enforcement is deferred to follow-up RFCs.
132
- - **`register`** — string selecting the default behavioral register (`business` or `creative`). Used by `forge.create` as a one-time default for new projects; existing `PREFERENCES.md` is never overwritten.
132
+ - **`register`** — string selecting the default behavioral register (`business` or `creative`). Used by `create` as a one-time default for new projects; existing `PREFERENCES.md` is never overwritten.
133
133
 
134
134
  Types and schemas are exported from `@warpgogol/forge`: `StackProfileDomainFields`, `ProfileArtifact`, `ProfileWorkspaceType`, `ProfileInvariant`, `stackProfileDomainFieldsSchema`, `UNIVERSAL_TERMINOLOGY_KEYS`, `TERMINOLOGY_DEFAULTS`.
135
135
 
@@ -137,9 +137,9 @@ Types and schemas are exported from `@warpgogol/forge`: `StackProfileDomainField
137
137
 
138
138
  The following commands are domain-aware — they read domain fields from the stack profile and `forge.yaml` to adapt their behavior:
139
139
 
140
- - **`forge.profile.validate`** — validates profile YAML files under `packages/forge/profiles/` against the `forge/stack-profile@1` schema (including RFC-0638 domain fields). Supports `--id <profile-id>` to validate a single profile. Returns exit 1 if any profile is invalid.
141
- - **`forge.create`** — reads `domain`, `terminology`, `register`, and artifact-derived semantic bindings from the selected profile and writes them into `forge.yaml` (domain, terminology, bindings.commands) and `PREFERENCES.md` (register). When the profile has no domain fields, behavior is unchanged (software-domain fallback).
142
- - **`forge.doctor`** — reports domain info (domain, source, register, terminology, invariant count) as a `domain-info` check. Enforces profile invariants via the invariant engine as a `domain-invariants` check (RFC-0675) — invariants with a `check` declaration are actively verified (`filename-pattern`, `file-contains`, `file-not-contains`, `attribute-pattern`); invariants without `check` remain advisory. The `attribute-pattern` check kind (RFC-0694) validates attribute values on elements matching a tag selector — requires `elements` (array) and `attribute` fields (schema-enforced via `.refine()`). Reports `fail` for error-severity violations, `warn` for warning-severity. The `--strict` flag elevates `warn` to `fail` for `domain-invariants` and `profile-validate` checks. `--json` includes `invariantViolations` array in the `domain-invariants` check. Runs `forge.profile.validate` as an advisory `profile-validate` check (warn status on failure, not gating — shipped profiles are forge-internal). Nested AGENTS.md check runs for all domains — profile-driven workspace types replace hardcoded detection when present. Domain is resolved via a three-tier chain: `forge.yaml` `project.domain` → stack profile `domain` → default `software`.
140
+ - **`profile.validate`** — validates profile YAML files under `packages/forge/profiles/` against the `forge/stack-profile@1` schema (including RFC-0638 domain fields). Supports `--id <profile-id>` to validate a single profile. Returns exit 1 if any profile is invalid.
141
+ - **`create`** — reads `domain`, `terminology`, `register`, and artifact-derived semantic bindings from the selected profile and writes them into `forge.yaml` (domain, terminology, bindings.commands) and `PREFERENCES.md` (register). When the profile has no domain fields, behavior is unchanged (software-domain fallback).
142
+ - **`doctor`** — reports domain info (domain, source, register, terminology, invariant count) as a `domain-info` check. Enforces profile invariants via the invariant engine as a `domain-invariants` check (RFC-0675) — invariants with a `check` declaration are actively verified (`filename-pattern`, `file-contains`, `file-not-contains`, `attribute-pattern`); invariants without `check` remain advisory. The `attribute-pattern` check kind (RFC-0694) validates attribute values on elements matching a tag selector — requires `elements` (array) and `attribute` fields (schema-enforced via `.refine()`). Reports `fail` for error-severity violations, `warn` for warning-severity. The `--strict` flag elevates `warn` to `fail` for `domain-invariants` and `profile-validate` checks. `--json` includes `invariantViolations` array in the `domain-invariants` check. Runs `profile.validate` as an advisory `profile-validate` check (warn status on failure, not gating — shipped profiles are forge-internal). Nested AGENTS.md check runs for all domains — profile-driven workspace types replace hardcoded detection when present. Domain is resolved via a three-tier chain: `forge.yaml` `project.domain` → stack profile `domain` → default `software`.
143
143
  - **`forge.agents.generate`** — loads `workspaceTypes[]` from the matching stack profile and passes them to `discoverWorkspaces` for profile-driven workspace type detection. When the profile has no `workspaceTypes`, falls back to hardcoded detection (astro.config → app, Dockerfile → service, else package).
144
144
 
145
145
  ### Per-domain AGENTS.md templates (RFC-0643)
@@ -151,11 +151,11 @@ The following commands are domain-aware — they read domain fields from the sta
151
151
  - **Terminology substitution**: `substituteTemplate(content, terminology)` replaces `{{terminology.key}}` placeholders with resolved values. Runs on the final assembled content (after dynamic sections are appended), so the behavioral layer's fixed policy text also receives terminology substitution. Unknown keys resolve to the key name itself — no error.
152
152
  - **`{{terminology.key}}` placeholder syntax**: AGENTS.md templates use `{{terminology.key}}` (double-brace), not `ref(bindings.terminology.key)` (skill syntax). The two are documented separately.
153
153
  - **`details` field in `--json` output**: `AgentsGenerateResult` includes an optional `details` array with per-file metadata: `{ path, domain?, register?, workspaceType? }`. The `generated` field remains `string[]` for backward compatibility.
154
- - **`profile` field in `forge.yaml`**: `forge.create` writes `profile: <id>` to `forge.yaml`. `loadForgeConfig` loads the corresponding `profiles/<id>.yaml` and attaches it as `config.profile` (a `StackProfile` object). The profile object is stripped before serialization — `forge.yaml` stores the profile id (string), not the full profile.
154
+ - **`profile` field in `forge.yaml`**: `create` writes `profile: <id>` to `forge.yaml`. `loadForgeConfig` loads the corresponding `profiles/<id>.yaml` and attaches it as `config.profile` (a `StackProfile` object). The profile object is stripped before serialization — `forge.yaml` stores the profile id (string), not the full profile.
155
155
  - **Template comments MUST NOT use literal `{{placeholder}}` syntax**: `replaceProjectPlaceholders()` runs on the entire template content, including HTML comments. A comment like `<!-- inserted at {{dynamicSections}} -->` will have the placeholder replaced with the full dynamic sections content, breaking the comment and inflating the output. Use plain text names (e.g. `dynamicSections marker`) in comments instead of `{{...}}` syntax.
156
156
  - **All template content MUST be external files, not inline `lines.push()` string arrays.** Fixed prose and policy text in forge generators (e.g. `agents-generate.ts`, `nested-agents-templates.ts`) must live in `.md` template files under `src/onboarding/templates/` or `profiles/`, loaded via `fs.readFileSync` with placeholder substitution. Inline `lines.push("### Section heading")` patterns for fixed text are a contract violation — they embed template content in source code, making it harder to review and maintain. Dynamic, data-driven content (tables generated from registry data, conditional sections from config) remains inline.
157
157
  - **Template files read at runtime via `fs.readFileSync` MUST be listed in `package.json` `files` array.** TypeScript compilation (`tsc`) does not copy `.md` template files to `dist/`. Without an explicit `files` entry, template files exist on disk in development but are missing from the published npm package — the generator silently falls back to empty content. The test `src/tests/package-files.test.ts` guards this: it verifies that `src/onboarding/templates/` is in the `files` array and that all expected template files exist and are readable.
158
- - **Profile object stripping before YAML serialization**: `loadForgeConfig` attaches a full `StackProfile` object to `config.profile`. Before serializing the config back to YAML (e.g. in `forge.create` post-processing), the profile object MUST be stripped back to its string id. Otherwise `forge.yaml` contains an object instead of a string and fails schema validation on re-read.
158
+ - **Profile object stripping before YAML serialization**: `loadForgeConfig` attaches a full `StackProfile` object to `config.profile`. Before serializing the config back to YAML (e.g. in `create` post-processing), the profile object MUST be stripped back to its string id. Otherwise `forge.yaml` contains an object instead of a string and fails schema validation on re-read.
159
159
  - **Profile invariant `rule` fields containing colons MUST be double-quoted.** YAML plain scalars with colons (e.g. `rule: mode attribute must be one of: sequence, fixed, contain, fit`) cause "Nested mappings are not allowed in compact mappings" parsing errors. Always quote rule fields that contain colons: `rule: "mode attribute must be one of: sequence, fixed, contain, fit"`. This also applies to any other YAML string field in profile YAML that may contain colons.
160
160
 
161
161
  ## Bindings contract (RFC-0393)
@@ -163,11 +163,11 @@ The following commands are domain-aware — they read domain fields from the sta
163
163
  The `bindings` section in `forge.yaml` de-hardcodes project-specific values from fo-skills. Skills reference bindings by key (e.g. `ref(forge.yaml bindings.commands.validateRfc)`) instead of hardcoding commands, paths, or terminology.
164
164
 
165
165
  - `forgeBindingsSchema` + `resolveBinding(config, key, placeholders?)` are exported from `@warpgogol/forge`.
166
- - `forge.doctor` validates bindings: checks path existence, reports resolved/absent/invalid, and emits `defaultable-binding-null` notices for forge-CLI-backed bindings that are null (RFC-0540).
167
- - `forge.create` writes forge-CLI-backed defaults for commands forge provides (`validateRfc`, `validateAdr`, `implementStamp`, `specValidate`) and null for stack-dependent commands (`typecheck`, `test`, `scopedBuild`). The package manager from `forge.yaml` determines the runner prefix (`pnpm exec`, `npx`, `yarn exec`, `bunx`).
168
- - `forge.skill.validate` enforces SKILL-11: canonical skill bodies must not contain hardcoded `pnpm exec site-kernel run` or `docs/architecture-dna.md` in instruction lines (code blocks and `run:` directives). Supports `<!-- skill-lint-disable SKILL-11 -->` escape hatch.
169
- - `forge.skill.validate` enforces SKILL-17: skill files must not contain specific platform RFC/ADR ids (`RFC-\d{4}`, `ADR-\d{4}`) or platform names ("Warpgogol", "Warpgogol", "WarpGogol"). Generic "RFC"/"ADR" terms, generic placeholder ids (`RFC-XXXX`), file paths (`adr-0000-template.md`), and binding key names (`validateRfc`) are allowed. The `@warpgogol/forge` npm package name is excluded from the platform name check. Supports `<!-- skill-lint-disable SKILL-17 -->` escape hatch.
170
- - `forge.skill.validate` enforces SKILL-18: canonical forge skill bodies must not reference software-specific binding keys (`bindings.commands.typecheck`, `bindings.commands.scopedBuild`, `bindings.commands.test`) in instruction lines (code blocks and `run:` directives). Skills must reference semantic keys (`bindings.commands.validate`, `bindings.commands.produce`, `bindings.commands.verify`) instead. Supports `<!-- skill-lint-disable SKILL-18 -->` escape hatch. Applies to forge skills only, not pack skills.
166
+ - `doctor` validates bindings: checks path existence, reports resolved/absent/invalid, and emits `defaultable-binding-null` notices for forge-CLI-backed bindings that are null (RFC-0540).
167
+ - `create` writes forge-CLI-backed defaults for commands forge provides (`validateRfc`, `validateAdr`, `implementStamp`, `specValidate`) and null for stack-dependent commands (`typecheck`, `test`, `scopedBuild`). The package manager from `forge.yaml` determines the runner prefix (`pnpm exec`, `npx`, `yarn exec`, `bunx`).
168
+ - `skill.validate` enforces SKILL-11: canonical skill bodies must not contain hardcoded `pnpm exec site-kernel run` or `docs/architecture-dna.md` in instruction lines (code blocks and `run:` directives). Supports `<!-- skill-lint-disable SKILL-11 -->` escape hatch.
169
+ - `skill.validate` enforces SKILL-17: skill files must not contain specific platform RFC/ADR ids (`RFC-\d{4}`, `ADR-\d{4}`) or platform names ("Warpgogol", "Warpgogol", "WarpGogol"). Generic "RFC"/"ADR" terms, generic placeholder ids (`RFC-XXXX`), file paths (`adr-0000-template.md`), and binding key names (`validateRfc`) are allowed. The `@warpgogol/forge` npm package name is excluded from the platform name check. Supports `<!-- skill-lint-disable SKILL-17 -->` escape hatch.
170
+ - `skill.validate` enforces SKILL-18: canonical forge skill bodies must not reference software-specific binding keys (`bindings.commands.typecheck`, `bindings.commands.scopedBuild`, `bindings.commands.test`) in instruction lines (code blocks and `run:` directives). Skills must reference semantic keys (`bindings.commands.validate`, `bindings.commands.produce`, `bindings.commands.verify`) instead. Supports `<!-- skill-lint-disable SKILL-18 -->` escape hatch. Applies to forge skills only, not pack skills.
171
171
  - Skills declare binding requirements in frontmatter: `bindings: { requires: [...], optional: [...] }`.
172
172
  - Degradation contract: required binding unresolvable → skill refuses to start; optional binding absent → step skipped with `Degraded:` line in report.
173
173
  - **RFC-0609: Binding templates must use flag format.** CLI binding templates in `FORGE_CLI_BINDING_DEFAULTS` and `forge.yaml` must use `--id {id}` (flag format), not `{id}` (positional). For example: `forge rfc.validate --id {id} --json`, not `forge rfc.validate {id} --json`. This applies to `validateRfc`, `validateAdr`, and any future binding that passes an identifier to a command.
@@ -182,7 +182,7 @@ The `forge/bindings@1` schema includes five optional semantic command keys that
182
182
  - **`commands.preview`** — domain-neutral preview command (e.g. dev server, live preview).
183
183
  - **`commands.lint`** — domain-neutral linting command.
184
184
 
185
- All semantic keys are optional with `null` defaults. `applyCliBindingDefaults` initializes them with `null` (they are stack-dependent, not CLI-backed). `forge.doctor` does **not** validate semantic keys — they are opt-in per-domain, so reporting them as `absent` for projects that intentionally leave them `null` would be noise. Skills reference them via `ref(bindings.commands.produce)` etc.
185
+ All semantic keys are optional with `null` defaults. `applyCliBindingDefaults` initializes them with `null` (they are stack-dependent, not CLI-backed). `doctor` does **not** validate semantic keys — they are opt-in per-domain, so reporting them as `absent` for projects that intentionally leave them `null` would be noise. Skills reference them via `ref(bindings.commands.produce)` etc.
186
186
 
187
187
  ### Terminology resolution (RFC-0639)
188
188
 
@@ -201,17 +201,17 @@ If the key is not found in any tier, the key itself is returned. The `terminolog
201
201
  Every forge CLI command's output ends with a **Next steps** block in pretty mode and a `nextSteps` array in `--json` mode. Each entry is `{ action: string, kind: "required" | "optional" }`.
202
202
 
203
203
  - `renderNextSteps`, `renderIdeRecommendation`, and `generateHelp` are pure functions in `src/cli-output.ts` — importable by `bin/cli.ts` and unit tests.
204
- - `forge.create` prints an IDE recommendation (Windsurf tested, alternatives without guarantee) after the Next steps block in pretty mode.
204
+ - `create` prints an IDE recommendation (Windsurf tested, alternatives without guarantee) after the Next steps block in pretty mode.
205
205
  - All forge CLI natural-language output is English regardless of `PREFERENCES.md` — `aiLanguage` governs agent chat, not the forge binary.
206
206
  - `printHelp` is generated from the registry via `generateHelp` — no hand-maintained command list. `--help <command>` prints per-command flags and description.
207
207
  - `ForgeNextStep` type and `nextSteps?` field are on `ForgeCommandResult` directly (cross-cutting), not inside command-specific `data`.
208
- - Lifecycle commands (`forge.create`, `forge.scaffold`, `forge.doctor`, `forge.port.scaffold`) MUST populate `nextSteps`. Pass-state validators MAY leave the array empty.
209
- - Future commands (`forge.create`, `forge.upgrade`) MUST conform to the `nextSteps` contract from day one.
208
+ - Lifecycle commands (`create`, `scaffold`, `doctor`, `port.scaffold`) MUST populate `nextSteps`. Pass-state validators MAY leave the array empty.
209
+ - Future commands (`create`, `upgrade`) MUST conform to the `nextSteps` contract from day one.
210
210
  - Skill reports (agent chat output) use the operator's `aiLanguage` and contain zero CLI commands, guides, or format references in user-facing text. The system hides all complexity from the operator. CLI output remains English per RFC-0542; only the skill (agent chat) uses `aiLanguage`. The `forge-bootstrap` welcoming report is the canonical example of this contract.
211
211
 
212
212
  ## Silent upgrade trigger (RFC-0554)
213
213
 
214
- The `forge-bootstrap` skill step 0 silently checks `forge.syncedVersion` against the installed `@warpgogol/forge` version. If they differ, it runs `forge upgrade --update-npm` invisibly — the operator is never informed about migration, version numbers, or upgrade mechanics. The npm update is skipped automatically in monorepo environments (where `packages/forge/` exists). The `forge.upgrade` CLI command remains available for manual sync (with or without `--update-npm`). This is not a dual-path: it is a single upgrade mechanism (`runUpgrade`) with two entry points (CLI and `forge-bootstrap`).
214
+ The `forge-bootstrap` skill step 0 silently checks `forge.syncedVersion` against the installed `@warpgogol/forge` version. If they differ, it runs `forge upgrade --update-npm` invisibly — the operator is never informed about migration, version numbers, or upgrade mechanics. The npm update is skipped automatically in monorepo environments (where `packages/forge/` exists). The `upgrade` CLI command remains available for manual sync (with or without `--update-npm`). This is not a dual-path: it is a single upgrade mechanism (`runUpgrade`) with two entry points (CLI and `forge-bootstrap`).
215
215
 
216
216
  ## Core behavioral layer (RFC-0548)
217
217
 
@@ -221,7 +221,7 @@ The `forge-bootstrap` skill step 0 silently checks `forge.syncedVersion` against
221
221
  - **Fixed policy text** for 20 core behavioral areas: auto-grilling, auto-session-save, auto-review, context awareness, creator-facing communication, adaptive learning, proactive guidance, live operator feedback, register parameter, pushback policy, external capabilities (MCP), safety net, invisible quality, first creation moment, creative health, sharing and feedback, cultural awareness, indirect teaching, ownership, and commit policy (RFC-0551).
222
222
  - **Conditional extended behavioral layer** (RFC-0549) — included only when the register is `creative` (read from `PREFERENCES.md` `register` field). Contains ten sections: personal connection, creative memory, emotional rhythm (questions not declarations), gentle accountability, creative partnership, visual thinking, audience empathy, creative companion (companion mode, `saveCompanionSessions` flag, pull-only inspiration feed), creative confidence (outcome-based praise, never refuse creative direction), and always-next-step (RFC-0551, supersedes the "at most one per session" anticipatory suggestion limit). Content is loaded from `src/onboarding/templates/behavioral-layer-extended.md`.
223
223
 
224
- `forge.create` auto-runs `forge.agents.generate` after `forge.init`, so newly created projects get the behavioral layer from day one. If generation fails, a warning is logged but the create command continues.
224
+ `create` auto-runs `forge.agents.generate` after `forge.init`, so newly created projects get the behavioral layer from day one. If generation fails, a warning is logged but the create command continues.
225
225
 
226
226
  The `triggers` field in skill frontmatter is validated by SKILL-16: optional array of 1-5 natural-language strings (each 5-100 characters), only allowed on fo-category skills. Pack skills may not declare triggers.
227
227
 
@@ -236,9 +236,9 @@ The `triggers` field in skill frontmatter is validated by SKILL-16: optional arr
236
236
 
237
237
  Workspace-type detection rules are defined in RFC-0611. Agents MUST NOT add new detection rules without an amending RFC.
238
238
 
239
- The edit guard skips hand-written nested `AGENTS.md` files (no generated marker) and reports them in the `skipped` array. Generated files (with marker) are regenerated if content differs. `forge.upgrade` also runs nested generation after skill sync. `forge.doctor` checks for missing, stale (in-memory comparison), and hand-written improvement opportunities.
239
+ The edit guard skips hand-written nested `AGENTS.md` files (no generated marker) and reports them in the `skipped` array. Generated files (with marker) are regenerated if content differs. `upgrade` also runs nested generation after skill sync. `doctor` checks for missing, stale (in-memory comparison), and hand-written improvement opportunities.
240
240
 
241
- `forge.agents.generate` supports `dryRun` mode (RFC-0601 pattern): it renders content in memory without writing to disk, returning `renderedFiles` in the result. This is used by `forge.doctor` for staleness detection.
241
+ `forge.agents.generate` supports `dryRun` mode (RFC-0601 pattern): it renders content in memory without writing to disk, returning `renderedFiles` in the result. This is used by `doctor` for staleness detection.
242
242
 
243
243
  - **Doctor stale check MUST use the same rendering pipeline as `forge agents generate`.** The stale check in `checkNestedAgentsMd` (`src/onboarding/doctor.ts`) must call `readPackageInfo` → `buildNestedAgentsMd(ws, config, packageInfo)` → `selectNestedTemplate(wsType, profile, terminology, fallback)` — exactly matching `generateNestedAgentsMd` in `src/onboarding/nested-agents-generate.ts`. Any divergence (missing `packageInfo`, missing `selectNestedTemplate`, missing `resolveAllTerminology`) causes false-positive stale reports for all generated nested `AGENTS.md` files. When modifying either function, verify the other stays in sync.
244
244
 
@@ -304,7 +304,7 @@ When publishing `@warpgogol/forge`, npm resolves the auth token from `.npmrc` fi
304
304
 
305
305
  ## CLI invocation and test fixtures
306
306
 
307
- - **Running forge CLI commands on the workspace root** — `pnpm --filter @warpgogol/forge exec forge <command>` runs from the package directory (`packages/forge/`), where `forge.yaml` is not found. To run forge commands against the workspace root (e.g. `forge.doctor`, `rfc.validate`, `forge.upgrade`), use `node packages/forge/bin/cli.js <command>` from the workspace root instead.
307
+ - **Running forge CLI commands on the workspace root** — `pnpm --filter @warpgogol/forge exec forge <command>` runs from the package directory (`packages/forge/`), where `forge.yaml` is not found. To run forge commands against the workspace root (e.g. `doctor`, `rfc.validate`, `upgrade`), use `node packages/forge/bin/cli.js <command>` from the workspace root instead.
308
308
  - **Golden fixture for `agents-generate`** — when adding or modifying sections in `agents-generate.ts`, the golden fixture `src/tests/fixtures/agents-generate-business-before.txt` MUST be updated to match the new generated output. The test `agents-generate-domain.test.ts` compares generated content against this fixture with `expect(content).toBe(goldenFixture)` — a mismatch fails the test.
309
309
  - **SKILL-17 brand pattern must be case-sensitive** — the brand regex in `skill-validate.ts` uses a `@`-lookbehind to allow `@warpgogol/<pkg>` npm-scope references in skill instruction lines. Making the regex case-insensitive (`/gi`) defeats the lookbehind and false-flags every `@warpgogol` import as a brand violation. Keep the regex case-sensitive (`/g` only) so the `@`-scope allowance works correctly.
310
310
  - **`vi.resetModules()` before `vi.doMock()` for Node builtins** — when mocking Node built-in modules (e.g. `node:child_process`) in vitest, `vi.resetModules()` MUST be called BEFORE `vi.doMock()`. Without `resetModules()` first, the module cache retains the original module and the mock is not applied on re-import via dynamic `import()`. After the test, call `vi.doUnmock()` and `vi.resetModules()` to restore. Discovered during `upgrade.test.ts` `--update-npm` mock testing.
@@ -334,8 +334,8 @@ All profile-driven RFCs (RFC-0674 onwards) MUST follow these conventions:
334
334
 
335
335
  ## Workflow file placement
336
336
 
337
- Workflow files MUST live only in `.agents/workflows/`. Do NOT duplicate workflow files in `.windsurf/workflows/` — `.windsurf/workflows/` is IDE-specific config that does not ship to new projects via `forge.create`. `.agents/workflows/` is the single source of truth for workflow definitions.
337
+ Workflow files MUST live only in `.agents/workflows/`. Do NOT duplicate workflow files in `.windsurf/workflows/` — `.windsurf/workflows/` is IDE-specific config that does not ship to new projects via `create`. `.agents/workflows/` is the single source of truth for workflow definitions.
338
338
 
339
339
  ## Workflow files vs skill content
340
340
 
341
- IDE-specific workflow files (`.windsurf/workflows/`, `.devin/workflows/`) MUST NOT duplicate skill content. Skills (`packages/forge/skills/`) are the portable unit — they ship to every new project via `forge.create`. Workflow files are IDE-specific triggers that reference skills by name; they should not contain the protocol itself. If a workflow file grows beyond a trigger phrase + skill reference, move the content into the skill's `SKILL.md`.
341
+ IDE-specific workflow files (`.windsurf/workflows/`, `.devin/workflows/`) MUST NOT duplicate skill content. Skills (`packages/forge/skills/`) are the portable unit — they ship to every new project via `create`. Workflow files are IDE-specific triggers that reference skills by name; they should not contain the protocol itself. If a workflow file grows beyond a trigger phrase + skill reference, move the content into the skill's `SKILL.md`.
package/README.md CHANGED
@@ -190,20 +190,34 @@ You should see version information, not an error.
190
190
  - **"EACCES permission denied" on Ubuntu when installing Forge globally** — Run `sudo pnpm add -g @warpgogol/forge` instead.
191
191
  - **"corepack: command not found"** — Your Node.js version is too old. Install Node.js 22+ using the steps above.
192
192
  - **Windsurf can't find `forge`** — Close and reopen Windsurf after installing Forge. IDEs need to restart to pick up new global commands.
193
+ - **AI agent doesn't know about Forge** — You opened an empty folder, but the AI agent has no Forge context. Run `forge create my-project --profile editframe` (or the appropriate profile) in a terminal first, then open the created folder in your IDE. The `forge create` command populates the folder with skills, configuration, and `AGENTS.md` — without it, the AI agent can't discover Forge.
193
194
 
194
195
  ---
195
196
 
196
197
  ## Quick start
197
198
 
198
- ### For creative operators — no terminal needed
199
+ ### For creative operators — one command, then just talk
199
200
 
200
- You don't need to know what a terminal is. You don't need to type a single command. If you have an AI-powered IDE like Windsurf or Cursor Forge works entirely through conversation.
201
+ You need to run one command in the terminal to create your project. After that, everything works through conversation with an AI agentno more commands.
201
202
 
202
203
  #### Start a new project from scratch
203
204
 
204
- 1. **Create an empty folder** on your computer anywhere you like. Name it whatever you want your project to be called (use lowercase letters and hyphens, e.g. `my-brand-video`).
205
+ 1. **Create a Forge project.** Open a terminal (PowerShell on Windows, Terminal on Ubuntu) and run:
205
206
 
206
- 2. **Open that folder in your AI IDE.** The folder is empty — that's exactly what we want.
207
+ ```sh
208
+ forge create my-brand-video --profile editframe
209
+ ```
210
+
211
+ Replace `my-brand-video` with your project name (lowercase letters and hyphens). This creates a new folder with everything Forge needs — skills, configuration, and project structure. For other project types, use a different `--profile`:
212
+
213
+ | What you want to build | Profile flag |
214
+ | ----------------------------------------- | -------------------------------------- |
215
+ | Video (brand video, intro, motion design) | `--profile editframe` |
216
+ | Website (landing page, blog, portfolio) | `--profile astro-typescript-turborepo` |
217
+ | Browser game (2D, arcade, puzzle) | `--profile phaser-turborepo` |
218
+ | Library or governance-only project | `--profile forge-shell` |
219
+
220
+ 2. **Open the project folder in your AI IDE.** Open the folder that was created in step 1 in Windsurf or your preferred IDE.
207
221
 
208
222
  3. **Tell the AI agent what you want to build.** Just type it in the chat, in your own words. For example:
209
223
 
@@ -222,7 +236,6 @@ You don't need to know what a terminal is. You don't need to type a single comma
222
236
  > I want to create a TypeScript library for calculating astrology charts.
223
237
 
224
238
  That's it. The AI agent will do everything else:
225
- - Install Forge and all necessary tools
226
239
  - Set up the project structure based on what you described (video, website, game, library, etc.)
227
240
  - Configure language preferences and project settings
228
241
  - Start a live preview so you can see your work (for websites, games, and videos)
@@ -238,7 +251,13 @@ You don't need to know what a terminal is. You don't need to type a single comma
238
251
 
239
252
  If you already have a project somewhere else and want to move it into Forge:
240
253
 
241
- 1. **Create an empty folder** and open it in your AI IDE.
254
+ 1. **Create a Forge project.** Open a terminal and run:
255
+
256
+ ```sh
257
+ forge create my-project
258
+ ```
259
+
260
+ Then open the created folder in your AI IDE.
242
261
 
243
262
  2. **Tell the AI agent:**
244
263
 
@@ -428,7 +447,7 @@ await forgeRfcModule.register(registry);
428
447
  | `bin/` | CLI entrypoint (`forge` command). |
429
448
  | `skills/` | 44 skill definitions (36 fo + 5 shared + 3 meta) with SKILL.md frontmatter. |
430
449
  | `scripts/` | Publication hygiene check (`publish-check.mjs`) run by `prepublishOnly`. |
431
- | `profiles/` | Stack profiles for `forge.scaffold`. |
450
+ | `profiles/` | Stack profiles for `scaffold`. |
432
451
 
433
452
  ## Publishing to npm
434
453
 
package/README.uk.md CHANGED
@@ -190,20 +190,34 @@ ffmpeg -version
190
190
  - **«EACCES permission denied» в Ubuntu під час глобального встановлення Forge** — Виконайте `sudo pnpm add -g @warpgogol/forge`.
191
191
  - **«corepack: command not found»** — Ваша версія Node.js занадто стара. Встановіть Node.js 22+ за кроками вище.
192
192
  - **Windsurf не бачить `forge`** — Закрийте та знову відкрийте Windsurf після встановлення Forge. IDE потрібно перезапустити, щоб підхопити нові глобальні команди.
193
+ - **ШІ-агент не знає про Forge** — Ви відкрили порожню папку, але ШІ-агент не має контексту Forge. Спочатку виконайте `forge create my-project --profile editframe` (або відповідний профіль) у терміналі, потім відкрийте створену папку в вашому IDE. Команда `forge create` наповнює папку навичками, конфігурацією та `AGENTS.md` — без цього ШІ-агент не може виявити Forge.
193
194
 
194
195
  ---
195
196
 
196
197
  ## Швидкий старт
197
198
 
198
- ### Для креативних операторів — термінал не потрібен
199
+ ### Для креативних операторів — одна команда, потім просто розмовляйте
199
200
 
200
- Вам не потрібно знати, що таке термінал. Вам не потрібно вводити жодної команди. Якщо у вас є IDE зі штучним інтелектом наприклад Windsurf або Cursor — Forge працює виключно через розмову.
201
+ Потрібно виконати одну команду в терміналі для створення проєкту. Після цього все працює через розмову з ШІ-агентомбільше команд не потрібно.
201
202
 
202
203
  #### Створення нового проєкту з нуля
203
204
 
204
- 1. **Створіть порожню папку** на комп'ютері де завгодно. Назвіть її як хочете назвати свій проєкт (малі літери та дефіси, наприклад `my-brand-video`).
205
+ 1. **Створіть проєкт Forge.** Відкрийте термінал (PowerShell на Windows, Термінал на Ubuntu) і виконайте:
205
206
 
206
- 2. **Відкрийте цю папку в вашому IDE.** Папка порожня — це саме те, що треба.
207
+ ```sh
208
+ forge create my-brand-video --profile editframe
209
+ ```
210
+
211
+ Замініть `my-brand-video` на назву вашого проєкту (малі літери та дефіси). Це створить нову папку з усьом, що потрібно Forge — навичками, конфігурацією та структурою проєкту. Для інших типів проєктів використовуйте інший `--profile`:
212
+
213
+ | Що ви хочете створити | Прапорець профілю |
214
+ | -------------------------------------------- | -------------------------------------- |
215
+ | Відео (брендове відео, інтро, motion-дизайн) | `--profile editframe` |
216
+ | Вебсайт (лендінг, блог, портфоліо) | `--profile astro-typescript-turborepo` |
217
+ | Браузерна гра (2D, аркада, головоломка) | `--profile phaser-turborepo` |
218
+ | Бібліотека або проєкт лише з управлінням | `--profile forge-shell` |
219
+
220
+ 2. **Відкрийте папку проєкту в вашому IDE.** Відкрийте папку, створену на кроці 1, у Windsurf або вашому IDE.
207
221
 
208
222
  3. **Скажіть ШІ-агенту, що ви хочете створити.** Просто напишіть це в чаті своїми словами. Наприклад:
209
223
 
@@ -222,7 +236,6 @@ ffmpeg -version
222
236
  > Я хочу створити TypeScript-бібліотеку для розрахунку астрологічних карт.
223
237
 
224
238
  Це все. ШІ-агент зробить усе інше:
225
- - Встановить Forge та всі необхідні інструменти
226
239
  - Налаштує структуру проєкту залежно від того, що ви описали (відео, вебсайт, гра, бібліотека тощо)
227
240
  - Налаштує мовні вподобання та параметри проєкту
228
241
  - Запустить живий попередній перегляд, щоб ви бачили свою роботу (для вебсайтів, ігор та відео)
@@ -238,7 +251,13 @@ ffmpeg -version
238
251
 
239
252
  Якщо ви вже маєте проєкт десь інше і хочете перенести його у Forge:
240
253
 
241
- 1. **Створіть порожню папку** та відкрийте її в вашому IDE.
254
+ 1. **Створіть проєкт Forge.** Відкрийте термінал і виконайте:
255
+
256
+ ```sh
257
+ forge create my-project
258
+ ```
259
+
260
+ Потім відкрийте створену папку в вашому IDE.
242
261
 
243
262
  2. **Скажіть ШІ-агенту:**
244
263
 
@@ -428,7 +447,7 @@ await forgeRfcModule.register(registry);
428
447
  | `bin/` | Точка входу CLI (команда `forge`). |
429
448
  | `skills/` | 44 визначення навичок (36 fo + 5 спільних + 3 мета) з frontmatter SKILL.md. |
430
449
  | `scripts/` | Перевірка гігієни публікації (`publish-check.mjs`), запускається `prepublishOnly`. |
431
- | `profiles/` | Профілі стеків для `forge.scaffold`. |
450
+ | `profiles/` | Профілі стеків для `scaffold`. |
432
451
 
433
452
  ## Публікація в npm
434
453
 
package/bin/cli.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { fileURLToPath } from "node:url";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
3
  import { dirname, resolve } from "node:path";
4
4
 
5
5
  const __dirname = dirname(fileURLToPath(import.meta.url));
6
- const distEntry = resolve(__dirname, "..", "dist", "bin", "cli.js");
6
+ const distEntry = pathToFileURL(resolve(__dirname, "..", "dist", "bin", "cli.js")).href;
7
7
 
8
8
  try {
9
9
  await import(distEntry);
package/dist/bin/cli.js CHANGED
@@ -173,13 +173,15 @@ function resolveForgeRootFromCli() {
173
173
  return undefined;
174
174
  }
175
175
  function printCommandHelp(registry, commandName) {
176
- const cmd = registry.getCommand(commandName);
177
- if (!cmd) {
176
+ const resolved = resolveCommandName(commandName, registry);
177
+ const cmd = resolved ? registry.getCommand(resolved) : undefined;
178
+ if (!resolved || !cmd) {
178
179
  logger.error(`Unknown command: ${commandName}`);
179
180
  logger.info(`Run 'forge --help' for available commands.`);
180
181
  process.exit(1);
181
182
  }
182
- console.log(`forge ${cmd.name}`);
183
+ const displayName = resolved.replace(/^forge\./, "");
184
+ console.log(`forge ${displayName}`);
183
185
  console.log(`\n ${cmd.description}`);
184
186
  if (cmd.flags && Object.keys(cmd.flags).length > 0) {
185
187
  console.log("\nFlags:");
@@ -191,6 +193,25 @@ function printCommandHelp(registry, commandName) {
191
193
  process.exit(0);
192
194
  }
193
195
  // ---------------------------------------------------------------------------
196
+ // Command-name resolution (RFC-0699)
197
+ // ---------------------------------------------------------------------------
198
+ function resolveCommandName(commandName, registry) {
199
+ if (registry.getCommand(commandName)) {
200
+ if (commandName.startsWith("forge.")) {
201
+ const unqualified = commandName.slice("forge.".length);
202
+ logger.warn("'" + commandName + "' is deprecated; use '" + unqualified + "'");
203
+ }
204
+ return commandName;
205
+ }
206
+ if (!commandName.includes(".")) {
207
+ const qualified = "forge." + commandName;
208
+ if (registry.getCommand(qualified)) {
209
+ return qualified;
210
+ }
211
+ }
212
+ return undefined;
213
+ }
214
+ // ---------------------------------------------------------------------------
194
215
  // Main
195
216
  // ---------------------------------------------------------------------------
196
217
  async function main() {
@@ -213,7 +234,8 @@ async function main() {
213
234
  const rest = argv.slice(1);
214
235
  const { flags } = parseArgs(rest);
215
236
  const registry = await buildRegistry();
216
- const command = registry.getCommand(commandName);
237
+ const resolved = resolveCommandName(commandName, registry);
238
+ const command = resolved ? registry.getCommand(resolved) : undefined;
217
239
  if (!command) {
218
240
  logger.error(`Unknown command: ${commandName}`);
219
241
  logger.info(`Run 'forge --help' for available commands.`);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;EAeE;AAEF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,MAAM,GAAG;IACb,OAAO,CAAC,GAAW,EAAE,OAAiB;QACpC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1B,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,OAAiB;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACxB,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,OAAiB;QACjC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC3B,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,OAAiB;QAClC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC5B,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAW,EAAE,OAAiB;QACpC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1B,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;CACF,CAAC;AAeF,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG9F,MAAM,gBAAgB;IACZ,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE7D,eAAe,CAAC,OAA+B;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,MAA2B;QACzD,4CAA4C;IAC9C,CAAC;IAED,gBAAgB;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,WAAoB;YAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,KAAK,GAAmC,EAAE,CAAC;IAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBAClB,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sEAAsE;QACxE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,KAAK,UAAU,aAAa;IAC1B,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAExC,MAAM,OAAO,GAAkB;QAC7B,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;QACxE,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACrE,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACpF,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC9E,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACjF,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACvF,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;KAClF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAE9E,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E,SAAS,WAAW;IAClB,2EAA2E;IAC3E,oDAAoD;IACpD,KAAK,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;YAC9E,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAE9B,SAAS,uBAAuB;IAC9B,+DAA+D;IAC/D,uDAAuD;IACvD,KAAK,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAsB,CAAC;YAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB;gBAAE,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0B,EAAE,WAAmB;IACvE,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,GAAG,QAAQ,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzF,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;QACvC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAEzC,MAAM,KAAK,GAAsB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACvD,MAAM,OAAO,GAAwB;QACnC,aAAa;QACb,SAAS,EAAE,uBAAuB,EAAE;QACpC,MAAM;QACN,MAAM;QACN,YAAY;QACZ,eAAe,EAAE,QAAQ;KAC1B,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAA8B,CAAC;QACpF,IAAI,MAAM,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,MAAM,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../../src/cli-output.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,CAQ/D;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA0B9D"}
1
+ {"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../../src/cli-output.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,CAQ/D;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA2B9D"}
@@ -44,7 +44,8 @@ Registered commands (${commands.length}):`;
44
44
  const commandLines = commands
45
45
  .map((cmd) => {
46
46
  const desc = cmd.description.length > 80 ? cmd.description.slice(0, 77) + "..." : cmd.description;
47
- return ` ${cmd.name.padEnd(40)} ${desc}`;
47
+ const displayName = cmd.name.replace(/^forge\./, "");
48
+ return ` ${displayName.padEnd(40)} ${desc}`;
48
49
  })
49
50
  .join("\n");
50
51
  return `${header}\n${commandLines}\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/cli-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;EAaE;AAIF,MAAM,UAAU,eAAe,CAAC,KAAuB;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,yGAAyG,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAyB;IACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;uBAaM,QAAQ,CAAC,MAAM,IAAI,CAAC;IAEzC,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GACR,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;QACvF,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,MAAM,KAAK,YAAY,IAAI,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/cli-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;EAaE;AAIF,MAAM,UAAU,eAAe,CAAC,KAAuB;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,yGAAyG,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAyB;IACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;uBAaM,QAAQ,CAAC,MAAM,IAAI,CAAC;IAEzC,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GACR,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;QACvF,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,KAAK,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,MAAM,KAAK,YAAY,IAAI,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warpgogol/forge",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -15,107 +15,107 @@
15
15
  "framework"
16
16
  ],
17
17
  "homepage": "https://warpgogol.com",
18
- "main": "./src/index.ts",
19
- "types": "./src/index.ts",
18
+ "main": "./dist/src/index.js",
19
+ "types": "./dist/src/index.d.ts",
20
20
  "bin": {
21
21
  "forge": "./bin/cli.js"
22
22
  },
23
23
  "exports": {
24
24
  ".": {
25
- "types": "./src/index.ts",
26
- "default": "./src/index.ts"
25
+ "types": "./dist/src/index.d.ts",
26
+ "default": "./dist/src/index.js"
27
27
  },
28
28
  "./types": {
29
- "types": "./src/types.ts",
30
- "default": "./src/types.ts"
29
+ "types": "./dist/src/types.d.ts",
30
+ "default": "./dist/src/types.js"
31
31
  },
32
32
  "./utils": {
33
- "types": "./src/utils/index.ts",
34
- "default": "./src/utils/index.ts"
33
+ "types": "./dist/src/utils/index.d.ts",
34
+ "default": "./dist/src/utils/index.js"
35
35
  },
36
36
  "./config": {
37
- "types": "./src/config/forge-config.ts",
38
- "default": "./src/config/forge-config.ts"
37
+ "types": "./dist/src/config/forge-config.d.ts",
38
+ "default": "./dist/src/config/forge-config.js"
39
39
  },
40
40
  "./os/core": {
41
- "types": "./os/core/core.module.ts",
42
- "default": "./os/core/core.module.ts"
41
+ "types": "./dist/os/core/core.module.d.ts",
42
+ "default": "./dist/os/core/core.module.js"
43
43
  },
44
44
  "./os/compass": {
45
- "types": "./os/compass/index.ts",
46
- "default": "./os/compass/index.ts"
45
+ "types": "./dist/os/compass/index.d.ts",
46
+ "default": "./dist/os/compass/index.js"
47
47
  },
48
48
  "./os/naming": {
49
- "types": "./os/naming/index.ts",
50
- "default": "./os/naming/index.ts"
49
+ "types": "./dist/os/naming/index.d.ts",
50
+ "default": "./dist/os/naming/index.js"
51
51
  },
52
52
  "./os/naming-module": {
53
- "types": "./os/naming/naming.module.ts",
54
- "default": "./os/naming/naming.module.ts"
53
+ "types": "./dist/os/naming/naming.module.d.ts",
54
+ "default": "./dist/os/naming/naming.module.js"
55
55
  },
56
56
  "./os/rfc": {
57
- "types": "./os/rfc/index.ts",
58
- "default": "./os/rfc/index.ts"
57
+ "types": "./dist/os/rfc/index.d.ts",
58
+ "default": "./dist/os/rfc/index.js"
59
59
  },
60
60
  "./os/rfc-module": {
61
- "types": "./os/rfc/rfc.module.ts",
62
- "default": "./os/rfc/rfc.module.ts"
61
+ "types": "./dist/os/rfc/rfc.module.d.ts",
62
+ "default": "./dist/os/rfc/rfc.module.js"
63
63
  },
64
64
  "./os/werkstatt": {
65
- "types": "./os/werkstatt/index.ts",
66
- "default": "./os/werkstatt/index.ts"
65
+ "types": "./dist/os/werkstatt/index.d.ts",
66
+ "default": "./dist/os/werkstatt/index.js"
67
67
  },
68
68
  "./os/workflow": {
69
- "types": "./os/workflow/index.ts",
70
- "default": "./os/workflow/index.ts"
69
+ "types": "./dist/os/workflow/index.d.ts",
70
+ "default": "./dist/os/workflow/index.js"
71
71
  },
72
72
  "./os/workflow-module": {
73
- "types": "./os/workflow/workflow.module.ts",
74
- "default": "./os/workflow/workflow.module.ts"
73
+ "types": "./dist/os/workflow/workflow.module.d.ts",
74
+ "default": "./dist/os/workflow/workflow.module.js"
75
75
  },
76
76
  "./os/spec-module": {
77
- "types": "./os/spec/spec.module.ts",
78
- "default": "./os/spec/spec.module.ts"
77
+ "types": "./dist/os/spec/spec.module.d.ts",
78
+ "default": "./dist/os/spec/spec.module.js"
79
79
  },
80
80
  "./os/adr": {
81
- "types": "./os/adr/index.ts",
82
- "default": "./os/adr/index.ts"
81
+ "types": "./dist/os/adr/index.d.ts",
82
+ "default": "./dist/os/adr/index.js"
83
83
  },
84
84
  "./os/adr-module": {
85
- "types": "./os/adr/adr.module.ts",
86
- "default": "./os/adr/adr.module.ts"
85
+ "types": "./dist/os/adr/adr.module.d.ts",
86
+ "default": "./dist/os/adr/adr.module.js"
87
87
  },
88
88
  "./os/plan": {
89
- "types": "./os/plan/index.ts",
90
- "default": "./os/plan/index.ts"
89
+ "types": "./dist/os/plan/index.d.ts",
90
+ "default": "./dist/os/plan/index.js"
91
91
  },
92
92
  "./os/plan-module": {
93
- "types": "./os/plan/plan.module.ts",
94
- "default": "./os/plan/plan.module.ts"
93
+ "types": "./dist/os/plan/plan.module.d.ts",
94
+ "default": "./dist/os/plan/plan.module.js"
95
95
  },
96
96
  "./os/audit": {
97
- "types": "./os/audit/index.ts",
98
- "default": "./os/audit/index.ts"
97
+ "types": "./dist/os/audit/index.d.ts",
98
+ "default": "./dist/os/audit/index.js"
99
99
  },
100
100
  "./os/audit-module": {
101
- "types": "./os/audit/audit.module.ts",
102
- "default": "./os/audit/audit.module.ts"
101
+ "types": "./dist/os/audit/audit.module.d.ts",
102
+ "default": "./dist/os/audit/audit.module.js"
103
103
  },
104
104
  "./os/session": {
105
- "types": "./os/session/index.ts",
106
- "default": "./os/session/index.ts"
105
+ "types": "./dist/os/session/index.d.ts",
106
+ "default": "./dist/os/session/index.js"
107
107
  },
108
108
  "./os/session-module": {
109
- "types": "./os/session/session.module.ts",
110
- "default": "./os/session/session.module.ts"
109
+ "types": "./dist/os/session/session.module.d.ts",
110
+ "default": "./dist/os/session/session.module.js"
111
111
  },
112
112
  "./os/mission": {
113
- "types": "./os/mission/index.ts",
114
- "default": "./os/mission/index.ts"
113
+ "types": "./dist/os/mission/index.d.ts",
114
+ "default": "./dist/os/mission/index.js"
115
115
  },
116
116
  "./os/mission-module": {
117
- "types": "./os/mission/mission.module.ts",
118
- "default": "./os/mission/mission.module.ts"
117
+ "types": "./dist/os/mission/mission.module.d.ts",
118
+ "default": "./dist/os/mission/mission.module.js"
119
119
  }
120
120
  },
121
121
  "files": [
@@ -127,18 +127,8 @@
127
127
  "os/rfc/rfc-0000-template.md",
128
128
  "AGENTS.md",
129
129
  "README.md",
130
- "README.uk.md",
131
130
  "LICENSE"
132
131
  ],
133
- "scripts": {
134
- "build": "pnpm exec tsc -p tsconfig.json",
135
- "build:check": "pnpm exec tsc -p tsconfig.json --noEmit",
136
- "clean": "rm -rf dist",
137
- "prepublishOnly": "pnpm run clean && pnpm run build && node scripts/publish-check.mjs && node scripts/strip-workspace-deps.mjs",
138
- "postpublish": "git checkout -- ./package.json",
139
- "test": "vitest run --passWithNoTests",
140
- "test:watch": "vitest"
141
- },
142
132
  "dependencies": {
143
133
  "@aws-sdk/client-s3": "^3.700.0",
144
134
  "trash": "^10.1.1",
@@ -155,106 +145,13 @@
155
145
  "node": ">=20.0.0"
156
146
  },
157
147
  "publishConfig": {
158
- "access": "public",
159
- "main": "./dist/src/index.js",
160
- "types": "./dist/src/index.d.ts",
161
- "exports": {
162
- ".": {
163
- "types": "./dist/src/index.d.ts",
164
- "default": "./dist/src/index.js"
165
- },
166
- "./types": {
167
- "types": "./dist/src/types.d.ts",
168
- "default": "./dist/src/types.js"
169
- },
170
- "./utils": {
171
- "types": "./dist/src/utils/index.d.ts",
172
- "default": "./dist/src/utils/index.js"
173
- },
174
- "./config": {
175
- "types": "./dist/src/config/forge-config.d.ts",
176
- "default": "./dist/src/config/forge-config.js"
177
- },
178
- "./os/core": {
179
- "types": "./dist/os/core/core.module.d.ts",
180
- "default": "./dist/os/core/core.module.js"
181
- },
182
- "./os/compass": {
183
- "types": "./dist/os/compass/index.d.ts",
184
- "default": "./dist/os/compass/index.js"
185
- },
186
- "./os/naming": {
187
- "types": "./dist/os/naming/index.d.ts",
188
- "default": "./dist/os/naming/index.js"
189
- },
190
- "./os/naming-module": {
191
- "types": "./dist/os/naming/naming.module.d.ts",
192
- "default": "./dist/os/naming/naming.module.js"
193
- },
194
- "./os/rfc": {
195
- "types": "./dist/os/rfc/index.d.ts",
196
- "default": "./dist/os/rfc/index.js"
197
- },
198
- "./os/rfc-module": {
199
- "types": "./dist/os/rfc/rfc.module.d.ts",
200
- "default": "./dist/os/rfc/rfc.module.js"
201
- },
202
- "./os/werkstatt": {
203
- "types": "./dist/os/werkstatt/index.d.ts",
204
- "default": "./dist/os/werkstatt/index.js"
205
- },
206
- "./os/workflow": {
207
- "types": "./dist/os/workflow/index.d.ts",
208
- "default": "./dist/os/workflow/index.js"
209
- },
210
- "./os/workflow-module": {
211
- "types": "./dist/os/workflow/workflow.module.d.ts",
212
- "default": "./dist/os/workflow/workflow.module.js"
213
- },
214
- "./os/spec-module": {
215
- "types": "./dist/os/spec/spec.module.d.ts",
216
- "default": "./dist/os/spec/spec.module.js"
217
- },
218
- "./os/adr": {
219
- "types": "./dist/os/adr/index.d.ts",
220
- "default": "./dist/os/adr/index.js"
221
- },
222
- "./os/adr-module": {
223
- "types": "./dist/os/adr/adr.module.d.ts",
224
- "default": "./dist/os/adr/adr.module.js"
225
- },
226
- "./os/plan": {
227
- "types": "./dist/os/plan/index.d.ts",
228
- "default": "./dist/os/plan/index.js"
229
- },
230
- "./os/plan-module": {
231
- "types": "./dist/os/plan/plan.module.d.ts",
232
- "default": "./dist/os/plan/plan.module.js"
233
- },
234
- "./os/audit": {
235
- "types": "./dist/os/audit/index.d.ts",
236
- "default": "./dist/os/audit/index.js"
237
- },
238
- "./os/audit-module": {
239
- "types": "./dist/os/audit/audit.module.d.ts",
240
- "default": "./dist/os/audit/audit.module.js"
241
- },
242
- "./os/session": {
243
- "types": "./dist/os/session/index.d.ts",
244
- "default": "./dist/os/session/index.js"
245
- },
246
- "./os/session-module": {
247
- "types": "./dist/os/session/session.module.d.ts",
248
- "default": "./dist/os/session/session.module.js"
249
- },
250
- "./os/mission": {
251
- "types": "./dist/os/mission/index.d.ts",
252
- "default": "./dist/os/mission/index.js"
253
- },
254
- "./os/mission-module": {
255
- "types": "./dist/os/mission/mission.module.d.ts",
256
- "default": "./dist/os/mission/mission.module.js"
257
- }
258
- }
148
+ "access": "public"
149
+ },
150
+ "scripts": {
151
+ "build": "pnpm exec tsc -p tsconfig.json",
152
+ "build:check": "pnpm exec tsc -p tsconfig.json --noEmit",
153
+ "clean": "rm -rf dist",
154
+ "test": "vitest run --passWithNoTests",
155
+ "test:watch": "vitest"
259
156
  }
260
- }
157
+ }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: fo-harvest
3
- description: Systematic self-growth loop — scan the whole project for forge-worthy patterns, grill the operator on portability, and port accepted candidates via port-to-forge / forge.port.scaffold.
3
+ description: Systematic self-growth loop — scan the whole project for forge-worthy patterns, grill the operator on portability, and port accepted candidates via port-to-forge / port.scaffold.
4
4
  category: fo
5
5
  invocation: user
6
6
  concerns: code-mutation
@@ -13,7 +13,7 @@ triggers: ["harvest portable patterns from code", "extract reusable code pattern
13
13
 
14
14
  # fo-harvest
15
15
 
16
- The systematic self-growth loop for forge. Discover patterns proven in real project work that deserve to be canonicalized into `packages/forge`, grill the operator on portability per candidate, and port accepted candidates through the existing `port-to-forge` skill and `forge.port.scaffold` command.
16
+ The systematic self-growth loop for forge. Discover patterns proven in real project work that deserve to be canonicalized into `packages/forge`, grill the operator on portability per candidate, and port accepted candidates through the existing `port-to-forge` skill and `port.scaffold` command.
17
17
 
18
18
  ## When to invoke
19
19
 
@@ -49,7 +49,7 @@ For each candidate, grill the operator:
49
49
  - Is this pattern project-specific or genuinely portable?
50
50
  - Does forge already have an equivalent? If so, should the existing one be enhanced instead?
51
51
  - What is the minimal extraction that preserves the pattern without project-specific coupling?
52
- - Does porting this require a new RFC, or can it go through `forge.port.scaffold` directly?
52
+ - Does porting this require a new RFC, or can it go through `port.scaffold` directly?
53
53
 
54
54
  Only proceed with candidates the operator explicitly accepts. Do not port anything without explicit acceptance.
55
55
 
@@ -57,11 +57,11 @@ Only proceed with candidates the operator explicitly accepts. Do not port anythi
57
57
 
58
58
  For each accepted candidate:
59
59
 
60
- 1. Run `forge.port.scaffold` to create the skeleton in `packages/forge/`.
60
+ 1. Run `port.scaffold` to create the skeleton in `packages/forge/`.
61
61
  2. Implement the ported logic — inline trivial code, invert dependencies for non-trivial cases.
62
- 3. Run `forge.port.validate` to verify compliance with forge contracts.
62
+ 3. Run `port.validate` to verify compliance with forge contracts.
63
63
  4. Update `FORGE_SKILLS` registry if a new skill was created.
64
- 5. Run `forge.skill.validate` to verify skill frontmatter.
64
+ 5. Run `skill.validate` to verify skill frontmatter.
65
65
 
66
66
  ### 5. Registry + docs update
67
67
 
@@ -74,7 +74,7 @@ After all accepted candidates are ported:
74
74
  ## Constraints
75
75
 
76
76
  - **Operator-invoked only.** Never auto-run harvest on a schedule.
77
- - **One port per candidate.** Do not batch multiple patterns into one port — each candidate gets its own `forge.port.scaffold` call and its own commit.
78
- - **No hand-copying.** All porting goes through `port-to-forge` / `forge.port.scaffold`. Do not manually copy files into `packages/forge/`.
77
+ - **One port per candidate.** Do not batch multiple patterns into one port — each candidate gets its own `port.scaffold` call and its own commit.
78
+ - **No hand-copying.** All porting goes through `port-to-forge` / `port.scaffold`. Do not manually copy files into `packages/forge/`.
79
79
  - **Grilling is mandatory.** Every candidate must pass the grilling step before porting. No silent ports.
80
80
  - **Forward-only.** If a pattern replaces an existing forge skill or command, the old one is removed in the same change — no parallel implementations.
@@ -21,13 +21,13 @@ This skill assists the operator in the knowledge distillation lifecycle: reading
21
21
  ## When to invoke
22
22
 
23
23
  - **After a productive session** — when the session generated raw Q&A pairs or debugging insights that could benefit future agents.
24
- - **When `forge.skill.knowledge.compact --all-skills --dry-run` reports legacy sections** — this skill performs the actual migration with operator approval.
24
+ - **When `skill.knowledge.compact --all-skills --dry-run` reports legacy sections** — this skill performs the actual migration with operator approval.
25
25
  - **When a SKILL-21 budget warning appears** — distill to reduce active knowledge volume.
26
26
  - **When the operator asks to "distill", "compact", or "maintain" skill knowledge.**
27
27
 
28
28
  ## What this skill is NOT
29
29
 
30
- - It is NOT `forge.skill.knowledge.compact` — that command handles mechanical archival (expiry, supersession, L0 retention, L2 staleness). This skill handles semantic work: grouping, promoting, and migrating.
30
+ - It is NOT `skill.knowledge.compact` — that command handles mechanical archival (expiry, supersession, L0 retention, L2 staleness). This skill handles semantic work: grouping, promoting, and migrating.
31
31
  - It is NOT `fo-session-retro` — that skill triages session discoveries and routes them. This skill works within a single skill's knowledge files.
32
32
  - It is NOT `fo-extract-dna` — that skill extracts architectural invariants. This skill distills operational knowledge (fix patterns, learned principles).
33
33
 
@@ -104,7 +104,7 @@ Apply approved mutations via the knowledge serializer (`serializeKnowledgeFile`)
104
104
 
105
105
  If retention/expiry candidates remain after distillation:
106
106
 
107
- - Recommend `forge.skill.knowledge.compact --skill <name>` to the operator.
107
+ - Recommend `skill.knowledge.compact --skill <name>` to the operator.
108
108
  - Offer to run it via `ask_user_question`.
109
109
  - If the operator declines, note it in the session summary.
110
110
 
@@ -145,13 +145,13 @@ See `writing-great-skills` § Cumulative knowledge pattern for the three-layer r
145
145
 
146
146
  - **Operator approval on every mutation.** Never write to a knowledge file without explicit approval for each entry.
147
147
  - **Serializer only.** Always use `serializeKnowledgeFile` from the forge knowledge module. Never string-splice markdown.
148
- - **No semantic logic in command handlers.** The `forge.skill.knowledge.compact` command handles mechanical archival only. Semantic grouping and promotion live in this skill.
148
+ - **No semantic logic in command handlers.** The `skill.knowledge.compact` command handles mechanical archival only. Semantic grouping and promotion live in this skill.
149
149
  - **No LLM logic in `src/knowledge/`.** Deterministic planning only; meaning work lives here.
150
150
  - **Read archives too.** When distilling, read both live and archive files — archived material may still contain themes worth re-distilling.
151
151
 
152
152
  ## Cross-skill promotion
153
153
 
154
- When `forge.doctor` reports `knowledge-duplicate` warnings (cross-skill L2 entries with matching normalized titles), or when the operator identifies a promotion candidate, execute the promotion protocol:
154
+ When `doctor` reports `knowledge-duplicate` warnings (cross-skill L2 entries with matching normalized titles), or when the operator identifies a promotion candidate, execute the promotion protocol:
155
155
 
156
156
  ### Promotion protocol
157
157
 
@@ -56,7 +56,7 @@ Before any operator interaction, silently check whether the installed `@warpgogo
56
56
  2. If `forge.syncedVersion` is absent or `null`, treat it as "never synced".
57
57
  3. Resolve the installed `@warpgogol/forge` version by reading `node_modules/@warpgogol/forge/package.json` (the `version` field). If the file cannot be read (forge not installed yet), skip the version check entirely and proceed to step 1.
58
58
  4. If `forge.syncedVersion` equals the installed version — skip to step 1 (language selection). No migration needed.
59
- 5. If versions differ (or `syncedVersion` is `null`/absent) — silently run `forge upgrade --update-npm` via CLI. The agent executes the command internally and does not show any output to the operator. The upgrade updates `@warpgogol/forge` from npm (if not a monorepo), syncs `.agents/skills/`, adds missing binding defaults, updates `forge.syncedVersion`, and runs `forge.doctor` — all invisibly. In a monorepo (where `packages/forge/` exists), the npm update step is skipped automatically and only the sync runs.
59
+ 5. If versions differ (or `syncedVersion` is `null`/absent) — silently run `forge upgrade --update-npm` via CLI. The agent executes the command internally and does not show any output to the operator. The upgrade updates `@warpgogol/forge` from npm (if not a monorepo), syncs `.agents/skills/`, adds missing binding defaults, updates `forge.syncedVersion`, and runs `doctor` — all invisibly. In a monorepo (where `packages/forge/` exists), the npm update step is skipped automatically and only the sync runs.
60
60
  6. If `forge upgrade` fails — log the error to the session log (not shown to the operator), proceed to step 1 with the old configuration. `forge.syncedVersion` is not updated, so the next `forge-bootstrap` invocation will retry.
61
61
  7. Proceed to step 1 (language selection) regardless of success or failure. The operator sees no text about migration, version numbers, or upgrade mechanics.
62
62
 
@@ -305,13 +305,13 @@ The RTK usage rule is automatically included in the generated `AGENTS.md` by `fo
305
305
 
306
306
  ### 7. Auto-run doctor (new)
307
307
 
308
- The skill runs `forge.doctor` internally — not as a CLI command the operator types. The operator never sees a command or a terminal.
308
+ The skill runs `doctor` internally — not as a CLI command the operator types. The operator never sees a command or a terminal.
309
309
 
310
310
  If doctor reports issues, the skill presents them in human language (in `aiLanguage`) with proposed solutions. The operator can choose to fix or defer.
311
311
 
312
312
  If doctor passes, the skill confirms everything is healthy.
313
313
 
314
- If `forge.doctor` is unavailable (forge not installed as devDependency yet), the skill skips auto-doctor and notes it in the report. The operator can ask the agent to run it later.
314
+ If `doctor` is unavailable (forge not installed as devDependency yet), the skill skips auto-doctor and notes it in the report. The operator can ask the agent to run it later.
315
315
 
316
316
  ### 8. Auto-create ADR (new, both greenfield and transplant, silent)
317
317
 
@@ -430,8 +430,8 @@ A short description after every onboarding, read from `forge-about.md`. The skil
430
430
  - No adapter matches the source directory → skill reports "no migration adapter detected for this project type" and falls back to the greenfield interview for bindings (no code migration).
431
431
  - Multiple adapters match → skill asks the operator to choose.
432
432
  - File conflict (source and forge both have the same non-protected file) → skill shows the conflict and asks the operator to choose (source-wins or forge-wins).
433
- - `forge.doctor` finds issues → skill presents them in human language with proposed solutions; operator can choose to fix or defer.
434
- - `forge.doctor` is unavailable → skill skips auto-doctor and notes it in the report; operator can ask the agent to run it later.
433
+ - `doctor` finds issues → skill presents them in human language with proposed solutions; operator can choose to fix or defer.
434
+ - `doctor` is unavailable → skill skips auto-doctor and notes it in the report; operator can ask the agent to run it later.
435
435
  - Auto-ADR creation fails → skill reports the error silently (in agent logs, not to operator), leaves the ADR file in place for the agent to fix, and continues to the welcoming report. The operator is never told about the ADR.
436
436
  - Project analysis finds nothing recommendable (transplant) → skill skips recommendations and proceeds to the welcoming report with a direct invitation to start creating.
437
437
  - Git history transfer fails → skill warns and continues with clean `git init`.
@@ -15,7 +15,7 @@ bindings:
15
15
 
16
16
  Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the `my-preferences` skill semantics.
17
17
 
18
- Interactive skill for porting reusable patterns from project work into forge. Process: identify pattern → grill operator about portability boundaries → create RFC/ADR if needed → scaffold via `forge.port.scaffold` → implement → validate via `forge.port.validate` → update registry.
18
+ Interactive skill for porting reusable patterns from project work into forge. Process: identify pattern → grill operator about portability boundaries → create RFC/ADR if needed → scaffold via `port.scaffold` → implement → validate via `port.validate` → update registry.
19
19
 
20
20
  ## Process
21
21
 
@@ -38,7 +38,7 @@ If the port involves architectural decisions (new package boundaries, command ow
38
38
 
39
39
  ### 4. Scaffold
40
40
 
41
- Run `forge.port.scaffold --name <name> --type <skill|command> --category <category>` to generate the skeleton.
41
+ Run `port.scaffold --name <name> --type <skill|command> --category <category>` to generate the skeleton.
42
42
 
43
43
  ### 5. Implement
44
44
 
@@ -50,7 +50,7 @@ Port the implementation, ensuring:
50
50
 
51
51
  ### 6. Validate
52
52
 
53
- Run `forge.port.validate --name <name>` to verify the ported artifact has no project-specific dependencies.
53
+ Run `port.validate --name <name>` to verify the ported artifact has no project-specific dependencies.
54
54
 
55
55
  ### 7. Update registry
56
56
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: skill-create
3
- description: Guides an agent through creating a new forge-compliant skill — determines category, invocation, concerns, dependencies, generates frontmatter, calls forge.port.scaffold, and validates.
3
+ description: Guides an agent through creating a new forge-compliant skill — determines category, invocation, concerns, dependencies, generates frontmatter, calls port.scaffold, and validates.
4
4
  invocation: user
5
5
  category: meta
6
6
  concerns: document-only
@@ -12,7 +12,7 @@ languagePolicy: ref(PREFERENCES.md)
12
12
 
13
13
  Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
14
14
 
15
- Interactive skill that guides an agent through creating a new forge-compliant skill. This is the agent-facing workflow; `forge.port.scaffold --type skill` is the machine-facing OS command that does the actual file generation.
15
+ Interactive skill that guides an agent through creating a new forge-compliant skill. This is the agent-facing workflow; `port.scaffold --type skill` is the machine-facing OS command that does the actual file generation.
16
16
 
17
17
  ## Process
18
18
 
@@ -50,7 +50,7 @@ Present the analysis to the operator. If they confirm, create the knowledge file
50
50
 
51
51
  ### 2. Scaffold
52
52
 
53
- Run `forge.port.scaffold --name <name> --type skill --category <category>` to generate the SKILL.md skeleton with standardized frontmatter.
53
+ Run `port.scaffold --name <name> --type skill --category <category>` to generate the SKILL.md skeleton with standardized frontmatter.
54
54
 
55
55
  ### 3. Write the body
56
56
 
@@ -58,7 +58,7 @@ Fill the SKILL.md body with the skill's behavioral instructions. Follow the conv
58
58
 
59
59
  ### 4. Validate
60
60
 
61
- Run `forge.skill.validate` to verify the new skill passes all invariants (SKILL-01 through SKILL-13).
61
+ Run `skill.validate` to verify the new skill passes all invariants (SKILL-01 through SKILL-13).
62
62
 
63
63
  ### 5. Register
64
64
 
@@ -102,7 +102,7 @@ knowledge:
102
102
  - learned-principles.md
103
103
  ```
104
104
 
105
- `forge.skill.validate` enforces SKILL-13: declared knowledge files must exist. `forge.create` syncs them to `.agents/skills/`. `forge.doctor` detects stale copies.
105
+ `skill.validate` enforces SKILL-13: declared knowledge files must exist. `create` syncs them to `.agents/skills/`. `doctor` detects stale copies.
106
106
 
107
107
  ### Three-layer reference pattern
108
108
 
@@ -120,10 +120,10 @@ Not every skill needs all three. `grilling` uses L0 and L2 only (no fix patterns
120
120
 
121
121
  In addition to the three skill-local layers, there is a fourth tier: the **shared knowledge layer** at `packages/forge/skills/shared/knowledge/learned-principles.md`. This file holds promoted cross-skill principles with `shared/K-NNNN` identifiers.
122
122
 
123
- - **Detection**: `forge.doctor` reports cross-skill duplicate L2 entries via normalized-title matching (exact and bounded containment).
123
+ - **Detection**: `doctor` reports cross-skill duplicate L2 entries via normalized-title matching (exact and bounded containment).
124
124
  - **Promotion**: `fo-knowledge-distill` executes promotions under operator grilling — the principle moves to the shared layer with summed confirmations and `promotedFrom` provenance; each skill-local copy is rewritten to a pointer entry (`promotedTo: shared/K-NNNN`, `status: superseded`).
125
125
  - **Consumption**: knowledge-adopting skills read the shared layer at run start and cite shared principles as `shared/K-NNNN`.
126
- - **Validation**: `forge.doctor` validates the shared layer file for schema validity and id uniqueness (it is not inside a skill directory, so `forge.skill.validate` does not reach it).
126
+ - **Validation**: `doctor` validates the shared layer file for schema validity and id uniqueness (it is not inside a skill directory, so `skill.validate` does not reach it).
127
127
  - **npm portability**: the shared layer ships as an empty template — accumulated promotions are project-specific.
128
128
 
129
129
  ### Entry format
@@ -173,12 +173,12 @@ Files declared in `knowledge:` frontmatter that do not use `### K-NNNN:` heading
173
173
 
174
174
  #### Validation
175
175
 
176
- `forge.skill.validate` enforces:
176
+ `skill.validate` enforces:
177
177
  - **SKILL-19**: entry metadata schema validity (errors) and legacy section warnings (migration window).
178
178
  - **SKILL-20**: identifier uniqueness (`K-NNNN` format, no duplicates, `supersedes` references resolve, `promotedTo` format).
179
179
  - **SKILL-21**: hot (L2) and warm (L1) layer character budget warnings — warnings only, never build gates. Defaults: hot=4096, warm=8192. Override in `forge.yaml` under `bindings.knowledge.budgets`.
180
180
 
181
- `forge.doctor` reports legacy section counts and knowledge budget summaries as informational warnings.
181
+ `doctor` reports legacy section counts and knowledge budget summaries as informational warnings.
182
182
 
183
183
  ### Reading discipline
184
184
 
@@ -195,11 +195,11 @@ L2 entries carry a `confirmations: N` counter. When confirmations reach threshol
195
195
  ### Mutation contract
196
196
 
197
197
  - **Source-of-truth**: `packages/forge/skills/<category>/<name>/`. Skills mutate knowledge files here during runs and commit to main repo. Skills always read from source.
198
- - **Runtime copy**: `.agents/skills/<name>/`. Synced by `forge.create`. Read-only — skills never write here. The `.agents/` copy exists for consumers who install `@warpgogol/forge` as an npm package.
198
+ - **Runtime copy**: `.agents/skills/<name>/`. Synced by `create`. Read-only — skills never write here. The `.agents/` copy exists for consumers who install `@warpgogol/forge` as an npm package.
199
199
  - **Sync**: one-way (source → `.agents/`), never the reverse.
200
- - **Stale detection**: `forge.doctor` compares source and `.agents/` copies, reports drift as warnings.
200
+ - **Stale detection**: `doctor` compares source and `.agents/` copies, reports drift as warnings.
201
201
 
202
202
  ### npm portability
203
203
 
204
- `@warpgogol/forge` is published to npm with `skills/` in the `files` array. Knowledge files ship as empty templates (header comments only). Forge's accumulated Q&A and learned principles are project-specific and should not leak to npm consumers. Each project accumulates its own knowledge locally after running `forge.create`.
204
+ `@warpgogol/forge` is published to npm with `skills/` in the `files` array. Knowledge files ship as empty templates (header comments only). Forge's accumulated Q&A and learned principles are project-specific and should not leak to npm consumers. Each project accumulates its own knowledge locally after running `create`.
205
205
  ```