@shepai/cli 1.50.0 → 1.51.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/AgentType.yaml +1 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +11 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/configure-agent.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/configure-agent.use-case.js +6 -4
- package/dist/packages/core/src/domain/generated/output.d.ts +2 -1
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +10 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.js +3 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +128 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.js +94 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.js +140 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.js +81 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.js +131 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.d.ts +6 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.js +146 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js +16 -4
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +3 -2
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +11 -0
- package/dist/src/presentation/cli/commands/settings/agent.command.js +3 -3
- package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +8 -4
- package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
- package/dist/src/presentation/tui/prompts/agent-select.prompt.js +10 -5
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +6 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.js +7 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +3 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +3 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +3 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +3 -2
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +3 -2
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +3 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +23 -11
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +6 -5
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
- package/web/.next/server/chunks/ssr/_1fafa9db._.js +1 -1
- package/web/.next/server/chunks/ssr/_1fafa9db._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_1fafa9db._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.stories.tsx +16 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.tsx +8 -1
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-config.ts +3 -1
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-drawer.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +3 -1
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +3 -1
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +6 -6
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +51 -35
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +6 -5
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{86340848468ecffa.js → 0d05698b519cd405.js} +4 -4
- package/web/.next/static/chunks/{0da7a9860fa6ae05.js → f9953dad6d0c239c.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- /package/web/.next/static/{Hbv-BqJZOvcXHMnbSKEtM → FZG4H6o2TaQM__WR3-u30}/_buildManifest.js +0 -0
- /package/web/.next/static/{Hbv-BqJZOvcXHMnbSKEtM → FZG4H6o2TaQM__WR3-u30}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Hbv-BqJZOvcXHMnbSKEtM → FZG4H6o2TaQM__WR3-u30}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research Fixture
|
|
3
|
+
*
|
|
4
|
+
* Realistic fixture for the fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
5
|
+
* Passes validateResearch() with zero repair iterations.
|
|
6
|
+
*/
|
|
7
|
+
export const RESEARCH_FIXTURE = `name: dark-mode-toggle
|
|
8
|
+
summary: >
|
|
9
|
+
The dark-mode implementation uses React context for theme state distribution,
|
|
10
|
+
Tailwind CSS v4 class-based dark mode, and localStorage for preference persistence.
|
|
11
|
+
No new npm dependencies are required. Three architectural decisions cover state
|
|
12
|
+
management, CSS strategy, and persistence layer.
|
|
13
|
+
|
|
14
|
+
relatedFeatures: []
|
|
15
|
+
|
|
16
|
+
technologies:
|
|
17
|
+
- React 19 context API
|
|
18
|
+
- 'Tailwind CSS v4 (dark: modifier)'
|
|
19
|
+
- localStorage Web API
|
|
20
|
+
- shadcn/ui Switch component
|
|
21
|
+
- Next.js App Router root layout
|
|
22
|
+
|
|
23
|
+
relatedLinks: []
|
|
24
|
+
|
|
25
|
+
decisions:
|
|
26
|
+
- title: 'Theme State Management'
|
|
27
|
+
chosen: >
|
|
28
|
+
React context with a ThemeProvider component and useTheme hook. The provider
|
|
29
|
+
reads the initial value from localStorage and sets the html element class on
|
|
30
|
+
mount and on toggle.
|
|
31
|
+
rejected:
|
|
32
|
+
- >
|
|
33
|
+
Zustand global store: adds a new state management library dependency for a
|
|
34
|
+
single boolean value; over-engineered for this scope when React context
|
|
35
|
+
achieves the same result in ~40 lines.
|
|
36
|
+
- >
|
|
37
|
+
next-themes library: a popular choice but adds a new npm package for
|
|
38
|
+
functionality achievable in-house; the project guideline prefers no new
|
|
39
|
+
dependencies when existing tools suffice (NFR-3).
|
|
40
|
+
rationale: >
|
|
41
|
+
The project already uses React context extensively (e.g., SettingsProvider).
|
|
42
|
+
A simple context-based ThemeProvider follows the established pattern and
|
|
43
|
+
requires zero new dependencies — consistent with NFR-3.
|
|
44
|
+
|
|
45
|
+
- title: 'CSS Dark Mode Strategy'
|
|
46
|
+
chosen: >
|
|
47
|
+
Tailwind CSS v4 class-based dark mode: add the dark class to the html element
|
|
48
|
+
and rely on Tailwind dark: variants already present in shadcn/ui components.
|
|
49
|
+
rejected:
|
|
50
|
+
- >
|
|
51
|
+
CSS custom properties (CSS variables) approach: requires redefining all
|
|
52
|
+
existing Tailwind color tokens as CSS variables and large changes to every
|
|
53
|
+
styled component — disproportionate for this feature.
|
|
54
|
+
- >
|
|
55
|
+
Inline style overrides on individual components: does not scale; breaks
|
|
56
|
+
existing Tailwind utility classes; produces unmaintainable ad-hoc styling.
|
|
57
|
+
rationale: >
|
|
58
|
+
Tailwind CSS v4 with darkMode: class is already configured in the project.
|
|
59
|
+
All shadcn/ui components expose dark: variants. Toggling the html class is
|
|
60
|
+
the minimal, canonical approach that requires no additional configuration.
|
|
61
|
+
|
|
62
|
+
- title: 'Persistence Layer for Theme Preference'
|
|
63
|
+
chosen: >
|
|
64
|
+
localStorage Web API. Read on ThemeProvider mount to restore the preference;
|
|
65
|
+
write on every toggleTheme() call. Key: shep-theme, values: light or dark.
|
|
66
|
+
rejected:
|
|
67
|
+
- >
|
|
68
|
+
SQLite settings via backend API: requires a new settings field, API endpoint,
|
|
69
|
+
and schema migration — out of scope for a client-side preference.
|
|
70
|
+
- >
|
|
71
|
+
sessionStorage: does not persist across browser sessions; the whole point
|
|
72
|
+
is remembering the user preference between visits.
|
|
73
|
+
rationale: >
|
|
74
|
+
localStorage is the de-facto standard for persisting UI theme preferences
|
|
75
|
+
client-side. It is synchronous, zero-dependency, available in all target
|
|
76
|
+
browsers, and requires no backend changes — satisfying NFR-3.
|
|
77
|
+
|
|
78
|
+
openQuestions: []
|
|
79
|
+
|
|
80
|
+
content: |
|
|
81
|
+
## Technology Decisions
|
|
82
|
+
|
|
83
|
+
### 1. Theme State Management
|
|
84
|
+
|
|
85
|
+
**Chosen:** React context ThemeProvider + useTheme hook
|
|
86
|
+
|
|
87
|
+
**Rejected:**
|
|
88
|
+
- Zustand global store — adds a new dependency for a single boolean
|
|
89
|
+
- next-themes library — adds a package for functionality achievable in ~40 lines
|
|
90
|
+
|
|
91
|
+
**Rationale:** Follows established SettingsProvider pattern. Zero new dependencies.
|
|
92
|
+
|
|
93
|
+
### 2. CSS Dark Mode Strategy
|
|
94
|
+
|
|
95
|
+
**Chosen:** Tailwind CSS v4 dark: class-based (dark class on html element)
|
|
96
|
+
|
|
97
|
+
**Rejected:**
|
|
98
|
+
- CSS custom properties — requires redefining all color tokens (large change surface)
|
|
99
|
+
- Inline style overrides — unmaintainable, breaks Tailwind utilities
|
|
100
|
+
|
|
101
|
+
**Rationale:** Already configured; shadcn/ui components expose dark: variants natively.
|
|
102
|
+
|
|
103
|
+
### 3. Persistence Layer
|
|
104
|
+
|
|
105
|
+
**Chosen:** localStorage (key: shep-theme, values: light | dark)
|
|
106
|
+
|
|
107
|
+
**Rejected:**
|
|
108
|
+
- SQLite settings via API — out of scope, requires migration
|
|
109
|
+
- sessionStorage — does not survive browser restarts
|
|
110
|
+
|
|
111
|
+
**Rationale:** De-facto standard for client-side theme persistence. Zero backend changes.
|
|
112
|
+
|
|
113
|
+
## Library Analysis
|
|
114
|
+
|
|
115
|
+
| Library | Purpose | Decision | Reasoning |
|
|
116
|
+
| ------- | ------- | -------- | --------- |
|
|
117
|
+
| next-themes | SSR-safe theme management | Reject | Adds dependency for in-house functionality |
|
|
118
|
+
| Tailwind CSS v4 | Dark mode via dark: class | Use (existing) | Already configured, shadcn/ui compatible |
|
|
119
|
+
| shadcn/ui Switch | Toggle UI control | Use (existing) | Already a project dependency, accessible |
|
|
120
|
+
| localStorage | Preference persistence | Use (built-in) | No dependency, synchronous, universally available |
|
|
121
|
+
|
|
122
|
+
## Security Considerations
|
|
123
|
+
|
|
124
|
+
localStorage is readable by any JavaScript on the page. The stored value is
|
|
125
|
+
light or dark — no sensitive data. The ThemeProvider must sanitize the retrieved
|
|
126
|
+
value (only accept light or dark; default to light for any other value) to prevent
|
|
127
|
+
unexpected CSS class injection.
|
|
128
|
+
|
|
129
|
+
## Performance Implications
|
|
130
|
+
|
|
131
|
+
localStorage.getItem() is synchronous and executes in under 1ms. Setting the html
|
|
132
|
+
class on mount avoids a flash of unstyled content (FOUC) provided the ThemeProvider
|
|
133
|
+
is high enough in the component tree.
|
|
134
|
+
|
|
135
|
+
## Architecture Notes
|
|
136
|
+
|
|
137
|
+
ThemeProvider wraps the root layout, making theme state available to all pages and
|
|
138
|
+
components without prop drilling. The useTheme hook is consumed only by ThemeToggle
|
|
139
|
+
and the root layout. This follows the existing SettingsProvider pattern.
|
|
140
|
+
`;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec (Analyze Phase) Fixture
|
|
3
|
+
*
|
|
4
|
+
* Realistic fixture for the fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
5
|
+
* Passes validateSpecAnalyze() with zero repair iterations.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SPEC_ANALYZE_FIXTURE = "name: dark-mode-toggle\nnumber: 42\nbranch: feat/042-dark-mode-toggle\noneLiner: Add a dark-mode toggle to the Shep web UI settings panel\nsummary: >\n Introduce a persistent dark-mode toggle to the Shep web UI settings panel that\n applies a CSS class-based theme, stores the user preference in localStorage, and\n is surfaced as a shadcn/ui Switch component with full Storybook coverage.\nphase: Analysis\nsizeEstimate: M\n\nrelatedFeatures: []\n\ntechnologies:\n - React 19\n - Next.js 16 (App Router)\n - Tailwind CSS v4\n - shadcn/ui\n - Storybook\n - TypeScript\n\nrelatedLinks: []\n\nopenQuestions: []\n\ncontent: |\n ## Problem Statement\n\n The Shep web UI currently renders only in light mode. Developers working in dark\n environments or those who prefer dark themes have no way to switch the UI appearance.\n Adding a first-class dark-mode toggle improves developer experience and demonstrates\n the Shep settings panel as a configurable surface.\n\n ## Codebase Analysis\n\n ### Project Structure\n\n The web UI lives in src/presentation/web/ following Next.js App Router conventions.\n Components are organized into four tiers: ui/ (Tier 0), common/ (Tier 1),\n layouts/ (Tier 2), and features/ (Tier 3). Storybook stories are mandatory for every\n component.\n\n ### Architecture Patterns\n\n The project uses shadcn/ui (Radix primitives + Tailwind CSS v4) for all UI components.\n Theme state would live in a React context provider wrapping the root layout, following\n the existing SettingsProvider pattern in the codebase. Clean Architecture layers keep\n theme state in the presentation layer only.\n\n ### Relevant Technologies\n\n Tailwind CSS v4 supports dark mode via the `dark` CSS class on the html element.\n shadcn/ui provides a Switch component suitable for the toggle control. localStorage\n provides client-side persistence without any backend changes.\n\n ## Affected Areas\n\n | Area | Impact | Reasoning |\n | ---- | ------ | --------- |\n | src/presentation/web/components/features/settings/ | High | Settings panel receives the toggle component |\n | src/presentation/web/app/layout.tsx | Medium | Root layout needs ThemeProvider wrapper |\n | src/presentation/web/components/common/ | Medium | ThemeToggle and ThemeProvider components created here |\n | tailwind.config.ts | Low | Verify darkMode: class is configured |\n\n ## Dependencies\n\n - shadcn/ui Switch component\n - React context for theme state distribution\n - localStorage Web API for persistence (built-in, no new dependency)\n\n ## Size Estimate\n\n **M (days)** \u2014 Context setup, toggle component, settings integration, Storybook stories,\n and tests across 3 phases add up to roughly 2 developer-days with TDD.\n";
|
|
8
|
+
//# sourceMappingURL=spec-analyze.fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-analyze.fixture.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,oBAAoB,gtFA0EhC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec (Analyze Phase) Fixture
|
|
3
|
+
*
|
|
4
|
+
* Realistic fixture for the fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
5
|
+
* Passes validateSpecAnalyze() with zero repair iterations.
|
|
6
|
+
*/
|
|
7
|
+
export const SPEC_ANALYZE_FIXTURE = `name: dark-mode-toggle
|
|
8
|
+
number: 42
|
|
9
|
+
branch: feat/042-dark-mode-toggle
|
|
10
|
+
oneLiner: Add a dark-mode toggle to the Shep web UI settings panel
|
|
11
|
+
summary: >
|
|
12
|
+
Introduce a persistent dark-mode toggle to the Shep web UI settings panel that
|
|
13
|
+
applies a CSS class-based theme, stores the user preference in localStorage, and
|
|
14
|
+
is surfaced as a shadcn/ui Switch component with full Storybook coverage.
|
|
15
|
+
phase: Analysis
|
|
16
|
+
sizeEstimate: M
|
|
17
|
+
|
|
18
|
+
relatedFeatures: []
|
|
19
|
+
|
|
20
|
+
technologies:
|
|
21
|
+
- React 19
|
|
22
|
+
- Next.js 16 (App Router)
|
|
23
|
+
- Tailwind CSS v4
|
|
24
|
+
- shadcn/ui
|
|
25
|
+
- Storybook
|
|
26
|
+
- TypeScript
|
|
27
|
+
|
|
28
|
+
relatedLinks: []
|
|
29
|
+
|
|
30
|
+
openQuestions: []
|
|
31
|
+
|
|
32
|
+
content: |
|
|
33
|
+
## Problem Statement
|
|
34
|
+
|
|
35
|
+
The Shep web UI currently renders only in light mode. Developers working in dark
|
|
36
|
+
environments or those who prefer dark themes have no way to switch the UI appearance.
|
|
37
|
+
Adding a first-class dark-mode toggle improves developer experience and demonstrates
|
|
38
|
+
the Shep settings panel as a configurable surface.
|
|
39
|
+
|
|
40
|
+
## Codebase Analysis
|
|
41
|
+
|
|
42
|
+
### Project Structure
|
|
43
|
+
|
|
44
|
+
The web UI lives in src/presentation/web/ following Next.js App Router conventions.
|
|
45
|
+
Components are organized into four tiers: ui/ (Tier 0), common/ (Tier 1),
|
|
46
|
+
layouts/ (Tier 2), and features/ (Tier 3). Storybook stories are mandatory for every
|
|
47
|
+
component.
|
|
48
|
+
|
|
49
|
+
### Architecture Patterns
|
|
50
|
+
|
|
51
|
+
The project uses shadcn/ui (Radix primitives + Tailwind CSS v4) for all UI components.
|
|
52
|
+
Theme state would live in a React context provider wrapping the root layout, following
|
|
53
|
+
the existing SettingsProvider pattern in the codebase. Clean Architecture layers keep
|
|
54
|
+
theme state in the presentation layer only.
|
|
55
|
+
|
|
56
|
+
### Relevant Technologies
|
|
57
|
+
|
|
58
|
+
Tailwind CSS v4 supports dark mode via the \`dark\` CSS class on the html element.
|
|
59
|
+
shadcn/ui provides a Switch component suitable for the toggle control. localStorage
|
|
60
|
+
provides client-side persistence without any backend changes.
|
|
61
|
+
|
|
62
|
+
## Affected Areas
|
|
63
|
+
|
|
64
|
+
| Area | Impact | Reasoning |
|
|
65
|
+
| ---- | ------ | --------- |
|
|
66
|
+
| src/presentation/web/components/features/settings/ | High | Settings panel receives the toggle component |
|
|
67
|
+
| src/presentation/web/app/layout.tsx | Medium | Root layout needs ThemeProvider wrapper |
|
|
68
|
+
| src/presentation/web/components/common/ | Medium | ThemeToggle and ThemeProvider components created here |
|
|
69
|
+
| tailwind.config.ts | Low | Verify darkMode: class is configured |
|
|
70
|
+
|
|
71
|
+
## Dependencies
|
|
72
|
+
|
|
73
|
+
- shadcn/ui Switch component
|
|
74
|
+
- React context for theme state distribution
|
|
75
|
+
- localStorage Web API for persistence (built-in, no new dependency)
|
|
76
|
+
|
|
77
|
+
## Size Estimate
|
|
78
|
+
|
|
79
|
+
**M (days)** — Context setup, toggle component, settings integration, Storybook stories,
|
|
80
|
+
and tests across 3 phases add up to roughly 2 developer-days with TDD.
|
|
81
|
+
`;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec (Requirements Phase) Fixture
|
|
3
|
+
*
|
|
4
|
+
* Realistic fixture for the fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
5
|
+
* Passes validateSpecRequirements() with zero repair iterations.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SPEC_REQUIREMENTS_FIXTURE = "name: dark-mode-toggle\nnumber: 42\nbranch: feat/042-dark-mode-toggle\noneLiner: Add a dark-mode toggle to the Shep web UI settings panel\nsummary: >\n Introduce a persistent dark-mode toggle to the Shep web UI settings panel that\n applies a CSS class-based theme via Tailwind dark: variants, stores the user\n preference in localStorage, and is surfaced as a shadcn/ui Switch component\n with full Storybook coverage and TDD-driven unit tests.\nphase: Requirements\nsizeEstimate: M\n\nrelatedFeatures: []\n\ntechnologies:\n - React 19\n - Next.js 16 (App Router)\n - Tailwind CSS v4\n - shadcn/ui\n - Storybook\n - TypeScript\n - localStorage Web API\n\nrelatedLinks: []\n\nopenQuestions:\n - question: 'Where should the dark-mode preference be persisted?'\n resolved: true\n options:\n - option: 'localStorage only'\n description: >\n Store the theme preference in localStorage. Zero backend changes,\n instant read on page load, and no need for a settings schema migration.\n The ThemeProvider reads the key on mount and writes on toggle.\n selected: true\n - option: 'SQLite settings via backend API'\n description: >\n Persist the preference in the Shep SQLite settings store alongside\n other settings. Syncs across devices but requires API changes and a\n settings migration \u2014 out of scope for this feature.\n selected: false\n selectionRationale: >\n localStorage is the conventional approach for client-side theme preferences\n and requires no backend changes. The Shep settings API is out of scope for\n this feature; localStorage ships the value faster with zero migration risk.\n answer: 'localStorage only'\n\n - question: 'How should the CSS dark-mode implementation be applied?'\n resolved: true\n options:\n - option: 'Tailwind CSS class-based dark mode (dark: modifier)'\n description: >\n Add the dark class to the html element and use Tailwind dark: modifier\n on all themed elements. Supported natively in Tailwind CSS v4 and fully\n compatible with the shadcn/ui component library.\n selected: true\n - option: 'CSS custom properties via a custom ThemeProvider stylesheet'\n description: >\n Define a set of CSS custom properties (--color-bg, --color-text, etc.)\n and swap them by toggling a data attribute. More flexible but requires\n redefining all existing color tokens \u2014 a large change surface.\n selected: false\n selectionRationale: >\n Tailwind CSS v4 with dark: modifier is already the standard in this codebase.\n All shadcn/ui components are built to accept Tailwind dark: variants. Using\n the dark class on html is the minimal, zero-extra-dependency approach.\n answer: 'Tailwind CSS class-based dark mode (dark: modifier)'\n\ncontent: |\n ## Problem Statement\n\n The Shep web UI currently renders only in light mode. Developers working in dark\n environments or those who prefer dark themes have no way to switch the UI appearance.\n\n ## Success Criteria\n\n - [ ] A ThemeProvider wraps the root layout and provides a useTheme hook\n - [ ] A ThemeToggle component renders in the settings panel with a Switch and label\n - [ ] Clicking the toggle switches the html element class between light and dark\n - [ ] The preference persists across page refreshes via localStorage\n - [ ] All new components have Storybook stories with light and dark variants\n - [ ] pnpm validate passes with no new errors\n\n ## Functional Requirements\n\n - **FR-1**: A ThemeProvider component must wrap the root Next.js App Router layout\n and provide theme state to the component tree via React context.\n - **FR-2**: A useTheme hook must expose { theme, toggleTheme } to any component.\n - **FR-3**: A ThemeToggle component must render a Switch and a label (Dark mode).\n - **FR-4**: Toggling the Switch must apply the dark CSS class to the html element.\n - **FR-5**: The selected theme must be persisted to localStorage and restored on load.\n - **FR-6**: ThemeToggle must appear in the settings panel (features/settings/).\n\n ## Non-Functional Requirements\n\n - **NFR-1**: Theme switch must complete within one animation frame (no FOUC).\n - **NFR-2**: All new components must have Storybook stories per project conventions.\n - **NFR-3**: No new npm dependencies may be added; use existing React, Tailwind, shadcn/ui.\n - **NFR-4**: Each new file must stay within the 150-line project guideline.\n\n ## Product Questions & AI Recommendations\n\n | # | Question | AI Recommendation | Rationale |\n | - | -------- | ----------------- | --------- |\n | 1 | Persistence layer? | localStorage | Zero backend changes required |\n | 2 | CSS implementation? | Tailwind dark: class | Already standard in the codebase |\n\n ## Affected Areas\n\n | Area | Impact | Reasoning |\n | ---- | ------ | --------- |\n | src/presentation/web/components/features/settings/ | High | Toggle component added here |\n | src/presentation/web/app/layout.tsx | Medium | ThemeProvider wrapper added |\n | src/presentation/web/components/common/ | Medium | ThemeToggle and ThemeProvider created |\n\n ## Dependencies\n\n - shadcn/ui Switch and Label components (already installed)\n - React context API (built-in)\n - localStorage Web API (built-in)\n\n ## Size Estimate\n\n **M (days)** \u2014 3 phases: context + provider, toggle component, settings integration.\n";
|
|
8
|
+
//# sourceMappingURL=spec-requirements.fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-requirements.fixture.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,yBAAyB,m8KA4HrC,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec (Requirements Phase) Fixture
|
|
3
|
+
*
|
|
4
|
+
* Realistic fixture for the fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
5
|
+
* Passes validateSpecRequirements() with zero repair iterations.
|
|
6
|
+
*/
|
|
7
|
+
export const SPEC_REQUIREMENTS_FIXTURE = `name: dark-mode-toggle
|
|
8
|
+
number: 42
|
|
9
|
+
branch: feat/042-dark-mode-toggle
|
|
10
|
+
oneLiner: Add a dark-mode toggle to the Shep web UI settings panel
|
|
11
|
+
summary: >
|
|
12
|
+
Introduce a persistent dark-mode toggle to the Shep web UI settings panel that
|
|
13
|
+
applies a CSS class-based theme via Tailwind dark: variants, stores the user
|
|
14
|
+
preference in localStorage, and is surfaced as a shadcn/ui Switch component
|
|
15
|
+
with full Storybook coverage and TDD-driven unit tests.
|
|
16
|
+
phase: Requirements
|
|
17
|
+
sizeEstimate: M
|
|
18
|
+
|
|
19
|
+
relatedFeatures: []
|
|
20
|
+
|
|
21
|
+
technologies:
|
|
22
|
+
- React 19
|
|
23
|
+
- Next.js 16 (App Router)
|
|
24
|
+
- Tailwind CSS v4
|
|
25
|
+
- shadcn/ui
|
|
26
|
+
- Storybook
|
|
27
|
+
- TypeScript
|
|
28
|
+
- localStorage Web API
|
|
29
|
+
|
|
30
|
+
relatedLinks: []
|
|
31
|
+
|
|
32
|
+
openQuestions:
|
|
33
|
+
- question: 'Where should the dark-mode preference be persisted?'
|
|
34
|
+
resolved: true
|
|
35
|
+
options:
|
|
36
|
+
- option: 'localStorage only'
|
|
37
|
+
description: >
|
|
38
|
+
Store the theme preference in localStorage. Zero backend changes,
|
|
39
|
+
instant read on page load, and no need for a settings schema migration.
|
|
40
|
+
The ThemeProvider reads the key on mount and writes on toggle.
|
|
41
|
+
selected: true
|
|
42
|
+
- option: 'SQLite settings via backend API'
|
|
43
|
+
description: >
|
|
44
|
+
Persist the preference in the Shep SQLite settings store alongside
|
|
45
|
+
other settings. Syncs across devices but requires API changes and a
|
|
46
|
+
settings migration — out of scope for this feature.
|
|
47
|
+
selected: false
|
|
48
|
+
selectionRationale: >
|
|
49
|
+
localStorage is the conventional approach for client-side theme preferences
|
|
50
|
+
and requires no backend changes. The Shep settings API is out of scope for
|
|
51
|
+
this feature; localStorage ships the value faster with zero migration risk.
|
|
52
|
+
answer: 'localStorage only'
|
|
53
|
+
|
|
54
|
+
- question: 'How should the CSS dark-mode implementation be applied?'
|
|
55
|
+
resolved: true
|
|
56
|
+
options:
|
|
57
|
+
- option: 'Tailwind CSS class-based dark mode (dark: modifier)'
|
|
58
|
+
description: >
|
|
59
|
+
Add the dark class to the html element and use Tailwind dark: modifier
|
|
60
|
+
on all themed elements. Supported natively in Tailwind CSS v4 and fully
|
|
61
|
+
compatible with the shadcn/ui component library.
|
|
62
|
+
selected: true
|
|
63
|
+
- option: 'CSS custom properties via a custom ThemeProvider stylesheet'
|
|
64
|
+
description: >
|
|
65
|
+
Define a set of CSS custom properties (--color-bg, --color-text, etc.)
|
|
66
|
+
and swap them by toggling a data attribute. More flexible but requires
|
|
67
|
+
redefining all existing color tokens — a large change surface.
|
|
68
|
+
selected: false
|
|
69
|
+
selectionRationale: >
|
|
70
|
+
Tailwind CSS v4 with dark: modifier is already the standard in this codebase.
|
|
71
|
+
All shadcn/ui components are built to accept Tailwind dark: variants. Using
|
|
72
|
+
the dark class on html is the minimal, zero-extra-dependency approach.
|
|
73
|
+
answer: 'Tailwind CSS class-based dark mode (dark: modifier)'
|
|
74
|
+
|
|
75
|
+
content: |
|
|
76
|
+
## Problem Statement
|
|
77
|
+
|
|
78
|
+
The Shep web UI currently renders only in light mode. Developers working in dark
|
|
79
|
+
environments or those who prefer dark themes have no way to switch the UI appearance.
|
|
80
|
+
|
|
81
|
+
## Success Criteria
|
|
82
|
+
|
|
83
|
+
- [ ] A ThemeProvider wraps the root layout and provides a useTheme hook
|
|
84
|
+
- [ ] A ThemeToggle component renders in the settings panel with a Switch and label
|
|
85
|
+
- [ ] Clicking the toggle switches the html element class between light and dark
|
|
86
|
+
- [ ] The preference persists across page refreshes via localStorage
|
|
87
|
+
- [ ] All new components have Storybook stories with light and dark variants
|
|
88
|
+
- [ ] pnpm validate passes with no new errors
|
|
89
|
+
|
|
90
|
+
## Functional Requirements
|
|
91
|
+
|
|
92
|
+
- **FR-1**: A ThemeProvider component must wrap the root Next.js App Router layout
|
|
93
|
+
and provide theme state to the component tree via React context.
|
|
94
|
+
- **FR-2**: A useTheme hook must expose { theme, toggleTheme } to any component.
|
|
95
|
+
- **FR-3**: A ThemeToggle component must render a Switch and a label (Dark mode).
|
|
96
|
+
- **FR-4**: Toggling the Switch must apply the dark CSS class to the html element.
|
|
97
|
+
- **FR-5**: The selected theme must be persisted to localStorage and restored on load.
|
|
98
|
+
- **FR-6**: ThemeToggle must appear in the settings panel (features/settings/).
|
|
99
|
+
|
|
100
|
+
## Non-Functional Requirements
|
|
101
|
+
|
|
102
|
+
- **NFR-1**: Theme switch must complete within one animation frame (no FOUC).
|
|
103
|
+
- **NFR-2**: All new components must have Storybook stories per project conventions.
|
|
104
|
+
- **NFR-3**: No new npm dependencies may be added; use existing React, Tailwind, shadcn/ui.
|
|
105
|
+
- **NFR-4**: Each new file must stay within the 150-line project guideline.
|
|
106
|
+
|
|
107
|
+
## Product Questions & AI Recommendations
|
|
108
|
+
|
|
109
|
+
| # | Question | AI Recommendation | Rationale |
|
|
110
|
+
| - | -------- | ----------------- | --------- |
|
|
111
|
+
| 1 | Persistence layer? | localStorage | Zero backend changes required |
|
|
112
|
+
| 2 | CSS implementation? | Tailwind dark: class | Already standard in the codebase |
|
|
113
|
+
|
|
114
|
+
## Affected Areas
|
|
115
|
+
|
|
116
|
+
| Area | Impact | Reasoning |
|
|
117
|
+
| ---- | ------ | --------- |
|
|
118
|
+
| src/presentation/web/components/features/settings/ | High | Toggle component added here |
|
|
119
|
+
| src/presentation/web/app/layout.tsx | Medium | ThemeProvider wrapper added |
|
|
120
|
+
| src/presentation/web/components/common/ | Medium | ThemeToggle and ThemeProvider created |
|
|
121
|
+
|
|
122
|
+
## Dependencies
|
|
123
|
+
|
|
124
|
+
- shadcn/ui Switch and Label components (already installed)
|
|
125
|
+
- React context API (built-in)
|
|
126
|
+
- localStorage Web API (built-in)
|
|
127
|
+
|
|
128
|
+
## Size Estimate
|
|
129
|
+
|
|
130
|
+
**M (days)** — 3 phases: context + provider, toggle component, settings integration.
|
|
131
|
+
`;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tasks Fixture — fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
3
|
+
* Passes validateTasks() against plan phase IDs [phase-1, phase-2, phase-3].
|
|
4
|
+
*/
|
|
5
|
+
export declare const TASKS_FIXTURE = "name: dark-mode-toggle\nsummary: >\n 8 tasks across 3 phases: ThemeProvider context (phase-1), ThemeToggle component\n (phase-2), settings panel integration and validation (phase-3).\n\nrelatedFeatures: []\ntechnologies: []\nrelatedLinks: []\n\ntasks:\n - id: task-1\n phaseId: phase-1\n title: 'Create ThemeProvider and useTheme hook'\n description: 'ThemeProvider managing light/dark state via React context with localStorage persistence.'\n state: Todo\n dependencies: []\n acceptanceCriteria:\n - 'ThemeProvider renders children without error'\n - 'useTheme returns { theme, toggleTheme } where theme is \"light\" or \"dark\"'\n - 'toggleTheme() switches theme and toggles html element dark class'\n - 'Theme persists to localStorage key \"shep-theme\" on toggle'\n tdd:\n red: ['Write test: useTheme default is \"light\" with no localStorage entry', 'Write test: toggleTheme() adds dark class to html element']\n green: ['Implement ThemeProvider reading localStorage and calling classList.toggle', 'Implement useTheme hook calling useContext(ThemeContext)']\n refactor: ['Extract THEME_KEY constant; add sanitization for non-light/dark values']\n estimatedEffort: '2h'\n\n - id: task-2\n phaseId: phase-1\n title: 'Write unit tests for ThemeProvider edge cases'\n description: 'Cover edge cases: invalid stored value, double-toggle cycle, SSR safety.'\n state: Todo\n dependencies: ['task-1']\n acceptanceCriteria:\n - 'Test: invalid localStorage value \"purple\" defaults to \"light\"'\n - 'Test: toggling twice returns to original theme'\n - 'Test: ThemeProvider handles window being undefined (SSR safety)'\n tdd:\n red: ['Write test: localStorage \"purple\" \u2192 theme defaults to \"light\"']\n green: ['Sanitization branch handles all non-light/dark values']\n refactor: ['Consolidate theme validation into isValidTheme() helper']\n estimatedEffort: '1h'\n\n - id: task-3\n phaseId: phase-2\n title: 'Create ThemeToggle component'\n description: 'shadcn/ui Switch + Label component wired to useTheme(). onClick calls toggleTheme().'\n state: Todo\n dependencies: ['task-1']\n acceptanceCriteria:\n - 'ThemeToggle renders a Switch with aria-label \"Toggle dark mode\"'\n - 'Switch checked reflects current theme (\"dark\" = checked)'\n - 'Clicking Switch calls toggleTheme() exactly once'\n - 'Component file is <= 50 lines'\n tdd:\n red: ['Write test: Switch checked is false when theme is \"light\"', 'Write test: Switch click triggers toggleTheme()']\n green: ['Implement ThemeToggle with Switch checked wired to theme === \"dark\"']\n refactor: ['Extract aria-label constant; remove any inline styles']\n estimatedEffort: '1h'\n\n - id: task-4\n phaseId: phase-2\n title: 'Create Storybook story for ThemeToggle'\n description: 'theme-toggle.stories.tsx with Default and DarkMode variants using ThemeProvider decorator.'\n state: Todo\n dependencies: ['task-3']\n acceptanceCriteria:\n - 'Story includes Default and DarkMode variants with ThemeProvider decorator'\n - 'pnpm dev:storybook runs without error for the new story'\n tdd: null\n estimatedEffort: '30min'\n\n - id: task-5\n phaseId: phase-2\n title: 'Write integration test for ThemeToggle + ThemeProvider'\n description: 'Mount ThemeProvider wrapping ThemeToggle; assert full toggle cycle including localStorage.'\n state: Todo\n dependencies: ['task-3']\n acceptanceCriteria:\n - 'After clicking Toggle: html has dark class, localStorage has \"dark\"'\n - 'After clicking Toggle again: html has no dark class, localStorage has \"light\"'\n tdd:\n red: ['Write integration test: html class and localStorage after two toggle cycles']\n green: ['Test passes with existing ThemeProvider + ThemeToggle implementations']\n refactor: ['Extract renderWithTheme() test helper for reuse']\n estimatedEffort: '45min'\n\n - id: task-6\n phaseId: phase-3\n title: 'Wrap root layout in ThemeProvider'\n description: 'Update app/layout.tsx to wrap children with ThemeProvider.'\n state: Todo\n dependencies: ['task-1']\n acceptanceCriteria:\n - 'layout.tsx imports ThemeProvider and wraps children'\n - 'Existing Playwright e2e tests continue to pass'\n tdd:\n red: ['Write e2e test: dark class persists after page reload when toggled']\n green: ['Add ThemeProvider wrapping children in layout.tsx']\n refactor: ['Ensure import order follows project eslint rules']\n estimatedEffort: '30min'\n\n - id: task-7\n phaseId: phase-3\n title: 'Add ThemeToggle to settings panel'\n description: 'Add ThemeToggle to the Appearance section of settings-panel.tsx.'\n state: Todo\n dependencies: ['task-3', 'task-6']\n acceptanceCriteria:\n - 'settings-panel.tsx imports and renders ThemeToggle in the Appearance section'\n - 'ThemeToggle is visible and functional in the running web UI'\n tdd:\n red: ['Write unit test: ThemeToggle is present in rendered SettingsPanel']\n green: ['Add import and render ThemeToggle in the Appearance section']\n refactor: ['Ensure Appearance section heading is semantically correct (h2/h3)']\n estimatedEffort: '30min'\n\n - id: task-8\n phaseId: phase-3\n title: 'Run full validation and fix any issues'\n description: 'Run pnpm validate and pnpm test; fix any failures before marking complete.'\n state: Todo\n dependencies: ['task-6', 'task-7']\n acceptanceCriteria:\n - 'pnpm lint passes with no errors'\n - 'pnpm typecheck passes with no errors'\n - 'pnpm test passes with no failures'\n - 'pnpm build completes successfully'\n tdd: null\n estimatedEffort: '30min'\n\ntotalEstimate: '7.25h'\nopenQuestions: []\n\ncontent: |\n ## Summary\n\n Phase-1 builds ThemeProvider + useTheme hook with full test coverage.\n Phase-2 creates ThemeToggle in isolation with Storybook stories and integration tests.\n Phase-3 wires the provider into the root layout, adds the toggle to the settings panel,\n then validates with pnpm validate + pnpm test.\n";
|
|
6
|
+
//# sourceMappingURL=tasks.fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.fixture.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,aAAa,wmMA6IzB,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tasks Fixture — fictional "Add dark-mode toggle to Shep Web UI" feature.
|
|
3
|
+
* Passes validateTasks() against plan phase IDs [phase-1, phase-2, phase-3].
|
|
4
|
+
*/
|
|
5
|
+
export const TASKS_FIXTURE = `name: dark-mode-toggle
|
|
6
|
+
summary: >
|
|
7
|
+
8 tasks across 3 phases: ThemeProvider context (phase-1), ThemeToggle component
|
|
8
|
+
(phase-2), settings panel integration and validation (phase-3).
|
|
9
|
+
|
|
10
|
+
relatedFeatures: []
|
|
11
|
+
technologies: []
|
|
12
|
+
relatedLinks: []
|
|
13
|
+
|
|
14
|
+
tasks:
|
|
15
|
+
- id: task-1
|
|
16
|
+
phaseId: phase-1
|
|
17
|
+
title: 'Create ThemeProvider and useTheme hook'
|
|
18
|
+
description: 'ThemeProvider managing light/dark state via React context with localStorage persistence.'
|
|
19
|
+
state: Todo
|
|
20
|
+
dependencies: []
|
|
21
|
+
acceptanceCriteria:
|
|
22
|
+
- 'ThemeProvider renders children without error'
|
|
23
|
+
- 'useTheme returns { theme, toggleTheme } where theme is "light" or "dark"'
|
|
24
|
+
- 'toggleTheme() switches theme and toggles html element dark class'
|
|
25
|
+
- 'Theme persists to localStorage key "shep-theme" on toggle'
|
|
26
|
+
tdd:
|
|
27
|
+
red: ['Write test: useTheme default is "light" with no localStorage entry', 'Write test: toggleTheme() adds dark class to html element']
|
|
28
|
+
green: ['Implement ThemeProvider reading localStorage and calling classList.toggle', 'Implement useTheme hook calling useContext(ThemeContext)']
|
|
29
|
+
refactor: ['Extract THEME_KEY constant; add sanitization for non-light/dark values']
|
|
30
|
+
estimatedEffort: '2h'
|
|
31
|
+
|
|
32
|
+
- id: task-2
|
|
33
|
+
phaseId: phase-1
|
|
34
|
+
title: 'Write unit tests for ThemeProvider edge cases'
|
|
35
|
+
description: 'Cover edge cases: invalid stored value, double-toggle cycle, SSR safety.'
|
|
36
|
+
state: Todo
|
|
37
|
+
dependencies: ['task-1']
|
|
38
|
+
acceptanceCriteria:
|
|
39
|
+
- 'Test: invalid localStorage value "purple" defaults to "light"'
|
|
40
|
+
- 'Test: toggling twice returns to original theme'
|
|
41
|
+
- 'Test: ThemeProvider handles window being undefined (SSR safety)'
|
|
42
|
+
tdd:
|
|
43
|
+
red: ['Write test: localStorage "purple" → theme defaults to "light"']
|
|
44
|
+
green: ['Sanitization branch handles all non-light/dark values']
|
|
45
|
+
refactor: ['Consolidate theme validation into isValidTheme() helper']
|
|
46
|
+
estimatedEffort: '1h'
|
|
47
|
+
|
|
48
|
+
- id: task-3
|
|
49
|
+
phaseId: phase-2
|
|
50
|
+
title: 'Create ThemeToggle component'
|
|
51
|
+
description: 'shadcn/ui Switch + Label component wired to useTheme(). onClick calls toggleTheme().'
|
|
52
|
+
state: Todo
|
|
53
|
+
dependencies: ['task-1']
|
|
54
|
+
acceptanceCriteria:
|
|
55
|
+
- 'ThemeToggle renders a Switch with aria-label "Toggle dark mode"'
|
|
56
|
+
- 'Switch checked reflects current theme ("dark" = checked)'
|
|
57
|
+
- 'Clicking Switch calls toggleTheme() exactly once'
|
|
58
|
+
- 'Component file is <= 50 lines'
|
|
59
|
+
tdd:
|
|
60
|
+
red: ['Write test: Switch checked is false when theme is "light"', 'Write test: Switch click triggers toggleTheme()']
|
|
61
|
+
green: ['Implement ThemeToggle with Switch checked wired to theme === "dark"']
|
|
62
|
+
refactor: ['Extract aria-label constant; remove any inline styles']
|
|
63
|
+
estimatedEffort: '1h'
|
|
64
|
+
|
|
65
|
+
- id: task-4
|
|
66
|
+
phaseId: phase-2
|
|
67
|
+
title: 'Create Storybook story for ThemeToggle'
|
|
68
|
+
description: 'theme-toggle.stories.tsx with Default and DarkMode variants using ThemeProvider decorator.'
|
|
69
|
+
state: Todo
|
|
70
|
+
dependencies: ['task-3']
|
|
71
|
+
acceptanceCriteria:
|
|
72
|
+
- 'Story includes Default and DarkMode variants with ThemeProvider decorator'
|
|
73
|
+
- 'pnpm dev:storybook runs without error for the new story'
|
|
74
|
+
tdd: null
|
|
75
|
+
estimatedEffort: '30min'
|
|
76
|
+
|
|
77
|
+
- id: task-5
|
|
78
|
+
phaseId: phase-2
|
|
79
|
+
title: 'Write integration test for ThemeToggle + ThemeProvider'
|
|
80
|
+
description: 'Mount ThemeProvider wrapping ThemeToggle; assert full toggle cycle including localStorage.'
|
|
81
|
+
state: Todo
|
|
82
|
+
dependencies: ['task-3']
|
|
83
|
+
acceptanceCriteria:
|
|
84
|
+
- 'After clicking Toggle: html has dark class, localStorage has "dark"'
|
|
85
|
+
- 'After clicking Toggle again: html has no dark class, localStorage has "light"'
|
|
86
|
+
tdd:
|
|
87
|
+
red: ['Write integration test: html class and localStorage after two toggle cycles']
|
|
88
|
+
green: ['Test passes with existing ThemeProvider + ThemeToggle implementations']
|
|
89
|
+
refactor: ['Extract renderWithTheme() test helper for reuse']
|
|
90
|
+
estimatedEffort: '45min'
|
|
91
|
+
|
|
92
|
+
- id: task-6
|
|
93
|
+
phaseId: phase-3
|
|
94
|
+
title: 'Wrap root layout in ThemeProvider'
|
|
95
|
+
description: 'Update app/layout.tsx to wrap children with ThemeProvider.'
|
|
96
|
+
state: Todo
|
|
97
|
+
dependencies: ['task-1']
|
|
98
|
+
acceptanceCriteria:
|
|
99
|
+
- 'layout.tsx imports ThemeProvider and wraps children'
|
|
100
|
+
- 'Existing Playwright e2e tests continue to pass'
|
|
101
|
+
tdd:
|
|
102
|
+
red: ['Write e2e test: dark class persists after page reload when toggled']
|
|
103
|
+
green: ['Add ThemeProvider wrapping children in layout.tsx']
|
|
104
|
+
refactor: ['Ensure import order follows project eslint rules']
|
|
105
|
+
estimatedEffort: '30min'
|
|
106
|
+
|
|
107
|
+
- id: task-7
|
|
108
|
+
phaseId: phase-3
|
|
109
|
+
title: 'Add ThemeToggle to settings panel'
|
|
110
|
+
description: 'Add ThemeToggle to the Appearance section of settings-panel.tsx.'
|
|
111
|
+
state: Todo
|
|
112
|
+
dependencies: ['task-3', 'task-6']
|
|
113
|
+
acceptanceCriteria:
|
|
114
|
+
- 'settings-panel.tsx imports and renders ThemeToggle in the Appearance section'
|
|
115
|
+
- 'ThemeToggle is visible and functional in the running web UI'
|
|
116
|
+
tdd:
|
|
117
|
+
red: ['Write unit test: ThemeToggle is present in rendered SettingsPanel']
|
|
118
|
+
green: ['Add import and render ThemeToggle in the Appearance section']
|
|
119
|
+
refactor: ['Ensure Appearance section heading is semantically correct (h2/h3)']
|
|
120
|
+
estimatedEffort: '30min'
|
|
121
|
+
|
|
122
|
+
- id: task-8
|
|
123
|
+
phaseId: phase-3
|
|
124
|
+
title: 'Run full validation and fix any issues'
|
|
125
|
+
description: 'Run pnpm validate and pnpm test; fix any failures before marking complete.'
|
|
126
|
+
state: Todo
|
|
127
|
+
dependencies: ['task-6', 'task-7']
|
|
128
|
+
acceptanceCriteria:
|
|
129
|
+
- 'pnpm lint passes with no errors'
|
|
130
|
+
- 'pnpm typecheck passes with no errors'
|
|
131
|
+
- 'pnpm test passes with no failures'
|
|
132
|
+
- 'pnpm build completes successfully'
|
|
133
|
+
tdd: null
|
|
134
|
+
estimatedEffort: '30min'
|
|
135
|
+
|
|
136
|
+
totalEstimate: '7.25h'
|
|
137
|
+
openQuestions: []
|
|
138
|
+
|
|
139
|
+
content: |
|
|
140
|
+
## Summary
|
|
141
|
+
|
|
142
|
+
Phase-1 builds ThemeProvider + useTheme hook with full test coverage.
|
|
143
|
+
Phase-2 creates ThemeToggle in isolation with Storybook stories and integration tests.
|
|
144
|
+
Phase-3 wires the provider into the root layout, adds the toggle to the settings panel,
|
|
145
|
+
then validates with pnpm validate + pnpm test.
|
|
146
|
+
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAoB1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoD1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAoB1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoD1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsM/D"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js
CHANGED
|
@@ -130,6 +130,7 @@ export async function runWorker(args) {
|
|
|
130
130
|
getDiffSummary: (cwd, baseBranch) => gitPrService.getPrDiffSummary(cwd, baseBranch),
|
|
131
131
|
hasRemote: (cwd) => gitPrService.hasRemote(cwd),
|
|
132
132
|
getDefaultBranch: (cwd) => gitPrService.getDefaultBranch(cwd),
|
|
133
|
+
verifyMerge: (cwd, featureBranch, baseBranch) => gitPrService.verifyMerge(cwd, featureBranch, baseBranch),
|
|
133
134
|
featureRepository,
|
|
134
135
|
},
|
|
135
136
|
};
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts
CHANGED
|
@@ -17,6 +17,11 @@ export interface MergeNodeDeps {
|
|
|
17
17
|
hasRemote: (cwd: string) => Promise<boolean>;
|
|
18
18
|
getDefaultBranch: (cwd: string) => Promise<string>;
|
|
19
19
|
featureRepository: Pick<IFeatureRepository, 'findById' | 'update'>;
|
|
20
|
+
/**
|
|
21
|
+
* Verify that featureBranch has been merged into baseBranch.
|
|
22
|
+
* Returns true if baseBranch contains all commits from featureBranch.
|
|
23
|
+
*/
|
|
24
|
+
verifyMerge: (cwd: string, featureBranch: string, baseBranch: string) => Promise<boolean>;
|
|
20
25
|
}
|
|
21
26
|
/**
|
|
22
27
|
* Factory that creates the merge node function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iEAAiE,CAAC;AAqBnG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iEAAiE,CAAC;AAqBnG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAsL7E"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js
CHANGED
|
@@ -61,10 +61,10 @@ export function createMergeNode(deps) {
|
|
|
61
61
|
let prUrl = state.prUrl;
|
|
62
62
|
let prNumber = state.prNumber;
|
|
63
63
|
const ciStatus = state.ciStatus;
|
|
64
|
+
// --- Check for git remote (needed by both agent calls) ---
|
|
65
|
+
const remoteAvailable = await deps.hasRemote(cwd);
|
|
64
66
|
// --- Agent Call 1: Commit + Push + PR (skip on approval resume) ---
|
|
65
67
|
if (!isResumeAfterInterrupt) {
|
|
66
|
-
// --- Check for git remote ---
|
|
67
|
-
const remoteAvailable = await deps.hasRemote(cwd);
|
|
68
68
|
if (!remoteAvailable) {
|
|
69
69
|
log.info('No git remote configured — skipping push and PR, will merge locally');
|
|
70
70
|
}
|
|
@@ -110,8 +110,20 @@ export function createMergeNode(deps) {
|
|
|
110
110
|
let merged = false;
|
|
111
111
|
if (state.approvalGates?.allowMerge) {
|
|
112
112
|
log.info('Agent call 2: merge/squash');
|
|
113
|
-
const mergePrompt = buildMergeSquashPrompt({ ...state, prUrl, prNumber, commitHash }, branch, baseBranch);
|
|
114
|
-
|
|
113
|
+
const mergePrompt = buildMergeSquashPrompt({ ...state, prUrl, prNumber, commitHash }, branch, baseBranch, remoteAvailable);
|
|
114
|
+
// Run merge in the ORIGINAL repo, not the worktree — the worktree IS
|
|
115
|
+
// the feature branch and must not be modified or removed during merge.
|
|
116
|
+
const mergeOptions = { ...options, cwd: state.repositoryPath };
|
|
117
|
+
await retryExecute(executor, mergePrompt, mergeOptions, { logger: log });
|
|
118
|
+
// Verify the merge actually succeeded (agent may report success without merging)
|
|
119
|
+
if (!prUrl) {
|
|
120
|
+
const mergeVerified = await deps.verifyMerge(state.repositoryPath, branch, baseBranch);
|
|
121
|
+
if (!mergeVerified) {
|
|
122
|
+
throw new Error(`Merge verification failed: ${branch} was not merged into ${baseBranch}. ` +
|
|
123
|
+
`The agent may have encountered errors during the merge operation.`);
|
|
124
|
+
}
|
|
125
|
+
log.info('Merge verified: feature branch is ancestor of base branch');
|
|
126
|
+
}
|
|
115
127
|
messages.push(`[merge] Agent completed merge operation`);
|
|
116
128
|
merged = true;
|
|
117
129
|
}
|
|
@@ -20,5 +20,5 @@ export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch
|
|
|
20
20
|
* When no PR exists, performs a local merge in the ORIGINAL repo directory
|
|
21
21
|
* (not the worktree, which IS the feature branch).
|
|
22
22
|
*/
|
|
23
|
-
export declare function buildMergeSquashPrompt(state: FeatureAgentState, branch: string, baseBranch: string): string;
|
|
23
|
+
export declare function buildMergeSquashPrompt(state: FeatureAgentState, branch: string, baseBranch: string, hasRemote?: boolean): string;
|
|
24
24
|
//# sourceMappingURL=merge-prompts.d.ts.map
|