chore(packmind): nightly artifacts update#364
Open
github-actions[bot] wants to merge 2807 commits into
Open
Conversation
The publish job pushed commits to the `packmind/sync` branch but never
opened the actual pull request, leaving the marketplace repo with a
detached branch and no review surface — contradicting the rolling-PR
promise from PRD §6.
Add a new `IGitPort.openOrUpdatePullRequest(repo, { head, title, body })`
primitive with rolling-PR semantics: when an open PR already exists with
the same head→base, it is returned untouched (no duplicate opened);
otherwise a new PR is opened. GitHub implementation lists open PRs via
`/pulls?head&base&state=open` and posts a new one when none is found,
with a 422 "pull request already exists" retry to handle the
concurrent-publisher race. GitLab implementation mirrors the pattern
through the merge-request endpoints. Routed through `GitProviderService`
and `GitAdapter` next to `createBranchFromBase`.
The publish job now calls it after a successful `commitToGit`, stores the
returned URL on `MarketplaceDistribution.prUrl`, and includes `prUrl` on
the `PluginPublishedEvent` payload (matches PRD §5
`plugin_publish_succeeded` event property). A PR-call failure after a
successful commit is logged at warn level and leaves the distribution in
`success` — the underlying push already landed, so we don't roll back.
Refs: GH-580
Co-Authored-By: Claude <noreply@anthropic.com>
…and errors Sprint group G1 (types-deployments) for feature remove-published-plugin-from-marketplace. Completed tasks: - 1.1: Extend DistributionStatus enum with to_be_removed and removed - 1.2: Add MarketplacePluginRemovalInitiatedEvent - 1.3: Add PackagesDeletedEvent - 1.4: Add PluginDistributionNotFoundError and PluginDistributionInvalidStateError domain errors - 1.5: Add IMarkPluginForRemovalUseCase, ICancelPluginRemovalUseCase, IListMarketplaceDistributionsUseCase contracts - 1.6: Extend IDeploymentPort with new methods Note: MarketplacePluginRemovalInitiatedEvent.eventName uses 'deployments.distribution.retired' (3 segments) to satisfy the @domain-events lint rule. Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G2 (feature-flag) for feature remove-published-plugin-from-marketplace. Completed tasks: - 1.7: Declare MARKETPLACE_PLUGIN_REMOVAL_FEATURE_KEY feature flag Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G3 (migrations) for feature remove-published-plugin-from-marketplace. Completed tasks: - 2.5: No-op migration documenting new distribution lifecycle states (to_be_removed, removed) Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G9 (docs) for feature remove-published-plugin-from-marketplace. Completed tasks: - 9.1: Add "Retire a plugin" end-user documentation - 9.2: CHANGELOG entry under [Unreleased] Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
…ft detection Sprint group G4 (backend-deployments) for feature remove-published-plugin-from-marketplace. Completed tasks: - 2.1: Extend IMarketplaceDistributionRepository with new finders - 2.2: Implement new finders in MarketplaceDistributionRepository - 2.3: Distribution test factory .toBeRemoved() / .removed() helpers - 2.4: Repository spec covering new finders and status transitions - 3.1: markPluginForRemoval use case - 3.2: markPluginForRemoval spec - 3.3: cancelPluginRemoval use case - 3.4: cancelPluginRemoval spec - 3.5: listMarketplaceDistributions use case - 3.6: listMarketplaceDistributions spec - 3.7: Emit PackagesDeletedEvent from DeletePackagesBatchUsecase - 3.8: DeletePackagesBatchUsecase spec for event emission - 3.9: PackageDeletedDistributionsListener - 3.10: Listener spec - 3.11: Extend MarketplaceReconciliationDelayedJob with distribution cross-check - 3.12: Reconciliation job spec - 3.13: Wire new use cases + listener into DeploymentsHexa - 3.14: Expose new methods on DeploymentsAdapter - 3.15: Adapter spec for new methods Notes: - MarketplaceDescriptor gained optional driftedPluginSlugs?: string[] for drift persistence. - MarketplaceReconciliationJobFactory and DeploymentsAdapter constructors now take IMarketplaceDistributionRepository. Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G5 (amplitude) for feature remove-published-plugin-from-marketplace. Completed tasks: - 4.1: Subscribe Amplitude listener to MarketplacePluginRemovalInitiatedEvent - 4.2: Amplitude listener spec Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G6 (api-marketplaces) for feature remove-published-plugin-from-marketplace. Completed tasks: - 5.1: Add marketplace removal routes to controller (GET distributions, POST removal by distribution/package, DELETE removal) - 5.2: Controller spec covering new routes + error mapping Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G7 (frontend-marketplaces) for feature remove-published-plugin-from-marketplace.
Completed tasks:
- 6.1: Extend marketplace gateway interface + impl
- 6.2: Add distribution query options + removal/cancel mutation hooks
- 6.3: Queries spec
- 7.1: DistributionStatusBadge component + spec
- 7.2: RemovePluginButton component + spec
- 7.3: CancelRemovalButton component + spec
- 7.4: MarketplaceDistributionsTable component + spec
- 7.5: MarketplaceDetailsHeader component + spec
- 7.6: Extend MarketplaceStateBadge with driftedPluginSlugs tooltip
- 7.7: Link MarketplaceRow name to details route
- 7.8: New marketplace details route
- 7.9: PackageMarketplaceDistributions component + spec
- 7.10: Insert PackageMarketplaceDistributions in package details page (flag-gated)
All action regions gated behind <PMFeatureFlag featureKeys={[MARKETPLACE_PLUGIN_REMOVAL_FEATURE_KEY]}>.
Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/
Co-Authored-By: Claude <noreply@anthropic.com>
Sprint group G8 (integration-tests) for feature remove-published-plugin-from-marketplace. Completed tasks: - 8.1: Removal → reconciliation path - 8.2: Drift detection on direct repo delete - 8.3: Cancellation reverts state - 8.4: Package-delete cascade across marketplaces - 8.5: Both manual-trigger routes (by-distributionId and by-packageId) Notes: - Registered MarketplaceDistributionSchema in deploymentsSchemas barrel so the integration-test datasource synchronizes the table (was wired into DeploymentsHexa but missing from the schemas index). - 8.1: when a to_be_removed slug disappears from the descriptor the descriptor itself diffs, so the marketplace lands in 'drift' rather than 'healthy'; the test asserts the AC10 invariant (driftedPluginSlugs stays undefined — expected removals are suppressed from drift). Refs: tmp/feature-specs/remove-published-plugin-from-marketplace/ Co-Authored-By: Claude <noreply@anthropic.com>
Reword the PackagesDeletedEvent comment and its emission site to the generic wording used in the OSS repo so the shared files are byte-identical across repos and the OSS→proprietary sync merges cleanly (no add/add or overlapping -edit conflict). No behavior change. Co-Authored-By: Claude <noreply@anthropic.com>
The removal/cancel actions were gated behind <PMFeatureFlag> but only featureKeys was passed — the required featureDomainMap and userEmail were missing, so the flag resolved to false and hid the actions for everyone. Wire the auth context + DEFAULT_FEATURE_DOMAIN_MAP on both the marketplace distributions table and the package Distributions tab. Also fix latent type errors swc did not catch: add the to_be_removed/removed keys to PackageArtifactsTable's status-badge map, widen PMConfirmationModal message to ReactNode, and drop a dead __testables__ export. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nc PR Marking a distribution for removal (and the package-delete cascade) now enqueues RemovePluginFromMarketplaceDelayedJob, which drops the plugin from the descriptor and deletes its plugins/<slug>/ directory on the packmind/sync branch — symmetric to publishing, so the rolling Packmind sync PR updates automatically instead of requiring a manual CLI deletion. The job reads the descriptor from the sync branch (so it stacks on pending publishes rather than clobbering them) and uses the distribution's stored pluginSlug, so the package-deletion cascade works even though the package is already gone. The distribution stays to_be_removed; reconciliation owns the terminal removed transition once the PR merges. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The close-effect depended on the whole `publishMutation` object, which react-query returns as a fresh reference every render. That made the effect re-run each render and call `reset()`, re-rendering into a "Maximum update depth exceeded" loop. Depend on the stable `reset` callback instead, and add a regression test using the real mutation hook. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The test waited a fixed 50ms for a fire-and-forget cascade and left the removal job's addJob unmocked, so under the SyncJob harness it ran real git ops inline between the two distribution updates. Combined with the non-deterministic findActiveByPackageId ordering, the row processed second raced the sleep. Stub addJob and replace the sleep with condition-based polling on the observable outcome. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sprint group D (integration tests + changelog) for feature `publish-package-as-managed-plugin`. Add six integration specs under packages/integration-tests/src/deployments/ that drive the publish use case + delayed job inline against a real datasource with a mocked IGitPort. Scenarios match the PRD engineering checklist: rolling-PR amend (two publishes converge to one PR, status='success' on both rows, prUrl shared), no-op idempotency (NO_CHANGES_DETECTED → status='no_changes', wasNoop=true event), descriptor missing → marketplace state flipped to 'bad_format' + no row left in success, expired token preflight (synchronous failure, no row, no enqueue, no token in error strings), name collision with an unmanaged plugin (no PR opened), two concurrent publishers (single rolling PR with ordered commits, both rows end success, both plugins land in descriptor.plugins). Add a CHANGELOG entry under Unreleased / Added. End-user docs (apps/doc/) intentionally left out of this commit — the feature is still gated by the marketplace feature flag and the docs will be merged on a separate branch once the flag opens to the public. Completed tasks: - 4.1: Integration test — rolling-PR amend - 4.2: Integration test — no-op idempotency - 4.3: Integration test — descriptor missing → bad_format - 4.4: Integration test — expired token preflight - 4.5: Integration test — name collision with unmanaged plugin - 4.6: Integration test — two concurrent publishers - 4.7: DEFERRED — end-user docs held on a branch until the feature flag opens - 4.8: Update CHANGELOG.md Unreleased Refs: GH-580, tmp/feature-specs/publish-package-as-managed-plugin/ Co-Authored-By: Claude <noreply@anthropic.com>
The chevron suggested affordance the rows don't actually have — clicking them does nothing. Removing it tightens the row and stops promising an interaction we don't honor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ance The governance DRIFT section listed every package because ListDriftedPackagesByOrgUseCase treated every active deployment returned by findOutdatedDeploymentsBySpace as drifted. That repository method actually returns all active deployments (with their deployed version), not just outdated ones — the space overview compensates by comparing versions itself, but the governance use case did not. It now resolves drift the same way the space overview does: a deployed artifact counts as drift only when its deployed version is behind the latest version, or when the artifact has been deleted from Packmind. To read latest versions org-wide without per-space membership checks (governance is org-scoped), add membership-free listAllRecipesByOrganization / listAllSkillsByOrganization to the recipes and skills ports, mirroring the existing listAllStandardsByOrganization. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Prefix each package name in the governance DRIFT section with the shared LuPackage icon so packages are easier to spot at a glance. The icon and name share the row's flexible width, so only the name truncates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Move the "Drift" signal out of the page-header state badge and into a dedicated warning banner rendered above the package list by `MarketplaceDetailAlerts`. The banner explains that the marketplace descriptor was edited outside Packmind and, when known, lists the published plugins that are no longer listed in the descriptor. - The header state badge now only renders for `unreachable` / `bad_format` — genuine repo-level failures that still belong at the page top. - Dedupe `driftedPluginSlugs` in `MarketplaceReconciliationDelayedJob`: each republish writes a fresh `success` row for the same slug, so the drift list collapsed multiple entries per plugin. Switched to a `Set<string>` accumulator with a regression test that pushes three successful publishes of `p1` and asserts the persisted list is `['p1']`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the table + toolbar in favor of an HStack-based row layout matching apps/playground/src/prototypes/marketplaces. Remove the "Last checked" and "Added by" columns. Replace the state badge with a small orange dot near the repo path that only surfaces git access issues (unreachable, bad format, auth/repo-not-found refinements); move drift and outdated plugin counts into a separate "N outdated" indicator under the Contents column with a human-friendly tooltip. The repo path opens a menu with Copy SSH URL / Copy HTTPS URL / Open on provider (SSH URL derived from the web URL via a regex that covers GitHub, GitLab and Bitbucket). Unlink moves into a trailing ellipsis menu. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add the search domain types (SearchResult, SearchResponse, SearchArtifactType, SearchMatchSource) and the ISearchPort hexagonal port with SearchCommand, completing the untracked search type scaffolding. Export the search domain from the @packmind/types root barrel so the frontend gateway can import SearchResponse. Co-Authored-By: Claude <noreply@anthropic.com>
Add OrganizationsSearchModule with: - SearchController (GET /organizations/:orgId/search?q=, guarded by OrganizationAccessGuard, rejects queries shorter than 2 chars) - SearchService (resolves the user's member spaces via ISpacesPort and builds the spaceSlugById map) - SearchAdapter (read-only ILIKE QueryBuilders over standards, recipes, skills and packages, scoped to the member spaces; recipes join the latest RecipeVersion for the command summary; results ordered name-match first then description, capped at 15, soft-delete filtered) Wire the module into OrganizationsModule imports and the AppModule RouterModule tree as /organizations/:orgId/search. Co-Authored-By: Claude <noreply@anthropic.com>
Wire the navbar search bar to the org-scoped backend endpoint GET /api/v0/organizations/:orgId/search via the existing spaces-domain data-flow pattern. - SearchGatewayApi extends PackmindGateway and implements ISearchGateway (GET /organizations/:orgId/search?q=<term>) - searchQueryKeys scoped under the organization query scope - getSearchQueryOptions / useSearchQuery gated on orgId and a trimmed term length >= 2, with keepPreviousData to keep results visible while a new keystroke is in flight - complete the pre-existing search domain api barrel (gateway + queries + queryKeys) Co-Authored-By: Claude <noreply@anthropic.com>
Surface a debounced global search bar in a new slim top navbar above the sidebar/content shell, letting users find any artifact (standard, command, skill, package) across the spaces they belong to without knowing which space it lives in. - TopNavbar: slim PMHStack, background.primary surface + border.tertiary divider, holds only the search bar (per the agreed navbar scope) - GlobalSearchBar: PMInputGroup + PMInput (LuSearch start element), debounced (250 ms) search triggered at >=2 chars, results in a PMPopover dropdown anchored (not triggered) to the input so refining the query never closes it - SearchResultRow: bold name + single-line description preview with the searched term highlighted (blue.subtle/blue.fg palette), a type badge, and click/keyboard navigation to the single-item page (skills by slug, others by id) - highlightMatch util splits case-insensitively and wraps matches with PMText - useDebouncedValue shared hook (manual setTimeout, no new dependency) - AuthenticatedLayout wraps sidebar+content in a PMVStack with TopNavbar above All UI uses @packmind/ui PM-prefixed components and Packmind semantic tokens only; no raw div/input or hardcoded hex. Renders correctly in the single dark theme. Co-Authored-By: Claude <noreply@anthropic.com>
This reverts commit 608b0cc.
This reverts commit ccf7606.
This reverts commit 0d78b23.
This reverts commit 3af0f5d.
- Remove PACKMIND_EDITION branching in docker.yml and release.yml - Add OSS tag variants alongside proprietary tags via docker tag - Always push public (unsuffixed) images on release - List both OSS and Enterprise image tags in release notes Co-Authored-By: Claude <noreply@anthropic.com>
…362) Drive the deploy workflow off github.ref only, dropping the PACKMIND_EDITION gating. Each main-branch commit now updates the prod cloud, staging cloud and staging on-prem OSS values together, matching the unified Docker build that publishes both image variants per run. Each release tag updates both the OSS and enterprise on-prem values. Claude-Session: https://claude.ai/code/session_01GnFUbyMuQHkpiRmYXHTN2H Co-authored-by: Claude <noreply@anthropic.com>
Contributor
|
PR title or description contains an excluded keyword. |
added 7 commits
June 24, 2026 03:10
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.
Automated update of Packmind artifacts via
packmind-cli install. Review the diff under.packmind/andpackmind-lock.json.