@gobing-ai/spur 0.3.7 → 0.3.9
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 +18 -2
- package/{spur-cli/config → config}/rules/boundary/sp-runtime-path.yaml +5 -0
- package/package.json +4 -3
- package/spur.js +30 -5
- package/web/_astro/BoardApp.Bcfvp2GH.js +1 -0
- package/web/_astro/BoardApp.DjpO2XHn.js +178 -0
- package/web/_astro/BoardApp.t7x-dYDo.css +1 -0
- package/web/_astro/TaskDetail.DilpuD7R.js +1 -0
- package/web/_astro/arc.KcqIior8.js +1 -0
- package/web/_astro/architectureDiagram-3BPJPVTR.BTFU70BY.js +36 -0
- package/web/_astro/blockDiagram-GPEHLZMM.apx49Oy9.js +132 -0
- package/web/_astro/c4Diagram-AAUBKEIU.BM-J4juX.js +10 -0
- package/web/_astro/channel.vSp82e1U.js +1 -0
- package/web/_astro/chunk-2J33WTMH.K6z7IYZU.js +1 -0
- package/web/_astro/chunk-4BX2VUAB.BDYhxKa0.js +1 -0
- package/web/_astro/chunk-55IACEB6.BnNOxqnI.js +1 -0
- package/web/_astro/chunk-727SXJPM.DNeg6N7v.js +206 -0
- package/web/_astro/chunk-AQP2D5EJ.BjILBkba.js +231 -0
- package/web/_astro/chunk-FMBD7UC4.DQ5UvvsV.js +15 -0
- package/web/_astro/chunk-ND2GUHAM.Yn1OvRJs.js +1 -0
- package/web/_astro/chunk-QZHKN3VN.UErqHgqw.js +1 -0
- package/web/_astro/classDiagram-4FO5ZUOK.BmjVF7iZ.js +1 -0
- package/web/_astro/classDiagram-v2-Q7XG4LA2.BmjVF7iZ.js +1 -0
- package/web/_astro/client.CdFpTatq.js +9 -0
- package/web/_astro/cose-bilkent-S5V4N54A.iKBxnkbb.js +1 -0
- package/web/_astro/cytoscape.esm.D3_iZ_3b.js +321 -0
- package/web/_astro/dagre-BM42HDAG.OwnCCrs6.js +4 -0
- package/web/_astro/defaultLocale.CrowFXzY.js +1 -0
- package/web/_astro/diagram-2AECGRRQ.DCdcffxE.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.Ai-LvmVW.js +10 -0
- package/web/_astro/diagram-KO2AKTUF.B6e21QDN.js +3 -0
- package/web/_astro/diagram-LMA3HP47.oPfqy1fq.js +24 -0
- package/web/_astro/diagram-OG6HWLK6.Dh5QRDCE.js +24 -0
- package/web/_astro/erDiagram-TEJ5UH35.DpBiOcO3.js +85 -0
- package/web/_astro/flowDiagram-I6XJVG4X.NbMxFlVk.js +162 -0
- package/web/_astro/ganttDiagram-6RSMTGT7.JgZ3fDME.js +292 -0
- package/web/_astro/gitGraphDiagram-PVQCEYII.oMjFeZRt.js +106 -0
- package/web/_astro/graph.D2o_JWn5.js +1 -0
- package/web/_astro/index.A0eX93qW.js +1 -0
- package/web/_astro/index.CA3GTZM6.css +1 -0
- package/web/_astro/infoDiagram-5YYISTIA.kaio3YzK.js +2 -0
- package/web/_astro/init.Gi6I4Gst.js +1 -0
- package/web/_astro/ishikawaDiagram-YF4QCWOH.CXQfMyeF.js +70 -0
- package/web/_astro/journeyDiagram-JHISSGLW.AvNKMzx6.js +139 -0
- package/web/_astro/kanban-definition-UN3LZRKU.kv3cZGdE.js +89 -0
- package/web/_astro/katex.HP8lGamR.js +257 -0
- package/web/_astro/layout.DNLMvjEt.js +1 -0
- package/web/_astro/linear.CfLoHWjz.js +1 -0
- package/web/_astro/mermaid.core.BSV8pBn-.js +301 -0
- package/web/_astro/mindmap-definition-RKZ34NQL.CbL_3b32.js +96 -0
- package/web/_astro/ordinal.BYWQX77i.js +1 -0
- package/web/_astro/pieDiagram-4H26LBE5.5BXdOLRb.js +30 -0
- package/web/_astro/quadrantDiagram-W4KKPZXB.krXYbhlh.js +7 -0
- package/web/_astro/requirementDiagram-4Y6WPE33.COO4LapZ.js +84 -0
- package/web/_astro/sankeyDiagram-5OEKKPKP.BvL0Jbdx.js +40 -0
- package/web/_astro/sequenceDiagram-3UESZ5HK.Dk7Tu15E.js +162 -0
- package/web/_astro/stateDiagram-AJRCARHV.Cqh_KmEW.js +1 -0
- package/web/_astro/stateDiagram-v2-BHNVJYJU.WapPgDCy.js +1 -0
- package/web/_astro/timeline-definition-PNZ67QCA.CEVdiX0n.js +120 -0
- package/web/_astro/vennDiagram-CIIHVFJN.Cd9A63eF.js +34 -0
- package/web/_astro/wardley-L42UT6IY.DEiaHiIT.js +161 -0
- package/web/_astro/wardleyDiagram-YWT4CUSO.B7nGP61E.js +78 -0
- package/web/_astro/xychartDiagram-2RQKCTM6.Bq8CHmxC.js +7 -0
- package/web/favicon.svg +4 -0
- package/web/index.html +2 -0
- /package/{spur-cli/config → config}/config.example.yaml +0 -0
- /package/{spur-cli/config → config}/plugins/.gitkeep +0 -0
- /package/{spur-cli/config → config}/rules/README.md +0 -0
- /package/{spur-cli/config → config}/rules/boundary/config-loading-ownership.yaml +0 -0
- /package/{spur-cli/config → config}/rules/boundary/dao-boundary.yaml +0 -0
- /package/{spur-cli/config → config}/rules/boundary/planning-folder-hardcode.yaml +0 -0
- /package/{spur-cli/config → config}/rules/boundary/sp-no-vendor-refs.yaml +0 -0
- /package/{spur-cli/config → config}/rules/migration/rg-dialect.yaml +0 -0
- /package/{spur-cli/config → config}/rules/quality/coverage-gate.yaml +0 -0
- /package/{spur-cli/config → config}/rules/quality/tsdoc-exports.yaml +0 -0
- /package/{spur-cli/config → config}/rules/recommended-post-check.yaml +0 -0
- /package/{spur-cli/config → config}/rules/recommended-pre-check.yaml +0 -0
- /package/{spur-cli/config → config}/rules/rg-migration.yaml +0 -0
- /package/{spur-cli/config → config}/rules/strict/http-boundaries.yaml +0 -0
- /package/{spur-cli/config → config}/rules/strict/rule-files-structural.yaml +0 -0
- /package/{spur-cli/config → config}/rules/strict/runtime-boundaries.yaml +0 -0
- /package/{spur-cli/config → config}/rules/strict-check.yaml +0 -0
- /package/{spur-cli/config → config}/rules/structure/protected-files.yaml +0 -0
- /package/{spur-cli/config → config}/rules/structure/test-focus-skip.yaml +0 -0
- /package/{spur-cli/config → config}/rules/structure/test-location.yaml +0 -0
- /package/{spur-cli/config → config}/rules/surface/check-cli-surface.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/bun-tooling.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/guarded-happy-dom-register.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/happy-dom-teardown.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/no-biome-suppressions.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/no-debugger.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/no-leaky-module-mocks.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/no-module-scope-import-calls.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -0
- /package/{spur-cli/config → config}/rules/typescript/output-boundaries.yaml +0 -0
- /package/{spur-cli/config → config}/rules/ui/ui-import-boundary.yaml +0 -0
- /package/{spur-cli/config → config}/tasks/section-matrix.yaml +0 -0
- /package/{spur-cli/config → config}/templates/AGENTS.md +0 -0
- /package/{spur-cli/config → config}/templates/bdd/checklist.md +0 -0
- /package/{spur-cli/config → config}/templates/bdd/gherkin.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/00_ADR.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/01_PRD.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/02_ROADMAP.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/03_ARCHITECTURE.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/04_DESIGN.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/05_FEATURES.md +0 -0
- /package/{spur-cli/config → config}/templates/docs/99_PROJECT_CONSTITUTION.md +0 -0
- /package/{spur-cli/config → config}/templates/feature/default.md +0 -0
- /package/{spur-cli/config → config}/templates/task/brainstorm.md +0 -0
- /package/{spur-cli/config → config}/templates/task/feature-impl.md +0 -0
- /package/{spur-cli/config → config}/templates/task/issue.md +0 -0
- /package/{spur-cli/config → config}/templates/task/meta.md +0 -0
- /package/{spur-cli/config → config}/templates/task/review.md +0 -0
- /package/{spur-cli/config → config}/templates/task/standard.md +0 -0
- /package/{spur-cli/config → config}/workflows/basic.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/docs-pipeline.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/feature-dev.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/feature-lifecycle.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/idea-pipeline.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/planning-pipeline.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/task-lifecycle.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/task-pipeline.yaml +0 -0
- /package/{spur-cli/config → config}/workflows/wrapup-pipeline.yaml +0 -0
package/README.md
CHANGED
|
@@ -45,10 +45,25 @@ If `~/.local/bin` isn't already on your `PATH`, add it (e.g. `export PATH="$HOME
|
|
|
45
45
|
in your shell profile). Supported targets: `darwin-arm64`, `darwin-x64`, `linux-arm64`, `linux-x64`.
|
|
46
46
|
Windows: use the Bun path under WSL.
|
|
47
47
|
|
|
48
|
+
### Package layout (what ships)
|
|
49
|
+
|
|
50
|
+
The published tarball is a self-contained Bun bundle plus static assets:
|
|
51
|
+
|
|
52
|
+
| Path | Purpose |
|
|
53
|
+
|------|---------|
|
|
54
|
+
| `spur.js` | CLI entry (`bin.spur`) |
|
|
55
|
+
| `config/` | Default rules, workflows, tasks, templates, plugins (ADR-015 SSOT) |
|
|
56
|
+
| `web/` | Spur Board SPA served by `spur serve` |
|
|
57
|
+
| `schemas/` | JSON Schema for editor/CI validation |
|
|
58
|
+
|
|
59
|
+
`spur init` copies the full `config/` tree into the project `.spur/` directory (and seeds
|
|
60
|
+
`~/.config/spur/` globally on first run). `spur serve` resolves board assets from package `web/`.
|
|
61
|
+
|
|
48
62
|
### First run
|
|
49
63
|
|
|
50
64
|
```bash
|
|
51
|
-
spur init #
|
|
65
|
+
spur init # scaffold .spur/ from bundled config/ + seed ~/.config/spur/ — idempotent, never clobbers
|
|
66
|
+
spur serve # local board at http://localhost:3000/board (uses package web/)
|
|
52
67
|
```
|
|
53
68
|
|
|
54
69
|
The standalone installer runs `spur init` for you; the Bun install does it on your first `spur init`.
|
|
@@ -57,7 +72,8 @@ The standalone installer runs `spur init` for you; the Bun install does it on yo
|
|
|
57
72
|
|
|
58
73
|
```bash
|
|
59
74
|
spur init # scaffold .spur/ + seed global rules
|
|
60
|
-
spur
|
|
75
|
+
spur serve --port 5678 # start API + Spur Board
|
|
76
|
+
spur rule run --preset recommended-pre-check # evaluate constraint rules
|
|
61
77
|
spur workflow run <workflow.yaml> # run an FSM workflow
|
|
62
78
|
spur agent run "<prompt>" --agent auto # execute a prompt via a coding agent
|
|
63
79
|
spur agent doctor # check agent readiness
|
|
@@ -17,6 +17,11 @@ include:
|
|
|
17
17
|
exclude:
|
|
18
18
|
- "**/node_modules/**"
|
|
19
19
|
- "**/dist/**"
|
|
20
|
+
# Package build artifacts: `build:bundle` copies repo-root config/ → apps/cli/config/
|
|
21
|
+
# (and legacy spur-cli/config/). Those trees are the ADR-015 SSOT payload itself and
|
|
22
|
+
# legitimately contain `config/...` documentation / self-references — not runtime paths.
|
|
23
|
+
- "apps/cli/config/**"
|
|
24
|
+
- "apps/cli/spur-cli/**"
|
|
20
25
|
rules:
|
|
21
26
|
- id: sp-runtime-path
|
|
22
27
|
description: >
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.9",
|
|
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",
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
30
|
"spur.js",
|
|
31
|
-
"
|
|
31
|
+
"config",
|
|
32
32
|
"schemas",
|
|
33
|
+
"web",
|
|
33
34
|
"README.md"
|
|
34
35
|
],
|
|
35
36
|
"engines": {
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
"dev": "bun run src/index.ts",
|
|
43
44
|
"build": "bun run ../../scripts/spur-dev.ts build-cli",
|
|
44
45
|
"build:binaries": "bun run ../../scripts/spur-dev.ts build-binaries",
|
|
45
|
-
"build:bundle": "bun build src/index.ts --target=bun --outfile spur.js && bun run ../../scripts/spur-dev.ts bundle-config
|
|
46
|
+
"build:bundle": "bun run ../../scripts/spur-dev.ts bundle-web && bun build src/index.ts --target=bun --outfile spur.js && bun run ../../scripts/spur-dev.ts bundle-config config",
|
|
46
47
|
"test": "bun test tests --coverage --coverage-dir=../../.coverage --pass-with-no-tests",
|
|
47
48
|
"typecheck": "tsc --noEmit",
|
|
48
49
|
"prepublishOnly": "bun run build:bundle"
|
package/spur.js
CHANGED
|
@@ -38376,9 +38376,16 @@ function walk(dir, relPrefix, filter = /\.(ya?ml|json)$/i) {
|
|
|
38376
38376
|
}
|
|
38377
38377
|
return acc;
|
|
38378
38378
|
}
|
|
38379
|
-
|
|
38379
|
+
function listBundledProjectSeedFiles() {
|
|
38380
|
+
const root = bundledConfigRoot();
|
|
38381
|
+
if (root === null)
|
|
38382
|
+
return [];
|
|
38383
|
+
return walk(root, "", PROJECT_SEED_FILTER).filter((rel) => rel !== BUNDLED_CONFIG_EXAMPLE).sort();
|
|
38384
|
+
}
|
|
38385
|
+
var BUNDLED_CONFIG_DIRS, cachedRoot, PROJECT_SEED_FILTER, BUNDLED_CONFIG_EXAMPLE = "config.example.yaml";
|
|
38380
38386
|
var init_bundled_config = __esm(() => {
|
|
38381
38387
|
BUNDLED_CONFIG_DIRS = ["config", "spur-cli/config"];
|
|
38388
|
+
PROJECT_SEED_FILTER = /\.(ya?ml|json|md|gitkeep)$/i;
|
|
38382
38389
|
});
|
|
38383
38390
|
|
|
38384
38391
|
// ../../packages/config/src/template-renderer.ts
|
|
@@ -71770,7 +71777,7 @@ import { join as join14, resolve as resolve5 } from "path";
|
|
|
71770
71777
|
var CLI_CONFIG = {
|
|
71771
71778
|
binaryName: "spur",
|
|
71772
71779
|
binaryLabel: "spur",
|
|
71773
|
-
binaryVersion: "0.3.
|
|
71780
|
+
binaryVersion: "0.3.9",
|
|
71774
71781
|
configDir: ".spur",
|
|
71775
71782
|
configFile: ".spur/config.yaml",
|
|
71776
71783
|
databaseFile: ".spur/spur.db"
|
|
@@ -71967,6 +71974,14 @@ ${contextEntry}
|
|
|
71967
71974
|
if (!minimal) {
|
|
71968
71975
|
const configRoot = bundledConfigRoot();
|
|
71969
71976
|
if (configRoot !== null) {
|
|
71977
|
+
for (const relPath of listBundledProjectSeedFiles()) {
|
|
71978
|
+
const sourcePath = join14(configRoot, relPath);
|
|
71979
|
+
if (!await context4.fs.exists(sourcePath))
|
|
71980
|
+
continue;
|
|
71981
|
+
const targetPath = join14(context4.cwd, CLI_CONFIG.configDir, relPath);
|
|
71982
|
+
await context4.fs.ensureDir(join14(targetPath, ".."));
|
|
71983
|
+
await writeIfNew(context4, targetPath, await context4.fs.readFile(sourcePath), force, result);
|
|
71984
|
+
}
|
|
71970
71985
|
for (const entry of SCAFFOLD_MANIFEST) {
|
|
71971
71986
|
const sourcePath = join14(configRoot, entry.source);
|
|
71972
71987
|
if (!await context4.fs.exists(sourcePath))
|
|
@@ -81146,6 +81161,8 @@ async function runTaskActionJob(ctx, env, payload, createAgentService = createTa
|
|
|
81146
81161
|
async function resolveWebDistPath(configuredPath) {
|
|
81147
81162
|
const candidates = configuredPath && configuredPath.trim() !== "" ? [isAbsolute3(configuredPath) ? configuredPath : join18(process.cwd(), configuredPath)] : [
|
|
81148
81163
|
join18(process.cwd(), "dist/web"),
|
|
81164
|
+
join18(import.meta.dir, "web"),
|
|
81165
|
+
join18(dirname12(process.execPath), "web"),
|
|
81149
81166
|
join18(dirname12(process.execPath), "../web"),
|
|
81150
81167
|
join18(import.meta.dir, "../../../dist/web")
|
|
81151
81168
|
];
|
|
@@ -81172,12 +81189,16 @@ async function startServer(options, deps = defaultDeps) {
|
|
|
81172
81189
|
if (bootConfig.scheduler.enabled) {
|
|
81173
81190
|
scheduler3 = await deps.createScheduler();
|
|
81174
81191
|
}
|
|
81192
|
+
const webDistPath = await resolveWebDistPath(options.webDistPath);
|
|
81193
|
+
if (!webDistPath) {
|
|
81194
|
+
appRt.logger.warn("Board UI static assets not found \u2014 /board will return 404. " + "Reinstall a package that includes the web board, or set server.webDistPath to a built dist/web directory (index.html).");
|
|
81195
|
+
}
|
|
81175
81196
|
const ctx = deps.createServerContext(appRt, {
|
|
81176
81197
|
cwd: process.cwd(),
|
|
81177
81198
|
fs: fs3,
|
|
81178
81199
|
dbUrl: options.dbUrl,
|
|
81179
81200
|
folders: await resolvePlanningFolders(fs3),
|
|
81180
|
-
webDistPath
|
|
81201
|
+
webDistPath,
|
|
81181
81202
|
jobQueueEnabled: bootConfig.jobqueue.enabled,
|
|
81182
81203
|
scheduler: scheduler3,
|
|
81183
81204
|
teamAutostart: bootConfig.teamAutostart,
|
|
@@ -81255,9 +81276,13 @@ async function startServer(options, deps = defaultDeps) {
|
|
|
81255
81276
|
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
81256
81277
|
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
81257
81278
|
const url2 = `http://${options.host}:${options.port}`;
|
|
81258
|
-
appRt.logger.info("Server started", {
|
|
81279
|
+
appRt.logger.info("Server started", {
|
|
81280
|
+
port: options.port,
|
|
81281
|
+
host: options.host,
|
|
81282
|
+
board: webDistPath ? `${url2}/board` : null
|
|
81283
|
+
});
|
|
81259
81284
|
if (options.openBrowser) {
|
|
81260
|
-
await deps.openUrl(`${url2}/board`);
|
|
81285
|
+
await deps.openUrl(webDistPath ? `${url2}/board` : `${url2}/api/health`);
|
|
81261
81286
|
}
|
|
81262
81287
|
if (options.keepAlive !== false) {
|
|
81263
81288
|
await new Promise(() => {});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as t}from"./BoardApp.DjpO2XHn.js";import"./index.A0eX93qW.js";export{t as default};
|