Commit Graph

145 Commits

Author SHA1 Message Date
Carlos Florêncio 96dbcb9938 fix: bypass release PR checks with admin token (#2758) 2026-08-17 19:39:13 +00:00
Carlos Florêncio ac08c1df5c feat: automate Scoop stable releases (#2517) 2026-08-16 21:12:19 +00:00
João Salavisa 5dcac3f259 ci: prepare CI workflows for a GitHub merge queue (#2721)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-16 20:10:03 +01:00
João Salavisa 5323cd68e7 ci(e2e): cache Go modules and build cache in the E2E build job (#2657)
Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 17:04:56 +01:00
João Salavisa c488c7b4f9 test(e2e): ratchet new unconditional sleeps to dwell/injectLatency (#2646)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-13 22:50:13 +01:00
João Salavisa 510f887787 ci(e2e): surface and trend the E2E flake rate in the job summary (#2635)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-13 18:53:59 +01:00
Alassane 3ff2441830 test(gitlab): scrub ambient GitLab env vars for host-trust tests (#2592)
Co-authored-by: ayattara <alassane.yattara@savoirfairelinux.com>
Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
2026-08-13 12:53:29 +01:00
Alassane 81e16c4c32 fix(test): pin NODE_ENV so React unit tests can render (#2568)
Co-authored-by: ayattara <alassane.yattara@savoirfairelinux.com>
Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
2026-08-13 12:52:31 +01:00
José Almeida f218880ecb feat(plugins): add source-control extension contracts (#2117) 2026-08-13 08:29:29 +01:00
Carlos Florêncio be966f410f ci: harden GHCR release publishing (#2573) 2026-08-12 19:01:01 +01:00
nova28 2c6a9c287d feat(backend): count accepted step-completion signals (#2526)
Co-authored-by: nova28 <17953305+nova28@users.noreply.github.com>
Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
2026-08-12 17:12:56 +01:00
Carlos Florêncio b4a84f8212 docs: prevent em dashes in public copy (#2516) 2026-08-12 11:13:25 +01:00
Clément Fiere f12bd75a40 fix(ci): grant pull-requests write to fork label job (#2542) 2026-08-11 23:21:52 +01:00
Carlos Florêncio 1429fa1a9a ci: balance e2e shards by test duration (#2489) 2026-08-11 19:33:50 +01:00
Alassane 6aa967f873 fix(plugins): correct stale plugin-hook availability claims (#2309)
Co-authored-by: ayattara <alassane.yattara@savoirfairelinux.com>
2026-08-10 10:14:46 +01:00
Carlos Florêncio 52be8b8e47 fix: guard backend runtime-state ownership (#2468) 2026-08-09 21:44:52 +01:00
João Salavisa c5c591b60b refactor(pty): collapse duplicated PTY and cmdline helpers into common/ptyexec (#2457)
Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 01:03:13 +01:00
Carlos Florêncio bf62f39b10 fix: harden launcher port ownership (#2394) 2026-08-07 23:32:04 +01:00
Carlos Florêncio c312430a99 ci: upgrade GitHub Actions to Node 24 runtime (#2401) 2026-08-07 22:31:00 +01:00
Carlos Florêncio fa433cc965 ci: label allowlisted fork pull requests (#2380) 2026-08-07 18:24:27 +01:00
José Almeida 774ce6d9b4 feat: add source runtime bundle target (#2277) 2026-08-07 12:58:53 +01:00
João Salavisa ee40cd6235 perf(i18n): drop the pseudo QA locale from production bundles (#2361)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-07 13:21:38 +02:00
João Salavisa 0350e1d0e6 ci(web): gate frontend CI on typecheck (#2304)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-06 03:18:24 +02:00
João Manso ad69533c10 ci(release): publish a Windows zip alongside the tarball (#2286) 2026-08-05 15:30:12 +01:00
Carlos Florêncio 9b3aa282a9 chore: strengthen code review prompts (#2267) 2026-08-05 13:44:25 +01:00
Carlos Florêncio a602ec498b fix: restore stable release publication (#2260) 2026-08-04 17:02:28 +01:00
José Almeida 1d5c3e3f5f feat: add npm nightly release channel (#2126) 2026-08-04 00:45:50 +01:00
Carlos Florêncio bb71233826 chore: add architecture lint guardrails (#2168) 2026-08-03 22:40:29 +01:00
Carlos Florêncio 5772fa86f0 ci: fix OpenCode fork label cleanup permission (#2230) 2026-08-03 22:11:45 +01:00
Carlos Florêncio f51a83e4d3 fix: publish clarification task state updates (#2174) 2026-08-02 20:42:57 +01:00
João Salavisa f26befdc33 fix(ci): stop the i18n ratchet failing PRs on files they never touched (#2165)
Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 18:58:30 +02:00
João Salavisa 83c3c1ccf1 feat(i18n): ratchet new code to require t()/<Trans> everywhere (#2105)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-01 23:14:50 +01:00
João Salavisa 6cd89a78d3 feat(i18n): add scoped i18n foundation with one migrated page (#2097)
Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-08-01 23:11:18 +02:00
Carlos Florêncio 9f7662d540 ci: authenticate docs preview build (#2115) 2026-07-31 21:52:05 +01:00
Carlos Florêncio 0aa6749bdb fix(ci): checkout PR head for Claude mentions (#2109) 2026-07-31 19:51:06 +01:00
Carlos Florêncio b5a80d9b23 ci: mirror postgres service image in ghcr (#2110) 2026-07-31 19:27:55 +01:00
Carlos Florêncio 272fa2d34d ci: review PRs only on open (#2100) 2026-07-31 17:06:22 +01:00
Carlos Florêncio be85ce2f87 ci: forward approved users to Claude review (#2078) 2026-07-30 20:48:48 +01:00
João Manso cc340ae5f2 fix(build): make Makefile $(shell) probes work under native Windows cmd (#1953) 2026-07-26 11:40:55 +01:00
Carlos Florêncio 2d5fedd5d0 fix(release): preflight signing configuration before merge (#1948) 2026-07-25 18:06:49 +01:00
João Manso 6fedac6c64 fix(build): support make dev on native Windows (#1886) 2026-07-24 12:08:22 +01:00
Carlos Florêncio ae6e2f3daa fix(release): sign and verify release tags (#1902) 2026-07-24 09:54:00 +01:00
Carlos Florêncio a225fbac3e ci: harden trusted PR review evidence (#1896) 2026-07-23 16:22:50 +01:00
Carlos Florêncio e53fd038a8 fix(windows): list logical drives in folder picker (#1870) 2026-07-23 14:45:49 +01:00
Carlos Florêncio 2130c28686 fix(repositories): allow explicit paths outside discovery roots (#1825) 2026-07-20 19:49:41 +01:00
João Salavisa 52946b9159 docs: document the plugin marketplace (#1805)
* docs: document the plugin marketplace

Add a public Plugin Marketplace page covering both audiences: operators
using the in-app catalog (Browse/Installed tabs, one-click install,
Update to vX, the Sources dialog for team/corporate registries, plugin
icons, feature-flag gating, sideloading still works) and plugin authors
publishing into it (one-repo-per-plugin GitHub Release assets, the
optional manifest icon field, submitting a plugins.yaml PR to the
official catalog, GitHub-stars-only ranking, and hosting your own
index.json source).

Also cross-link the new page from plugins.md (replacing the now-false
"No plugin marketplace" security note), plugins-authoring.md, and
plugins-manifest.md (new icon field row); register it in meta.json and
coverage.json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: correct plugin-registry CI validation claims

The registry index-build workflow does not validate plugins.yaml against
schema.json, nor does build-index.mjs compare the entry id to the
manifest id — bad entries are skipped-and-logged, and CI only fails when
a non-empty list resolves to zero built entries. Reword the submission
steps (in both the marketplace docs page and plugin-registry/README.md)
to describe what the workflow actually does: it resolves each entry
against the GitHub API and requires a correctly named
<id>-<version>.tar.gz release asset, with maintainer approval as the real
gate. Also clarify that plugins.yaml `categories` are free-form curation
tags, not the manifest's category enum.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: split plugin-registry Pages deploy into its own job

The single build-and-deploy job bound the `github-pages` environment at
the job level, so GitHub evaluated that environment's protection rules on
every PR run — failing the check even though the deploy steps were gated
to non-PR events. This broke every PR touching plugin-registry/**, which
is exactly what a plugin-submission PR does.

Split into a PR-safe `build` job (no environment) and a non-PR-gated
`deploy` job that owns the `github-pages` environment and runs only
`deploy-pages`. Behavior on push/schedule/workflow_call is unchanged; PRs
now run build+tests without tripping the environment gate. The star
refresh calls this workflow by file path, so the job rename is safe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: describe index-build asset resolution accurately

build-index.mjs picks the <id>-<version>.tar.gz release asset when
present but falls back to the release's first .tar.gz otherwise, and only
errors when a release has no .tar.gz at all — it does not hard-fail a
misnamed asset. Reword the submission steps to present the exact asset
name as an authoring instruction (so the index resolves the right asset)
rather than a builder-enforced gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Revert "ci: split plugin-registry Pages deploy into its own job"

This reverts commit 2c5f649146.

* Reapply "ci: split plugin-registry Pages deploy into its own job"

This reverts commit 3795cdb98a.

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 17:44:15 +01:00
João Salavisa bc2f310e73 feat(plugins): add plugin marketplace with curated registry and updates (#1798)
* feat(plugins): add plugin marketplace with curated registry and updates

Discover and install plugins from inside kandev instead of only by URL/upload.

- Backend marketplace subpackage: SQLite-backed sources, catalog fetch/merge
  (dedup, install_state, degraded-source handling), and the /api/plugins/
  marketplace[/sources] API. Install reuses the existing install-by-URL pipeline.
- Frontend: Settings > Plugins gains a Browse tab (search/category/star sort),
  source management, one-click install, and an Update button on the Installed
  tab when the catalog has a newer version. Plugins may ship an icon (manifest
  `icon` -> catalog icon_url) with a letter-tile fallback.
- Registry infra: plugin-registry/ (curated plugins.yaml + schema.json) and two
  GitHub Actions (zero-dependency Node build-index.mjs -> index.json on Pages,
  daily star refresh). Ships empty at launch; the empty catalog is valid.
- Spec: docs/specs/plugins/marketplace.md. No download telemetry; stars only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(plugins): address marketplace PR review feedback

- CodeQL: stub fetch routers keyed off a path segment, not a hostname substring.
- Nullable stars end to end: a failed star lookup stays unknown (not 0) and
  sorts last, instead of decoding null -> 0 and corrupting ranking.
- Fetch marketplace sources concurrently and dedupe identical in-flight
  downloads (singleflight), so a slow source can't serialize the Browse tab.
- Register /marketplace routes before the /:id wildcard (gin tree ordering).
- Duplicate source URL returns 409 ErrDuplicateSource, not a raw SQL error.
- Browse: filter category client-side so the category dropdown never collapses.
- marketplaceInstall swallows after toasting (no unhandled promise rejection).
- Source badge keys off source_id, not a name substring.
- build-index: read block-sequence manifest categories, not just inline.
- Registry index workflow validates on pull_request; Pages deploy gated to
  push/schedule/dispatch. Spec: align package_sha256 (advisory in v1) + sort enum.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(plugins): guard catalog repo_url against javascript: href injection

repo_url comes from an untrusted index.json, so a malicious/compromised source
could set a javascript: URL that runs in the operator's session when the Repo
link is clicked (rel/target don't block it). Only render the anchor for http(s)
schemes. Adds regression tests for the scheme guard and null-star rendering.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(plugins): require https for remote sources; test oversized download

- Reject remote plain-http marketplace sources (MITM catalog-poisoning risk);
  loopback http stays allowed for local dev/e2e fixtures.
- Add the missing oversized-response assertion to TestDownloadRejectsNon200AndOversized
  so the maxIndexBytes memory bound has coverage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(plugins): detach source download from singleflight leader's context

Two concurrent Browse opens after a cache Refresh share one singleflight
download; if the leader's request context is canceled (it navigates away), the
waiters must not inherit that cancellation. Use context.WithoutCancel so values
are preserved but the leader can't cancel everyone; the client's 20s timeout
still bounds the download.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 17:10:53 +01:00
Carlos Florêncio 21f811d5ec feat: add idle storage maintenance (#1699) 2026-07-18 19:08:44 +01:00
Carlos Florêncio 16da501fc4 feat(office): route agents through execution profiles (#1725) 2026-07-17 18:47:09 +01:00
José Almeida 4757fffdea docs: reframe feature guides and mark experimental surfaces (#1760)
* docs: reframe feature guides and mark experimental surfaces

* fix: tighten task demo framing

* fix: validate experimental page status

* docs: anchor experimental office status

* fix(ci): isolate Wrangler preview install

* docs: complete focused camera example

* fix(ci): use valid Wrangler package name
2026-07-17 16:45:10 +01:00