About page redesign, config.json rename, CI flake fix#16
Merged
Conversation
Append mermaid stateDiagram-v2 diagrams for task and worker lifecycles to docs/design.md. Task diagram shows the API endpoints that drive each transition; worker diagram covers the simpler running/stopped model with an aside on lost-but-not-deleted workers. Add .claude/ to .gitignore — only ever holds per-developer state (settings.local.json, scheduled_tasks.lock). Remove the tracked lock file. NextUp additions: claude-code/codex task wrappers, MCP server wrapper, AI tool instructions for authoring task types, optional auto-start service registration in install scripts, and task scheduling (notBefore + cron). Updated the existing diagram entry to reflect that state machines are now done. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename docs/ files to snake_case for consistency: Api.md → api.md, NextUp.md → next_up.md, TaskFlow.md → task_flow.md, TaskTypeDefinitions.md → task_type_definitions.md. Update Go test comments that referenced the old paths. Move task and worker state-machine diagrams from design.md to task_flow.md, where they live alongside the existing flow narrative and state definitions. Fix two endpoint typos in the diagrams I wrote earlier: PUT /task/:id/run not /start, PUT /worker/:id/stop not POST. Slim design.md back to origin/goals/architecture. Bring docs/api.md up to date with the actual routes in server/server.go: add /version, /config/, /ops/status/, log/tail endpoints. Add a sync reminder in CLAUDE.md so the doc doesn't drift the next time routes change. Aggressively trim the main README: keep tagline, install, 60-second start (with both curl and CLI submit to honor the RESTy promise), links into docs. Move detailed curl/CLI examples, file uploads, scripted submissions, and the task type schema deep-dive to a new docs/usage.md. Add docs/README.md as a landing index. Use relative links throughout the docs so local previews resolve. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drop the "stub" disclaimer — the page now covers everything a user needs to author a task type. Replace the inaccurate "bash is the only executor" line with a table listing the four supported modes (bash, cmd, powershell, arbitrary -c executor) and a pointer to blanket task-validate. Add a windows_echo example so cmd usage is visible alongside bash. Add a Docker task type idea to next_up.md: either a first-class executor = "docker" with image/mounts fields, or a shipped bash example that wraps docker run. Lean toward example-first; promote if usage warrants. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The installer creates ~/.config/blanket/config.json but viper looks
for blanket.{json,yaml,toml} — so the file the installer writes is
ignored and a fresh user gets the no-config error. Switch viper's
config name from "blanket" to "config" so config.json (matching the
installer) is found. The flag-help text is updated alongside.
Breaking change for anyone running with an existing blanket.json,
which is acceptable given the small user base. The smoke test and
docs/usage.md are updated to use config.json and to use input.txt
as the example upload filename so it doesn't collide with the
config name.
The install scripts now also write an absolute database path under
the data directory. Without it the default ("blanket.db") resolves
relative to cwd, which is surprising for a daemon-style install.
The About page is rewritten:
- Blurb describing what blanket is, with a GitHub link and a pointer
to the Workers page
- Server card with version, binary path, PID, and config file path
- Config file contents (raw, in <pre>) when a config is in use
- Settings table with timeMultiplier hidden (test-only knob), the
legacy singular tasks.typesPath default removed, and database /
typesPaths / resultsPath rendered as absolute paths
Wire ldflags-set Version through ServerConfig so the /version
endpoint and the About page show the real build info instead of the
hardcoded "0.1" string.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Task API lifecycle round-trip test fails intermittently with the
GET-by-id step returning 500. Root cause: fullyParallel: false only
serializes tests within a single spec file. Blanket's tests live in
two files (blanket.spec.ts, journeys.spec.ts), so by default
playwright runs them with workers > 1 and they share a single bolt
DB through one server. journeys.spec.ts's purgeTasks (in
beforeEach/afterEach) deletes every task in the DB; if it fires
between the round-trip test's POST and the follow-up GET, the
handler 500s on the missing task.
Set workers: 1. The existing comment ("blanket is stateful; keep
tests serial") signaled the intent — workers: 1 actually delivers
it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
~/.config/blanket/config.json, but viper'sSetConfigName("blanket")looks forblanket.{json,yaml,toml}. So the file the installer writes is ignored on first run. Switch toSetConfigName("config"). Breaking change for anyone running withblanket.json— accepted given the small user base.timeMultiplierknob and the legacy singulartasks.typesPathdefault.database,tasks.typesPaths, andtasks.resultsPathrender as absolute paths.tasks.typesPath(singular) gone. It was a leftover default that did nothing — only the pluraltasks.typesPathsis read by the loader. Removed from defaults so it no longer shows up.databasepath under the data directory. Without it the default (blanket.db) resolves relative to cwd, which is surprising for a daemon-style install./versionendpoint now reports the real ldflags version instead of the hardcoded\"0.1\".fullyParallel: falseonly serializes tests within a single spec file. With two spec files, playwright runs them concurrently against one shared bolt DB, andjourneys.spec.ts'spurgeTaskswould delete the round-trip's task between POST and GET. Setworkers: 1.Test plan
go build ./...cleango test ./...passesmake linux && bash scripts/smoke.shpasses (smoke test now uses config.json)~/.config/blanket/config.jsonautomatically🤖 Generated with Claude Code