@gobing-ai/spur 0.3.5 → 0.3.7

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
@@ -1,9 +1,9 @@
1
1
  # @gobing-ai/spur
2
2
 
3
3
  **The `spur` command** — a local-first harness for mainstream coding agents (Claude Code, Codex,
4
- Gemini CLI, Antigravity, pi, OpenCode, OpenClaw). Spur is **not** a coding agent; it wraps the agents
5
- you already have with constraint checking, workflow orchestration, agent health checks, and
6
- conversation-history analytics.
4
+ Gemini CLI, pi, omp, OpenCode, Antigravity, OpenClaw, Hermes, Grok). Spur is **not** a coding agent;
5
+ it wraps the agents you already have with constraint checking, workflow orchestration, agent health
6
+ checks, and conversation-history analytics.
7
7
 
8
8
  ## Install
9
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "scripts": {
42
42
  "dev": "bun run src/index.ts",
43
- "build": "bun build src/index.ts --compile --outfile ../../dist/cli/spur",
43
+ "build": "bun run ../../scripts/spur-dev.ts build-cli",
44
44
  "build:binaries": "bun run ../../scripts/spur-dev.ts build-binaries",
45
45
  "build:bundle": "bun build src/index.ts --target=bun --outfile spur.js && bun run ../../scripts/spur-dev.ts bundle-config spur-cli/config",
46
46
  "test": "bun test tests --coverage --coverage-dir=../../.coverage --pass-with-no-tests",
@@ -49,13 +49,14 @@
49
49
  },
50
50
  "devDependencies": {
51
51
  "@commander-js/extra-typings": "^14.0.0",
52
- "@gobing-ai/ts-ai-runner": "^0.4.4",
53
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.4",
54
- "@gobing-ai/ts-infra": "^0.4.4",
55
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.4",
56
- "@gobing-ai/ts-rule-engine": "^0.4.4",
57
- "@gobing-ai/ts-runtime": "^0.4.4",
58
- "@gobing-ai/ts-utils": "^0.4.4",
52
+ "@gobing-ai/ts-db": "^0.4.8",
53
+ "@gobing-ai/ts-ai-runner": "^0.4.8",
54
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.8",
55
+ "@gobing-ai/ts-infra": "^0.4.8",
56
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.8",
57
+ "@gobing-ai/ts-rule-engine": "^0.4.8",
58
+ "@gobing-ai/ts-runtime": "^0.4.8",
59
+ "@gobing-ai/ts-utils": "^0.4.8",
59
60
  "@types/bun": "1.3.14",
60
61
  "@types/figlet": "^1.7.0",
61
62
  "@types/node-notifier": "8.0.5",
@@ -39,6 +39,9 @@ agent:
39
39
  # `default` is the executor selector for `--agent auto` (resolved as an executor
40
40
  # name first, then a legacy agent name). Keep it simple, or define richer profiles:
41
41
  default: omp
42
+ # Canonical coding-agent ids (ts-ai-runner DISPLAY_ORDER, 0.4.8+):
43
+ # claude, codex, gemini, pi, omp, opencode, antigravity-cli, openclaw, hermes, grok
44
+ # Grok auth: non-empty XAI_API_KEY and/or ~/.grok/auth.json (no CLI auth-status verb).
42
45
  # Named executor profiles: pair a canonical agent with an optional opaque model
43
46
  # override. Referenced by name from `default` and `default-by-phase`.
44
47
  # executors:
@@ -49,12 +52,16 @@ agent:
49
52
  # model: zai//glm-5.2
50
53
  # - name: claude
51
54
  # agent: claude
55
+ # - name: grok
56
+ # agent: grok
57
+ # # model: grok-… # optional; passed as grok -m <model>
52
58
  # Per-phase auto routing — a MAP of dev phase → executor selector. A configured
53
59
  # phase mapping is authoritative: a broken mapping fails fast (unknown executor →
54
60
  # exit 2; unusable agent → exit 1) and does NOT fall back to `default`.
55
61
  # default-by-phase:
56
62
  # dev-run: omp-zai
57
63
  # dev-review: claude
64
+ # # dev-run: grok
58
65
 
59
66
  rules:
60
67
  paths:
@@ -26,6 +26,12 @@ rules:
26
26
  exclude:
27
27
  - "**/node_modules/**"
28
28
  - "**/tests/**"
29
+ # apps/cli/src/index.ts carries a side-effect import of ts-db as a
30
+ # bundler hint for Bun --compile. The import does not use ts-db APIs;
31
+ # it ensures the dynamic import('@gobing-ai/ts-db') calls from within
32
+ # ts-runtime resolve at runtime from the compiled binary's bunfs.
33
+ # Spur-domain still owns all functional ts-db usage.
34
+ - "apps/cli/src/index.ts"
29
35
 
30
36
  - id: drizzle-only-in-domain-schema
31
37
  description: >
@@ -28,12 +28,31 @@ rules:
28
28
 
29
29
  - id: no-globalthis-fetch
30
30
  description: "Avoid globalThis.fetch(...); route HTTP through a client seam when one exists."
31
- severity: warning
31
+ severity: error
32
32
  evaluator:
33
33
  type: rg
34
34
  config:
35
35
  pattern: "globalThis\\.fetch\\("
36
+ include:
37
+ - "apps/**/src/**/*.ts"
38
+ - "packages/**/src/**/*.ts"
39
+ - "apps/**/tests/**/*.ts"
40
+ - "apps/**/tests/**/*.tsx"
41
+ - "packages/**/tests/**/*.ts"
42
+ - "packages/**/tests/**/*.tsx"
36
43
 
44
+ - id: no-globalthis-fetch-mutation
45
+ description: "Avoid mutating globalThis.fetch in tests; use the injectable fetch seam (rpc-client.ts setFetchForTesting / resetFetchForTesting)."
46
+ severity: error
47
+ evaluator:
48
+ type: rg
49
+ config:
50
+ pattern: "globalThis\\.fetch\\s*="
51
+ include:
52
+ - "apps/**/tests/**/*.ts"
53
+ - "apps/**/tests/**/*.tsx"
54
+ - "packages/**/tests/**/*.ts"
55
+ - "packages/**/tests/**/*.tsx"
37
56
  - id: no-xml-http-request
38
57
  description: "Do not use XMLHttpRequest in a Bun/Node codebase."
39
58
  severity: error
@@ -55,6 +55,13 @@ rules:
55
55
  evaluator:
56
56
  type: rg
57
57
  config:
58
- # Match imports from modules with known module-eval side effects.
59
- # Add new patterns here as alternations (|) when new cases are discovered.
60
- pattern: "from ['\"].*task-kanban/useTasks['\"]"
58
+ # Match imports from modules with KNOWN, ACTIVE module-eval side effects.
59
+ # IMPORTANT: this rule is INERT unless a pattern is present. When a new
60
+ # side-effect module is discovered (CI-only ordering failure traced to
61
+ # an import-time call), add its import pattern here as a string. Remove
62
+ # the pattern once the source module is fixed (side effects made lazy).
63
+ #
64
+ # RESOLVED modules (patterns removed after fix — kept as history):
65
+ # - task-kanban/useTasks — fixed 2026-07-08, commit 3937d31
66
+ # (resolveApiUrl/api.task.list converted to lazy dynamic imports)
67
+ pattern: "__no_active_side_effect_modules__"
@@ -0,0 +1,151 @@
1
+ # AGENTS.md
2
+
3
+ Entry point for AI coding agents in this repository. Symlink `CLAUDE.md` / `GEMINI.md` (and
4
+ equivalents) here when the platform expects those names.
5
+
6
+ **Read this first every session.** Lean: harness routing + project facts + where depth lives.
7
+ Does **not** restate skill runbooks or the full `spur` verb catalog.
8
+
9
+ ---
10
+
11
+ ## Project
12
+
13
+ <!-- PROJECT-SPECIFIC: filled by `spur init` (`{project-name}` / `{project-description}`). -->
14
+ **{project-name}** — {project-description}.
15
+
16
+ This project uses **Spur** as its harness: the `spur` CLI for deterministic corpus/ops, and Spur’s
17
+ agent surface (`/sp:dev-*` commands + `sp:*` subagents/skills) for planning, execution, review, and
18
+ docs hygiene. Prefer the harness over ad-hoc process unless the operator overrides for a one-off.
19
+
20
+ ---
21
+
22
+ ## Harness-first contract
23
+
24
+ All product development work goes through the harness by default.
25
+
26
+ ### Harness tool routing
27
+
28
+ | Need | Route to | Avoid |
29
+ |------|----------|--------|
30
+ | Plan a feature (intake → AC → tasks) | `/sp:dev-plan`, `/sp:dev-idea` | Freeform feature files without gates |
31
+ | Drive one task end-to-end | `/sp:dev-run <wbs>` or **`sp:super-coder`** | Implement with no task / no pipeline |
32
+ | Batch or parallel task runs | `/sp:dev-runall`, `/sp:dev-parallel` → **`sp:super-coder`** | Unordered multi-task thrash |
33
+ | Multi-step corpus CLI (tasks/features/rules/workflows) | **`sp:expert-spur`** | Raw Write/Edit on corpus files |
34
+ | Look up `spur` verbs / flags / `--json` | Skill **`sp:spur-cli`** | Inventing flags from memory |
35
+ | Create/edit/list tasks or features | **`spur task` / `spur feature`** (`--section --from-file`) | Direct-writing task/feature corpus files |
36
+ | Verify requirements / AC | `/sp:dev-verify` | Self-reported “done” |
37
+ | Review (SECUA + traceability + architecture) | `/sp:dev-review` or **`sp:super-reviewer`** | Unstructured “LGTM” |
38
+ | Tests / coverage | `/sp:dev-unit` | Untested production paths as done |
39
+ | Constraint gate / rule authoring | **`spur rule`**; `/sp:rule-scan`, `/sp:rule-add`, `/sp:rule-refine` | Skipping `spur rule run` |
40
+ | Workflow author / run | **`spur workflow`**; `/sp:workflow-add`, `/sp:workflow-refine` | Ad-hoc shell as the lifecycle |
41
+ | Docs drift / sync / lessons | Skill **`sp:doc-evolve`** + `docs/99_PROJECT_CONSTITUTION.md` | Patching derived docs over authority |
42
+ | Wrap completed work | `/sp:dev-wrap`, `/sp:dev-wrapall` | Skipping learnings / doc sync |
43
+ | Session index / memory | Skill **`sp:indexed-context`** + `.spur/context/` | Full-tree re-reads every turn |
44
+
45
+ **Non-negotiable (unless operator overrides):**
46
+
47
+ 1. **CLI-gated corpus writes** — `spur task update` / `spur feature update` (etc.). Never direct-write
48
+ task/feature corpus files.
49
+ 2. **Gates before done** — `spur task check` / `spur feature check` / `spur rule run`; pipeline done
50
+ needs a real verify **PASS**.
51
+ 3. **`--json` for machines** — parse CLI with `--json`.
52
+ 4. **Route, don’t invent** — verbs → `sp:spur-cli`; lifecycle → `/sp:dev-*` / `sp:super-coder`;
53
+ multi-noun corpus → `sp:expert-spur`; review → `sp:super-reviewer`; docs process → `sp:doc-evolve`.
54
+
55
+ **Platform fallback:** Platforms without slash commands and/or subagents still use the harness.
56
+ Equivalent path: skills `sp:spur-dev`, `sp:spur-cli`, `sp:code-verification` (and related) plus the
57
+ `spur` CLI. Do not invent a parallel process because `/sp:dev-*` is unavailable.
58
+
59
+ Invoke CLI: `spur <noun> <verb> … --json` (or the project’s documented dev entry).
60
+
61
+ ---
62
+
63
+ ## Documentation
64
+
65
+ **Process SSOT:** `docs/99_PROJECT_CONSTITUTION.md`. Operate with **`sp:doc-evolve`**
66
+ (`drift-audit`, `sync-check`, `contract-verify`, `lesson-append`).
67
+
68
+ **Conflict rule:** lower number wins on content (`00` decisions, `01` scope, `99` process). Fix
69
+ authority first, then derived docs, then this file.
70
+
71
+ ### Doc map (constitution §4.1)
72
+
73
+ | Doc | Owns | Authority | When |
74
+ |------|------|-----------|------|
75
+ | `docs/00_ADR.md` | **WHY** | Authoritative (content) | Structural change; dated entry before diverging |
76
+ | `docs/01_PRD.md` | **WHAT** | Authoritative on scope | New feature/command |
77
+ | `docs/02_ROADMAP.md` | **WHEN** | Derived | Phase placement |
78
+ | `docs/03_ARCHITECTURE.md` | **HOW** | Derived (ADR wins) | Cross-module / seam / schema |
79
+ | `docs/04_DESIGN.md` | **SURFACE** (+ `docs/design/`) | Derived | Same commit as surface code (T3) |
80
+ | `docs/05_FEATURES.md` | **STATUS** (+ `docs/features/`) | Derived | Feature status (T4) |
81
+ | `docs/99_PROJECT_CONSTITUTION.md` | **PROCESS** | Authoritative on process | Before editing numbered docs |
82
+ | `AGENTS.md` (this file) | **ENTRY** | Derived | First every session |
83
+
84
+ **Routing:** decision → `00`; scope → `01`; mechanism → `03`; surface → `04`; phase → `02`;
85
+ feature status → `05`. Working layers §4.2; audits §7; satellites §4.5.
86
+
87
+ ---
88
+
89
+ ## Stack & layout
90
+
91
+ <!-- PROJECT-SPECIFIC: monorepo layout, package manager, key frameworks. -->
92
+ _(Fill from package manifests / README — or during `sp:doc-evolve` customize.)_
93
+
94
+ ---
95
+
96
+ ## Build & verification
97
+
98
+ <!-- PROJECT-SPECIFIC: lint / test / build commands. -->
99
+ ```bash
100
+ # Fill with this project's lint, test, and build commands.
101
+ ```
102
+
103
+ **Done gate (minimum):** lint + tests clean; only intentional `git status` changes; no
104
+ `--no-verify` / silent suppressions. Harness task done ⇒ real verify **PASS** when the pipeline ran.
105
+
106
+ ---
107
+
108
+ ## Spur CLI surface
109
+
110
+ **Not the verb catalog.** For `task` / `feature` / `rule` / `workflow` flags, exit codes, and
111
+ `--json` shapes → skill **`sp:spur-cli`**. Lifecycle → `/sp:dev-*` / **`sp:super-coder`**.
112
+ Multi-noun corpus campaigns → **`sp:expert-spur`**.
113
+
114
+ ```bash
115
+ spur <noun> <verb> … --json
116
+ spur <noun> --help
117
+ ```
118
+
119
+ **Long-tail:** Additional `/sp:dev-*` commands (handover, gitmsg, fixall, dogfood, reverse, arch,
120
+ …) are indexed in the project plugin README (`plugins/sp/README.md` when present).
121
+
122
+ **Outside spur-cli:** Nouns not fully documented in `sp:spur-cli` (`agent`, `history`, `message`,
123
+ `team`, `status`, `migrate`, `serve`, `init`, …) — use only `spur <noun> --help` and
124
+ `docs/04_DESIGN.md`. Never guess flags.
125
+
126
+ ---
127
+
128
+ ## Conventions & boundaries
129
+
130
+ - Conventional Commits (`feat:`, `fix:`, `docs:`, `chore:`, …); breaking changes in a
131
+ `BREAKING CHANGE:` footer.
132
+ - Never commit secrets or `.env*`.
133
+ - Surgical changes only — no drive-by refactors or speculative abstractions.
134
+ - Surface changes keep `docs/04_DESIGN.md` in the **same commit** (T3); run `sp:doc-evolve`
135
+ sync-check when unsure.
136
+ <!-- PROJECT-SPECIFIC: import aliases, forbidden paths, CI rules. -->
137
+
138
+ ---
139
+
140
+ ## Indexed context
141
+
142
+ Project context under `.spur/context/` (gitignored), via **`sp:indexed-context`**:
143
+
144
+ 1. `anatomy.md` — file one-liners + token estimates
145
+ 2. `learnings.md` — conventions / decisions
146
+ 3. `pitfalls.md` — do-not-repeat
147
+ 4. `buglog.md` — historical bugs
148
+ 5. `memory.md` — session log
149
+ 6. `token-ledger.jsonl` — auto; never hand-edit
150
+
151
+ If `.spur/context/` is absent, continue; do not block.
@@ -12,6 +12,9 @@ updated_at: 1970-01-01T00:00:00.000Z
12
12
 
13
13
  > Authoritative on **decisions**. Lower number wins — this doc overrides all others on decisions.
14
14
  > Each entry is append-only; supersession is by a new dated entry, never by editing an old one.
15
+ > Only real cross-cutting decisions belong here — not implementation notes, not feature status, not
16
+ > how-to guidance. Entries that grow past decision + reason are carrying mechanism that belongs in
17
+ > `03`/`04`; link it instead of inlining it.
15
18
 
16
19
  ## ADR-001 — (example) Adopt this doc structure
17
20
 
@@ -24,4 +27,6 @@ updated_at: 1970-01-01T00:00:00.000Z
24
27
  <!--
25
28
  Add new ADRs here. Copy the entry shape above (Date, Status, Context, Decision, Reason).
26
29
  A decision that reverses a prior ADR adds a new entry that says "supersedes ADR-NNN".
30
+ An Amendment records the decision delta + one-line reason — not the mechanism. Implementation
31
+ paths, detailed semantics, and multi-paragraph rationale belong in 03/04, not in the amendment.
27
32
  -->
@@ -53,7 +53,7 @@ When a change touches one of these, the listed doc MUST be updated in the **same
53
53
 
54
54
  | ID | Trigger | Doc(s) |
55
55
  |----|---------|--------|
56
- | T1 | New cross-cutting decision | `00` first, then `03` mechanism |
56
+ | T1 | New cross-cutting decision (entry = decision + one-line reason; amendment = decision delta only — mechanism goes in `03`/`04`, not the amendment) | `00` first, then `03` mechanism |
57
57
  | T3 | Command/flag/config/schema/DTO added/changed | `04` + `AGENTS.md` |
58
58
  | T4 | Feature ships or changes state | `05` row |
59
59
  | T6 | Scope added / cut / deferred | `01` |