@shepai/cli 1.79.0-pr250.29eec94 → 1.80.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/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +0 -10
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-plan.js +0 -8
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +20 -3
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +0 -74
- 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/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1e3cf73b._.js +1 -1
- package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_a9a31cc7._.js → _50b7100e._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_a9a31cc7._.js.map → _50b7100e._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_5d4e7151._.js +1 -1
- package/web/.next/server/chunks/ssr/_5d4e7151._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
- package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_4cc78caa._.js → _645e9a63._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4cc78caa._.js.map → _645e9a63._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_c29db9b3._.js +3 -0
- package/web/.next/server/chunks/ssr/{_a89e9440._.js.map → _c29db9b3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.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 +28 -28
- package/web/.next/static/chunks/{f9edf7cceb5ecfe1.js → 0263c85901a20cec.js} +1 -1
- package/web/.next/static/chunks/{cc4ae5c962684c74.js → 158f8113bf93c2ee.js} +1 -1
- package/web/.next/static/chunks/{7be2145c5da9915d.js → 1d1da60d2d4f5f64.js} +1 -1
- package/web/.next/static/chunks/{c576233480a01594.js → 4f5b21c7dfd3c5bb.js} +1 -1
- package/web/.next/static/chunks/{5e3f946c0459b2e6.js → 594c694d9e749bf6.js} +1 -1
- package/web/.next/static/chunks/{c094a6d1f4f166cd.js → 5c11c4f4042077dd.js} +1 -1
- package/web/.next/static/chunks/{1eb59ef58bc289af.js → 62b3642ac8337a1d.js} +1 -1
- package/web/.next/static/chunks/96bab6d3820504f3.css +2 -0
- package/web/.next/static/chunks/{a2e2da17a62d4a16.js → a23c696600afe26c.js} +1 -1
- package/web/.next/static/chunks/{709acc97b45864c5.js → a996823ce96362aa.js} +1 -1
- package/web/.next/static/chunks/{f34022767b8cb68c.js → fae8e157d874ab74.js} +1 -1
- package/dist/src/presentation/web/components/common/task-progress-view/index.d.ts +0 -3
- package/dist/src/presentation/web/components/common/task-progress-view/index.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/task-progress-view/index.js +0 -1
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts +0 -6
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +0 -84
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.d.ts +0 -16
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.js +0 -194
- package/web/.next/server/chunks/ssr/_a89e9440._.js +0 -3
- package/web/.next/static/chunks/f324257cd8c5fd55.css +0 -2
- /package/web/.next/static/{Q5dSnqKRfMPVDs276cx_I → TpbhEjRZP-asaxlR5yaGh}/_buildManifest.js +0 -0
- /package/web/.next/static/{Q5dSnqKRfMPVDs276cx_I → TpbhEjRZP-asaxlR5yaGh}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Q5dSnqKRfMPVDs276cx_I → TpbhEjRZP-asaxlR5yaGh}/_ssgManifest.js +0 -0
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
export interface AcceptanceCriterionData {
|
|
2
|
-
description: string;
|
|
3
|
-
verified: boolean;
|
|
4
|
-
}
|
|
5
|
-
export interface ActionItemData {
|
|
6
|
-
name: string;
|
|
7
|
-
description: string;
|
|
8
|
-
acceptanceCriteria: AcceptanceCriterionData[];
|
|
9
|
-
}
|
|
10
1
|
export interface PlanTaskData {
|
|
11
2
|
title: string;
|
|
12
3
|
description: string;
|
|
13
4
|
state: string;
|
|
14
|
-
actionItems: ActionItemData[];
|
|
15
5
|
}
|
|
16
6
|
export interface PlanData {
|
|
17
7
|
state: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC9E"}
|
|
@@ -20,14 +20,6 @@ export async function getFeaturePlan(featureId) {
|
|
|
20
20
|
title: t.title ?? '',
|
|
21
21
|
description: t.description ?? '',
|
|
22
22
|
state: t.state,
|
|
23
|
-
actionItems: (t.actionItems ?? []).map((ai) => ({
|
|
24
|
-
name: ai.name,
|
|
25
|
-
description: ai.description,
|
|
26
|
-
acceptanceCriteria: (ai.acceptanceCriteria ?? []).map((ac) => ({
|
|
27
|
-
description: ac.description,
|
|
28
|
-
verified: ac.verified,
|
|
29
|
-
})),
|
|
30
|
-
})),
|
|
31
23
|
})),
|
|
32
24
|
};
|
|
33
25
|
return { plan };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,gCAAgC,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAoBD,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,YAAY,2CAgD7D"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Loader2 } from 'lucide-react';
|
|
3
|
+
import { Loader2, Circle, Check, Eye } from 'lucide-react';
|
|
4
4
|
import { AlertCircle, ListTodo } from 'lucide-react';
|
|
5
5
|
import { Badge } from '../../ui/badge.js';
|
|
6
|
-
import { TaskProgressView } from '../../common/task-progress-view/index.js';
|
|
7
6
|
const planStateBadgeStyles = {
|
|
8
7
|
Requirements: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
|
|
9
8
|
ClarificationRequired: 'border-transparent bg-amber-50 text-amber-700 hover:bg-amber-50',
|
|
10
9
|
Ready: 'border-transparent bg-green-50 text-green-700 hover:bg-green-50',
|
|
11
10
|
};
|
|
11
|
+
const taskStateConfig = {
|
|
12
|
+
Todo: { icon: Circle, colorClass: 'text-muted-foreground' },
|
|
13
|
+
'Work in Progress': { icon: Loader2, colorClass: 'text-blue-600', spinning: true },
|
|
14
|
+
Done: { icon: Check, colorClass: 'text-emerald-600' },
|
|
15
|
+
Review: { icon: Eye, colorClass: 'text-amber-600' },
|
|
16
|
+
};
|
|
17
|
+
const defaultTaskConfig = { icon: Circle, colorClass: 'text-muted-foreground' };
|
|
12
18
|
export function PlanTab({ plan, loading, error }) {
|
|
13
19
|
if (loading) {
|
|
14
20
|
return (_jsx("div", { "data-testid": "plan-tab-loading", className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
|
|
@@ -19,5 +25,16 @@ export function PlanTab({ plan, loading, error }) {
|
|
|
19
25
|
if (!plan) {
|
|
20
26
|
return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(ListTodo, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No plan created yet" })] }));
|
|
21
27
|
}
|
|
22
|
-
return (_jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Plan State" }), _jsx(Badge, { className: planStateBadgeStyles[plan.state] ?? 'border-transparent bg-gray-50 text-gray-700', children: plan.state })] }), plan.overview ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Overview" }), _jsx("p", { className: "text-sm leading-relaxed", children: plan.overview })] })) : null, _jsx(
|
|
28
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Plan State" }), _jsx(Badge, { className: planStateBadgeStyles[plan.state] ?? 'border-transparent bg-gray-50 text-gray-700', children: plan.state })] }), plan.overview ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Overview" }), _jsx("p", { className: "text-sm leading-relaxed", children: plan.overview })] })) : null, _jsx(TaskList, { tasks: plan.tasks })] }));
|
|
29
|
+
}
|
|
30
|
+
function TaskList({ tasks }) {
|
|
31
|
+
if (tasks.length === 0) {
|
|
32
|
+
return (_jsx("div", { className: "flex flex-col items-center justify-center gap-2 py-4", children: _jsx("p", { className: "text-muted-foreground text-sm", children: "No tasks defined yet" }) }));
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Tasks" }), _jsx("div", { "data-testid": "plan-task-list", className: "flex flex-col gap-2", children: tasks.map((task, index) => (_jsx(TaskItem, { task: task, index: index }, task.title || `task-${index}`))) })] }));
|
|
35
|
+
}
|
|
36
|
+
function TaskItem({ task, index }) {
|
|
37
|
+
const config = taskStateConfig[task.state] ?? defaultTaskConfig;
|
|
38
|
+
const Icon = config.icon;
|
|
39
|
+
return (_jsxs("div", { "data-testid": `plan-task-${index}`, className: `flex items-start gap-2 rounded-md border px-3 py-2 ${config.colorClass}`, children: [_jsx(Icon, { className: `mt-0.5 h-4 w-4 shrink-0 ${config.spinning ? 'animate-spin' : ''}` }), _jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "text-sm font-medium", children: task.title }), task.description ? (_jsx("span", { className: "text-muted-foreground text-xs", children: task.description })) : null] })] }));
|
|
23
40
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,CAc9B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,CAc9B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,OAAO,CAAC,CAAC;AA0HtC,6EAA6E;AAC7E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC"}
|
|
@@ -23,96 +23,31 @@ const mixedTasksPlan = {
|
|
|
23
23
|
title: 'Set up OAuth provider configuration',
|
|
24
24
|
description: 'Configure Google and GitHub OAuth apps with client IDs and secrets',
|
|
25
25
|
state: 'Done',
|
|
26
|
-
actionItems: [
|
|
27
|
-
{
|
|
28
|
-
name: 'Create OAuth config module',
|
|
29
|
-
description: 'Define provider configuration schema and load from env',
|
|
30
|
-
acceptanceCriteria: [
|
|
31
|
-
{ description: 'Config loads from environment variables', verified: true },
|
|
32
|
-
{ description: 'Validation rejects missing client ID or secret', verified: true },
|
|
33
|
-
],
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'Register OAuth apps',
|
|
37
|
-
description: 'Register apps with Google and GitHub developer consoles',
|
|
38
|
-
acceptanceCriteria: [
|
|
39
|
-
{ description: 'Google OAuth app created with correct scopes', verified: true },
|
|
40
|
-
{ description: 'GitHub OAuth app created with correct callback URL', verified: true },
|
|
41
|
-
],
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
26
|
},
|
|
45
27
|
{
|
|
46
28
|
title: 'Implement callback handler',
|
|
47
29
|
description: 'Handle OAuth callback with authorization code exchange',
|
|
48
30
|
state: 'Done',
|
|
49
|
-
actionItems: [
|
|
50
|
-
{
|
|
51
|
-
name: 'Build callback endpoint',
|
|
52
|
-
description: 'GET /auth/callback with code exchange logic',
|
|
53
|
-
acceptanceCriteria: [
|
|
54
|
-
{ description: 'Exchanges authorization code for tokens', verified: true },
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
31
|
},
|
|
59
32
|
{
|
|
60
33
|
title: 'Add token refresh logic',
|
|
61
34
|
description: 'Implement silent token refresh using refresh tokens stored in httpOnly cookies',
|
|
62
35
|
state: 'Work in Progress',
|
|
63
|
-
actionItems: [
|
|
64
|
-
{
|
|
65
|
-
name: 'Implement refresh endpoint',
|
|
66
|
-
description: 'POST /auth/refresh to issue new access token',
|
|
67
|
-
acceptanceCriteria: [
|
|
68
|
-
{ description: 'Returns new access token when refresh token is valid', verified: true },
|
|
69
|
-
{ description: 'Returns 401 when refresh token is expired', verified: false },
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: 'Add httpOnly cookie handling',
|
|
74
|
-
description: 'Store refresh tokens in secure httpOnly cookies',
|
|
75
|
-
acceptanceCriteria: [
|
|
76
|
-
{ description: 'Cookies are set with Secure and HttpOnly flags', verified: false },
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
36
|
},
|
|
81
37
|
{
|
|
82
38
|
title: 'Create user profile sync',
|
|
83
39
|
description: 'Sync user profile data from identity providers on login',
|
|
84
40
|
state: 'Todo',
|
|
85
|
-
actionItems: [
|
|
86
|
-
{
|
|
87
|
-
name: 'Fetch profile from provider',
|
|
88
|
-
description: 'Use access token to retrieve user profile from Google/GitHub',
|
|
89
|
-
acceptanceCriteria: [
|
|
90
|
-
{ description: 'Retrieves name, email, and avatar from Google', verified: false },
|
|
91
|
-
{ description: 'Retrieves name, email, and avatar from GitHub', verified: false },
|
|
92
|
-
],
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
41
|
},
|
|
96
42
|
{
|
|
97
43
|
title: 'Write integration tests',
|
|
98
44
|
description: 'Test the full OAuth flow with mocked providers',
|
|
99
45
|
state: 'Todo',
|
|
100
|
-
actionItems: [],
|
|
101
46
|
},
|
|
102
47
|
{
|
|
103
48
|
title: 'Update API documentation',
|
|
104
49
|
description: 'Document new authentication endpoints and flows',
|
|
105
50
|
state: 'Review',
|
|
106
|
-
actionItems: [
|
|
107
|
-
{
|
|
108
|
-
name: 'Document auth endpoints',
|
|
109
|
-
description: 'Add OpenAPI specs for all auth routes',
|
|
110
|
-
acceptanceCriteria: [
|
|
111
|
-
{ description: 'All endpoints have OpenAPI documentation', verified: true },
|
|
112
|
-
{ description: 'Examples included for each endpoint', verified: true },
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
51
|
},
|
|
117
52
|
],
|
|
118
53
|
};
|
|
@@ -124,25 +59,21 @@ const allDonePlan = {
|
|
|
124
59
|
title: 'Design sliding window algorithm',
|
|
125
60
|
description: 'Implement Redis-backed sliding window counter',
|
|
126
61
|
state: 'Done',
|
|
127
|
-
actionItems: [],
|
|
128
62
|
},
|
|
129
63
|
{
|
|
130
64
|
title: 'Add rate limit middleware',
|
|
131
65
|
description: 'Express middleware that checks rate limits per IP',
|
|
132
66
|
state: 'Done',
|
|
133
|
-
actionItems: [],
|
|
134
67
|
},
|
|
135
68
|
{
|
|
136
69
|
title: 'Configure limits per endpoint',
|
|
137
70
|
description: 'Set different rate limits for public vs authenticated endpoints',
|
|
138
71
|
state: 'Done',
|
|
139
|
-
actionItems: [],
|
|
140
72
|
},
|
|
141
73
|
{
|
|
142
74
|
title: 'Add rate limit headers',
|
|
143
75
|
description: 'Include X-RateLimit-* headers in responses',
|
|
144
76
|
state: 'Done',
|
|
145
|
-
actionItems: [],
|
|
146
77
|
},
|
|
147
78
|
],
|
|
148
79
|
};
|
|
@@ -154,19 +85,16 @@ const draftPlan = {
|
|
|
154
85
|
title: 'Define notification types',
|
|
155
86
|
description: 'Enumerate all notification events and their payloads',
|
|
156
87
|
state: 'Todo',
|
|
157
|
-
actionItems: [],
|
|
158
88
|
},
|
|
159
89
|
{
|
|
160
90
|
title: 'Set up WebSocket server',
|
|
161
91
|
description: 'Configure Socket.io with Redis adapter for horizontal scaling',
|
|
162
92
|
state: 'Todo',
|
|
163
|
-
actionItems: [],
|
|
164
93
|
},
|
|
165
94
|
{
|
|
166
95
|
title: 'Implement notification store',
|
|
167
96
|
description: 'Persist notifications in database with read/unread tracking',
|
|
168
97
|
state: 'Todo',
|
|
169
|
-
actionItems: [],
|
|
170
98
|
},
|
|
171
99
|
],
|
|
172
100
|
};
|
|
@@ -178,13 +106,11 @@ const clarificationPlan = {
|
|
|
178
106
|
title: 'Set up email provider',
|
|
179
107
|
description: 'Configure SendGrid API integration',
|
|
180
108
|
state: 'Done',
|
|
181
|
-
actionItems: [],
|
|
182
109
|
},
|
|
183
110
|
{
|
|
184
111
|
title: 'Create template engine',
|
|
185
112
|
description: 'Implement Handlebars-based email template rendering',
|
|
186
113
|
state: 'Todo',
|
|
187
|
-
actionItems: [],
|
|
188
114
|
},
|
|
189
115
|
],
|
|
190
116
|
};
|