Skip to content

Store run artifacts outside project repositories by default #34

Description

@ElbertePlinio

Problem

PickLab currently writes generated run artifacts to <project>/.picklab/runs/ by default. Screenshots and manifests then appear in the target repository's source-control view, even though they are runtime output rather than project source.

PickForge already defaults per-project runtime data outside repositories. PickLab should follow the same model under the shared Pickforge company root.

Proposed outcome

Default PickLab run storage to:

~/.pickforge/picklab/projects/<projectId>/runs/<runId>/

Use the platform home-directory equivalent on non-Linux systems. Keep each project's runs isolated with a stable project ID derived from its canonical path.

Storage modes:

  • home (default): Pickforge company root above
  • project-local (explicit opt-in): <project>/.picklab/runs/
  • custom (explicit absolute path)

Keep project configuration at <project>/.picklab/config.json; only generated runtime artifacts move by default.

Compatibility

  • New runs write only to the resolved storage location.
  • Existing <project>/.picklab/runs/ data remains readable by artifact list/show/report/resource flows.
  • Do not automatically move or delete existing runs.
  • Preserve PICKLAB_HOME as the PickLab-root override; its default becomes ~/.pickforge/picklab.
  • Document any one-time behavior affecting existing ~/.picklab global config, agents, or sessions. Prefer a non-destructive read fallback rather than silently orphaning them.

Acceptance criteria

  • A default screenshot/run creates no generated files inside the target repository.
  • Default runs are isolated under ~/.pickforge/picklab/projects/<projectId>/runs/.
  • The same canonical project path resolves to the same project ID; different paths do not collide.
  • CLI and MCP artifact create/list/show/report/resource flows use the same resolver.
  • project-local restores the current <project>/.picklab/runs/ behavior when explicitly configured.
  • custom rejects ambiguous/unsafe configuration (for example, a missing path or a relative path if absolute paths are required).
  • Existing project-local runs remain discoverable without an automatic migration.
  • PICKLAB_HOME overrides work in tests and real CLI/MCP usage.
  • README/config examples explain the default, project-local opt-in, custom storage, legacy behavior, and source-control impact.
  • docs/releases/UNRELEASED.md records the user-visible default change.

Agent plan

Goal: move generated PickLab runs out of repositories by default while preserving explicit local storage and non-destructive access to legacy runs.

Checklist:

  • Add a core storage resolver for home/project-local/custom modes and stable per-project IDs.
  • Route run creation and artifact lookup through the resolver across core, CLI, and MCP.
  • Add legacy project-local read fallback without legacy writes or automatic deletion/moves.
  • Handle the ~/.picklab~/.pickforge/picklab default-root transition for config, agents, and sessions without silently losing existing state.
  • Add regression tests for default repo cleanliness, project isolation, overrides, explicit local mode, custom paths, and legacy discovery.
  • Update README, config examples, and unreleased notes.
  • Run focused tests, then bun run typecheck, bun run test, and bun run build.
  • Open one focused PR and complete review.

Validation:

  • bun run test packages/core/test/paths.test.ts packages/core/test/run.test.ts packages/core/test/config.test.ts
  • focused CLI/MCP artifact tests added by this change
  • bun run typecheck
  • bun run test
  • bun run build
  • manual smoke from a temporary Git repository: create a run and verify git status --short stays clean

PR plan: one PR. The resolver, writers, readers, compatibility behavior, and docs are tightly coupled; splitting would leave an inconsistent storage contract.

Feature flag: not needed if this ships as one backward-compatible change in the next release.

Current status: Planned
Next action: implement the storage resolver and regression tests.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions