Interview Prep Application of Moss#391
Conversation
Index the open workspace with a local Moss SessionIndex and expose a sidebar for live semantic search with jump-to-file results. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop auto-indexing on activate; add a sidebar Create Index flow, resume existing sessions, and harden indexing/search readiness. Co-authored-by: Cursor <cursoragent@cursor.com>
Run the native Moss runtime in a forked Node worker so crashes cannot take down VS Code, save/load indexes from disk across sessions, and refresh sidebar branding with Moss wordmarks and avatar. Co-authored-by: Cursor <cursoragent@cursor.com>
Add Moss Cloud push/restore, sidebar gear settings for credentials and cloud sync, dependency exclusions, cross-platform VSIX packaging with bundled native binaries, CI workflow, privacy policy, and improved Node worker discovery. Co-authored-by: Cursor <cursoragent@cursor.com>
Add a self-contained Remotion promo under apps/moss-vscode/promo and ignore local agent skill files in the repo root. Co-authored-by: Cursor <cursoragent@cursor.com>
Local Pipecat + Ollama voice system-design coach with Moss-grounded rubrics and a Next.js assist UI. Co-authored-by: Cursor <cursoragent@cursor.com>
Default to llama3.1 for tool support; grade via grade_candidate_answer and simplify the assist UI. Co-authored-by: Cursor <cursoragent@cursor.com>
Defer grades until the coach finishes speaking, drop stale/interrupted results, and stop mid-turn question flicker. Co-authored-by: Cursor <cursoragent@cursor.com>
Support System Design, Agent-Native, and ML Concepts tracks with isolated grading via a subprocess worker. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
This PR adds two new developer-facing applications to the Moss repo: (1) a local-first, voice-based interview coach grounded by Moss retrieval, and (2) a VS Code extension that provides semantic code search over the active workspace (plus packaging/CI and a Remotion promo project).
Changes:
- Introduces
apps/moss-interview-coach/: FastAPI + Pipecat SmallWebRTC voice pipeline (Whisper/Ollama/Piper) with Moss-backed rubric retrieval and subprocess-based grading, plus a Next.js assist UI. - Introduces
apps/moss-vscode/: a VS Code extension for local semantic code search with persisted indexes and optional cloud sync, including publishing docs and CI workflow. - Updates top-level docs and repo tooling files (README, .gitignore, VS Code launch/tasks) to support the new apps.
Reviewed changes
Copilot reviewed 92 out of 131 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Documents the new interview coach and updates the apps tree (needs to reflect VS Code extension too). |
| apps/moss-vscode/tsconfig.json | TypeScript compiler settings for the VS Code extension. |
| apps/moss-vscode/src/extension.ts | VS Code activation wiring, indexing workflow, persistence, and cloud sync commands. |
| apps/moss-vscode/src/ui/sidebar.ts | Webview UI provider for search/settings and message bridge. |
| apps/moss-vscode/src/worker/mossWorker.ts | Worker process that hosts Moss runtime operations off the extension host. |
| apps/moss-vscode/src/search/search.ts | Query mapping + small helper utilities for semantic search results. |
| apps/moss-vscode/src/moss/persistence.ts | Local disk cache + meta.json persistence helpers for indexes. |
| apps/moss-vscode/src/moss/config.ts | Credential resolution (settings/secrets/env) + search/index settings helpers. |
| apps/moss-vscode/src/moss/client.ts | Worker-backed session manager and Node binary resolution logic. |
| apps/moss-vscode/src/indexer/scanner.ts | Workspace scanning and safe file loading for indexing. |
| apps/moss-vscode/src/indexer/indexer.ts | Chunking + indexing orchestration and incremental update watchers. |
| apps/moss-vscode/src/indexer/excludes.ts | Hard + configurable exclusion logic for indexing paths. |
| apps/moss-vscode/src/indexer/chunker.ts | Line-based chunking and metadata for file navigation. |
| apps/moss-vscode/scripts/verify-package.mjs | Verifies VSIX contains expected artifacts and moss-core bundle. |
| apps/moss-vscode/scripts/prepackage.mjs | Installs cross-platform native moss-core binaries before packaging. |
| apps/moss-vscode/README.md | Extension usage docs (setup, commands, settings, architecture). |
| apps/moss-vscode/PUBLISHING.md | VS Code Marketplace publishing steps and CI notes. |
| apps/moss-vscode/PRIVACY.md | Privacy policy for local indexing + optional cloud sync. |
| apps/moss-vscode/package.json | VS Code extension manifest (commands, settings, engines, deps). |
| apps/moss-vscode/esbuild.mjs | Esbuild bundling config for extension + worker. |
| apps/moss-vscode/media/sidebar.css | Styling for the extension’s webview sidebar UI. |
| apps/moss-vscode/media/icon.svg | Activity bar icon for the extension. |
| apps/moss-vscode/LICENSE | License file for the extension package. |
| apps/moss-vscode/CHANGELOG.md | Initial extension changelog entry. |
| apps/moss-vscode/.vscodeignore | Packaging ignore rules for VSIX output. |
| apps/moss-vscode/.vscode/tasks.json | Local dev tasks for building/watching the extension. |
| apps/moss-vscode/.vscode/launch.json | Local debug configuration to run the extension host. |
| apps/moss-vscode/.gitignore | App-local ignores for build artifacts and env files. |
| apps/moss-vscode/.env.example | Example Moss credentials env file for the extension. |
| apps/moss-vscode/promo/package.json | Remotion promo project dependencies and scripts. |
| apps/moss-vscode/promo/tsconfig.json | TS config for promo rendering code. |
| apps/moss-vscode/promo/eslint.config.mjs | ESLint config for the promo project. |
| apps/moss-vscode/promo/.prettierrc | Prettier config for the promo project. |
| apps/moss-vscode/promo/.gitignore | Promo-local ignores (node_modules, out/ render output, etc.). |
| apps/moss-vscode/promo/remotion.config.ts | Remotion config (image format, Tailwind v4 integration). |
| apps/moss-vscode/promo/README.md | Promo storyboard and render commands. |
| apps/moss-vscode/promo/src/index.ts | Remotion root registration entrypoint. |
| apps/moss-vscode/promo/src/Root.tsx | Declares the Remotion composition for the promo. |
| apps/moss-vscode/promo/src/index.css | Tailwind import for Remotion UI styling. |
| apps/moss-vscode/promo/src/compositions/MossVscodePromo.tsx | Main promo composition, scenes, and audio/SFX timeline. |
| apps/moss-vscode/promo/src/scenes/HeroScene.tsx | Promo hero scene. |
| apps/moss-vscode/promo/src/scenes/GrepFailureScene.tsx | Promo “grep noise” scene. |
| apps/moss-vscode/promo/src/scenes/HowItWorksScene.tsx | Promo pipeline explanation scene. |
| apps/moss-vscode/promo/src/scenes/ProductDemoScene.tsx | Promo product demo scene (indexing + semantic query + jump). |
| apps/moss-vscode/promo/src/scenes/EditorSuperpowersScene.tsx | Promo features montage scene. |
| apps/moss-vscode/promo/src/scenes/OutroScene.tsx | Promo outro scene. |
| apps/moss-vscode/promo/src/components/VfxLayer.tsx | Vignette/grain/flash VFX overlay components. |
| apps/moss-vscode/promo/src/components/SceneBridge.tsx | Scene enter/exit transitions (opacity/scale/blur). |
| apps/moss-vscode/promo/src/components/SequoiaBackdrop.tsx | Backdrop image + scrim component. |
| apps/moss-vscode/promo/src/components/PipelineBeat.tsx | Reusable beat + scan/chunk/embed/query visuals. |
| apps/moss-vscode/promo/src/components/DropText.tsx | Headline animation component. |
| apps/moss-vscode/promo/src/components/SuperpowerCard.tsx | Feature card component. |
| apps/moss-vscode/promo/src/components/MossSidebarPanel.tsx | Promo mock Moss sidebar panel component. |
| apps/moss-vscode/promo/src/components/MossWordmark.tsx | Wordmark/symbol/avatar image helpers. |
| apps/moss-vscode/promo/src/components/CrashTogetherLogos.tsx | VS Code + Moss logo collision/morph animation. |
| apps/moss-vscode/promo/src/components/CrashToMossOutro.tsx | Outro lockup animation composition. |
| apps/moss-vscode/promo/src/components/vscode/VSCodeWindow.tsx | Promo mock VS Code window layout component. |
| apps/moss-vscode/promo/src/components/vscode/TitleBar.tsx | Promo mock title bar. |
| apps/moss-vscode/promo/src/components/vscode/ActivityBar.tsx | Promo mock activity bar. |
| apps/moss-vscode/promo/src/components/vscode/TabBar.tsx | Promo mock tab bar. |
| apps/moss-vscode/promo/src/components/vscode/StatusBar.tsx | Promo mock status bar. |
| apps/moss-vscode/promo/src/components/vscode/CodeEditorPane.tsx | Promo mock editor pane with simple token coloring. |
| apps/moss-vscode/promo/src/components/vscode/FindInFilesPanel.tsx | Promo mock “Find in Files” sidebar panel. |
| apps/moss-vscode/promo/src/lib/colors.ts | Promo color tokens (VS Code + brand palette). |
| apps/moss-vscode/promo/src/lib/demo.ts | Demo script data (queries, hits, code lines). |
| apps/moss-vscode/promo/src/lib/easing.ts | Easing curves for animation. |
| apps/moss-vscode/promo/src/lib/music.ts | Music bed section volume automation. |
| apps/moss-vscode/promo/src/lib/sfx.ts | SFX timing constants and event frames. |
| apps/moss-vscode/promo/src/lib/timing.ts | Scene timing constants and cut frames. |
| apps/moss-vscode/promo/src/lib/typing.ts | Variable-speed “typing” frame simulation helper. |
| apps/moss-vscode/promo/src/lib/typography.ts | Typography size tokens. |
| apps/moss-vscode/promo/public/branding/vscode/icon.svg | Promo VS Code icon asset. |
| apps/moss-vscode/promo/public/branding/moss/icon.svg | Promo Moss icon asset. |
| apps/moss-interview-coach/README.md | End-to-end setup + architecture notes for interview coach. |
| apps/moss-interview-coach/.gitignore | Ignores local model downloads and env/build outputs. |
| apps/moss-interview-coach/backend/requirements.txt | Backend dependencies (FastAPI, Moss, Pipecat, etc.). |
| apps/moss-interview-coach/backend/.env.example | Backend env template (Moss creds + local model settings). |
| apps/moss-interview-coach/backend/tracks.py | Track definitions (prompts, index names, knowledge files). |
| apps/moss-interview-coach/backend/ingest_knowledge.py | Ingest script to create/load/query per-track Moss indexes. |
| apps/moss-interview-coach/backend/server.py | FastAPI server exposing SmallWebRTC offer/patch and running the Pipecat pipeline with Moss injection + grading. |
| apps/moss-interview-coach/backend/grader_worker.py | Subprocess grader that calls Ollama and returns structured JSON grade. |
| apps/moss-interview-coach/backend/knowledge/system_design_rubrics.json | System design rubric knowledge source. |
| apps/moss-interview-coach/backend/knowledge/agent_native_rubrics.json | Agent-infra rubric knowledge source. |
| apps/moss-interview-coach/backend/knowledge/ml_concepts_rubrics.json | ML concepts rubric knowledge source. |
| apps/moss-interview-coach/frontend/package.json | Next.js frontend dependencies/scripts for assist UI. |
| apps/moss-interview-coach/frontend/tsconfig.json | TypeScript config for Next.js frontend. |
| apps/moss-interview-coach/frontend/next.config.ts | Next.js configuration. |
| apps/moss-interview-coach/frontend/next-env.d.ts | Next.js TS environment declarations. |
| apps/moss-interview-coach/frontend/postcss.config.mjs | Tailwind v4 PostCSS plugin configuration. |
| apps/moss-interview-coach/frontend/.env.example | Frontend env template (backend URL). |
| apps/moss-interview-coach/frontend/app/layout.tsx | Next.js app layout and metadata. |
| apps/moss-interview-coach/frontend/app/globals.css | Tailwind + global styling for the interview coach UI. |
| .github/workflows/moss-vscode-ci.yml | CI workflow to build/typecheck/package/verify the VS Code extension. |
| .gitignore | Adds ignores for local agent skill artifacts. |
| .vscode/tasks.json | Root tasks to build/watch the VS Code extension. |
| .vscode/launch.json | Root launch config to run the VS Code extension host. |
Files not reviewed (1)
- apps/moss-interview-coach/frontend/package-lock.json: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Raise index batch size, require moss-core from the lockfile for packaging, check Unix execute bits when resolving Node, fix promo glob text, and document the VS Code extension in the root README apps tree. Co-authored-by: Cursor <cursoragent@cursor.com>
|
@cubic-dev-ai review this pull request |
@HarshaNalluru I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
4 issues found across 27 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="apps/moss-interview-coach/frontend/app/globals.css">
<violation number="1" location="apps/moss-interview-coach/frontend/app/globals.css:1">
P2: DM Sans and Instrument Serif can fail to load in the compiled app because Tailwind v4 inlines its import ahead of this remote `@import`. Place the Google Fonts import before `@import "tailwindcss"`.</violation>
<violation number="2" location="apps/moss-interview-coach/frontend/app/globals.css:2">
P2: Google Fonts (DM Sans and Instrument Serif) are loaded via CSS `@import url(...)` in `globals.css` instead of using Next.js's built-in `next/font` system. The CSS `@import` approach triggers a render-blocking external stylesheet fetch that cannot be optimized by Next.js — it prevents font preloading, disables automatic font subsetting, and blocks the initial paint. In a Next.js app, the recommended pattern is to load Google Fonts through `next/font`, which generates optimized, self-hosted font files with automatic preload links and eliminates the external blocking request.</violation>
</file>
<file name="apps/moss-interview-coach/backend/tracks.py">
<violation number="1" location="apps/moss-interview-coach/backend/tracks.py:13">
P3: Track IDs and labels now have a second source of truth in `frontend/app/page.tsx`, so future backend track changes can leave the UI stale or send an ID that normalizes to the default. Consider populating the selector from `/api/tracks` or generating both definitions from shared data.</violation>
</file>
<file name="apps/moss-interview-coach/README.md">
<violation number="1" location="apps/moss-interview-coach/README.md:73">
P3: After following the copy-`.env.example` setup, the grade model does not track `OLLAMA_MODEL`; it remains explicitly pinned to `llama3.1`. The table should describe that effective default, or the example variable should be left unset so the documented fallback applies.</violation>
</file>
Tip: instead of fixing issues one by one fix them all with cubic
Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.
Re-trigger cubic
Validate tracks strictly on offer, recover from Moss failures, isolate grader parsing, tighten ingest/rubric wording, and fix frontend session races, fonts, lint, and reduced-motion. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
All reported issues were addressed across 17 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
## What Makes the Codex PR reviewer run on **all pull requests, including forks/contributors** — today fork PRs are silently skipped. ## Why forks were skipped A fork's `pull_request` run gets a read-only token and **no secrets** (GitHub's fork-safety default), so the reviewer can't get `OPENAI_API_KEY`. The old workflow acknowledged this by gating itself to same-repo branches (`sameRepo` check), so every contributor PR got `Skipping Codex review: … is from a fork`. You can't fix this by dropping the gate — the secret still isn't there on fork runs. You need a trigger that *has* secrets, without ever running fork code next to them. ## How — two-stage split | Stage | File | Trigger | Secrets? | Touches PR code? | |---|---|---|---|---| | 1. Collect diff | `codex-review.yml` | `pull_request` (all PRs) | ❌ none | checkout + `git diff` only (no build/install) | | 2. Review + post | `codex-review-post.yml` | `workflow_run` (base context) | ✅ | ❌ — reads the diff artifact only | Stage 1 runs on every PR with no secrets, computes the diff, and uploads it as an artifact. Stage 2 is triggered by Stage 1's completion, runs in the **base-repo** context (so it has secrets even for forks), downloads the diff, runs Codex over the **diff text only**, and posts the inline review. **Fork code never executes in a job that holds the key** — that's the structural guarantee that makes reviewing fork PRs safe, and it's more robust than `pull_request_target` (which would put fork code on disk beside the secret and rely on "no one ever adds a build step"). ## Security notes - **Anti-spoofing:** the artifact carries the PR number; Stage 2 requires `pr.head.sha === workflow_run.head_sha` (a value GitHub sets, not the fork) before posting, so a tampered artifact can't redirect the review onto another PR. PR number is validated as digits-only. - **Least privilege:** Stage 1 is `contents: read`. Stage 2 is `contents: read`, `actions: read` (to fetch the artifact), `pull-requests/issues: write` (to post). - **Residual risk — please use a scoped key.** Codex still reads the untrusted diff as *data*, and per the action's docs the API key "flows through the proxy, so Codex could read it if it can reach process memory." A prompt-injection payload in a diff could in principle try to coax the key into a review comment. The two-stage split does **not** remove this (it removes code *execution*), so use a low-limit / restricted `OPENAI_API_KEY` for this workflow. ## Behavior changes - Auto-reviews **all non-draft, non-bot PRs** (previously same-repo only). - **Drops** the `@codex review` comment trigger and the trusted-commenter gate (no longer needed to keep forks out). Easy to re-add as an opt-in gate if you'd prefer maintainer-triggered reviews on forks to control cost. ## Activation caveat `workflow_run` only fires for the copy of these workflows **on the default branch**, so Codex review activates once this is merged to `main` — **this PR will not review itself.** After merge, opening any fork PR (or re-syncing an existing one like #391/#393) will exercise it end-to-end. ## Not tested in CI here The `openai/codex-action` step reviews a pre-computed `pr.diff` in an empty `git init`'d working dir (rather than a full checkout). YAML + embedded JS are validated locally; the first live run after merge is the real end-to-end test. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/usemoss/moss/pull/437?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
Pull Request Checklist
Please ensure that your PR meets the following requirements:
Description
Adds two Moss-powered developer apps:
apps/moss-interview-coach/— local-first voice interview coach (Pipecat SmallWebRTC + Whisper/Ollama/Piper) with Moss rubric retrieval, multi-track topic selection, Assist feedback panel, and subprocess-isolated grading.apps/moss-vscode/— VS Code extension for local semantic code search over the active workspace (worker-backed Moss runtime, persisted indexes, optional cloud sync), plus packaging/CI and a Remotion promo.Type of Change