Skip to content

release: v0.5.0 — frontend monorepo restructure, build hardening, jobs reliability#132

Merged
RaghavChamadiya merged 12 commits intomainfrom
next
May 3, 2026
Merged

release: v0.5.0 — frontend monorepo restructure, build hardening, jobs reliability#132
RaghavChamadiya merged 12 commits intomainfrom
next

Conversation

@RaghavChamadiya
Copy link
Copy Markdown
Collaborator

Summary

Test plan

  • Wheel builds clean (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/.j2 resources present.
  • Web UI builds clean (npm run build --workspace packages/web) — Next.js 15 standalone, 22 routes, transpilePackages correctly compiles @repowise-dev/ui/@repowise-dev/types source inline.
  • serve_cmd.py path conventions match both local-monorepo build output and publish.yml tarball flattening.
  • repowise serve smoke test: dashboard, chat, blast-radius, graph, hotspots, ownership, wiki, decisions all render.
  • Tarball-download path (validated post-merge once v0.5.0 release 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.0 on main to trigger the publish.yml workflow (builds wheel + standalone web tarball, attaches both to the GitHub release, publishes to PyPI).

RaghavChamadiya and others added 12 commits May 1, 2026 15:55
* 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.
@RaghavChamadiya RaghavChamadiya requested a review from swati510 as a code owner May 3, 2026 11:24
Copy link
Copy Markdown
Collaborator

@swati510 swati510 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@RaghavChamadiya RaghavChamadiya merged commit aadd8f5 into main May 3, 2026
6 checks passed
@RaghavChamadiya RaghavChamadiya deleted the next branch May 3, 2026 11:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants