@gobing-ai/spur 0.3.35 → 0.3.36

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.
@@ -0,0 +1,56 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>ai.gobing.spur.history.daily</string>
7
+
8
+ <!-- ── Program: run the nightly history pipeline (task 0470+) ──────────── -->
9
+ <!-- Replace SPUR_BIN with the absolute path to your `spur` binary -->
10
+ <!-- (e.g. /opt/homebrew/bin/spur or the bun-linked monorepo CLI). -->
11
+ <!-- Replace PROJECT_DIR with the absolute path to your Spur project root. -->
12
+ <key>ProgramArguments</key>
13
+ <array>
14
+ <string>SPUR_BIN</string>
15
+ <string>history</string>
16
+ <string>daily</string>
17
+ <string>--json</string>
18
+ </array>
19
+
20
+ <!-- Working directory: the Spur project root. The daily command resolves -->
21
+ <!-- .spur/reports, .spur/logs, and the SQLite ledger relative to this. -->
22
+ <key>WorkingDirectory</key>
23
+ <string>PROJECT_DIR</string>
24
+
25
+ <!-- ── Schedule: daily wall-clock trigger (R3) ─────────────────────────── -->
26
+ <!-- 02:00 local time — picks a low-activity hour. Adjust Hour to taste. -->
27
+ <!-- launchd survives reboot and runs missed CalendarInterval jobs at the -->
28
+ <!-- next login, so a laptop closed overnight self-heals. -->
29
+ <key>StartCalendarInterval</key>
30
+ <dict>
31
+ <key>Hour</key>
32
+ <integer>2</integer>
33
+ <key>Minute</key>
34
+ <integer>0</integer>
35
+ </dict>
36
+
37
+ <!-- ── Log capture (R4): failures before Spur's own logging initializes ── -->
38
+ <!-- are still written here. launchd owns these file handles from the first -->
39
+ <!-- byte — there is no window where output is lost. -->
40
+ <key>StandardOutPath</key>
41
+ <string>PROJECT_DIR/.spur/logs/history-daily.out</string>
42
+ <key>StandardErrorPath</key>
43
+ <string>PROJECT_DIR/.spur/logs/history-daily.err</string>
44
+
45
+ <!-- RunAtLoad=false: do NOT fire every time the agent loads (boot/login). -->
46
+ <!-- StartCalendarInterval already re-fires a missed slot when the machine -->
47
+ <!-- wakes, so RunAtLoad would only cause duplicate runs. -->
48
+
49
+ <!-- If the process exits non-zero, do NOT auto-restart — the daily command -->
50
+ <!-- has its own retry semantics (checkpoint resume), and a tight retry loop -->
51
+ <!-- would mask a configuration error. The operator checks the four detection -->
52
+ <!-- layers (R5) instead. -->
53
+ <key>KeepAlive</key>
54
+ <false/>
55
+ </dict>
56
+ </plist>
@@ -60,6 +60,7 @@ rules:
60
60
  - "packages/app/src/services/token-ledger-service.ts" # FD byte-window log tailing
61
61
  - "packages/app/src/services/token-ledger-watcher.ts" # node:fs watch() live watcher
62
62
  - "packages/app/src/services/project-registry.ts" # atomic projects.json persistence
63
+ - "packages/app/src/services/history-service.ts" # versioned analyze artifact + bounded-errors sidecar + latest.json symlink pointer (task 0474); ts-runtime FileSystem seam has no symlink, so the pointer uses node:fs directly (mirrors project-registry.ts persistence exemption)
63
64
  - "packages/app/src/observability/workflow-run-log-sink.ts" # sync FD append for mid-run tail-able all-in-one run log (task 0426 / feature D2); append() is sync from the observability bus
64
65
  - "apps/cli/src/commands/workflow.ts" # FD byte-window tail of the mid-run run log for `workflow trace --follow` streaming (task 0428 / feature D2); readSync at offset over the observability sink's FDs
65
66
  - "apps/web/src/modules/discover.ts" # Vite/Astro module scanner fallback under bun test
@@ -82,7 +82,7 @@ vars:
82
82
  # and the fixall slash input all use this same var so the command stays single-sourced.
83
83
  # TRUSTED CONFIG ONLY — this string is executed via `sh -c` (see test/test-recheck). Never
84
84
  # interpolate untrusted operator/LLM input into qualityGateCmd (task 0436 SECUA residual).
85
- qualityGateCmd: "bun run autofix && bun run spur-check"
85
+ qualityGateCmd: "bun run format && bun run spur-check"
86
86
  # Max /sp:dev-fixall attempts after a red quality-gate probe/recheck (bounded; no thrash).
87
87
  # Attempt counter: .spur/run/<wbs>-test-fix-attempt. Default 2 = two fixall hops before failed.
88
88
  qualityGateMaxFixAttempts: "2"
@@ -290,8 +290,10 @@ states:
290
290
  - id: verify
291
291
  description: >
292
292
  Functional verification (BDD + traceability) via /sp:dev-verify. The agent's
293
- captured answer is written to `.spur/run/<wbs>-verify-answer.txt`; a deterministic
294
- shell step then derives the verdict and writes the gate artifact
293
+ captured answer is written to `.spur/run/<wbs>-verify-answer.txt` and MUST follow
294
+ the answer-file schema contract (explicit `Verdict: PASS|PARTIAL|FAIL` line plus
295
+ `| Req | Status | Evidence |` and `| AC | Status | Evidence Type | Evidence |` tables);
296
+ a deterministic shell step then derives the verdict and writes the gate artifact
295
297
  `.spur/run/<wbs>-verdict.json` (so the completion gate reads a real verdict, not
296
298
  agent discretion — R9). The verdict is PASS only if the agent both reported PASS
297
299
  AND `spur task check` passes; otherwise FAIL.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.35",
3
+ "version": "0.3.36",
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",
@@ -50,14 +50,14 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@commander-js/extra-typings": "^14.0.0",
53
- "@gobing-ai/ts-db": "^0.4.22",
54
- "@gobing-ai/ts-ai-runner": "^0.4.22",
55
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.22",
56
- "@gobing-ai/ts-infra": "^0.4.22",
57
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.22",
58
- "@gobing-ai/ts-rule-engine": "^0.4.22",
59
- "@gobing-ai/ts-runtime": "^0.4.22",
60
- "@gobing-ai/ts-utils": "^0.4.22",
53
+ "@gobing-ai/ts-db": "^0.4.23",
54
+ "@gobing-ai/ts-ai-runner": "^0.4.23",
55
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.23",
56
+ "@gobing-ai/ts-infra": "^0.4.23",
57
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.23",
58
+ "@gobing-ai/ts-rule-engine": "^0.4.23",
59
+ "@gobing-ai/ts-runtime": "^0.4.23",
60
+ "@gobing-ai/ts-utils": "^0.4.23",
61
61
  "@types/bun": "1.3.14",
62
62
  "@types/figlet": "^1.7.0",
63
63
  "@types/node-notifier": "8.0.5",