@garygentry/feature-forge 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # @garygentry/feature-forge
2
+
3
+ Cross-agent installer for the [**feature-forge**](https://github.com/garygentry/feature-forge)
4
+ skill suite — an end-to-end feature-development pipeline that runs on any coding agent
5
+ (Claude, Codex, Copilot, Cursor, or Gemini).
6
+
7
+ This package installs the canonical forge skills into the agents detected on your machine.
8
+ It is dependency-free and performs sandboxed, manifest-tracked writes.
9
+
10
+ ## Usage
11
+
12
+ ```bash
13
+ # Install into every detected agent:
14
+ npx @garygentry/feature-forge install
15
+
16
+ # Scope to one agent:
17
+ npx @garygentry/feature-forge install -a codex
18
+
19
+ # Preview the plan without writing anything:
20
+ npx @garygentry/feature-forge install --dry-run --json
21
+ ```
22
+
23
+ ### Commands
24
+
25
+ | Command | Description |
26
+ | ------------------ | ----------------------------------------------------------------- |
27
+ | `install` (`add`) | Install feature-forge into the target agent(s). |
28
+ | `update` | Reconcile an existing install to the current adapters. |
29
+ | `uninstall` (`remove`) | Remove a prior install (manifest-tracked files only). |
30
+ | `list` (`ls`) | Report per-agent detected / installed / up-to-date status. |
31
+
32
+ ### Common flags
33
+
34
+ | Flag | Description |
35
+ | ------------------- | --------------------------------------------------------------------- |
36
+ | `-a, --agent <id>` | Scope to one agent (`claude`/`codex`/`copilot`/`cursor`/`gemini`). |
37
+ | `-g, --global` | Install into the user-level config dir (default: project-local). |
38
+ | `--symlink` | Symlink the bundle instead of copying (Windows always copies). |
39
+ | `--dry-run` | Print the planned actions without changing anything. |
40
+ | `--json` | Emit the run report as JSON. |
41
+ | `--skip-rauf` | Skip the rauf resolvability preflight (records `raufPin: null`). |
42
+
43
+ ## Claude
44
+
45
+ Claude Code users can alternatively install via the plugin marketplace:
46
+
47
+ ```bash
48
+ /plugin marketplace add garygentry/feature-forge
49
+ /plugin install feature-forge@feature-forge
50
+ ```
51
+
52
+ ## Notes
53
+
54
+ The default loop runner is [**rauf**](https://github.com/garygentry/rauf), published as
55
+ [`@garygentry/rauf`](https://www.npmjs.com/package/@garygentry/rauf). The installer runs a
56
+ read-only resolvability preflight on the pin (`@garygentry/rauf@0.7.0`) and records it; pass
57
+ `--skip-rauf` to defer the check (e.g. offline installs). Install the rauf CLI itself with
58
+ `npx @garygentry/rauf` or its
59
+ [binary script](https://github.com/garygentry/rauf#install). See the
60
+ [feature-forge README](https://github.com/garygentry/feature-forge#readme) for the full
61
+ pipeline documentation and per-agent setup guides.
62
+
63
+ ## License
64
+
65
+ MIT
@@ -147,8 +147,8 @@
147
147
  },
148
148
  "installHint": {
149
149
  "type": "string",
150
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
150
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.7.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.7.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.7.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
152
152
  },
153
153
  "schemaVersion": {
154
154
  "type": "string",
@@ -147,8 +147,8 @@
147
147
  },
148
148
  "installHint": {
149
149
  "type": "string",
150
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
150
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.7.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.7.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.7.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
152
152
  },
153
153
  "schemaVersion": {
154
154
  "type": "string",
@@ -147,8 +147,8 @@
147
147
  },
148
148
  "installHint": {
149
149
  "type": "string",
150
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
150
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.7.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.7.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.7.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
152
152
  },
153
153
  "schemaVersion": {
154
154
  "type": "string",
@@ -147,8 +147,8 @@
147
147
  },
148
148
  "installHint": {
149
149
  "type": "string",
150
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
150
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.7.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.7.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.7.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
152
152
  },
153
153
  "schemaVersion": {
154
154
  "type": "string",
@@ -147,8 +147,8 @@
147
147
  },
148
148
  "installHint": {
149
149
  "type": "string",
150
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
150
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.7.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.7.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
151
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.7.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
152
152
  },
153
153
  "schemaVersion": {
154
154
  "type": "string",
@@ -28,7 +28,7 @@ export interface BuildManifestArgs {
28
28
  readonly skills: readonly string[];
29
29
  /** SHA-256 over the source bundle's canonical (sorted-path) file set — drift anchor (spec 03). */
30
30
  readonly sourceHash: string;
31
- /** Recorded pinned rauf coordinate (e.g. "rauf@0.6.0"); `null` when `--skip-rauf` (spec 06). */
31
+ /** Recorded pinned rauf coordinate (e.g. "@garygentry/rauf@0.7.0"); `null` when `--skip-rauf` (spec 06). */
32
32
  readonly raufPin: string | null;
33
33
  /** Symlink mode only: the source bundle the namespace dir links to (REQ-SAFE-02). */
34
34
  readonly link?: {
package/dist/rauf.d.ts CHANGED
@@ -17,26 +17,27 @@ import { type Result } from "./types.js";
17
17
  * downstream `forge-rauf-loop-default` read the same value, and recorded into each manifest
18
18
  * as `InstallManifest.raufPin` (05-manifest-and-uninstall.md).
19
19
  *
20
- * Shape: `<name>@<version>` — UNSCOPED `rauf`. Advanced on each feature-forge release to a new
21
- * known-compatible rauf (REQ-RAUF-03). The current rauf version is 0.6.0.
20
+ * Shape: `<name>@<version>` — the SCOPED package `@garygentry/rauf` (the unscoped `rauf` name is
21
+ * blocked by npm's similarity filter). Advanced on each feature-forge release to a new
22
+ * known-compatible rauf (REQ-RAUF-03). The current rauf version is 0.7.0.
22
23
  *
23
- * Correctable config (OQ-C): the FINAL published coordinate is confirmed by `packaging-docs-ci`
24
- * when rauf's publish path is stood up. Until then this resolves to a package that does not yet
25
- * exist on npm (IR-2), so the preflight WILL fail — the known, designed failure mode, not a bug.
24
+ * rauf is now PUBLISHED (rauf#28): `@garygentry/rauf@0.7.0` resolves from the npm registry, so the
25
+ * preflight below passes by default. (Historically this pin pointed at an unpublished package and
26
+ * the preflight was a designed-to-fail check see the `--skip-rauf` escape hatch.)
26
27
  */
27
- export declare const RAUF_PIN = "rauf@0.6.0";
28
+ export declare const RAUF_PIN = "@garygentry/rauf@0.7.0";
28
29
  /**
29
30
  * An injectable, READ-ONLY registry query (D1). Given a coordinate `name@version`, returns the
30
31
  * resolved version string on success, or an `InstallerError` if it is not resolvable.
31
32
  *
32
33
  * Injectable so tests mock the registry with NO real network: the default implementation
33
34
  * (`defaultRegistryQuery`) shells `npm view <coordinate> version`; a test passes a stub
34
- * returning `ok("0.6.0")` or `err({ code: "RAUF_UNRESOLVABLE", ... })`.
35
+ * returning `ok("0.7.0")` or `err({ code: "RAUF_UNRESOLVABLE", ... })`.
35
36
  *
36
37
  * Contract: the query MUST be read-only — it MUST NOT install, MUST NOT mutate global npm
37
38
  * state, and MUST NOT execute rauf. `npm view` satisfies this (it only reads registry metadata).
38
39
  *
39
- * @param coordinate - the `name@version` to resolve, e.g. "rauf@0.6.0"
40
+ * @param coordinate - the `name@version` to resolve, e.g. "@garygentry/rauf@0.7.0"
40
41
  * @returns Result<string> — the resolved version on success; RAUF_UNRESOLVABLE on failure.
41
42
  */
42
43
  export type RegistryQuery = (coordinate: string) => Result<string>;
@@ -44,12 +45,12 @@ export type RegistryQuery = (coordinate: string) => Result<string>;
44
45
  export interface PreflightRaufOpts {
45
46
  /**
46
47
  * When true (the `--skip-rauf` flag), skip the preflight entirely: perform NO network call
47
- * and return `{ raufPin: null }`. For environments that knowingly defer rauf (e.g. CI
48
- * dry-runs while rauf is unpublished IR-2).
48
+ * and return `{ raufPin: null }`. For environments that knowingly defer rauf (e.g. offline
49
+ * installs or CI dry-runs that won't use the default loop).
49
50
  */
50
51
  readonly skip?: boolean;
51
52
  /**
52
- * The registry query to use. Default: `defaultRegistryQuery` (`npm view rauf@<pin> version`
53
+ * The registry query to use. Default: `defaultRegistryQuery` (`npm view <RAUF_PIN> version`
53
54
  * via node:child_process). Tests inject a stub so no real network call is made.
54
55
  */
55
56
  readonly query?: RegistryQuery;
@@ -61,7 +62,7 @@ export interface PreflightRaufOpts {
61
62
  * - `opts.skip` (the `--skip-rauf` flag) ⇒ return `ok({ raufPin: null })` immediately, with NO
62
63
  * network call.
63
64
  * - otherwise ⇒ run a READ-ONLY registry resolvability check on `RAUF_PIN` (default query:
64
- * `npm view rauf@<pin> version`). No install, no global-npm mutation, no execution of rauf.
65
+ * `npm view <RAUF_PIN> version`). No install, no global-npm mutation, no execution of rauf.
65
66
  * · resolvable ⇒ return `ok({ raufPin: RAUF_PIN })` — the value the manifest records.
66
67
  * · unresolvable ⇒ return `err(<RAUF_UNRESOLVABLE>)` carrying the FIXED message (§6).
67
68
  *
package/dist/rauf.js CHANGED
@@ -18,14 +18,15 @@ import { err, ok } from "./types.js";
18
18
  * downstream `forge-rauf-loop-default` read the same value, and recorded into each manifest
19
19
  * as `InstallManifest.raufPin` (05-manifest-and-uninstall.md).
20
20
  *
21
- * Shape: `<name>@<version>` — UNSCOPED `rauf`. Advanced on each feature-forge release to a new
22
- * known-compatible rauf (REQ-RAUF-03). The current rauf version is 0.6.0.
21
+ * Shape: `<name>@<version>` — the SCOPED package `@garygentry/rauf` (the unscoped `rauf` name is
22
+ * blocked by npm's similarity filter). Advanced on each feature-forge release to a new
23
+ * known-compatible rauf (REQ-RAUF-03). The current rauf version is 0.7.0.
23
24
  *
24
- * Correctable config (OQ-C): the FINAL published coordinate is confirmed by `packaging-docs-ci`
25
- * when rauf's publish path is stood up. Until then this resolves to a package that does not yet
26
- * exist on npm (IR-2), so the preflight WILL fail — the known, designed failure mode, not a bug.
25
+ * rauf is now PUBLISHED (rauf#28): `@garygentry/rauf@0.7.0` resolves from the npm registry, so the
26
+ * preflight below passes by default. (Historically this pin pointed at an unpublished package and
27
+ * the preflight was a designed-to-fail check see the `--skip-rauf` escape hatch.)
27
28
  */
28
- export const RAUF_PIN = "rauf@0.6.0";
29
+ export const RAUF_PIN = "@garygentry/rauf@0.7.0";
29
30
  /**
30
31
  * Resolvability preflight for the pinned default loop runner (D1; REQ-RAUF-01/02/03, OQ-1).
31
32
  *
@@ -33,7 +34,7 @@ export const RAUF_PIN = "rauf@0.6.0";
33
34
  * - `opts.skip` (the `--skip-rauf` flag) ⇒ return `ok({ raufPin: null })` immediately, with NO
34
35
  * network call.
35
36
  * - otherwise ⇒ run a READ-ONLY registry resolvability check on `RAUF_PIN` (default query:
36
- * `npm view rauf@<pin> version`). No install, no global-npm mutation, no execution of rauf.
37
+ * `npm view <RAUF_PIN> version`). No install, no global-npm mutation, no execution of rauf.
37
38
  * · resolvable ⇒ return `ok({ raufPin: RAUF_PIN })` — the value the manifest records.
38
39
  * · unresolvable ⇒ return `err(<RAUF_UNRESOLVABLE>)` carrying the FIXED message (§6).
39
40
  *
@@ -108,11 +109,13 @@ function raufUnresolvableError() {
108
109
  message: "pinned default loop runner `" +
109
110
  RAUF_PIN +
110
111
  "` is not resolvable from the npm registry. Network is required at " +
111
- "install; if rauf is not yet published this is the known cross-repo " +
112
- "prerequisite (see packaging-docs-ci). Skills were still installed; " +
113
- "the default loop will be unavailable until rauf publishes.",
112
+ "install; this usually means no network access or a registry that cannot " +
113
+ "see the pin. Skills were still installed; the default loop will be " +
114
+ "unavailable until the pin resolves.",
114
115
  remedy: "Ensure network access and that `" +
115
116
  RAUF_PIN +
116
- "` is published, or re-run with `--skip-rauf` to defer the default loop.",
117
+ "` is resolvable (`npm view " +
118
+ RAUF_PIN +
119
+ " version`), or re-run with `--skip-rauf` to defer the default loop.",
117
120
  };
118
121
  }
package/dist/types.d.ts CHANGED
@@ -124,7 +124,7 @@ export interface InstallManifest {
124
124
  readonly featureForgeVersion: string | null;
125
125
  /** SHA-256 over the source bundle's canonical (sorted-path) file set — drift anchor (OQ-4, spec 03). */
126
126
  readonly sourceHash: string;
127
- /** Pinned rauf coordinate recorded at install, e.g. "rauf@0.6.0"; `null` if `--skip-rauf` (spec 06). */
127
+ /** Pinned rauf coordinate recorded at install, e.g. "@garygentry/rauf@0.7.0"; `null` if `--skip-rauf` (spec 06). */
128
128
  readonly raufPin: string | null;
129
129
  /** ISO-8601 timestamps. */
130
130
  readonly installedAt: string;
package/package.json CHANGED
@@ -1,22 +1,34 @@
1
1
  {
2
2
  "name": "@garygentry/feature-forge",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Cross-agent installer for the feature-forge skill suite — installs the canonical forge pipeline into Claude, Codex, Copilot, Cursor, or Gemini.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
- "bin": { "feature-forge": "dist/cli.js" },
7
+ "bin": {
8
+ "feature-forge": "dist/cli.js"
9
+ },
8
10
  "exports": {
9
- ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" }
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "adapters"
19
+ ],
20
+ "engines": {
21
+ "node": ">=18"
10
22
  },
11
- "files": ["dist", "adapters"],
12
- "engines": { "node": ">=18" },
13
23
  "repository": {
14
24
  "type": "git",
15
25
  "url": "git+https://github.com/garygentry/feature-forge.git",
16
26
  "directory": "installer"
17
27
  },
18
28
  "homepage": "https://github.com/garygentry/feature-forge#readme",
19
- "bugs": { "url": "https://github.com/garygentry/feature-forge/issues" },
29
+ "bugs": {
30
+ "url": "https://github.com/garygentry/feature-forge/issues"
31
+ },
20
32
  "keywords": [
21
33
  "feature-forge",
22
34
  "cli",
@@ -28,7 +40,9 @@
28
40
  "cursor",
29
41
  "gemini"
30
42
  ],
31
- "publishConfig": { "access": "public" },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
32
46
  "scripts": {
33
47
  "build": "tsc -p tsconfig.json",
34
48
  "test": "node --test",