agenv-cli 0.1.0
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/LICENSE +21 -0
- package/README.md +110 -0
- package/dist/adapters/claude/index.d.ts +2 -0
- package/dist/adapters/claude/index.js +50 -0
- package/dist/adapters/claude/index.js.map +1 -0
- package/dist/adapters/codex/index.d.ts +2 -0
- package/dist/adapters/codex/index.js +31 -0
- package/dist/adapters/codex/index.js.map +1 -0
- package/dist/adapters/copilot/index.d.ts +2 -0
- package/dist/adapters/copilot/index.js +34 -0
- package/dist/adapters/copilot/index.js.map +1 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.js +18 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mcp/index.d.ts +2 -0
- package/dist/adapters/mcp/index.js +45 -0
- package/dist/adapters/mcp/index.js.map +1 -0
- package/dist/adapters/types.d.ts +23 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +18 -0
- package/dist/cli/commands/diff.js +65 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +26 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +21 -0
- package/dist/cli/commands/generate.js +73 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +93 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/templates-list.d.ts +2 -0
- package/dist/cli/commands/templates-list.js +20 -0
- package/dist/cli/commands/templates-list.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts/init-flow.d.ts +5 -0
- package/dist/cli/prompts/init-flow.js +23 -0
- package/dist/cli/prompts/init-flow.js.map +1 -0
- package/dist/cli/prompts/sessions/auth.d.ts +5 -0
- package/dist/cli/prompts/sessions/auth.js +6 -0
- package/dist/cli/prompts/sessions/auth.js.map +1 -0
- package/dist/cli/prompts/sessions/data.d.ts +5 -0
- package/dist/cli/prompts/sessions/data.js +6 -0
- package/dist/cli/prompts/sessions/data.js.map +1 -0
- package/dist/cli/prompts/sessions/output.d.ts +5 -0
- package/dist/cli/prompts/sessions/output.js +6 -0
- package/dist/cli/prompts/sessions/output.js.map +1 -0
- package/dist/cli/prompts/sessions/project-type.d.ts +5 -0
- package/dist/cli/prompts/sessions/project-type.js +6 -0
- package/dist/cli/prompts/sessions/project-type.js.map +1 -0
- package/dist/cli/prompts/sessions/quality.d.ts +5 -0
- package/dist/cli/prompts/sessions/quality.js +6 -0
- package/dist/cli/prompts/sessions/quality.js.map +1 -0
- package/dist/cli/prompts/sessions/setup-depth.d.ts +5 -0
- package/dist/cli/prompts/sessions/setup-depth.js +6 -0
- package/dist/cli/prompts/sessions/setup-depth.js.map +1 -0
- package/dist/cli/prompts/sessions/stack.d.ts +5 -0
- package/dist/cli/prompts/sessions/stack.js +6 -0
- package/dist/cli/prompts/sessions/stack.js.map +1 -0
- package/dist/cli/prompts/sessions/tooling.d.ts +5 -0
- package/dist/cli/prompts/sessions/tooling.js +6 -0
- package/dist/cli/prompts/sessions/tooling.js.map +1 -0
- package/dist/cli/prompts/sessions/tools.d.ts +5 -0
- package/dist/cli/prompts/sessions/tools.js +6 -0
- package/dist/cli/prompts/sessions/tools.js.map +1 -0
- package/dist/cli/prompts/sessions/ui.d.ts +5 -0
- package/dist/cli/prompts/sessions/ui.js +6 -0
- package/dist/cli/prompts/sessions/ui.js.map +1 -0
- package/dist/detect/dependencies.d.ts +8 -0
- package/dist/detect/dependencies.js +19 -0
- package/dist/detect/dependencies.js.map +1 -0
- package/dist/detect/existing-ai-files.d.ts +1 -0
- package/dist/detect/existing-ai-files.js +26 -0
- package/dist/detect/existing-ai-files.js.map +1 -0
- package/dist/detect/frameworks.d.ts +2 -0
- package/dist/detect/frameworks.js +13 -0
- package/dist/detect/frameworks.js.map +1 -0
- package/dist/detect/package-json.d.ts +7 -0
- package/dist/detect/package-json.js +20 -0
- package/dist/detect/package-json.js.map +1 -0
- package/dist/detect/repo-inspector.d.ts +10 -0
- package/dist/detect/repo-inspector.js +35 -0
- package/dist/detect/repo-inspector.js.map +1 -0
- package/dist/doctor/checks/compatibility.d.ts +4 -0
- package/dist/doctor/checks/compatibility.js +16 -0
- package/dist/doctor/checks/compatibility.js.map +1 -0
- package/dist/doctor/checks/env.d.ts +3 -0
- package/dist/doctor/checks/env.js +14 -0
- package/dist/doctor/checks/env.js.map +1 -0
- package/dist/doctor/checks/manifest.d.ts +3 -0
- package/dist/doctor/checks/manifest.js +31 -0
- package/dist/doctor/checks/manifest.js.map +1 -0
- package/dist/doctor/checks/paths.d.ts +3 -0
- package/dist/doctor/checks/paths.js +29 -0
- package/dist/doctor/checks/paths.js.map +1 -0
- package/dist/doctor/checks/repo-match.d.ts +4 -0
- package/dist/doctor/checks/repo-match.js +16 -0
- package/dist/doctor/checks/repo-match.js.map +1 -0
- package/dist/doctor/checks/security.d.ts +3 -0
- package/dist/doctor/checks/security.js +16 -0
- package/dist/doctor/checks/security.js.map +1 -0
- package/dist/doctor/run.d.ts +7 -0
- package/dist/doctor/run.js +47 -0
- package/dist/doctor/run.js.map +1 -0
- package/dist/doctor/types.d.ts +12 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/fs/backups.d.ts +1 -0
- package/dist/fs/backups.js +4 -0
- package/dist/fs/backups.js.map +1 -0
- package/dist/fs/diff.d.ts +8 -0
- package/dist/fs/diff.js +39 -0
- package/dist/fs/diff.js.map +1 -0
- package/dist/fs/headers.d.ts +6 -0
- package/dist/fs/headers.js +32 -0
- package/dist/fs/headers.js.map +1 -0
- package/dist/fs/write.d.ts +8 -0
- package/dist/fs/write.js +42 -0
- package/dist/fs/write.js.map +1 -0
- package/dist/manifest/defaults.d.ts +11 -0
- package/dist/manifest/defaults.js +71 -0
- package/dist/manifest/defaults.js.map +1 -0
- package/dist/manifest/load.d.ts +10 -0
- package/dist/manifest/load.js +34 -0
- package/dist/manifest/load.js.map +1 -0
- package/dist/manifest/normalize.d.ts +7 -0
- package/dist/manifest/normalize.js +40 -0
- package/dist/manifest/normalize.js.map +1 -0
- package/dist/manifest/save.d.ts +2 -0
- package/dist/manifest/save.js +9 -0
- package/dist/manifest/save.js.map +1 -0
- package/dist/manifest/schema.d.ts +166 -0
- package/dist/manifest/schema.js +96 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/planner/build-plan.d.ts +29 -0
- package/dist/planner/build-plan.js +49 -0
- package/dist/planner/build-plan.js.map +1 -0
- package/dist/planner/output-map.d.ts +18 -0
- package/dist/planner/output-map.js +192 -0
- package/dist/planner/output-map.js.map +1 -0
- package/dist/planner/warnings.d.ts +7 -0
- package/dist/planner/warnings.js +26 -0
- package/dist/planner/warnings.js.map +1 -0
- package/dist/render/render-plan.d.ts +4 -0
- package/dist/render/render-plan.js +15 -0
- package/dist/render/render-plan.js.map +1 -0
- package/dist/render/shared.d.ts +4 -0
- package/dist/render/shared.js +426 -0
- package/dist/render/shared.js.map +1 -0
- package/dist/templates/registry.d.ts +10 -0
- package/dist/templates/registry.js +48 -0
- package/dist/templates/registry.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/format.js +20 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.js +12 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { formatJson } from "../utils/json.js";
|
|
3
|
+
import { PROMPT_PACKS } from "../planner/output-map.js";
|
|
4
|
+
const PROMPT_TEMPLATE_DEFINITIONS = {
|
|
5
|
+
"build-page-shell": {
|
|
6
|
+
title: "Build Page Shell",
|
|
7
|
+
goal: "Create or refine a durable page shell with clear layout structure, route-level organization, and responsive behavior.",
|
|
8
|
+
useWhen: "Use this when a route needs the overall frame, header, navigation, spacing system, and page-level loading or empty states.",
|
|
9
|
+
focusAreas: [
|
|
10
|
+
"Define the route-level structure and the main content regions before filling in detailed widgets.",
|
|
11
|
+
"Make navigation, titles, actions, and responsive breakpoints feel intentional instead of incidental.",
|
|
12
|
+
"Keep loading, empty, and error states visible at the page-shell level where they affect the whole experience.",
|
|
13
|
+
],
|
|
14
|
+
deliverables: [
|
|
15
|
+
"The page shell implementation and any supporting layout components.",
|
|
16
|
+
"A short summary of the structure decisions, responsive behavior, and state handling.",
|
|
17
|
+
"Any follow-up gaps or risks that still need product or design input.",
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
"build-data-table": {
|
|
21
|
+
title: "Build Data Table",
|
|
22
|
+
goal: "Implement a production-ready data table with clear columns, sorting, filtering, pagination, and state handling.",
|
|
23
|
+
useWhen: "Use this when a page needs dense data presentation, list management, or admin workflows driven by tabular data.",
|
|
24
|
+
focusAreas: [
|
|
25
|
+
"Model the columns, row actions, empty states, and loading behavior around the real user task.",
|
|
26
|
+
"Keep filtering, sorting, and pagination predictable and easy to reason about.",
|
|
27
|
+
"Preserve accessibility, keyboard behavior, and legibility for dense information.",
|
|
28
|
+
],
|
|
29
|
+
deliverables: [
|
|
30
|
+
"The table implementation, helpers, and any state wiring required to support it.",
|
|
31
|
+
"A note describing how sorting, filtering, pagination, and row actions behave.",
|
|
32
|
+
"Tests or verification steps covering the most failure-prone table interactions.",
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
"build-filter-panel": {
|
|
36
|
+
title: "Build Filter Panel",
|
|
37
|
+
goal: "Build a filter panel or filter bar that makes narrowing results fast, understandable, and reversible.",
|
|
38
|
+
useWhen: "Use this when users need to refine lists, charts, dashboards, or search results with multiple controls.",
|
|
39
|
+
focusAreas: [
|
|
40
|
+
"Choose controls that fit the data shape and are easy to reset or inspect at a glance.",
|
|
41
|
+
"Keep filter state synchronized with the page state, URL state, or request state as appropriate.",
|
|
42
|
+
"Make the active filter set visible so users understand why results changed.",
|
|
43
|
+
],
|
|
44
|
+
deliverables: [
|
|
45
|
+
"The filter UI and any associated state/query integration.",
|
|
46
|
+
"A summary of how filter state is initialized, applied, cleared, and persisted.",
|
|
47
|
+
"Verification that empty, loading, and no-match states remain understandable with filters applied.",
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
"build-kpi-cards": {
|
|
51
|
+
title: "Build KPI Cards",
|
|
52
|
+
goal: "Create KPI or summary cards that surface the most important metrics clearly and credibly.",
|
|
53
|
+
useWhen: "Use this when a page needs top-level metrics, health indicators, or summary snapshots before deeper detail.",
|
|
54
|
+
focusAreas: [
|
|
55
|
+
"Prioritize the metrics, labels, trends, and comparisons that help users orient quickly.",
|
|
56
|
+
"Handle loading, stale data, missing values, and surprising values without visual confusion.",
|
|
57
|
+
"Keep the card hierarchy readable on both wide and narrow screens.",
|
|
58
|
+
],
|
|
59
|
+
deliverables: [
|
|
60
|
+
"The KPI card components and the data formatting needed to support them.",
|
|
61
|
+
"A short explanation of metric hierarchy, trend treatment, and fallback behavior.",
|
|
62
|
+
"Verification that cards remain legible and accurate across representative states.",
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
"build-chart-section": {
|
|
66
|
+
title: "Build Chart Section",
|
|
67
|
+
goal: "Implement a chart section that turns data into a readable story without sacrificing accuracy or usability.",
|
|
68
|
+
useWhen: "Use this when the page needs trends, comparisons, distributions, or time-series views supported by charts.",
|
|
69
|
+
focusAreas: [
|
|
70
|
+
"Choose chart types, labels, legends, and supporting context that match the data question being answered.",
|
|
71
|
+
"Make edge cases explicit, including empty data, partial ranges, and suspicious outliers.",
|
|
72
|
+
"Pair the chart with surrounding copy or summary context so users can interpret it quickly.",
|
|
73
|
+
],
|
|
74
|
+
deliverables: [
|
|
75
|
+
"The chart section implementation with any data adapters or formatting helpers it needs.",
|
|
76
|
+
"A brief note explaining the chart choice, axis treatment, and edge-case handling.",
|
|
77
|
+
"Verification that the chart stays readable and accessible across screen sizes and states.",
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
"connect-api-resource": {
|
|
81
|
+
title: "Connect API Resource",
|
|
82
|
+
goal: "Wire a UI surface to an API resource with strong typing, state handling, and clear failure behavior.",
|
|
83
|
+
useWhen: "Use this when you need to fetch, mutate, cache, or normalize data from an API or backend resource.",
|
|
84
|
+
focusAreas: [
|
|
85
|
+
"Keep request state explicit and typed, including loading, empty, success, stale, and error states.",
|
|
86
|
+
"Separate transport concerns from UI concerns so components stay easier to test and maintain.",
|
|
87
|
+
"Make retry behavior, optimistic updates, and error boundaries deliberate instead of accidental.",
|
|
88
|
+
],
|
|
89
|
+
deliverables: [
|
|
90
|
+
"The resource integration code plus the UI wiring that consumes it.",
|
|
91
|
+
"A summary of data flow, caching or invalidation behavior, and failure handling.",
|
|
92
|
+
"Tests or verification steps for the most important success and failure paths.",
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
"build-form-flow": {
|
|
96
|
+
title: "Build Form Flow",
|
|
97
|
+
goal: "Implement a form flow with clear validation, submission states, and user guidance from start to finish.",
|
|
98
|
+
useWhen: "Use this when the work involves data entry, editing, onboarding, configuration, or multi-step submission flows.",
|
|
99
|
+
focusAreas: [
|
|
100
|
+
"Design the field structure, validation, and submission lifecycle around the real user journey.",
|
|
101
|
+
"Keep errors actionable and in-context, especially for async validation or server responses.",
|
|
102
|
+
"Ensure the form remains usable with keyboard navigation, screen readers, and narrow viewports.",
|
|
103
|
+
],
|
|
104
|
+
deliverables: [
|
|
105
|
+
"The form implementation, validation schema or rules, and submission handling.",
|
|
106
|
+
"A short summary of validation behavior, success handling, and failure recovery.",
|
|
107
|
+
"Verification that the form behaves correctly across happy path, invalid input, and submission failure cases.",
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
"handle-loading-empty-error-states": {
|
|
111
|
+
title: "Handle Loading, Empty, and Error States",
|
|
112
|
+
goal: "Design and implement resilient loading, empty, and error states so the experience stays understandable under real-world data conditions.",
|
|
113
|
+
useWhen: "Use this when a feature is functionally complete on the happy path but still feels fragile, confusing, or incomplete around asynchronous states and failures.",
|
|
114
|
+
focusAreas: [
|
|
115
|
+
"Audit the user journey for loading, empty, partial, stale, retry, and failure states instead of only the success state.",
|
|
116
|
+
"Make fallback UI informative enough that users understand what happened and what they can do next.",
|
|
117
|
+
"Keep state handling consistent across page-level and component-level boundaries so the UI does not contradict itself.",
|
|
118
|
+
],
|
|
119
|
+
deliverables: [
|
|
120
|
+
"The UI and state-handling changes needed to cover loading, empty, and error scenarios properly.",
|
|
121
|
+
"A short summary of which edge states were added or improved and why.",
|
|
122
|
+
"Verification that the feature remains understandable across representative failure and no-data conditions.",
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
"enforce-accessibility-and-responsive-layout": {
|
|
126
|
+
title: "Enforce Accessibility and Responsive Layout",
|
|
127
|
+
goal: "Refine the implementation so accessibility, keyboard support, semantics, and responsive behavior are built into the feature rather than added as an afterthought.",
|
|
128
|
+
useWhen: "Use this when a UI surface is implemented but still needs a structured pass for accessibility quality, semantic clarity, and device responsiveness.",
|
|
129
|
+
focusAreas: [
|
|
130
|
+
"Review headings, landmarks, labels, focus order, and keyboard interaction before treating the UI as complete.",
|
|
131
|
+
"Check how layout, density, spacing, and overflow behave across narrow, medium, and wide screens.",
|
|
132
|
+
"Prefer adjustments that improve both usability and maintainability instead of layering one-off fixes on top.",
|
|
133
|
+
],
|
|
134
|
+
deliverables: [
|
|
135
|
+
"The accessibility and responsive-layout improvements required for the feature.",
|
|
136
|
+
"A short note describing the key improvements and any remaining accessibility risks.",
|
|
137
|
+
"Verification steps covering keyboard behavior, semantics, and responsive layout expectations.",
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
"write-dashboard-tests": {
|
|
141
|
+
title: "Write Feature Tests",
|
|
142
|
+
goal: "Add focused automated tests that prove the implementation works across the most important user flows and failure paths.",
|
|
143
|
+
useWhen: "Use this when the implementation exists but confidence is still too dependent on manual checking or the happy path only.",
|
|
144
|
+
focusAreas: [
|
|
145
|
+
"Choose the test level that best matches the behavior under risk instead of defaulting blindly to unit or integration tests.",
|
|
146
|
+
"Cover realistic user-visible outcomes, including loading, empty, error, validation, or permission-sensitive behavior where relevant.",
|
|
147
|
+
"Keep the tests readable enough that future contributors can understand what behavior is protected.",
|
|
148
|
+
],
|
|
149
|
+
deliverables: [
|
|
150
|
+
"Automated tests that protect the highest-risk behavior in the feature.",
|
|
151
|
+
"A brief summary of what the new tests cover and what they intentionally do not cover yet.",
|
|
152
|
+
"Notes on any remaining blind spots that still need manual verification or future coverage.",
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
"ui-builder": {
|
|
156
|
+
title: "UI Builder",
|
|
157
|
+
goal: "Design and implement cohesive UI structure that feels intentional, consistent, and maintainable.",
|
|
158
|
+
useWhen: "Use this when the task spans multiple components, layout decisions, or visual hierarchy choices.",
|
|
159
|
+
focusAreas: [
|
|
160
|
+
"Work from page structure and information hierarchy down to component detail.",
|
|
161
|
+
"Reuse existing patterns or design-system primitives before inventing new ones.",
|
|
162
|
+
"Keep implementation readable so future UI changes do not require large rewrites.",
|
|
163
|
+
],
|
|
164
|
+
deliverables: [
|
|
165
|
+
"The relevant UI implementation and any shared components needed to support it.",
|
|
166
|
+
"A summary of the composition decisions and reused patterns.",
|
|
167
|
+
"Notes on any assumptions, tradeoffs, or visual follow-ups still needed.",
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
"data-integrator": {
|
|
171
|
+
title: "Data Integrator",
|
|
172
|
+
goal: "Connect application state, API resources, and presentation components into a stable user-facing flow.",
|
|
173
|
+
useWhen: "Use this when the work crosses fetch logic, transformation, UI binding, and state synchronization boundaries.",
|
|
174
|
+
focusAreas: [
|
|
175
|
+
"Trace the data flow end to end before changing component behavior.",
|
|
176
|
+
"Keep transformation logic explicit so mismatches between backend data and UI state are easy to debug.",
|
|
177
|
+
"Make loading, error, and stale-data transitions predictable across the whole flow.",
|
|
178
|
+
],
|
|
179
|
+
deliverables: [
|
|
180
|
+
"The data integration changes across fetch, transform, and UI layers.",
|
|
181
|
+
"A short explanation of state boundaries and data ownership.",
|
|
182
|
+
"Verification steps that prove the integrated flow works across realistic scenarios.",
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
"table-specialist": {
|
|
186
|
+
title: "Table Specialist",
|
|
187
|
+
goal: "Refine tabular workflows for clarity, speed, and robustness in dense data experiences.",
|
|
188
|
+
useWhen: "Use this when the table is the main working surface and needs careful attention to interactions and edge cases.",
|
|
189
|
+
focusAreas: [
|
|
190
|
+
"Optimize discoverability of sorting, filtering, row actions, and bulk actions.",
|
|
191
|
+
"Protect usability in dense states with long text, many columns, or mixed row states.",
|
|
192
|
+
"Keep implementation modular enough to evolve without turning the table into a monolith.",
|
|
193
|
+
],
|
|
194
|
+
deliverables: [
|
|
195
|
+
"Improvements to the table surface and its supporting interaction model.",
|
|
196
|
+
"A summary of the interaction model and the edge cases it now covers.",
|
|
197
|
+
"Verification that the table remains predictable under realistic heavy-use scenarios.",
|
|
198
|
+
],
|
|
199
|
+
},
|
|
200
|
+
"chart-specialist": {
|
|
201
|
+
title: "Chart Specialist",
|
|
202
|
+
goal: "Refine charts and surrounding data presentation so they are both analytically useful and easy to read.",
|
|
203
|
+
useWhen: "Use this when data visualization is central to the task and chart quality matters as much as raw implementation.",
|
|
204
|
+
focusAreas: [
|
|
205
|
+
"Tune chart semantics, labels, legends, and supporting UI for the actual user question.",
|
|
206
|
+
"Avoid visual noise and misleading encodings when data is sparse, skewed, or incomplete.",
|
|
207
|
+
"Make sure the chart section still communicates the right story without hover interactions.",
|
|
208
|
+
],
|
|
209
|
+
deliverables: [
|
|
210
|
+
"The chart refinements and any supporting copy, formatting, or data-shaping changes.",
|
|
211
|
+
"A note describing why the chosen visualization is a fit for the data.",
|
|
212
|
+
"Verification that the visualization remains understandable across common edge cases.",
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
"form-builder": {
|
|
216
|
+
title: "Form Builder",
|
|
217
|
+
goal: "Build reliable forms that are easy to complete, validate, and recover from when something goes wrong.",
|
|
218
|
+
useWhen: "Use this when forms are the primary interaction surface and need thoughtful UX plus dependable implementation.",
|
|
219
|
+
focusAreas: [
|
|
220
|
+
"Reduce ambiguity in labels, defaults, validation, and confirmation states.",
|
|
221
|
+
"Treat async submission and server-side validation as first-class concerns.",
|
|
222
|
+
"Keep forms composable so later edits do not require rewriting the entire flow.",
|
|
223
|
+
],
|
|
224
|
+
deliverables: [
|
|
225
|
+
"The form flow implementation and any supporting abstractions required to keep it maintainable.",
|
|
226
|
+
"A brief summary of validation, error handling, and success feedback decisions.",
|
|
227
|
+
"Verification steps covering both user-facing UX and implementation correctness.",
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
"qa-reviewer": {
|
|
231
|
+
title: "QA Reviewer",
|
|
232
|
+
goal: "Review an implementation for regressions, missing states, and quality gaps before it moves on.",
|
|
233
|
+
useWhen: "Use this when a feature is implemented and needs a structured pass for bugs, edge cases, and verification coverage.",
|
|
234
|
+
focusAreas: [
|
|
235
|
+
"Look for behavior regressions, missing states, accessibility gaps, and weak error handling first.",
|
|
236
|
+
"Review the code path against realistic user flows, not just the happy path.",
|
|
237
|
+
"Call out concrete follow-up checks or tests when risk remains.",
|
|
238
|
+
],
|
|
239
|
+
deliverables: [
|
|
240
|
+
"A concise review summary ordered by the most important findings first.",
|
|
241
|
+
"Clear notes on missing tests, residual risks, or behavior that still needs manual verification.",
|
|
242
|
+
"If no issues are found, an explicit statement that the pass was clean plus any remaining blind spots.",
|
|
243
|
+
],
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
function describeProjectType(manifest) {
|
|
247
|
+
return manifest.project.type === "web-app" ? "web app" : "dashboard";
|
|
248
|
+
}
|
|
249
|
+
function describeProjectFocus(manifest) {
|
|
250
|
+
if (manifest.project.type === "web-app") {
|
|
251
|
+
return "Favor cohesive user journeys, responsive layouts, and reusable UI patterns that scale beyond a single page.";
|
|
252
|
+
}
|
|
253
|
+
return "Favor operational clarity, dense-but-readable interfaces, and explicit handling for data-heavy states and permissions.";
|
|
254
|
+
}
|
|
255
|
+
function formatBullets(items) {
|
|
256
|
+
return items.map((item) => `- ${item}`).join("\n");
|
|
257
|
+
}
|
|
258
|
+
function buildProjectContext(manifest) {
|
|
259
|
+
const enabledTargets = Object.entries(manifest.targets)
|
|
260
|
+
.filter(([, enabled]) => enabled)
|
|
261
|
+
.map(([target]) => target);
|
|
262
|
+
const context = [
|
|
263
|
+
`Project: ${manifest.project.name}`,
|
|
264
|
+
`Framework: ${manifest.project.framework}`,
|
|
265
|
+
`Project type: ${describeProjectType(manifest)}`,
|
|
266
|
+
`Targets: ${enabledTargets.join(", ") || "none"}`,
|
|
267
|
+
`Accessibility required: ${manifest.conventions.accessibility ? "yes" : "no"}`,
|
|
268
|
+
`Responsive behavior required: ${manifest.conventions.responsive ? "yes" : "no"}`,
|
|
269
|
+
];
|
|
270
|
+
if (manifest.conventions.authModel) {
|
|
271
|
+
context.push(`Auth model: ${manifest.conventions.authModel}`);
|
|
272
|
+
}
|
|
273
|
+
if (manifest.project.type === "dashboard") {
|
|
274
|
+
context.push(`Styling: ${manifest.dashboard.styling}`, `Components: ${manifest.dashboard.components}`, `Data fetching: ${manifest.dashboard.dataFetching}`, `Tables: ${manifest.dashboard.tables}`, `Charts: ${manifest.dashboard.charts}`, `Forms: ${manifest.dashboard.forms}`, `State: ${manifest.dashboard.state}`, `Testing: ${manifest.dashboard.testing.join(", ")}`);
|
|
275
|
+
}
|
|
276
|
+
return context;
|
|
277
|
+
}
|
|
278
|
+
function renderPromptBlock(manifest, goal, focusAreas, deliverables) {
|
|
279
|
+
return [
|
|
280
|
+
"```text",
|
|
281
|
+
`You are working in the ${manifest.project.name} ${manifest.project.framework} ${describeProjectType(manifest)} repository.`,
|
|
282
|
+
"",
|
|
283
|
+
`Task: ${goal}`,
|
|
284
|
+
"",
|
|
285
|
+
"Project context:",
|
|
286
|
+
...buildProjectContext(manifest).map((item) => `- ${item}`),
|
|
287
|
+
"",
|
|
288
|
+
"Focus areas:",
|
|
289
|
+
...focusAreas.map((item) => `- ${item}`),
|
|
290
|
+
"",
|
|
291
|
+
"Coding style:",
|
|
292
|
+
...manifest.instructions.codingStyle.map((item) => `- ${item}`),
|
|
293
|
+
"",
|
|
294
|
+
"Review rules:",
|
|
295
|
+
...manifest.instructions.reviewRules.map((item) => `- ${item}`),
|
|
296
|
+
"",
|
|
297
|
+
"Expected deliverables:",
|
|
298
|
+
...deliverables.map((item) => `- ${item}`),
|
|
299
|
+
"```",
|
|
300
|
+
].join("\n");
|
|
301
|
+
}
|
|
302
|
+
function renderArchitectureDoc(manifest) {
|
|
303
|
+
const enabledTargets = Object.entries(manifest.targets)
|
|
304
|
+
.filter(([, enabled]) => enabled)
|
|
305
|
+
.map(([target]) => target);
|
|
306
|
+
return `# AI Architecture\n\n## Project\n\n- Name: ${manifest.project.name}\n- Type: ${manifest.project.type}\n- Framework: ${manifest.project.framework}\n- Language: ${manifest.project.language}\n\n## Setup\n\n- Depth: ${manifest.setup.depth}\n- Mode: ${manifest.setup.mode}\n- Scope: ${manifest.setup.scope}\n\n## Targets\n\n${enabledTargets.map((target) => `- ${target}`).join("\n")}\n\n## Coding Style\n\n${manifest.instructions.codingStyle.map((rule) => `- ${rule}`).join("\n")}\n\n## Review Rules\n\n${manifest.instructions.reviewRules.map((rule) => `- ${rule}`).join("\n")}\n`;
|
|
307
|
+
}
|
|
308
|
+
function renderBootstrapPrompt(manifest) {
|
|
309
|
+
const starterMode = manifest.generated.prompts === "starter";
|
|
310
|
+
const goal = starterMode
|
|
311
|
+
? `Make steady progress on the current ${describeProjectType(manifest)} task without overcomplicating the first pass.`
|
|
312
|
+
: `Plan, implement, and verify a solid solution for the current ${describeProjectType(manifest)} task.`;
|
|
313
|
+
const focusAreas = starterMode
|
|
314
|
+
? [
|
|
315
|
+
"Start with the smallest end-to-end slice that makes the task concrete.",
|
|
316
|
+
"Keep assumptions explicit and ask for clarification only if the risk of guessing is high.",
|
|
317
|
+
"Call out the next most useful follow-up after the first pass is in place.",
|
|
318
|
+
]
|
|
319
|
+
: [
|
|
320
|
+
"Summarize the task and identify the files, states, and risks before editing.",
|
|
321
|
+
"Make changes that fit the existing architecture and reuse established patterns where possible.",
|
|
322
|
+
"Verify behavior with tests or focused checks, then call out any remaining risk clearly.",
|
|
323
|
+
];
|
|
324
|
+
const deliverables = starterMode
|
|
325
|
+
? [
|
|
326
|
+
"A concise implementation or investigation update.",
|
|
327
|
+
"The concrete file changes or recommendations that move the task forward.",
|
|
328
|
+
"The next best follow-up if the work should continue.",
|
|
329
|
+
]
|
|
330
|
+
: [
|
|
331
|
+
"A short plan before coding when the task spans multiple files or decisions.",
|
|
332
|
+
"The implementation plus any supporting tests or verification steps.",
|
|
333
|
+
"A final summary covering what changed, how it was verified, and any remaining risk.",
|
|
334
|
+
];
|
|
335
|
+
return `# Bootstrap Prompt\n\nUse this prompt when starting a new task in the repository.\n\nThis prompt is intentionally broad and reusable. It is the right default when you want one strong project-aware prompt without committing to a specialized workflow yet.\n\n## Project Focus\n\n${describeProjectFocus(manifest)}\n\n## Ready-To-Use Prompt\n\n${renderPromptBlock(manifest, goal, focusAreas, deliverables)}`;
|
|
336
|
+
}
|
|
337
|
+
function renderPromptIndex(manifest) {
|
|
338
|
+
const generatedPrompts = [
|
|
339
|
+
"bootstrap.md",
|
|
340
|
+
...(manifest.generated.prompts === "pack"
|
|
341
|
+
? PROMPT_PACKS.map((promptName) => `${promptName}.md`)
|
|
342
|
+
: []),
|
|
343
|
+
];
|
|
344
|
+
const modeSummary = manifest.generated.prompts === "starter"
|
|
345
|
+
? "Starter mode gives you one lightweight prompt to kick off a task."
|
|
346
|
+
: manifest.generated.prompts === "master"
|
|
347
|
+
? "Master mode gives you a more structured bootstrap prompt for planning, implementation, and verification."
|
|
348
|
+
: "Pack mode adds detailed best-practice prompts for common implementation roles, edge-state handling, accessibility, testing, and review flows.";
|
|
349
|
+
return `# AI Prompts\n\nPrompt generation mode: ${manifest.generated.prompts}\n\n${modeSummary}\n\nUse these prompts as reusable starting points for common ${describeProjectType(manifest)} implementation tasks.\n\n## Prompt Strategy\n\n- \`starter\` and \`master\` are intentionally more generic so they stay broadly reusable.\n- \`pack\` is the more complete setup: it adds richer best-practice prompts for specialized work.\n- Use specialized prompts when you want stronger guidance around implementation quality, state handling, accessibility, testing, or review depth.\n\n## Generated Prompt Files\n\n${generatedPrompts.map((promptFile) => `- \`${promptFile}\``).join("\n")}\n\n## How To Use Them\n\n- Start with \`bootstrap.md\` when you want one prompt that captures the project context and quality bar.\n- Reach for a specialized prompt when the work is clearly about a table, chart, form, data integration, state handling, accessibility, testing, or implementation review.\n- Edit the task wording in the prompt before pasting it into another tool so it matches the exact feature you are building.\n`;
|
|
350
|
+
}
|
|
351
|
+
function renderPromptTemplate(file, manifest) {
|
|
352
|
+
const promptName = basename(file.path, ".md");
|
|
353
|
+
const definition = PROMPT_TEMPLATE_DEFINITIONS[promptName];
|
|
354
|
+
if (!definition) {
|
|
355
|
+
const fallbackTitle = promptName
|
|
356
|
+
.split("-")
|
|
357
|
+
.map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)
|
|
358
|
+
.join(" ");
|
|
359
|
+
return `# ${fallbackTitle}\n\nUse this prompt as a starting point for work in ${manifest.project.name}.\n\n## Ready-To-Use Prompt\n\n${renderPromptBlock(manifest, `Advance the ${fallbackTitle.toLowerCase()} work while preserving the shared project conventions.`, [
|
|
360
|
+
"Clarify the intended user outcome before changing the implementation.",
|
|
361
|
+
"Reuse existing project patterns and keep state handling explicit.",
|
|
362
|
+
"Explain the final behavior and verification steps clearly.",
|
|
363
|
+
], [
|
|
364
|
+
"The implementation changes needed for the task.",
|
|
365
|
+
"A short summary of the decisions made.",
|
|
366
|
+
"Tests run or focused checks performed.",
|
|
367
|
+
])}`;
|
|
368
|
+
}
|
|
369
|
+
return `# ${definition.title}\n\n${definition.useWhen}\n\n## Goal\n\n${definition.goal}\n\n## Project Focus\n\n${describeProjectFocus(manifest)}\n\n## Ready-To-Use Prompt\n\n${renderPromptBlock(manifest, definition.goal, definition.focusAreas, definition.deliverables)}`;
|
|
370
|
+
}
|
|
371
|
+
function renderEnvExample(manifest) {
|
|
372
|
+
const presetLines = manifest.generated.mcpPresets.length === 0
|
|
373
|
+
? ["EXAMPLE_API_KEY=replace-me"]
|
|
374
|
+
: manifest.generated.mcpPresets.map((preset) => `${preset.toUpperCase().replaceAll(/[^A-Z0-9]+/g, "_")}_TOKEN=replace-me`);
|
|
375
|
+
return `${presetLines.join("\n")}\n`;
|
|
376
|
+
}
|
|
377
|
+
function renderLocalManifest() {
|
|
378
|
+
return formatJson({});
|
|
379
|
+
}
|
|
380
|
+
export function renderSharedFile(file, manifest) {
|
|
381
|
+
switch (file.path) {
|
|
382
|
+
case "ai-workspace.json":
|
|
383
|
+
return {
|
|
384
|
+
path: file.path,
|
|
385
|
+
content: formatJson(manifest),
|
|
386
|
+
trustSensitive: file.trustSensitive,
|
|
387
|
+
};
|
|
388
|
+
case "ai-workspace.local.json":
|
|
389
|
+
return {
|
|
390
|
+
path: file.path,
|
|
391
|
+
content: renderLocalManifest(),
|
|
392
|
+
trustSensitive: file.trustSensitive,
|
|
393
|
+
};
|
|
394
|
+
case "docs/ai-architecture.md":
|
|
395
|
+
return {
|
|
396
|
+
path: file.path,
|
|
397
|
+
content: renderArchitectureDoc(manifest),
|
|
398
|
+
trustSensitive: file.trustSensitive,
|
|
399
|
+
};
|
|
400
|
+
case "docs/ai-prompts/bootstrap.md":
|
|
401
|
+
return {
|
|
402
|
+
path: file.path,
|
|
403
|
+
content: renderBootstrapPrompt(manifest),
|
|
404
|
+
trustSensitive: file.trustSensitive,
|
|
405
|
+
};
|
|
406
|
+
case "docs/ai-prompts/README.md":
|
|
407
|
+
return {
|
|
408
|
+
path: file.path,
|
|
409
|
+
content: renderPromptIndex(manifest),
|
|
410
|
+
trustSensitive: file.trustSensitive,
|
|
411
|
+
};
|
|
412
|
+
case ".env.example":
|
|
413
|
+
return {
|
|
414
|
+
path: file.path,
|
|
415
|
+
content: renderEnvExample(manifest),
|
|
416
|
+
trustSensitive: file.trustSensitive,
|
|
417
|
+
};
|
|
418
|
+
default:
|
|
419
|
+
return {
|
|
420
|
+
path: file.path,
|
|
421
|
+
content: renderPromptTemplate(file, manifest),
|
|
422
|
+
trustSensitive: file.trustSensitive,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/render/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type TemplateDefinition = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
projectType: "dashboard" | "web-app";
|
|
5
|
+
framework: "react" | "nextjs" | "vite-react";
|
|
6
|
+
setupDepth: "recommended" | "semi-custom";
|
|
7
|
+
defaultTargets: string[];
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const TEMPLATE_REGISTRY: TemplateDefinition[];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const TEMPLATE_REGISTRY = [
|
|
2
|
+
{
|
|
3
|
+
id: "dashboard-nextjs-recommended",
|
|
4
|
+
name: "Dashboard Next.js Recommended",
|
|
5
|
+
projectType: "dashboard",
|
|
6
|
+
framework: "nextjs",
|
|
7
|
+
setupDepth: "recommended",
|
|
8
|
+
defaultTargets: ["codex", "copilot", "claude"],
|
|
9
|
+
description: "Opinionated Next.js dashboard setup with shared AI workspace defaults.",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "dashboard-vite-react-recommended",
|
|
13
|
+
name: "Dashboard Vite React Recommended",
|
|
14
|
+
projectType: "dashboard",
|
|
15
|
+
framework: "vite-react",
|
|
16
|
+
setupDepth: "recommended",
|
|
17
|
+
defaultTargets: ["codex", "copilot", "claude"],
|
|
18
|
+
description: "Lean Vite React internal-tool setup with dashboard-first defaults.",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "dashboard-react-semi-custom",
|
|
22
|
+
name: "Dashboard React Semi-custom",
|
|
23
|
+
projectType: "dashboard",
|
|
24
|
+
framework: "react",
|
|
25
|
+
setupDepth: "semi-custom",
|
|
26
|
+
defaultTargets: ["codex", "copilot", "claude", "mcp"],
|
|
27
|
+
description: "Manual-friendly React dashboard starter with broader tool selection.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "web-app-nextjs-recommended",
|
|
31
|
+
name: "Web App Next.js Recommended",
|
|
32
|
+
projectType: "web-app",
|
|
33
|
+
framework: "nextjs",
|
|
34
|
+
setupDepth: "recommended",
|
|
35
|
+
defaultTargets: ["codex", "copilot", "claude"],
|
|
36
|
+
description: "Opinionated Next.js web app setup with shared AI workspace defaults.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "web-app-react-semi-custom",
|
|
40
|
+
name: "Web App React Semi-custom",
|
|
41
|
+
projectType: "web-app",
|
|
42
|
+
framework: "react",
|
|
43
|
+
setupDepth: "semi-custom",
|
|
44
|
+
defaultTargets: ["codex", "copilot", "claude", "mcp"],
|
|
45
|
+
description: "Manual-friendly React web app starter with broader tool selection.",
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/templates/registry.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,iBAAiB,GAAyB;IACrD;QACE,EAAE,EAAE,8BAA8B;QAClC,IAAI,EAAE,+BAA+B;QACrC,WAAW,EAAE,WAAW;QACxB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC9C,WAAW,EAAE,wEAAwE;KACtF;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,IAAI,EAAE,kCAAkC;QACxC,WAAW,EAAE,WAAW;QACxB,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC9C,WAAW,EAAE,oEAAoE;KAClF;IACD;QACE,EAAE,EAAE,6BAA6B;QACjC,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,WAAW;QACxB,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;QACrD,WAAW,EAAE,sEAAsE;KACpF;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC9C,WAAW,EAAE,sEAAsE;KACpF;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;QACrD,WAAW,EAAE,oEAAoE;KAClF;CACF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { formatJson } from "./json.js";
|
|
2
|
+
export function parseCommaList(value) {
|
|
3
|
+
if (!value) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
return Array.from(new Set(value
|
|
7
|
+
.split(",")
|
|
8
|
+
.map((item) => item.trim())
|
|
9
|
+
.filter(Boolean)));
|
|
10
|
+
}
|
|
11
|
+
export function formatTextBlock(lines) {
|
|
12
|
+
return `${lines.join("\n")}\n`;
|
|
13
|
+
}
|
|
14
|
+
export function formatCommandOutput(text, jsonValue, asJson) {
|
|
15
|
+
if (asJson) {
|
|
16
|
+
return formatJson(jsonValue);
|
|
17
|
+
}
|
|
18
|
+
return text.endsWith("\n") ? text : `${text}\n`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,KAAK;SACF,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CACnB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,SAAkB,EAClB,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
export function isRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
export async function readJsonFile(filePath) {
|
|
6
|
+
const contents = await readFile(filePath, "utf8");
|
|
7
|
+
return JSON.parse(contents);
|
|
8
|
+
}
|
|
9
|
+
export function formatJson(value) {
|
|
10
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAM,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agenv-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Bootstrap a portable, reviewable AI workspace for web development repositories.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"cli",
|
|
8
|
+
"developer-tools",
|
|
9
|
+
"web-development",
|
|
10
|
+
"mcp",
|
|
11
|
+
"codex",
|
|
12
|
+
"copilot",
|
|
13
|
+
"claude",
|
|
14
|
+
"workspace",
|
|
15
|
+
"dashboard",
|
|
16
|
+
"frontend",
|
|
17
|
+
"internal-tools"
|
|
18
|
+
],
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/samuelyoo/agenv.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/samuelyoo/agenv",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/samuelyoo/agenv/issues"
|
|
26
|
+
},
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"bin": {
|
|
30
|
+
"agenv": "dist/cli/index.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.json",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
39
|
+
"start": "node dist/cli/index.js"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"commander": "^13.1.0",
|
|
46
|
+
"zod": "^4.1.5"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^24.0.0",
|
|
50
|
+
"typescript": "^5.8.3",
|
|
51
|
+
"vitest": "^3.2.4"
|
|
52
|
+
}
|
|
53
|
+
}
|