Skip to content

Releases: brambleworks/SiteCMD-Local

SiteCMD 1.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 03:40
v1.5.0
ebf6d19

Added

  • The sitecmd CLI can write template fixes into a checkout.
    sitecmd autofix apply sets X-Content-Type-Options: nosniff in a Vercel
    project's vercel.json, --only <CHECK_ID> narrows the run to one check,
    and --dry-run prints what it would write without touching the working
    tree. A config that already sets the header for every route is reported as
    satisfied, and one that sets a different value is reported as unsupported
    rather than overwritten.
  • sitecmd autofix locate prints the identity hash, path, and line of the
    Code Scan findings in a checkout, so a coding agent can name the exact
    occurrence it is fixing. It reads the connection export the site was
    connected with, and --check <SLUG> limits the output to one rule.
  • sitecmd autofix run-job and sitecmd autofix publish-job run the two
    halves of a hosted fix job inside GitHub Actions. The first applies the fix,
    installs dependencies, and runs the project's build, leaving a patch and a
    manifest behind; the second reads those on a fresh runner and opens the pull
    request. They are separate commands so the half that runs the project's own
    build never holds a token that can write to the repository.

Verify

Installers and CLI archives are served from https://releases.sitecmd.com/v1.5.0/. The attached SHA256SUMS and SHA256SUMS.minisig are signed with the SiteCMD updater key; verification steps are in the README section https://github.com/brambleworks/SiteCMD-Local/blob/main/README.md#verify-your-download.

SiteCMD 1.4.0

Choose a tag to compare

@github-actions github-actions released this 17 Sep 05:53
v1.4.0
9304d02

Added

  • The sitecmd CLI ships for Linux arm64. @sitecmd/cli installs
    @sitecmd/cli-linux-arm64 on arm64 machines, the standalone installer and
    the GitHub Actions setup action pick the linux-aarch64 archive, and each
    release publishes it beside the other signed archives.
  • Coding agents can aim start_fix at one Code Scan finding. The MCP tool
    accepts the relative_path and line that get_issue reports, and when
    that location is missing, ambiguous, resolved, or suppressed it returns an
    error instead of choosing a different occurrence. Leaving both out keeps
    the old behavior, where SiteCMD picks the occurrence.
  • Code Scan recognizes FastAPI's CORSMiddleware allowing every origin while
    also allowing credentials, including when the wildcard or the credential
    flag comes from a configuration default or a helper that returns ["*"].
    A setting guarded so the two can never combine stays quiet.
  • Code Scan reports Python code that turns off certificate verification for
    the whole process by replacing ssl._create_default_https_context with the
    unverified context.

Changed

  • A fix handed to a coding agent from one Code Scan finding is now about that
    finding alone. The brief names its file and line and says only that
    occurrence has to clear, and verifying it no longer marks every other open
    occurrence of the same check as verified. Each location keeps its own
    attempt, so two findings from one check in the same file can be in progress
    at once, and a finding's "Fix with" button shows the attempt for that
    finding rather than the latest one anywhere under its check.
  • Raw-HTML findings are reported per sink, each at its own line. A sanitizer
    now clears only the sink whose value it cleans, where one sanitizer anywhere
    in a file used to excuse every sink in it, and an innerHTML assignment of
    any computed value is reported while a complete string literal is not.
    Files with several sinks will show more findings, each pointing at one line.
  • An open redirect in a JavaScript or TypeScript route counts as guarded only
    when the guard applies to that redirect's destination: a literal path, an
    allowlist helper, a URL built against a trusted base, or an origin check
    before the redirect. Any .origin, .host, or startsWith("/") elsewhere
    in the file used to silence the finding, so some redirects that were
    excused before are now reported.
  • spawn and execFile calls are reported as shell injection only when they
    pass shell: true. Without a shell, arguments reach the program as separate
    values and are never read as shell syntax.

Fixed

  • Code Scan findings that shared a check, a file, and a line, such as two
    unused dependencies reported on the same package.json line, were saved as
    a single issue. Each now has its own.
  • A database export could leave out recent changes. The export copied the
    database file after asking SQLite to fold in its write-ahead log, which
    cannot finish while another part of the app is reading, so changes still in
    the log were missing from the backup. Exports now use SQLite's backup
    interface, which includes every committed change.
  • A robots.txt line whose first eight bytes split a multi-byte character
    crashed the sitemap check.
  • A coding agent could start a fix through MCP for an issue you had dismissed
    or snoozed. The desktop app now refuses the request and tells the agent to
    read the current issue list.
  • get_fix_prompts could return an unbounded response: asking for one check
    ignored limit, and long prompts had no overall size cap. Responses now stop
    at a fixed size and say when they were shortened.
  • Long sessions did more background work than they needed to. The events feed
    kept every event it polled for as long as the page stayed open and now keeps
    one page, and the check that watches project folders for changes could start
    a new pass while the previous one was still reading a large project.

Security

  • Updated rustls, the TLS library behind every HTTPS request the app and the
    CLI make, past RUSTSEC-2026-0285, under which it accepted TLS 1.3 handshake
    messages sent at the wrong encryption level.
  • A scan of localhost skipped certificate verification for every host it
    contacted, including public sites a local page redirected to or loaded
    assets from. The exception for self-signed certificates now covers loopback
    addresses only.
  • The secret that authorizes deleting your uploaded telemetry now lives in the
    OS keychain beside the license key and never enters the app's webview, and
    the short-lived upload token stays in memory. Both used to sit in the
    webview's local storage.
  • The MCP server marks project URLs, framework names, and fix prompt metadata
    as untrusted scan data, as it already did for project names and paths, so
    text a scanned site controls cannot pass for instructions to a coding agent.
    A .sitecmd/config.json whose site URL is not plain http or https is
    ignored.

Verify

Installers and CLI archives are served from https://releases.sitecmd.com/v1.4.0/. The attached SHA256SUMS and SHA256SUMS.minisig are signed with the SiteCMD updater key; verification steps are in the README section https://github.com/brambleworks/SiteCMD-Local/blob/main/README.md#verify-your-download.

SiteCMD 1.3.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 05:00
v1.3.0
0095ae9

Added

  • Scans can target a development server on your own network, such as
    http://192.168.1.40:8080/, a container by its service name in CI, or a
    machine on a tailnet. SiteCMD runs as you, on your machine, with your
    network, so a target you name reaches what you can already reach. Only the
    target you name gains that reach: a redirect, a stylesheet, a sitemap entry,
    or any other URL a fetched page chooses still reaches no further than the
    origin you asked for, and link-local addresses stay refused everywhere
    because cloud metadata answers there. The hidden browser keeps the narrower
    loopback boundary, so a private-network scan reports its browser measurements
    as unavailable.

Changed

  • The scan category labeled "Legal" is now "Privacy & Policies". Its checks
    observe what a page shows: whether a privacy notice, terms, accessibility
    statement, consent banner, or tracker is present, and how long a cookie
    lives. They do not determine whether a site meets a legal obligation, and
    every one of those findings already said so in its own words. The label now
    agrees with them, and the scales-of-justice icon that made the same claim
    without words is now a fingerprint. The category id is unchanged, so saved
    scans and issue history carry over untouched.
  • Confirmation dialogs for protected actions now name the action in the title
    bar, and the warning icon is reserved for actions that destroy data, revoke
    access, or disclose a secret. Saving an integration used to raise a warning
    triangle headed "Allow Protected Action"; it now reads "Save Integration"
    and asks the same question in the same words. The confirmation itself is
    unchanged, so storing a credential, configuring a webhook, or syncing a
    connected site still needs a native dialog that nothing inside the app can
    answer on your behalf.

Fixed

  • Web links, including Bing setup, open without an extra confirmation dialog.
  • Google integration setup stays on the selected service and no longer defaults
    to an unrelated Analytics property or Search Console site.
  • Google Analytics and Search Console connections include Google's required
    desktop client credential during sign-in and token refresh.
  • A Web Scan's score charged one defect more than once. Open Graph tags, form
    labels, the document language, heading structure, and page-level SEO markers
    are each graded by a Web Scan check and again by a polish signal, and both
    deductions landed even though the issue list already showed them as a single
    finding. A check that reports one row per occurrence, such as one per
    malformed Set-Cookie header, also deducted once per row while the dashboard
    score deducted once for the group. Both now charge a defect once, under the
    identity the issue list files it under, so a scan's score and the dashboard's
    agree. Category bars still report what each category observed, and scores on
    affected pages will read a little higher.
  • The app and the CLI disagreed about what could be scanned. The app refused a
    private address outright, while the CLI never checked a bare address at all
    and would scan one, yet refused the same machine named by hostname. Both now
    answer the same way, because the scanner validates its target itself rather
    than trusting each entry point to have done it.
  • A development server reached by its address on the local network was graded
    as a public production site. It earned a High "served over HTTP" finding
    measured against whatever answered port 443 at that address, and the custom
    404 page and CORS reflection checks had the same gap. Private network
    addresses now count as local, the way a localhost or .test hostname
    already did.
  • Web scans of pages that embed third-party iframes graded the wrong
    document. The hidden browser followed the iframe and measured that page
    instead, producing an accessibility failure, a load time, and a JavaScript
    error that belonged to somebody else's page. It now verifies which document
    it measured and reports the browser layer as unavailable rather than
    reporting a verdict about a different page. Every scan also reported one
    JavaScript error that was SiteCMD's own permission request, not the site's.
  • Half the open-redirect probes went unanswered on some sites, taking the
    redirect walk and the www check down with them, because the scan opened all
    of them at once and tripped its own HTTP/2 client's protection. Probes to a
    single origin are now bounded.
  • Time to first byte was measured while the scanner's own requests were in
    flight, so a server that accepts connections slowly was blamed for the
    scanner's retries.
  • A check that cannot reach a verdict now reports as skipped with the reason
    instead of guessing a warning. A rate-limited 404 probe, an unresolved www
    host, and a partial sitemap read all say what happened.
  • A site served only over HTTP now fails the HTTPS check instead of skipping
    it, so an unencrypted site no longer scores well on security.
  • Cross-page checks compared pages the scan never really reached: an error
    page could be reported as a duplicate title, and one page reached through
    two URLs was reported as a duplicate of itself.
  • Checks matched words inside comments and scripts. A commented-out heading
    counted as a heading, and the words "skip to" in a sentence passed for a
    skip link.
  • Sitemap dates written in the shorter standard form were all reported
    invalid, one site had all 1385 flagged. Cloudflare's email-protection link
    was counted as a broken link, and mail signing was reported missing on
    domains that sign through a provider the check never probed.
  • A published contact address in structured data was read as a leaked
    password, a form posting to the site's own subdomain was graded by neither
    of the two checks that cover it, and a site whose only analytics is
    cookieless was told it needs a cookie banner.
  • Code Scan reported findings for code that was not there: one rule matched
    the words "import" and "export" anywhere in a file, dependencies installed
    from GitHub were called registry mismatches, files a framework installs
    itself were graded as the project's own, and a structured-data block
    excused every raw-HTML sink in its file.
  • Coding agents reading SiteCMD through its MCP server could not see
    dependency findings that the score counts, and asking about one was refused
    even though the app itself accepts it.

Changed

  • Cancelling a scan now stops it. The code scan checks for cancellation
    before every file and between stages, the browser analysis abandons its
    wait and releases the hidden browser window, and a cancelled run saves
    nothing and reports nothing. Cancelling and starting again no longer leaves
    the old scan running underneath the new one.
  • Ordinary requests ask servers for compressed responses and cap the
    decompressed size, so registry metadata and other large downloads move less
    data. The measurement probes behind the performance checks still fetch raw
    bytes, so transfer sizes and compression headers stay true. Time to first
    byte is now measured the way a browser would see it, with compression
    negotiated, so that number can shift once for origins that compress on the
    fly.
  • The "Fix with" handoff to a coding agent no longer shows the system's Allow
    Protected Action dialog. It only opens the agent's app with the prompt
    staged in its composer; nothing runs until you send it there.
  • Web scans on Linux no longer run the browser layer, so Core Web Vitals and
    accessibility analysis report as unavailable there. The Linux webview gives
    SiteCMD no private-network subresource filter, and the app now refuses to
    load a page in it rather than expose the local network. Every other check
    still runs.

Fixed

  • Long scans no longer reload every open finding for the whole site after
    each page. The projection asks only for the routes the page covered.
  • Sitemap imports run in one transaction. A refused row keeps the previous
    list instead of leaving a partial or empty one, and the refresh reports the
    error instead of claiming success.
  • The code scan compiled its request-variable matchers once per evaluation
    instead of once per file, which took a 40 KB route file tens of seconds. It
    now takes milliseconds.
  • Multi-page scans download each shared stylesheet once per scan instead of
    once per page. A stylesheet that timed out is still retried on the next
    page; only a definite refusal is remembered for the rest of the scan.
  • Opening one scan's details fetches only that run's findings instead of
    every run in the execution.
  • The MCP server matched suppression patterns with a regex that a short
    pattern could stall for seconds. Matching now takes time linear in the
    pattern and path, and scan comparison loads history once instead of three
    times.
  • The dashboard kept one full code scan report per project in memory for the
    life of the app, including deleted projects. The cache is bounded and
    clears on deletion and when a newer scan lands.
  • The scan-scope picker, sitemap settings, and issue Locations lists page
    their rows the way the Issues list does, so a site with thousands of pages
    no longer mounts every row at once.
  • The startup bundle gate missed part of the eager graph and reported a false
    pass. It now walks every static import, including the boot stylesheet, and
    the page guide panel, command palette, scan summary, add-project, and
    telemetry consent overlays, and the scan completion handlers load on
    demand to keep startup under budget.
  • The scan progress percent no longer sprints, freezes, and leaps. It was
    mapped straight onto check counts, so ninety in-memory checks filled half
    the ring in the first second, the network-bound origin checks then held it
    flat for anything from one to thirteen seconds, then leapt to the end. One
    time-aware model now owns the number for the overl...
Read more

SiteCMD 1.2.0

Choose a tag to compare

@github-actions github-actions released this 02 Sep 00:31
v1.2.0
298d778

Added

  • The web scan now flags meta refresh redirects and timed reloads, and asks
    for review when a single page carries more than a thousand links.
  • Code Scan reports a test suite that exists but never runs automatically, when
    CI or a commit hook runs other quality commands and skips the tests.
  • Code Scan reports a checked-in git hook that was never installed in the
    scanned clone, so the hook config promises a guardrail it does not provide.

Changed

  • Project hygiene checks (tests, linter, CI workflow, commit hooks, and
    .gitignore) now cover static sites, single-page apps, and Composer-based PHP
    projects that have no server routes, instead of only apps with API routes.
    A static site with no tests is reported as Low rather than Medium.
  • A missing or decorative commit hook is now Medium when no CI workflow runs
    the project's build, lint, or tests, since the hook would be the only
    automated gate. It stays Low when CI already enforces those checks.
  • npm's default echo "Error: no test specified" script, and any script that
    only echoes or exits, no longer counts as a test, lint, or build command.
  • CI and hook commands for PHP (Pint, PHPStan, PHPUnit, Pest, composer test),
    Python (tox, nox, pyright), and task runners are recognized as quality gates.
  • A page with several H1 headings, or none, is now reported as an SEO issue,
    matching how search consoles classify it. The accessibility check keeps
    reviewing heading order.
  • The Issues list drops the web/code scan filter. One category filter now covers
    findings from both scanners, a search box narrows the list by title, and the
    list pages twenty issues at a time.
  • The Issues list and Code Scan results share one pager with numbered page links.
    Previous and Next sit beside the numbers and are hidden at the ends rather than
    shown as dead controls.

Fixed

  • Adding a project folder that runs on DDEV, Lando, Docksal, or a .test
    hostname now labels the detected URL as Local instead of listing it as
    another production site.
  • Code findings in the Issues list now name their category, such as Database or
    Architecture, instead of every row reading "Code".
  • Issue history no longer claims an issue regressed after a deploy when the
    issue had never passed. A regression now requires an earlier verified pass.

Verify

Installers and CLI archives are served from https://releases.sitecmd.com/v1.2.0/. The attached SHA256SUMS and SHA256SUMS.minisig are signed with the SiteCMD updater key; verification steps are in the README section https://github.com/brambleworks/SiteCMD/blob/main/README.md#verify-your-download.

SiteCMD 1.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 17:46
v1.1.0
d63a9d8

Added

  • The MCP server can now drive the whole fix loop: start_fix opens a fix
    attempt, run_scan triggers a scan, and a desktop heartbeat tells the agent
    whether the app is running. request_scan is now how_to_rescan (the old
    name still works).
  • The CLI gained unified gate flags across audit, scan, check, and
    gate, SARIF output for code-scanning integrations, and audit baselines.
  • A false-positive report form and accuracy labels, so a wrong finding can be
    reported from the issue itself.
  • Every release now publishes signed checksums and build provenance: a
    minisign-signed SHA256SUMS beside the artifacts and on the GitHub
    Release, with verification steps in the README.
  • The first run walks through connecting an AI editor, with manual MCP setup
    instructions for every supported editor.
  • The Issues page explains how each issue affects the SiteCMD Score.

Changed

  • Backend errors shown in the app are now plain-language messages with a next
    step, instead of raw error text.
  • Fix guides and first screens open with plain-English leads.
  • Dialogs, toasts, and navigation follow accessibility expectations: correct
    focus handling, screen-reader announcements, visible focus rings, and
    reduced-motion support across the app.

Fixed

  • The installer script refuses truncated downloads and version downgrades,
    and compares release versions strictly.
  • Scan traffic is harder to abuse: the analyzer blocks private-network
    subresources, API responses are size-bounded, git metadata is read with
    hostile repository configuration neutralized, and credentials that never
    migrated to the OS keychain are refused instead of silently used.

Verify

Installers and CLI archives are served from https://releases.sitecmd.com/v1.1.0/. The attached SHA256SUMS and SHA256SUMS.minisig are signed with the SiteCMD updater key; verification steps are in the README section https://github.com/brambleworks/SiteCMD/blob/main/README.md#verify-your-download.

SiteCMD 1.0.0

Choose a tag to compare

@brambleworks-co brambleworks-co released this 24 Aug 23:20
v1.0.0
c77efe1

Initial public release of SiteCMD: the desktop app, the sitecmd CLI, and the MCP server.

Verify

Installers and CLI archives are served from https://releases.sitecmd.com/v1.0.0/. The attached SHA256SUMS and SHA256SUMS.minisig are signed with the SiteCMD updater key; verification steps are in the README section https://github.com/brambleworks/SiteCMD/blob/main/README.md#verify-your-download.