112 lines
5.2 KiB
Markdown
112 lines
5.2 KiB
Markdown
# PR-06 Project-Scoped Studio State and Activity Persistence
|
|
|
|
Domain owner: `docs/studio`
|
|
|
|
## Briefing
|
|
|
|
Move Studio-local project persistence under each project root and make shell activity durable per project.
|
|
|
|
The target model is:
|
|
|
|
- each project owns a `.studio/` directory;
|
|
- `.studio/` is created when a new project is created;
|
|
- shell activity is stored inside that project-local directory and restored when the project is opened;
|
|
- activity retention is capped at a fixed maximum of `500` entries;
|
|
- the same `.studio/` root becomes the reserved home for future Studio project configuration.
|
|
|
|
## Objective
|
|
|
|
Make Studio state project-scoped instead of application-global where the data is inherently tied to one project, starting with activity persistence and the project-local Studio storage root.
|
|
|
|
After this change:
|
|
|
|
- opening a project reloads its recent activity feed;
|
|
- new activity entries are appended to that project's persisted history;
|
|
- persisted history is trimmed to the latest `500` entries;
|
|
- newly created projects already contain the `.studio/` structure expected by Studio.
|
|
|
|
## Dependencies
|
|
|
|
- [`../specs/1. Studio Shell and Workspace Layout Specification.md`](../specs/1.%20Studio%20Shell%20and%20Workspace%20Layout%20Specification.md)
|
|
- current project creation flow in `ProjectCatalogService`
|
|
- current shell activity mapping and rendering in `StudioActivityFeedControl`
|
|
|
|
## Scope
|
|
|
|
- define the project-local Studio storage convention under `.studio/`
|
|
- persist shell activity entries per project
|
|
- restore persisted activity when a project shell opens
|
|
- enforce a hard retention cap of `500` entries
|
|
- create `.studio/` during new-project scaffolding
|
|
- reserve `.studio/` as the home for future project-local Studio settings
|
|
- replace the current scaffolded `.workspace/` directory with `.studio/`
|
|
|
|
## Non-Goals
|
|
|
|
- no redesign of activity event semantics or severity mapping
|
|
- no cross-project merged activity history
|
|
- no migration of global launcher data such as known projects
|
|
- no broad persistence pass for every workspace in this PR
|
|
- no attempt to define every future file that may live under `.studio/`
|
|
|
|
## Execution Method
|
|
|
|
1. Define the `.studio/` storage contract for Studio-owned project data.
|
|
Proposed baseline layout:
|
|
- `.studio/activities.json` for persisted shell activity history
|
|
- `.studio/settings.json` reserved for project-local Studio configuration
|
|
|
|
2. Introduce a small project-local storage path abstraction.
|
|
It should centralize resolution of `.studio/`, activity storage, and future settings storage from `ProjectReference.rootPath()`.
|
|
|
|
3. Add an activity persistence service/repository.
|
|
Responsibilities:
|
|
- load persisted entries for a project;
|
|
- store entries after append;
|
|
- normalize malformed or missing files into an empty history;
|
|
- trim persisted and in-memory history to the latest `500` records.
|
|
|
|
4. Refactor `StudioActivityFeedControl` to become project-aware at construction time.
|
|
The control should:
|
|
- hydrate its initial list from persisted project activity;
|
|
- append new mapped entries to memory and persistence;
|
|
- preserve the existing duplicate-suppression behavior unless it conflicts with durable history expectations.
|
|
|
|
5. Update shell composition to pass the active `ProjectReference` into the activity feed.
|
|
`MainView` should instantiate the feed for the currently opened project instead of a project-agnostic global feed.
|
|
|
|
6. Update project creation scaffolding.
|
|
`ProjectCatalogService.createProject(...)` must create `.studio/` and stop creating `.workspace/`.
|
|
If needed, opening an older project may lazily create `.studio/` on first persistence write.
|
|
|
|
7. Propagate the contract to Studio specs and tests.
|
|
The shell spec should state that shell activity is project-scoped, restored on open, and retained with a bounded history.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- opening a project with an existing `.studio/activities.json` restores that project's recent activity feed before new events arrive
|
|
- activity produced while a project is open is persisted under that project's `.studio/` directory
|
|
- persisted activity history never exceeds `500` entries
|
|
- newly created projects contain `.studio/`
|
|
- new-project tests no longer expect `.workspace/`
|
|
- opening a project without `.studio/activities.json` still works and initializes an empty feed
|
|
|
|
## Validation
|
|
|
|
- unit tests for project scaffolding asserting `.studio/` creation
|
|
- unit tests for activity storage load/save behavior
|
|
- unit tests for retention trimming to `500`
|
|
- unit tests for activity-feed hydration from persisted entries
|
|
- unit tests for malformed or missing activity storage fallback
|
|
- smoke validation opening two different projects and confirming isolated activity histories
|
|
|
|
## Affected Artifacts
|
|
|
|
- `prometeu-studio/src/main/java/p/studio/projects/ProjectCatalogService.java`
|
|
- `prometeu-studio/src/main/java/p/studio/window/MainView.java`
|
|
- `prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityFeedControl.java`
|
|
- new Studio project-storage service/repository classes under `prometeu-studio/src/main/java/p/studio/...`
|
|
- `prometeu-studio/src/test/java/p/studio/projects/ProjectCatalogServiceTest.java`
|
|
- new activity persistence tests under `prometeu-studio/src/test/java/p/studio/...`
|
|
- `docs/studio/specs/1. Studio Shell and Workspace Layout Specification.md`
|