-
Notifications
You must be signed in to change notification settings - Fork 0
spec(project): 定义 Project Workspace MVP #53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
hifizz
merged 101 commits into
codex/feat-agent-observability-evaluation
from
codex/research-project-workspace-design
Sep 2, 2026
Merged
Changes from all commits
Commits
Show all changes
101 commits
Select commit
Hold shift + click to select a range
54bc076
docs(project): add workspace design research
hifizz 4d9eb5b
docs(project): 补充依赖支线成果交接场景
hifizz 7875a99
docs(project): 收敛引用与 Outcome 初步方案
hifizz 7485666
docs(project): 冻结 Project MVP 范围与开发节奏
hifizz 1675ed3
spec(project): 初始化 Project Workspace MVP OpenSpec
hifizz bf379eb
spec(project): 添加 Project Workspace MVP proposal
hifizz 0570adb
spec(project): 添加 Project Workspace MVP design
hifizz ed34702
spec(project): 添加 Project Workspace MVP requirements
hifizz f63bce6
spec(project): 添加 Project Workspace MVP tasks
hifizz 5e6599e
feat(project): add workspace data contracts
hifizz 1aa1f9f
feat(project): add workspace server APIs
hifizz 07e7891
feat(project): inject contract and project files
hifizz c170f6a
ci(project): add temporary workspace validation
hifizz b1e0ce5
feat(project): add workspace client state
hifizz d7b0381
ci(project): patch legacy workspace fixtures
hifizz fae299e
test(project): update legacy workspace fixtures [skip ci]
github-actions[bot] 6d727c1
ci(project): rerun workspace validation
hifizz f3471d7
feat(project): add project file upload client
hifizz 15db869
feat(project): unify project workspace panel
hifizz afd3837
style(project): add project panel workspace styles
hifizz 4965cfa
feat(project): expose project workspace from topbar
hifizz 0a6ad27
fix(project): keep project panel compatible with workspace shell
hifizz 2b2c48b
fix(project): preserve typed ui messages in attachment context
hifizz 35529bb
ci(project): keep legacy harness compatible with workspace client
hifizz a1a0e4e
test(project): update legacy workspace fixtures [skip ci]
github-actions[bot] 5225574
docs(openspec): record project workspace ui implementation
hifizz 29eecdf
test(project): complete legacy workspace client mock
hifizz ac412a4
test(project): complete workspace client fixture [skip ci]
github-actions[bot] 4b6ee46
ci(project): remove one-shot compatibility patch
hifizz 5467b8d
docs(openspec): mark completed project workspace tasks
hifizz 8c19d42
test(project): cover contract generation boundaries
hifizz 33db755
refactor(project): extract attachment content resolver
hifizz 641c2ea
refactor(project): use shared attachment content resolver
hifizz 6d2041d
docs(openspec): complete contract boundary and resolver tasks
hifizz da14e99
refactor(project): bind project panel to normalized store
hifizz 048907d
feat(project): bind project panel resources to conversation store
hifizz 5488635
ci(project): apply store-bound panel integration
hifizz 13c2803
ci(project): wire store-bound project panel
hifizz c776880
ci(project): trigger store-bound panel patch
hifizz 7fff1ff
refactor(project): share project panel conversation store
hifizz 1d5f1ff
ci(project): restore read-only workspace validation
hifizz ed07333
ci(project): remove one-shot panel patch workflow
hifizz 73dfcf0
feat(project): expose stable message anchors for provenance
hifizz b25d9f7
feat(project): locate and highlight artifact source message
hifizz eb72c3c
test(project): preserve workspace state across panel refresh
hifizz 84367f2
ci(project): verify project panel workspace isolation
hifizz 6abeeff
docs(openspec): complete project panel workspace tasks
hifizz 4d878a5
test(project): cover workspace schema commands and repositories
hifizz eed024d
refactor(project): extract deterministic attachment context policy
hifizz 9423d3b
refactor(project): apply pure attachment context policy
hifizz 58fba19
test(project): make pdf retrieval policy injectable
hifizz 07fdd67
test(project): cover deterministic project context policies
hifizz fddb626
ci(project): run project workspace database acceptance
hifizz 1bdae60
test(project): cover workspace API isolation and bootstrap
hifizz 5276376
ci(project): run workspace API integration
hifizz 1ac26d5
test(project): cover project panel UI contract
hifizz 53bae75
feat(evals): model project workspace context in agent cases
hifizz 77e3bf9
feat(evals): seed project contract and project files
hifizz fcf62ed
test(evals): add project workspace coverage cases
hifizz ab35aeb
test(evals): verify project workspace production seed
hifizz d2efd6a
test(project): fix contract boundary generation setup
hifizz 053d0f3
test(project): verify workspace history stability
hifizz b5730b0
test(project): prevent implicit artifact cross-thread context
hifizz e92a827
ci(project): run complete project workspace acceptance suite
hifizz 19f8853
spec(project): clarify bootstrap isolation semantics
hifizz 3c78503
spec(project): preserve empty bootstrap shell semantics
hifizz 1dc0257
test(project): align bootstrap shell isolation semantics
hifizz fbb14c7
ci(project): run correct agent eval command
hifizz 57bb1e8
eval(project): register workspace cases in manifests
hifizz 2bc3997
spec(project): mark project workspace test suite complete
hifizz f97a3ea
test(project): verify workspace migration on legacy data
hifizz 55a18c9
ci(project): verify migration compatibility and schema sync
hifizz 2f0f58c
ci(project): capture generated workspace migration snapshot
hifizz 391d83b
ci(project): add one-time drizzle snapshot repair
hifizz 19adc44
fix(db): add project workspace drizzle snapshot
github-actions[bot] e88aeb2
ci(project): remove one-time snapshot repair
hifizz 8002d59
ci(project): restore migration sync validation
hifizz 0bfda9b
spec(project): mark migration validation complete
hifizz b5ee42d
ci(project): add release validation gates
hifizz 95dca07
refactor(project): remove obsolete duplicate artifact drawer
hifizz 167017d
refactor(project): remove effect-driven panel state sync
hifizz 0a4a7df
ci(project): lint active project panel implementation
hifizz 4d0713c
refactor(project): add thin legacy harness adapter
hifizz d402573
ci(project): lint legacy panel adapter too
hifizz ebf8003
refactor(ai): remove relay legacy environment fallback
hifizz a30b2c9
feat(chat): group model selector by provider
hifizz 4a1d425
style: compact model selector popover
hifizz 32fe44a
chore(db): remove PR migration artifacts
hifizz 95b3dc6
feat(thread-chat): protect selection bubble draft from lossy dismissal
hifizz 3750019
fix(thread-chat): restore selection bubble focus and entrance
hifizz 2fc186a
style: 优化样式
hifizz 1e58754
style: update markdown style
hifizz db9a507
style: 优化样式
hifizz 7c359b4
docs(composer): add issue 68 research handoff
hifizz e0ca368
docs(composer): define attachment demo MVP
hifizz df60826
spec(composer): scaffold attachment composer demo change
hifizz 65a8380
spec(composer): add attachment demo proposal
hifizz 8ac21df
spec(composer): define attachment demo requirements
hifizz f3e7e50
spec(composer): add attachment demo design
hifizz fd9a2e3
spec(composer): add attachment demo tasks
hifizz dd50fa6
feat(composer): apply attachment demo spec
hifizz File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,135 @@ | ||
| name: Project Workspace CI | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - codex/research-project-workspace-design | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| validate: | ||
| runs-on: ubuntu-latest | ||
| services: | ||
| postgres: | ||
| image: pgvector/pgvector:pg17 | ||
| env: | ||
| POSTGRES_USER: postgres | ||
| POSTGRES_PASSWORD: postgres | ||
| POSTGRES_DB: postgres | ||
| ports: | ||
| - 5432:5432 | ||
| options: >- | ||
| --health-cmd "pg_isready -U postgres -d postgres" | ||
| --health-interval 10s | ||
| --health-timeout 5s | ||
| --health-retries 5 | ||
| env: | ||
| DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres | ||
| DIRECT_URL: postgres://postgres:postgres@localhost:5432/postgres | ||
| BETTER_AUTH_SECRET: project-workspace-ci-secret-at-least-32-characters | ||
| MINIMAX_API_KEY: project-workspace-build-placeholder | ||
| MINIMAX_BASE_URL: https://example.invalid/v1 | ||
| LLM_MODEL_ID: project-workspace-build-model | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: pnpm/action-setup@v4 | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: 24 | ||
| cache: pnpm | ||
|
|
||
| - name: Install dependencies | ||
| run: pnpm install --frozen-lockfile | ||
|
|
||
| - name: Typecheck | ||
| run: pnpm typecheck | ||
|
|
||
| - name: Targeted ESLint | ||
| run: >- | ||
| pnpm exec eslint | ||
| app/thread-chat/chat/chat-view.tsx | ||
| app/thread-chat/core/projections.ts | ||
| app/thread-chat/core/store.ts | ||
| app/thread-chat/core/types.ts | ||
| app/thread-chat/gate-3-harness/mock-v1-runtime.ts | ||
| app/thread-chat/net/client.ts | ||
| app/thread-chat/net/commands/conversation-commands.ts | ||
| app/thread-chat/net/project-file-upload.ts | ||
| app/thread-chat/orchestration/artifacts/artifact-drawer.tsx | ||
| app/thread-chat/orchestration/artifacts/project-panel.tsx | ||
| app/thread-chat/orchestration/artifacts/store-bound-project-panel.tsx | ||
| app/thread-chat/orchestration/navigation/thread-chat-topbar.tsx | ||
| app/thread-chat/thread-chat-demo.tsx | ||
| constants/project-workspace.ts | ||
| evals/agent/executors/production-harness.ts | ||
| evals/agent/schema.ts | ||
| lib/chat/attachment-content-resolver.ts | ||
| lib/chat/attachment-context-policy.ts | ||
| lib/chat/project-contract.ts | ||
| lib/chat/resolve-attachments.ts | ||
| lib/db/schema.ts | ||
| lib/thread-chat/application/compile-model-context.ts | ||
| lib/thread-chat/application/project-mutations.ts | ||
| lib/thread-chat/application/queries.ts | ||
| lib/thread-chat/contracts/commands.ts | ||
| lib/thread-chat/contracts/dto.ts | ||
| lib/thread-chat/persistence/artifact-repository.ts | ||
| lib/thread-chat/persistence/mappers.ts | ||
| lib/thread-chat/persistence/project-file-repository.ts | ||
| lib/thread-chat/server/handlers.ts | ||
| lib/thread-chat/streaming/finalize.ts | ||
| lib/thread-chat/streaming/generation-plan.ts | ||
| lib/thread-chat/streaming/run-generation.ts | ||
|
|
||
| - name: Verify generated migration is in sync | ||
| run: pnpm db:generate && git diff --exit-code -- drizzle | ||
|
|
||
| - name: Legacy data migration compatibility | ||
| run: node --import tsx e2e/thread-chat/project-workspace-migration-compatibility.test.mjs | ||
|
|
||
| - name: Pure project context policies | ||
| run: node --import tsx e2e/thread-chat/project-workspace-context.test.mjs | ||
|
|
||
| - name: Project panel UI contract | ||
| run: node e2e/thread-chat/project-panel-ui-contract.test.mjs | ||
|
|
||
| - name: Project panel workspace isolation | ||
| run: node --import tsx e2e/thread-chat/project-panel-workspace-state.test.mjs | ||
|
|
||
| - name: Project workspace eval harness | ||
| run: node --import tsx e2e/observability/project-workspace-eval-harness.test.mjs | ||
|
|
||
| - name: Prepare normalized test database | ||
| run: pnpm db:test:reset && pnpm db:test:migrate | ||
|
|
||
| - name: Project workspace schema and repository acceptance | ||
| run: node --import tsx e2e/thread-chat/project-workspace-db.test.mjs | ||
|
|
||
| - name: Project workspace API integration | ||
| run: node --import tsx e2e/thread-chat/project-workspace-api-db.test.mjs | ||
|
|
||
| - name: Project contract generation boundary | ||
| run: node --import tsx e2e/thread-chat/project-contract-generation-boundary.test.mjs | ||
|
|
||
| - name: Project workspace history stability | ||
| run: node --import tsx e2e/thread-chat/project-workspace-history-stability.test.mjs | ||
|
|
||
| - name: Project artifact context isolation | ||
| run: node --import tsx e2e/thread-chat/project-artifact-context-isolation.test.mjs | ||
|
|
||
| - name: Agent eval smoke | ||
| run: pnpm eval:agent | ||
|
|
||
| - name: Agent eval CI | ||
| run: pnpm eval:agent:ci | ||
|
|
||
| - name: Production build | ||
| run: pnpm build | ||
|
|
||
| - name: Validate OpenSpec | ||
| run: pnpm openspec:validate | ||
11 changes: 11 additions & 0 deletions
11
app/api/thread-chat/v1/projects/[projectId]/files/[attachmentId]/route.ts
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| import type { RouteContext } from "@/lib/thread-chat/server/route-utils" | ||
| import { handleRemoveProjectFile } from "@/lib/thread-chat/server/handlers" | ||
|
|
||
| export const dynamic = "force-dynamic" | ||
|
|
||
| type Context = RouteContext<{ projectId: string; attachmentId: string }> | ||
|
|
||
| export async function DELETE(request: Request, context: Context) { | ||
| const { projectId, attachmentId } = await context.params | ||
| return handleRemoveProjectFile(request, projectId, attachmentId) | ||
| } |
11 changes: 11 additions & 0 deletions
11
app/api/thread-chat/v1/projects/[projectId]/files/route.ts
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| import type { RouteContext } from "@/lib/thread-chat/server/route-utils" | ||
| import { handleAddProjectFile } from "@/lib/thread-chat/server/handlers" | ||
|
|
||
| export const dynamic = "force-dynamic" | ||
|
|
||
| type Context = RouteContext<{ projectId: string }> | ||
|
|
||
| export async function POST(request: Request, context: Context) { | ||
| const { projectId } = await context.params | ||
| return handleAddProjectFile(request, projectId) | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| "use client" | ||
|
|
||
| import { useCallback, useState } from "react" | ||
|
|
||
| import { AttachmentComposerDemo } from "../chat/composer/attachment-composer-demo" | ||
| import type { DemoAttachment } from "../chat/composer/attachment-composer-demo-model" | ||
|
|
||
| export default function AttachmentComposerDemoPage() { | ||
| const [attachments, setAttachments] = useState<DemoAttachment[]>([]) | ||
|
|
||
| const handleChange = useCallback((nextAttachments: DemoAttachment[]) => { | ||
| setAttachments(nextAttachments) | ||
| console.log("attachments changed", nextAttachments) | ||
| }, []) | ||
|
|
||
| return ( | ||
| <main className="tc min-h-screen bg-background px-4 py-12 text-foreground sm:px-6"> | ||
| <section className="mx-auto flex w-full max-w-2xl flex-col gap-6"> | ||
| <header className="space-y-2"> | ||
| <p className="text-sm font-medium text-muted-foreground"> | ||
| ThreadChat · Frontend Demo | ||
| </p> | ||
| <h1 className="text-2xl font-semibold tracking-tight"> | ||
| Attachment Composer | ||
| </h1> | ||
| <p className="max-w-xl text-sm leading-6 text-muted-foreground"> | ||
| 通过多选、拖拽或粘贴添加文件。粘贴的纯文本会转换为本地 .txt | ||
| 文件;所有操作仅保留在当前浏览器页面,不会上传或发送消息。 | ||
| </p> | ||
| </header> | ||
|
|
||
| <AttachmentComposerDemo | ||
| attachments={attachments} | ||
| onChange={handleChange} | ||
| /> | ||
|
|
||
| <p | ||
| data-testid="attachment-count" | ||
| className="text-xs text-muted-foreground" | ||
| > | ||
| 当前附件:{attachments.length} | ||
| </p> | ||
| </section> | ||
| </main> | ||
| ) | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
L3-7: delete: 这份 135 行 CI 只监听当前 feature branch,合并后立即失效,并重复 Agent Evals / OpenSpec。把一个 Project Workspace 测试脚本接入现有 pull_request workflow;删除本文件。