@agentsfleet/orly 0.5.0 β†’ 0.5.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 CHANGED
@@ -39,9 +39,19 @@ Works with Claude Code, Codex, OpenCode, and Amp.
39
39
  | a coding agent | something has to read the rules | Claude Code, Codex, OpenCode, or Amp |
40
40
  | your own check commands | `orly gate` runs what `.oracle/orly.json` names | whatever your repository already runs |
41
41
 
42
- gstack is not needed to install or run orly. The rules it installs do route the
43
- review stage through `gstack /review`. Without gstack, record the skip in your
44
- Pull Request notes and rerun before merge.
42
+ ### gstack
43
+
44
+ [gstack](https://github.com/garrytan/gstack) is **optional**. orly does not
45
+ require it to install or run.
46
+
47
+ orly's rules route the review stage through `gstack /review` when gstack is
48
+ available. If it is installed, `/review` is detected and runs automatically.
49
+ If not, orly records the skipped review in the Pull Request notes so it can be
50
+ rerun before merge.
51
+
52
+ **Bottom line:** orly works without gstack. Installing
53
+ [gstack](https://github.com/garrytan/gstack) gives you the automated `/review`
54
+ step.
45
55
 
46
56
  ```bash
47
57
  bunx @agentsfleet/orly init
@@ -7,7 +7,7 @@ Every triggered document requires one `πŸ“– DOC READ: <path>` proof-line **per t
7
7
  | Trigger | Read |
8
8
  |---|---|
9
9
  | Always (universal) | `docs/greptile-learnings/RULES.md` β€” at EXECUTE start read the Rule-code gloss legend + the sections named by the spec's "Applicable Rules" list (canonical); the full file belongs to `/review`, not EXECUTE. On sub-task shape change, section-scan (`grep -n "^## "`) and read only newly-touched sections, cited in the proof-line β€” never the full file again. |
10
- | `core/**`, `packs/**`, `schemas/**`, `src/**`, `registry.json`, agent-home instruction links, repository rules synchronization, or governance hooks | `dispatch/edit_rules.md` + `docs/ORLY_ARCHITECTURE.md` β€” canonical sources, profiles, snapshots, refusal boundaries, and evidence. |
10
+ | `core/**`, `packs/**`, `schemas/**`, `src/**`, `registry.json`, agent-home instruction links, repository rules synchronization, or governance hooks | `dispatch/edit_rules.md` + `docs/ORLY_ARCHITECTURE.md` β€” canonical sources, profiles, snapshots, refusal boundaries, and evidence. | <!-- oracle-packs:workflow.governance -->
11
11
  | Lifecycle stage transition (CHORE(open)/PLAN/CHORE(close)/LAND, worktree setup, milestone bootstrap) | `dispatch/lifecycle.md` β€” the entered stage's runbook section only (section-scan; fires on the transition itself, not on an Edit/Write). |
12
12
  | Any source file (cross-cutting authoring) | `dispatch/write_any.md` β€” length, logging, milestone-id, error-registry, UFS, greptile read, legacy-workaround family. |
13
13
  | Spec's "Applicable Rules" | Each rule (canonical). Missing β†’ the cross-cutting codes of `dispatch/write_any.md` are the floor; surface omission. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsfleet/orly",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "description": "Repository-scoped engineering harness: renders agent rules, materialises the gates that enforce them, and proves the PR boundary β€” for any coding agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -0,0 +1,35 @@
1
+ import { afterEach, describe, expect, test } from "bun:test";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+
5
+ import { cleanupTemporaryDirectories, newRepository, ROOT } from "./gates_test_support";
6
+ import { install } from "./install";
7
+ import { RulesModel } from "./model";
8
+
9
+ const SOURCE_EXTENSIONS = ["rs", "ts", "tsx", "js", "jsx", "py", "sh", "sql", "zig", "mdx"];
10
+ const ENGINE_VERSION = "0.5.2";
11
+
12
+ afterEach(cleanupTemporaryDirectories);
13
+
14
+ describe("opt-in pack selection", () => {
15
+ // An opt-in pack may cite a file another opt-in pack owns, and every such
16
+ // citation has to be gated by the pack that provides it. Ungated, the install
17
+ // is refused for skipping rules the repository was never meant to take:
18
+ // `product.agentsfleet` ships the doc-read table, `workflow.governance` ships
19
+ // the governance faΓ§ade that table once named unconditionally.
20
+ test("one opt-in pack installs without dragging in the others", async () => {
21
+ const model = await RulesModel.load(ROOT);
22
+ const repo = newRepository();
23
+ for (const extension of SOURCE_EXTENSIONS) await Bun.write(join(repo, `src/source.${extension}`), "\n");
24
+ await Bun.write(join(repo, ".oracle/orly.json"), JSON.stringify({ schema_version: 1, orly_version: "", packs: ["product.agentsfleet"], commands: {}, managed: [] }));
25
+
26
+ const result = await install(model, { targetRoot: repo, force: false, installHooks: true, orlyVersion: ENGINE_VERSION });
27
+
28
+ expect(result.errors).toEqual([]);
29
+ expect(result.ok).toBe(true);
30
+ expect(result.packs).toContain("product.agentsfleet");
31
+ expect(result.packs).not.toContain("workflow.governance");
32
+ expect(existsSync(join(repo, "docs/EXECUTE_DOC_READS.md"))).toBe(true);
33
+ expect(existsSync(join(repo, "dispatch/edit_rules.md"))).toBe(false);
34
+ });
35
+ });