release: v0.5.0 — frontend monorepo restructure, build hardening, jobs reliability#132
Merged
RaghavChamadiya merged 12 commits intomainfrom May 3, 2026
Merged
release: v0.5.0 — frontend monorepo restructure, build hardening, jobs reliability#132RaghavChamadiya merged 12 commits intomainfrom
RaghavChamadiya merged 12 commits intomainfrom
Conversation
* feat(types): scaffold @repowise/types with canonical contracts Adds packages/types as a workspace package holding canonical TypeScript shapes shared between packages/web (OSS dashboard) and downstream consumers. Modules: graph, git, docs, decisions, dead-code, symbols, chat. ChatArtifact is a discriminated union (KnownChatArtifact + GenericArtifact + isKnownChatArtifact narrowing helper) so consumers can switch on .type instead of casting Record<string, unknown>. Canonical decisions: - OSS engine shapes (PipelineResult / SymbolResponse / GitMetadata / DecisionRecordResponse) are canonical for engine-derived data. - Enrichment fields (DeadCodeFinding.status/note, DecisionRecord.staleness_score, GraphLink.confidence/edge_type) are optional so OSS-shaped artifacts still satisfy the contract. - Symbol renamed to CodeSymbol to avoid shadowing the JS global. Tests: vitest --typecheck against contracts.test.ts (12 assertions covering narrowing, optional-field invariants, literal unions). All pass. * feat(ui): scaffold @repowise/ui shared component package Scaffolding only — components move in a follow-up PR. Sets up: - package.json with subpath exports (graph, git, dead-code, decisions, docs, symbols, coverage, wiki, chat, dashboard, workspace, jobs, shared, hooks, ui) so the follow-up can drop components into per-domain directories without re-touching the exports map. - React 19 peer dep; @repowise/types as workspace dep. - tsconfig with paths shim so the package resolves @repowise/types from source (no build step needed in dev). - Empty styles/globals.css placeholder; canonical Tailwind v4 tokens move in the follow-up PR. - README documenting layout and consuming pattern.
…owise/ui package (#120) * chore(types,ui): clean up doc strings to reference downstream consumers neutrally Removes references to a specific downstream app, internal sub-task names, and private planning docs from JSDoc, package.json descriptions, README, and test names in @repowise/types and @repowise/ui. Pure docs/comments cleanup; no exported API, no shape, and no behavior changes. Type-level tests still pass. * test(ui): add Vitest + Testing Library + jsdom infrastructure Wires @repowise/ui for component-level tests so each domain can ship a smoke test alongside the components it owns. vitest.config.ts runs jsdom with @vitejs/plugin-react, aliases @repowise/types/* to the workspace source so tests import canonical types directly, and includes __tests__/** plus colocated src/**/*.test.tsx. Setup file pulls in @testing-library/jest-dom/vitest matchers. A placeholder smoke test mounts a trivial component to confirm the chain end-to-end. * feat(ui,web): centralise design tokens in @repowise/ui/styles.css Moves the canonical Tailwind v4 @theme block, base styles, scrollbar, focus, prose, tabular-nums, reduced-motion, and React Flow theming from packages/web/src/styles/globals.css into packages/ui/styles/globals.css. The shared file declares @source "../src/**/*.{ts,tsx}" so consumers automatically pick up classes used by shared components without each consumer re-declaring the source path. packages/web/src/styles/globals.css reduces to a single @import "@repowise/ui/styles.css" plus a comment explaining where overrides go. packages/web/next.config.ts adds transpilePackages: ["@repowise/ui", "@repowise/types"] so workspace TS source resolves at build time. next build succeeds across all 22 routes; type-check is clean. * feat(ui,web): move Radix-CVA primitives into @repowise/ui/ui Relocates the 17 Radix-based primitives (badge, button, card, dialog, confirm-dialog, input, label, progress, scroll-area, select, separator, sheet, skeleton, slider, switch, tabs, tooltip) from packages/web/src/components/ui/ into packages/ui/src/ui/ so any downstream consumer can pull them via @repowise/ui/ui/<name> or the barrel at @repowise/ui/ui. The shared cn helper moves with them to packages/ui/src/lib/cn.ts and a new ./lib/cn subpath export. packages/ui/package.json declares the radix-ui packages, class-variance-authority, clsx, lucide-react, and tailwind-merge as direct deps; React/ReactDOM stay peer-only. 84 files in packages/web rewrite their @/components/ui/* imports to @repowise/ui/ui/* mechanically; behavior, props, and styling are unchanged. A Button smoke test verifies render, variant class application, and HTML attribute forwarding. packages/web type-check + production build succeed across all 22 routes; packages/ui test suite is 4/4. * feat(ui,web): move shared primitives into @repowise/ui/shared Relocates api-error, empty-state, and stat-card from packages/web/src/components/shared/ into packages/ui/src/shared/ and adds a ./shared/* subpath export so consumers can import them as @repowise/ui/shared/<name> (matching the per-file pattern already used). 18 files in packages/web rewrite their @/components/shared/* imports mechanically. A StatCard smoke test covers label+value, optional description, and trend rendering. Type-check + production build clean across all 22 routes; packages/ui test suite is 7/7. * chore(types): scrub remaining capitalised references missed in earlier sweep Earlier doc-string cleanup used a case-sensitive search and didn't catch capitalised "Hosted" references in docs.ts, decisions.ts, graph.ts, and symbols.ts. Replaces them with neutral "downstream backends" / "consumer adapters" phrasing. No exported API or behavior change. Type-level tests still pass. * feat(ui,web): move coverage components and shared lib utilities into @repowise/ui Relocates coverage-donut and freshness-table from packages/web/src/components/coverage/ into packages/ui/src/coverage/, plus the pure utility modules confidence.ts and format.ts into packages/ui/src/lib/ (used by ~36 consumers across packages/web). Adds ./coverage/*, ./lib/confidence, ./lib/format subpath exports. freshness-table is refactored to be presentational: it no longer imports regeneratePage directly. The mutation is lifted to a thin client wrapper packages/web/src/components/coverage/freshness-table-wrapper.tsx that the coverage page uses; the table accepts an onRegenerate(pageId): Promise<void> callback and manages only per-row pending UI state. Type changes from anonymous PageResponse to canonical DocPage from @repowise/types/docs. coverage-donut is a mechanical move; strict-mode settings on @repowise/ui (noUncheckedIndexedAccess, exactOptionalPropertyTypes) surfaced three latent narrowing issues in confidence.languageColor, format.truncatePath, and coverage-donut's recharts integration, all defensively defaulted. Adds recharts as a direct dep on @repowise/ui. Adds COMPONENT_CONTRACTS.md documenting the prop interface for every component moved so far (ui/*, shared/*, coverage/*). 36 consumer files in packages/web rewrite their @/lib/utils/{confidence, format} imports mechanically. 4 new tests for FreshnessTable; packages/ui test suite is 11/11; packages/web type-check + production build clean. * feat(ui,web): move decisions-table and decision-health-widget into @repowise/ui/decisions Moves the two presentational decision components into packages/ui/src/decisions/ with the data-fetching lifted to caller-side wrappers, for cleaner separation of concerns. decisions-table becomes prop-driven: filter state is now controlled by the caller (so filter changes can drive SWR cache keys), and the table accepts decisions / filters / onFiltersChange / error / isLoading / onRetry. Types switch from anonymous DecisionRecordResponse to canonical DecisionRecord from @repowise/types/decisions. New DecisionsTableFilters, DecisionStatusFilter, DecisionSourceFilter exports. decision-health-widget becomes a pure render: accepts health: DecisionHealth | undefined, renders nothing while undefined. Two thin client wrappers in packages/web/src/components/decisions/ hold the SWR fetch and forward props. The decisions list page now imports the wrapper. decision-detail is deferred from this PR. It interleaves patchDecision mutations, sonner toast notifications with undo callbacks, a confirm-dialog state machine, and next/link navigation; lifting that contract cleanly is a deliberate design exercise that doesn't fit the mechanical-move scope. It stays in packages/web/src/components/decisions/ for now. 6 new tests; packages/ui test suite is 17/17. packages/web type-check + production build clean. CONTRACTS.md updated. * feat(ui,web): move dead-code summary-bar into @repowise/ui/dead-code Moves summary-bar from packages/web/src/components/dead-code/ into packages/ui/src/dead-code/. Type changes from anonymous DeadCodeSummaryResponse to canonical DeadCodeSummary from @repowise/types/dead-code (shapes match field-for-field). Adds ./dead-code/* per-file subpath export. findings-table and finding-row are deferred. The pair manages 7 pieces of UI/state, two distinct mutations (per-row patch and bulk resolve), sonner toast notifications with undo, a confirm-dialog state machine, tab + filter + selection state, and SWR-driven re-fetch on filter change. Lifting that contract is a deliberate design exercise that doesn't fit a mechanical move; both stay in packages/web/src/components/dead-code/ for now. 2 new tests for SummaryBar; packages/ui test suite is 19/19. packages/web type-check + production build clean. * feat(ui,web): move docs-tree into @repowise/ui/docs Moves docs-tree from packages/web/src/components/docs/ into packages/ui/src/docs/. Type changes from anonymous PageResponse to canonical DocPage from @repowise/types/docs. Three latent strict-mode narrowing issues were defensively defaulted (PageIcon className spread, two parts[parts.length - 1] accesses, one parts[0] access). docs-explorer and docs-viewer are deferred. docs-explorer uses the usePages data hook plus Next.js useSearchParams/useRouter for URL-driven state and coordinates docs-viewer; docs-viewer depends on three not-yet-moved wiki/* siblings, two graph-data hooks, and a download utility. Both need the wiki batch to land first or a deeper refactor; out of scope for a mechanical move. 2 new tests for DocsTree; packages/ui test suite is 21/21. packages/web type-check + production build clean. * feat(ui,web): move git domain components into @repowise/ui/git Twelve presentational components: bus-factor-panel, churn-bar, churn-histogram, co-change-list, commit-category-donut, commit-category-sparkline, contributor-bar, contributor-network, hotspot-table, ownership-table, ownership-treemap, risk-distribution-chart. All accept canonical engine artifacts via props (Hotspot, OwnershipEntry from @repowise/types/git). No data-hook imports — the caller fetches. Adds d3-force and d3-hierarchy as @repowise/ui deps. Strict-mode tightening (recharts formatter narrowing, palette fallbacks, ResizeObserver entries narrowing). Subpath exports ./git and ./git/* added; old packages/web/src/components/git directory removed; consumers rewired in hotspots, ownership, overview, wiki slug, and wiki git-history-panel. ChurnBar smoke test added (23 total ui tests passing). * feat(ui,web): move job-log into @repowise/ui/jobs JobLog is fully presentational — accepts an entries array and tails to maxLines. generation-progress stays in packages/web for now: its useJob SWR hook, cancelJob mutation, sonner toasts, and SSE chaining make it deeply mutation-coupled. Adds ./jobs/* subpath export and rewires the generation-progress JobLog import. ui type-check + 23/23 tests + web type-check clean. * feat(ui,web): move wiki domain components into @repowise/ui/wiki Six presentational components: code-block, confidence-badge, git-history-panel, mermaid-diagram, table-of-contents, wiki-markdown. git-history-panel swaps GitMetadataResponse for the canonical GitMetadata from @repowise/types/git. Wiki components reach across domains for git-side primitives (CommitCategorySparkline, CoChangeList) via @repowise/ui/git/* — no fetch coupling. Adds mermaid, react-markdown, and remark-gfm as @repowise/ui deps. The Next.js RSC wiki-renderer (next-mdx-remote/rsc + shiki), regenerate-button (mutation + GenerationProgress), version-history (usePageVersions hook), and security-panel (SWR) stay in packages/web for now. Subpath export ./wiki/* added; wiki-renderer rewires its sibling imports to @repowise/ui/wiki/*; consumers in app/page, docs-viewer, wiki/[...slug]/page, and graph-doc-panel rewired. * feat(ui,web,types): move chat presentation primitives into @repowise/ui/chat Five components: chat-markdown, tool-call-block, source-citations, chat-message, artifact-panel. The chat-interface (useChat hook, SSE merge, post mutation) and conversation-history (SWR + delete mutation) and model-selector (useProviders hook) stay in packages/web as deeply hook-coupled. Adds canonical ChatUIToolCall and ChatUIMessage to @repowise/types/chat — these are the post-stream-merge UI shapes that were previously declared inline in use-chat.ts. The web hook now re-exports these names so existing call sites keep working. Framework-neutrality fixes: source-citations uses a plain <a> instead of next/link; chat-message uses plain <img> with an assistantAvatarSrc override so non-Next consumers can swap the asset path. artifact-panel reuses the wiki-domain MermaidDiagram instead of duplicating the mermaid bootstrap. Subpath export ./chat/* added; consumers in graph-doc-panel, docs-viewer, and chat-interface rewired. ui type-check + 23/23 tests + web type-check + production build clean. * feat(ui,web): move dashboard overview tiles into @repowise/ui/dashboard Nine presentational tiles: attention-panel, decisions-timeline, dependency-heatmap, execution-flows-panel, health-score-ring, hotspots-mini, language-donut, module-minimap, ownership-treemap. Type swaps to canonical @repowise/types: HotspotResponse → Hotspot, DecisionRecordResponse → DecisionRecord, ModuleNodeResponse / ModuleEdgeResponse / ModuleGraphResponse → ModuleNode / ModuleEdge / ModuleGraph, ExecutionFlowEntry stays as the canonical name. The dashboard's OwnershipTreemap is intentionally separate from git/ownership-treemap (Card-wrapped variant for the overview tile). The AttentionItem type is now defined in @repowise/ui/dashboard/attention-panel and re-exported from packages/web/src/lib/utils/health-score.ts so existing call sites keep their import paths. Framework neutrality: replaced next/link with plain <a> in hotspots-mini, decisions-timeline, module-minimap (no prefetching — acceptable for navigation tiles). Strict-mode tightening: ResizeObserver entries narrowing in ownership-treemap and module-minimap, matrix indexing in dependency-heatmap, palette fallbacks in ownership-treemap. active-job-banner (SWR + listJobs polling), quick-actions (multiple mutations + GenerationProgress), and community-summary-grid (useCommunityDetail hook) stay in packages/web. Adds framer-motion as a @repowise/ui dep. Subpath export ./dashboard/* added; consumers in overview/page rewired. ui type-check + 23/23 tests + web type-check + production build clean. * feat(ui,web,types): move workspace components into @repowise/ui/workspace Five presentational components: contract-type-badge, contract-links-table, co-change-table, cross-repo-summary, repo-card. All accept canonical engine artifacts via props — none reach data hooks or mutations. Adds @repowise/types/workspace with RepoStats, WorkspaceCrossRepoSummary, WorkspaceContractSummary, WorkspaceContractLinkEntry, and WorkspaceCoChangeEntry — the same shapes packages/web previously declared inline as *Response types. Framework neutrality: repo-card swaps next/link for a plain <a>. cross-repo-summary uses a conditional spread for the optional description prop to satisfy exactOptionalPropertyTypes. Subpath export ./workspace/* added; consumers in workspace/page, workspace/contracts/page, and workspace/co-changes/page rewired. Old packages/web/src/components/workspace directory removed. ui type-check + 23/23 tests + web type-check + production build clean. * feat(ui,web,types): move standalone graph chrome into @repowise/ui/graph Four presentational components: graph-context-menu, graph-toolbar, graph-legend, graph-ego-sidebar. graph-ego-sidebar consumes the canonical @repowise/types/graph EgoGraph; the type gains an optional center_git_meta field referencing GitMetadata so the sidebar's owner / last-commit / commit-count display has a typed home. The xyflow host (graph-flow), its node/edge subcomponents, and the data-coupled panels (graph-doc-panel, graph-community-panel, path-finder-panel, graph-tooltip, elk-layout/use-elk-layout) stay in packages/web. They all subscribe to a GraphContext provider declared in graph-flow and reach into useGraph* / usePage hooks — moving any one of them would force GraphContext extraction or hook refactors that exceed the audit-and-defer threshold. graph-flow rewires its sibling imports for graph-toolbar, graph-legend, and graph-context-menu. ui type-check + 23/23 tests + web type-check + production build clean. * ci: publish internal @repowise-dev prereleases to GitHub Packages on push to next Adds .github/workflows/publish-internal.yml. On every push to `next` (and via workflow_dispatch), the workflow: 1. Type-checks @repowise/types + @repowise/ui and runs the ui Vitest suite as a pre-flight gate. 2. Computes 0.0.0-internal.<short-sha> as the prerelease version. 3. Rewrites name, version, and inter-package dep at publish time — @repowise/types becomes @repowise-dev/types, and @repowise/ui's dependency on @repowise/types becomes @repowise-dev/types pinned to the same internal version. `private: true` is dropped during the publish step. Source package.json files are unchanged on disk (workspace links keep working locally). 4. Publishes to https://npm.pkg.github.com under the @repowise-dev scope using the NPM_TOKEN_GITHUB_PACKAGES repo secret. publishConfig.registry is set on both source package.json files so that any accidental manual `npm publish` from a dev machine targets GitHub Packages rather than public npm. Explicitly does NOT trigger on push to main; only `next`. The PyPI publish workflow (publish.yml) only fires on v* tags and is completely unaffected. Downstream consumers install via npm aliases so existing `@repowise/...` import statements keep resolving without source changes: "@repowise/types": "npm:@repowise-dev/types@0.0.0-internal.<sha>", "@repowise/ui": "npm:@repowise-dev/ui@0.0.0-internal.<sha>"
…text, move symbols+jobs (#121) * refactor: rename @repowise/* to @repowise-dev/* across packages Source package names now match the published GitHub Packages scope so downstream consumers can drop the path-alias workaround. Updates the publish workflow to remove the source-rename steps that are now no-ops. * feat(ui,web): extract GraphContext and move presentational graph pieces Splits GraphContext into a standalone module (packages/ui/src/graph/ context.ts) so node/edge components can be consumed without depending on the graph-flow host. Moves the layout primitives (elk-layout, use-elk-layout), node/edge renderers (FileNode, ModuleGroupNode, DependencyEdge), and GraphTooltip from packages/web into @repowise-dev/ui/graph. graph-flow itself and the data-coupled panels (graph-doc-panel, graph-community-panel, path-finder-panel) stay in packages/web for now — they orchestrate useGraph* SWR hooks and will move under the wrapper pattern in a follow-up. * feat(ui,web): move symbols + generation-progress with wrapper pattern Presentational shells in @repowise-dev/ui take canonical data + handlers as props; data-fetching wrappers in packages/web plumb the SWR + SSE hooks. Affects: - symbols/symbol-graph-panel — accepts metrics/callData/heritageData - symbols/symbol-drawer — accepts an optional graphPanel slot - symbols/symbol-table — accepts items/importanceScores plus controlled filter props; drawer rendered via slot - jobs/generation-progress — accepts job/log/elapsed/actualCost + cancelling/onCancel; wrapper owns useJob, sse, toast, cancelJob Adds Vitest smokes for SymbolTable and GenerationProgress. * fix(ui,web): make new package exports webpack-resolvable - Switch graph-flow to subpath imports for the new graph context, layout, and node/edge files; the @repowise-dev/ui/graph barrel mixes .js-suffix re-exports that webpack can't resolve when the barrel is bundled. - Add explicit package.json exports for graph/context, graph/elk-layout, graph/use-elk-layout, and the nested nodes/* and edges/* paths. - Strip extraneous .js extensions from relative imports inside the new symbols/* and jobs/generation-progress.tsx files.
…e-dev/ui shells (#122) Decomposes packages/web/src/app/repos/[id]/blast-radius/page.tsx (456 lines) by extracting the section components into @repowise-dev/ui/blast-radius: RiskScoreCard, BlastRadiusSummary, TableSection, DirectRisksTable, TransitiveTable, CochangeTable, ReviewersTable, TestGapsList, plus BlastRadiusResults that composes the full results stack. The page wrapper continues to own input form state, SWR hotspot suggestions, and the API call. Shells are pure presentational. - packages/types: new blast-radius.ts with DirectRiskEntry, TransitiveEntry, CochangeWarning, ReviewerEntry, BlastRadiusResponse, BlastRadiusRequest. Re-exported from index and exposed via the ./blast-radius subpath. packages/web/src/lib/api/blast-radius.ts now re-exports from canonical types instead of redefining them. - packages/ui: new blast-radius/ domain with subpath export (./blast-radius and ./blast-radius/*). 12 vitest smoke tests (41/41 in package green). COMPONENT_CONTRACTS.md updated. - packages/web: page.tsx imports BlastRadiusResults from the shared package; section components removed from page.tsx. Build verified green; visual parity preserved (shells are byte-equivalent ports).
…ll + URL-customisable citations (#123) Stream 1: dispatch ArtifactPanel on `.type` and add per-variant renderers for the eight artifact shapes the chat backend actually emits (overview, context, risk_report, search_results, graph, decisions, dead_code, diagram). Reshape KnownChatArtifact to match what `_tool_*` returns; future strict-typed variants (StrictGraphArtifact / StrictDeadCodeArtifact / StrictDecisionsArtifact) are declared but unused, gating a Phase 2D backend normalisation. Stream 2: thread `buildHref` through SourceCitations so consumers (hosted frontend uses /s/{shortId}/wiki/...; OSS web stays on /repos/{id}/wiki/...) control routing without forking the component. Add singular SourceCitation chip for the typed ChatCitation surface. Stream 3: extract presentational ModelSelector shell to @repowise-dev/ui; OSS web's existing model-selector becomes a thin wrapper that forwards useProviders() output. Same pattern hosted-frontend will follow. Vitest smokes for every new renderer + the citation chip + the selector shell. Type-level contracts updated to mirror the new union.
…tings general-form (#124) Phase 2C OSS pass — closes the dashboard wrapper-pattern set started in Phase 1B.3 (graph + symbols + jobs) and adds a presentational `settings/general-form` shell that hosted can reuse in read-only mode. @repowise-dev/types * New `jobs.ts` — canonical `Job` + `JobStatus`. * New `settings.ts` — `RepoSettingsValue` for the form contract. @repowise-dev/ui * dashboard/active-job-banner — pure shell; takes `job: Job | null` + optional `detailsHref`. Wrapper owns SWR polling + freshness. * dashboard/quick-actions — pure shell; mutations forwarded via `onAction(key)` callback bag, optional `activeJobSlot` ReactNode for the running-job swap-in. Cost estimator stays inline. * dashboard/community-summary-grid — pure shell; `useCommunityDetail` lifted to wrapper, single SWR subscription per click. * settings/general-form — read-only when `onSubmit` is omitted, full edit + chip UI when wired. Hosted ships read-only (multi-tenant persistence deferred to Phase 5 RBAC). * New `./settings` subpath export. packages/web * Wrappers under `components/dashboard/` and `components/repos/` forward to the shells; pre-extraction monoliths deleted. * Consumers in `repos/[id]/{layout,overview,settings}` updated. Tests: 14 new vitest smokes (ui suite 72/72 green).
Surface symbol-level heritage relations (extends / implements / trait_impl / mixin / method_overrides / method_implements) and the engine's security_findings table shape as first-class canonical contracts so downstream consumers can render them without redeclaring the shape. Heritage types mirror the engine's resolved-vs-raw split — child_id and parent_id are present on resolved relations, absent on raw entries lifted out of parsed_files.json. SymbolHeritage exposes both directions (parents this symbol declares, children pointing at this symbol). SecurityFinding is taken verbatim from the consumer-side shape already shipped in packages/web/src/lib/api/security.ts so existing OSS-web callers don't need to adapt. Type-level tests via vitest --typecheck pin the discriminants and the optional-vs-required field split.
…ss remaining UI domains (#126) Lifts the last deferred-presentation components from packages/web into @repowise-dev/ui as pure shells, with caller-side wrappers owning data hooks, mutations, and side effects. Closes the gap from the prior component-move passes (#119–#125). Wiki (3): regenerate-button, security-panel, version-history. Plus a shared MDX components map and a framework-neutral preprocessor so the RSC wiki-renderer in each consuming app can render without forking the in-page styling. Chat (2): chat-interface, conversation-history. Shells take messages / callbacks via props; the SSE transport, SWR cache, and toast plumbing stay in the wrapper. Allows alternate transports (e.g. multi-repo fan-out) to consume the same shell. Graph (4): graph-flow, graph-doc-panel, graph-community-panel, path-finder-panel. graph-flow ships as a presentational canvas with render-slot props for the path-finder + community-panel children; caller-side wrapper supplies the SWR-driven datasets and renders the deeper wrappers into those slots. Presentational use-debounce moved to @repowise-dev/ui/hooks. Workspace pull-back: package-deps-table promoted to canonical, plus a slim repo-card-compact variant for callers that don't have RepoStats / GitSummary per member. WorkspacePackageDepEntry added to canonical types. @repowise-dev/types: NodeSearchResult added; GraphPath gains an optional visual_context; WorkspacePackageDepEntry added. Verified: packages/{types,ui,web} type-check clean, packages/ui vitest 98/98, packages/web next build clean.
Adds "sideEffects" listing only the CSS entry points so bundlers can safely drop unused subpath modules. Without this field, Webpack / Rollup / Turbopack must assume every module has side effects, which defeats the granular subpath exports (./graph/*, ./dashboard/*, etc.) when downstream consumers import a single named export. The package now ships its global stylesheet as the only retained side-effecting module; everything under src/ is pure ESM and safe to prune. Behaviour is unchanged for consumers that only need a couple of components — they get the leaner bundle for free.
…ce deps Both packages were imported throughout packages/web but only resolved via implicit workspace hoisting. Declaring them explicitly makes the dependency relationship discoverable and prevents isolated installs (e.g. cd packages/web && npm install) from failing with module-not-found. Lockfile picks up pre-existing drift in the packages/ui entry (@xyflow/react, fuse.js were already in packages/ui/package.json but absent from the lock).
Bump version to 0.5.0 across pyproject.toml and the three subpackage __init__.py files. Add 0.5.0 + 0.4.1 changelog entries (0.4.0 entry re-dated from 'Unreleased' to its actual 2026-04-26 release date). README: replace stale 'Live Demo → /examples' with 'Explore real codebases → /explore'. Refresh the Hosted version section to lead with parity + zero ops, surface the dogfood snapshot (repowise indexing itself), and frame integrations as rolling out rather than already-shipped.
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
pyproject.tomland the three subpackage__init__.pyfiles. Changelog entries added for 0.5.0 and 0.4.1; 0.4.0 entry re-dated from "Unreleased" to its actual 2026-04-26 release date.packages/webinto shared@repowise-dev/uiand@repowise-dev/typesworkspace packages. Fully transparent topip install repowiseusers — the publishedrepowise-web.tar.gzstandalone bundle is unchanged in shape and behaviour.pyproject.tomlnow uses[tool.setuptools.packages.find]to auto-discover allrepowise.*subpackages. Eliminates the missing-subpackage drift class that previously required hotfixes (fix(build): correct setuptools packages list #97, fix(build): include missing setuptools subpackages #110).repowise updatenow persists LLM costs to thellm_coststable (fix(update): persist LLM costs to llm_costs table during incremental updates #108); workspace dashboard contract summary renders when contracts exist but no cross-repo links (fix(workspace): show contract summary when contracts exist but no cross-repo links #111).packages/webdeclares workspace deps explicitly so isolated installs don't fail with module-not-found.Test plan
uv build --wheel) →dist/repowise-0.5.0-py3-none-any.whl, 270 files, all 19 CLI commands + 7 core subpackages + 3 server subpackages +.scm/.j2resources present.npm run build --workspace packages/web) — Next.js 15 standalone, 22 routes,transpilePackagescorrectly compiles@repowise-dev/ui/@repowise-dev/typessource inline.serve_cmd.pypath conventions match both local-monorepo build output andpublish.ymltarball flattening.repowise servesmoke test: dashboard, chat, blast-radius, graph, hotspots, ownership, wiki, decisions all render.v0.5.0release artifacts are published).Merge convention
Per
backend/docs/OPEN_ITEMS.md: use a regular merge commit (not squash) so the per-PR commit structure is preserved for rollback.After merge
Tag
v0.5.0onmainto trigger thepublish.ymlworkflow (builds wheel + standalone web tarball, attaches both to the GitHub release, publishes to PyPI).