@gobing-ai/spur 0.3.8 → 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.
Files changed (123) hide show
  1. package/README.md +18 -2
  2. package/{spur-cli/config → config}/rules/boundary/sp-runtime-path.yaml +5 -0
  3. package/package.json +4 -3
  4. package/spur.js +30 -5
  5. package/web/_astro/BoardApp.Bcfvp2GH.js +1 -0
  6. package/web/_astro/BoardApp.DjpO2XHn.js +178 -0
  7. package/web/_astro/BoardApp.t7x-dYDo.css +1 -0
  8. package/web/_astro/TaskDetail.DilpuD7R.js +1 -0
  9. package/web/_astro/arc.KcqIior8.js +1 -0
  10. package/web/_astro/architectureDiagram-3BPJPVTR.BTFU70BY.js +36 -0
  11. package/web/_astro/blockDiagram-GPEHLZMM.apx49Oy9.js +132 -0
  12. package/web/_astro/c4Diagram-AAUBKEIU.BM-J4juX.js +10 -0
  13. package/web/_astro/channel.vSp82e1U.js +1 -0
  14. package/web/_astro/chunk-2J33WTMH.K6z7IYZU.js +1 -0
  15. package/web/_astro/chunk-4BX2VUAB.BDYhxKa0.js +1 -0
  16. package/web/_astro/chunk-55IACEB6.BnNOxqnI.js +1 -0
  17. package/web/_astro/chunk-727SXJPM.DNeg6N7v.js +206 -0
  18. package/web/_astro/chunk-AQP2D5EJ.BjILBkba.js +231 -0
  19. package/web/_astro/chunk-FMBD7UC4.DQ5UvvsV.js +15 -0
  20. package/web/_astro/chunk-ND2GUHAM.Yn1OvRJs.js +1 -0
  21. package/web/_astro/chunk-QZHKN3VN.UErqHgqw.js +1 -0
  22. package/web/_astro/classDiagram-4FO5ZUOK.BmjVF7iZ.js +1 -0
  23. package/web/_astro/classDiagram-v2-Q7XG4LA2.BmjVF7iZ.js +1 -0
  24. package/web/_astro/client.CdFpTatq.js +9 -0
  25. package/web/_astro/cose-bilkent-S5V4N54A.iKBxnkbb.js +1 -0
  26. package/web/_astro/cytoscape.esm.D3_iZ_3b.js +321 -0
  27. package/web/_astro/dagre-BM42HDAG.OwnCCrs6.js +4 -0
  28. package/web/_astro/defaultLocale.CrowFXzY.js +1 -0
  29. package/web/_astro/diagram-2AECGRRQ.DCdcffxE.js +43 -0
  30. package/web/_astro/diagram-5GNKFQAL.Ai-LvmVW.js +10 -0
  31. package/web/_astro/diagram-KO2AKTUF.B6e21QDN.js +3 -0
  32. package/web/_astro/diagram-LMA3HP47.oPfqy1fq.js +24 -0
  33. package/web/_astro/diagram-OG6HWLK6.Dh5QRDCE.js +24 -0
  34. package/web/_astro/erDiagram-TEJ5UH35.DpBiOcO3.js +85 -0
  35. package/web/_astro/flowDiagram-I6XJVG4X.NbMxFlVk.js +162 -0
  36. package/web/_astro/ganttDiagram-6RSMTGT7.JgZ3fDME.js +292 -0
  37. package/web/_astro/gitGraphDiagram-PVQCEYII.oMjFeZRt.js +106 -0
  38. package/web/_astro/graph.D2o_JWn5.js +1 -0
  39. package/web/_astro/index.A0eX93qW.js +1 -0
  40. package/web/_astro/index.CA3GTZM6.css +1 -0
  41. package/web/_astro/infoDiagram-5YYISTIA.kaio3YzK.js +2 -0
  42. package/web/_astro/init.Gi6I4Gst.js +1 -0
  43. package/web/_astro/ishikawaDiagram-YF4QCWOH.CXQfMyeF.js +70 -0
  44. package/web/_astro/journeyDiagram-JHISSGLW.AvNKMzx6.js +139 -0
  45. package/web/_astro/kanban-definition-UN3LZRKU.kv3cZGdE.js +89 -0
  46. package/web/_astro/katex.HP8lGamR.js +257 -0
  47. package/web/_astro/layout.DNLMvjEt.js +1 -0
  48. package/web/_astro/linear.CfLoHWjz.js +1 -0
  49. package/web/_astro/mermaid.core.BSV8pBn-.js +301 -0
  50. package/web/_astro/mindmap-definition-RKZ34NQL.CbL_3b32.js +96 -0
  51. package/web/_astro/ordinal.BYWQX77i.js +1 -0
  52. package/web/_astro/pieDiagram-4H26LBE5.5BXdOLRb.js +30 -0
  53. package/web/_astro/quadrantDiagram-W4KKPZXB.krXYbhlh.js +7 -0
  54. package/web/_astro/requirementDiagram-4Y6WPE33.COO4LapZ.js +84 -0
  55. package/web/_astro/sankeyDiagram-5OEKKPKP.BvL0Jbdx.js +40 -0
  56. package/web/_astro/sequenceDiagram-3UESZ5HK.Dk7Tu15E.js +162 -0
  57. package/web/_astro/stateDiagram-AJRCARHV.Cqh_KmEW.js +1 -0
  58. package/web/_astro/stateDiagram-v2-BHNVJYJU.WapPgDCy.js +1 -0
  59. package/web/_astro/timeline-definition-PNZ67QCA.CEVdiX0n.js +120 -0
  60. package/web/_astro/vennDiagram-CIIHVFJN.Cd9A63eF.js +34 -0
  61. package/web/_astro/wardley-L42UT6IY.DEiaHiIT.js +161 -0
  62. package/web/_astro/wardleyDiagram-YWT4CUSO.B7nGP61E.js +78 -0
  63. package/web/_astro/xychartDiagram-2RQKCTM6.Bq8CHmxC.js +7 -0
  64. package/web/favicon.svg +4 -0
  65. package/web/index.html +2 -0
  66. /package/{spur-cli/config → config}/config.example.yaml +0 -0
  67. /package/{spur-cli/config → config}/plugins/.gitkeep +0 -0
  68. /package/{spur-cli/config → config}/rules/README.md +0 -0
  69. /package/{spur-cli/config → config}/rules/boundary/config-loading-ownership.yaml +0 -0
  70. /package/{spur-cli/config → config}/rules/boundary/dao-boundary.yaml +0 -0
  71. /package/{spur-cli/config → config}/rules/boundary/planning-folder-hardcode.yaml +0 -0
  72. /package/{spur-cli/config → config}/rules/boundary/sp-no-vendor-refs.yaml +0 -0
  73. /package/{spur-cli/config → config}/rules/migration/rg-dialect.yaml +0 -0
  74. /package/{spur-cli/config → config}/rules/quality/coverage-gate.yaml +0 -0
  75. /package/{spur-cli/config → config}/rules/quality/tsdoc-exports.yaml +0 -0
  76. /package/{spur-cli/config → config}/rules/recommended-post-check.yaml +0 -0
  77. /package/{spur-cli/config → config}/rules/recommended-pre-check.yaml +0 -0
  78. /package/{spur-cli/config → config}/rules/rg-migration.yaml +0 -0
  79. /package/{spur-cli/config → config}/rules/strict/http-boundaries.yaml +0 -0
  80. /package/{spur-cli/config → config}/rules/strict/rule-files-structural.yaml +0 -0
  81. /package/{spur-cli/config → config}/rules/strict/runtime-boundaries.yaml +0 -0
  82. /package/{spur-cli/config → config}/rules/strict-check.yaml +0 -0
  83. /package/{spur-cli/config → config}/rules/structure/protected-files.yaml +0 -0
  84. /package/{spur-cli/config → config}/rules/structure/test-focus-skip.yaml +0 -0
  85. /package/{spur-cli/config → config}/rules/structure/test-location.yaml +0 -0
  86. /package/{spur-cli/config → config}/rules/surface/check-cli-surface.yaml +0 -0
  87. /package/{spur-cli/config → config}/rules/typescript/bun-tooling.yaml +0 -0
  88. /package/{spur-cli/config → config}/rules/typescript/guarded-happy-dom-register.yaml +0 -0
  89. /package/{spur-cli/config → config}/rules/typescript/happy-dom-teardown.yaml +0 -0
  90. /package/{spur-cli/config → config}/rules/typescript/no-biome-suppressions.yaml +0 -0
  91. /package/{spur-cli/config → config}/rules/typescript/no-debugger.yaml +0 -0
  92. /package/{spur-cli/config → config}/rules/typescript/no-leaky-module-mocks.yaml +0 -0
  93. /package/{spur-cli/config → config}/rules/typescript/no-module-scope-import-calls.yaml +0 -0
  94. /package/{spur-cli/config → config}/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -0
  95. /package/{spur-cli/config → config}/rules/typescript/output-boundaries.yaml +0 -0
  96. /package/{spur-cli/config → config}/rules/ui/ui-import-boundary.yaml +0 -0
  97. /package/{spur-cli/config → config}/tasks/section-matrix.yaml +0 -0
  98. /package/{spur-cli/config → config}/templates/AGENTS.md +0 -0
  99. /package/{spur-cli/config → config}/templates/bdd/checklist.md +0 -0
  100. /package/{spur-cli/config → config}/templates/bdd/gherkin.md +0 -0
  101. /package/{spur-cli/config → config}/templates/docs/00_ADR.md +0 -0
  102. /package/{spur-cli/config → config}/templates/docs/01_PRD.md +0 -0
  103. /package/{spur-cli/config → config}/templates/docs/02_ROADMAP.md +0 -0
  104. /package/{spur-cli/config → config}/templates/docs/03_ARCHITECTURE.md +0 -0
  105. /package/{spur-cli/config → config}/templates/docs/04_DESIGN.md +0 -0
  106. /package/{spur-cli/config → config}/templates/docs/05_FEATURES.md +0 -0
  107. /package/{spur-cli/config → config}/templates/docs/99_PROJECT_CONSTITUTION.md +0 -0
  108. /package/{spur-cli/config → config}/templates/feature/default.md +0 -0
  109. /package/{spur-cli/config → config}/templates/task/brainstorm.md +0 -0
  110. /package/{spur-cli/config → config}/templates/task/feature-impl.md +0 -0
  111. /package/{spur-cli/config → config}/templates/task/issue.md +0 -0
  112. /package/{spur-cli/config → config}/templates/task/meta.md +0 -0
  113. /package/{spur-cli/config → config}/templates/task/review.md +0 -0
  114. /package/{spur-cli/config → config}/templates/task/standard.md +0 -0
  115. /package/{spur-cli/config → config}/workflows/basic.yaml +0 -0
  116. /package/{spur-cli/config → config}/workflows/docs-pipeline.yaml +0 -0
  117. /package/{spur-cli/config → config}/workflows/feature-dev.yaml +0 -0
  118. /package/{spur-cli/config → config}/workflows/feature-lifecycle.yaml +0 -0
  119. /package/{spur-cli/config → config}/workflows/idea-pipeline.yaml +0 -0
  120. /package/{spur-cli/config → config}/workflows/planning-pipeline.yaml +0 -0
  121. /package/{spur-cli/config → config}/workflows/task-lifecycle.yaml +0 -0
  122. /package/{spur-cli/config → config}/workflows/task-pipeline.yaml +0 -0
  123. /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 # seeds ~/.config/spur/ (config.yaml, rules/, workflows/) — idempotent, never clobbers
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 rule run --preset recommended # evaluate constraint rules
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.8",
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
- "spur-cli",
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 spur-cli/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
- var BUNDLED_CONFIG_DIRS, cachedRoot;
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.8",
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: await resolveWebDistPath(options.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", { port: options.port, host: options.host });
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};