maxsim-flutter 1.19.0 → 1.21.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/claude-setup/hooks-writer.d.ts.map +1 -1
- package/dist/claude-setup/hooks-writer.js +67 -0
- package/dist/claude-setup/hooks-writer.js.map +1 -1
- package/dist/claude-setup/prd-generator.d.ts.map +1 -1
- package/dist/claude-setup/prd-generator.js +289 -178
- package/dist/claude-setup/prd-generator.js.map +1 -1
- package/dist/claude-setup/prd-schema.d.ts +12 -12
- package/dist/claude-setup/preset-resolver.d.ts +11 -0
- package/dist/claude-setup/preset-resolver.d.ts.map +1 -0
- package/dist/claude-setup/preset-resolver.js +43 -0
- package/dist/claude-setup/preset-resolver.js.map +1 -0
- package/dist/claude-setup/skill-writer.d.ts.map +1 -1
- package/dist/claude-setup/skill-writer.js +179 -0
- package/dist/claude-setup/skill-writer.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsDzD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE3F"}
|
|
@@ -1,9 +1,76 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
|
+
import { chmod, mkdir } from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
4
|
+
const BLOCK_DANGEROUS_SH = `#!/bin/bash
|
|
5
|
+
# PreToolUse hook: block dangerous bash commands
|
|
6
|
+
# Claude passes tool input as JSON on stdin
|
|
7
|
+
|
|
8
|
+
INPUT=$(cat)
|
|
9
|
+
|
|
10
|
+
DANGEROUS_PATTERNS=("rm -rf" "--no-verify" "--force" "reset --hard" "clean -f")
|
|
11
|
+
|
|
12
|
+
for PATTERN in "\${DANGEROUS_PATTERNS[@]}"; do
|
|
13
|
+
if echo "$INPUT" | grep -qF "$PATTERN"; then
|
|
14
|
+
echo "Blocked: dangerous pattern detected: $PATTERN" >&2
|
|
15
|
+
exit 2
|
|
16
|
+
fi
|
|
17
|
+
done
|
|
18
|
+
|
|
19
|
+
exit 0
|
|
20
|
+
`;
|
|
21
|
+
const FORMAT_DART_SH = `#!/bin/bash
|
|
22
|
+
# PostToolUse hook: run dart format on modified .dart files
|
|
23
|
+
# Claude passes tool input as JSON on stdin
|
|
24
|
+
|
|
25
|
+
INPUT=$(cat)
|
|
26
|
+
|
|
27
|
+
# Extract file_path from JSON and check if it's a .dart file
|
|
28
|
+
if echo "$INPUT" | grep -qE '"file_path"\\s*:\\s*"[^"]*\\.dart"'; then
|
|
29
|
+
FILE=$(echo "$INPUT" | grep -oE '"file_path"\\s*:\\s*"[^"]+"' | sed 's/.*"file_path"\\s*:\\s*"//;s/".*//')
|
|
30
|
+
if [[ -n "$FILE" ]]; then
|
|
31
|
+
dart format "$FILE" 2>/dev/null || true
|
|
32
|
+
fi
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
exit 0
|
|
36
|
+
`;
|
|
3
37
|
export async function writeHooks(context, outputPath) {
|
|
4
38
|
const claudeDir = path.join(outputPath, '.claude');
|
|
39
|
+
const hooksDir = path.join(claudeDir, 'hooks');
|
|
5
40
|
await fs.ensureDir(claudeDir);
|
|
41
|
+
await mkdir(hooksDir, { recursive: true });
|
|
42
|
+
// Write shell scripts
|
|
43
|
+
const blockDangerousPath = path.join(hooksDir, 'block-dangerous.sh');
|
|
44
|
+
const formatDartPath = path.join(hooksDir, 'format-dart.sh');
|
|
45
|
+
await fs.writeFile(blockDangerousPath, BLOCK_DANGEROUS_SH);
|
|
46
|
+
await fs.writeFile(formatDartPath, FORMAT_DART_SH);
|
|
47
|
+
// Make scripts executable (mode 0o755)
|
|
48
|
+
await chmod(blockDangerousPath, 0o755);
|
|
49
|
+
await chmod(formatDartPath, 0o755);
|
|
50
|
+
// Build hooks config
|
|
6
51
|
const hooks = {
|
|
52
|
+
PreToolUse: [
|
|
53
|
+
{
|
|
54
|
+
matcher: 'Bash',
|
|
55
|
+
hooks: [
|
|
56
|
+
{
|
|
57
|
+
type: 'command',
|
|
58
|
+
command: '.claude/hooks/block-dangerous.sh',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
PostToolUse: [
|
|
64
|
+
{
|
|
65
|
+
matcher: 'Edit|Write',
|
|
66
|
+
hooks: [
|
|
67
|
+
{
|
|
68
|
+
type: 'command',
|
|
69
|
+
command: '.claude/hooks/format-dart.sh',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
7
74
|
TaskCompleted: [
|
|
8
75
|
{
|
|
9
76
|
hooks: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-writer.js","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAoB7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,UAAkB;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks-writer.js","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAoB7B,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;CAgB1B,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;CAetB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,UAAkB;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,sBAAsB;IACtB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAE7D,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAEnD,uCAAuC;IACvC,MAAM,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,qBAAqB;IACrB,MAAM,KAAK,GAAyB;QAClC,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,kCAAkC;qBAC5C;iBACF;aACF;SACF;QACD,WAAW,EAAE;YACX;gBACE,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,8BAA8B;qBACxC;iBACF;aACF;SACF;QACD,aAAa,EAAE;YACb;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,iCAAiC;qBAC3C;iBACF;aACF;SACF;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/B,KAAK,CAAC,YAAY,GAAG;YACnB;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,gDAAgD;qBAC1D;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,KAAK,EAAE,CAAC;IAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd-generator.d.ts","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"prd-generator.d.ts","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAoBzD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAiC3D"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
function ac(description) {
|
|
2
|
+
return { description };
|
|
3
|
+
}
|
|
4
|
+
function prefixedStories(inputs, phase, prefix) {
|
|
5
|
+
return inputs.map((story, i) => ({
|
|
6
|
+
...story,
|
|
7
|
+
id: `P${phase}-${prefix}-${String(i + 1).padStart(3, '0')}`,
|
|
8
|
+
}));
|
|
9
|
+
}
|
|
1
10
|
/**
|
|
2
11
|
* Generates a prd.json for the scaffolded Flutter project.
|
|
3
12
|
* Stories are organized into three phases:
|
|
@@ -6,36 +15,51 @@
|
|
|
6
15
|
* Phase 3 - Integration and end-to-end testing
|
|
7
16
|
*/
|
|
8
17
|
export function generatePrd(context) {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
const phase1Stories = prefixedStories(buildPhase1Inputs(context), 1, 'CORE');
|
|
19
|
+
const phase1Ids = phase1Stories.map((s) => s.id);
|
|
20
|
+
const phase2Stories = buildPhase2Stories(context, phase1Ids);
|
|
21
|
+
const phase3Stories = buildPhase3Stories(context, phase1Ids, phase2Stories);
|
|
22
|
+
const phases = [
|
|
23
|
+
{
|
|
24
|
+
phase: 1,
|
|
25
|
+
title: 'Core Setup',
|
|
26
|
+
description: 'Core app structure, routing, and state management',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
phase: 2,
|
|
30
|
+
title: 'Module Features',
|
|
31
|
+
description: 'Module-specific features conditional on enabled configuration',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
phase: 3,
|
|
35
|
+
title: 'Integration & Quality',
|
|
36
|
+
description: 'Integration testing and final quality audit',
|
|
37
|
+
},
|
|
13
38
|
];
|
|
14
|
-
// Assign sequential IDs
|
|
15
|
-
const numbered = rawStories.map((story, index) => ({
|
|
16
|
-
...story,
|
|
17
|
-
id: `S-${String(index + 1).padStart(3, '0')}`,
|
|
18
|
-
}));
|
|
19
39
|
const prd = {
|
|
20
|
-
version: '
|
|
40
|
+
version: '2.0.0',
|
|
21
41
|
project: context.projectName,
|
|
22
|
-
|
|
42
|
+
generatedAt: new Date().toISOString(),
|
|
43
|
+
phases,
|
|
44
|
+
stories: [...phase1Stories, ...phase2Stories, ...phase3Stories],
|
|
23
45
|
};
|
|
24
46
|
return JSON.stringify(prd, null, 2) + '\n';
|
|
25
47
|
}
|
|
26
|
-
function
|
|
48
|
+
function buildPhase1Inputs(context) {
|
|
27
49
|
return [
|
|
28
50
|
{
|
|
29
51
|
phase: 1,
|
|
30
52
|
priority: 'P0',
|
|
31
53
|
title: 'Setup Clean Architecture project structure',
|
|
32
54
|
description: `Verify and finalize the scaffolded project structure for ${context.projectName}. Ensure all directories follow Clean Architecture conventions with domain, data, and presentation layers per feature. Configure analysis_options.yaml with appropriate lint rules.`,
|
|
55
|
+
storyPoints: 3,
|
|
56
|
+
dependencies: [],
|
|
33
57
|
acceptanceCriteria: [
|
|
34
|
-
'`lib/features/` directory exists with at minimum a `home` feature',
|
|
35
|
-
'Each feature contains `domain/`, `data/`, and `presentation/` subdirectories',
|
|
36
|
-
'`lib/core/` contains router, theme, and providers directories',
|
|
37
|
-
'`flutter analyze` reports zero errors',
|
|
38
|
-
'`dart format --set-exit-if-changed .` passes',
|
|
58
|
+
ac('`lib/features/` directory exists with at minimum a `home` feature'),
|
|
59
|
+
ac('Each feature contains `domain/`, `data/`, and `presentation/` subdirectories'),
|
|
60
|
+
ac('`lib/core/` contains router, theme, and providers directories'),
|
|
61
|
+
ac('`flutter analyze` reports zero errors'),
|
|
62
|
+
ac('`dart format --set-exit-if-changed .` passes'),
|
|
39
63
|
],
|
|
40
64
|
passes: false,
|
|
41
65
|
},
|
|
@@ -44,12 +68,14 @@ function generatePhase1Stories(context) {
|
|
|
44
68
|
priority: 'P0',
|
|
45
69
|
title: 'Configure go_router with type-safe routes',
|
|
46
70
|
description: 'Set up go_router in `lib/core/router/app_router.dart` using TypedGoRoute annotations. Define initial route to HomeRoute. Register the router as a Riverpod provider. Run build_runner to generate route code.',
|
|
71
|
+
storyPoints: 5,
|
|
72
|
+
dependencies: [],
|
|
47
73
|
acceptanceCriteria: [
|
|
48
|
-
'`lib/core/router/app_router.dart` exists with GoRouter configuration',
|
|
49
|
-
'Router is exposed as a Riverpod provider (`routerProvider`)',
|
|
50
|
-
'`HomeRoute` is defined with `@TypedGoRoute(path: \'/\')`',
|
|
51
|
-
'`lib/core/router/app_router.g.dart` is generated by build_runner',
|
|
52
|
-
'`flutter analyze` reports zero errors',
|
|
74
|
+
ac('`lib/core/router/app_router.dart` exists with GoRouter configuration'),
|
|
75
|
+
ac('Router is exposed as a Riverpod provider (`routerProvider`)'),
|
|
76
|
+
ac('`HomeRoute` is defined with `@TypedGoRoute(path: \'/\')`'),
|
|
77
|
+
ac('`lib/core/router/app_router.g.dart` is generated by build_runner'),
|
|
78
|
+
ac('`flutter analyze` reports zero errors'),
|
|
53
79
|
],
|
|
54
80
|
passes: false,
|
|
55
81
|
},
|
|
@@ -58,11 +84,13 @@ function generatePhase1Stories(context) {
|
|
|
58
84
|
priority: 'P0',
|
|
59
85
|
title: 'Configure Riverpod ProviderScope and global providers',
|
|
60
86
|
description: 'Ensure `main.dart` wraps the app in `ProviderScope`. Set up `lib/core/providers/app_providers.dart` as a barrel export for all core providers. Verify the app boots without errors.',
|
|
87
|
+
storyPoints: 3,
|
|
88
|
+
dependencies: [],
|
|
61
89
|
acceptanceCriteria: [
|
|
62
|
-
'`main.dart` wraps `runApp` with `ProviderScope`',
|
|
63
|
-
'`lib/core/providers/app_providers.dart` exports core providers',
|
|
64
|
-
'App compiles and runs without errors',
|
|
65
|
-
'`flutter analyze` reports zero errors',
|
|
90
|
+
ac('`main.dart` wraps `runApp` with `ProviderScope`'),
|
|
91
|
+
ac('`lib/core/providers/app_providers.dart` exports core providers'),
|
|
92
|
+
ac('App compiles and runs without errors'),
|
|
93
|
+
ac('`flutter analyze` reports zero errors'),
|
|
66
94
|
],
|
|
67
95
|
passes: false,
|
|
68
96
|
},
|
|
@@ -71,186 +99,263 @@ function generatePhase1Stories(context) {
|
|
|
71
99
|
priority: 'P1',
|
|
72
100
|
title: `Implement ${context.projectName} home screen`,
|
|
73
101
|
description: `Build the initial home screen at \`lib/features/home/presentation/pages/home_page.dart\`. The page should use ConsumerWidget and display the project name. Wire it up to the \`/\` route in app_router.`,
|
|
102
|
+
storyPoints: 2,
|
|
103
|
+
dependencies: [],
|
|
74
104
|
acceptanceCriteria: [
|
|
75
|
-
'`home_page.dart` exists and extends `ConsumerWidget`',
|
|
76
|
-
'Home page displays the app name or a welcome message',
|
|
77
|
-
'Route `/` navigates to the home page',
|
|
78
|
-
'Widget test in `test/features/home/` passes',
|
|
79
|
-
'`flutter test` passes all tests',
|
|
105
|
+
ac('`home_page.dart` exists and extends `ConsumerWidget`'),
|
|
106
|
+
ac('Home page displays the app name or a welcome message'),
|
|
107
|
+
ac('Route `/` navigates to the home page'),
|
|
108
|
+
ac('Widget test in `test/features/home/` passes'),
|
|
109
|
+
ac('`flutter test` passes all tests'),
|
|
80
110
|
],
|
|
81
111
|
passes: false,
|
|
82
112
|
},
|
|
83
113
|
];
|
|
84
114
|
}
|
|
85
|
-
function
|
|
115
|
+
function buildPhase2Stories(context, phase1Ids) {
|
|
86
116
|
const stories = [];
|
|
117
|
+
const coreSetupId = phase1Ids[0]; // P1-CORE-001
|
|
118
|
+
const routerId = phase1Ids[1]; // P1-CORE-002
|
|
119
|
+
const riverpodId = phase1Ids[2]; // P1-CORE-003
|
|
87
120
|
if (context.modules.auth) {
|
|
88
121
|
const provider = context.modules.auth.provider;
|
|
89
|
-
const providerLabel = provider === 'firebase'
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
const providerLabel = provider === 'firebase'
|
|
123
|
+
? 'Firebase Auth'
|
|
124
|
+
: provider === 'supabase'
|
|
125
|
+
? 'Supabase Auth'
|
|
126
|
+
: 'custom auth';
|
|
127
|
+
const inputs = [
|
|
128
|
+
{
|
|
129
|
+
phase: 2,
|
|
130
|
+
priority: 'P0',
|
|
131
|
+
module: 'auth',
|
|
132
|
+
title: `Implement authentication with ${providerLabel}`,
|
|
133
|
+
description: `Build the auth feature in \`lib/features/auth/\` following Clean Architecture. Domain layer: \`AuthRepository\` interface and \`User\` entity. Data layer: \`${capitalize(provider)}AuthDataSource\` and \`AuthRepositoryImpl\`. Presentation layer: \`authRepositoryProvider\`, login page, register page. Add auth guard to go_router redirect.`,
|
|
134
|
+
storyPoints: 8,
|
|
135
|
+
dependencies: [coreSetupId, routerId, riverpodId],
|
|
136
|
+
acceptanceCriteria: [
|
|
137
|
+
ac('`lib/features/auth/domain/repositories/auth_repository.dart` defines `AuthRepository` interface'),
|
|
138
|
+
ac('`lib/features/auth/domain/entities/user.dart` defines `User` entity with freezed'),
|
|
139
|
+
ac('Auth repository implementation connects to ' + providerLabel),
|
|
140
|
+
ac('`/login` and `/register` routes exist and render auth pages'),
|
|
141
|
+
ac('Auth guard in go_router redirects unauthenticated users to `/login`'),
|
|
142
|
+
ac('Unit tests for auth use cases pass'),
|
|
143
|
+
ac('`flutter analyze` reports zero errors'),
|
|
144
|
+
],
|
|
145
|
+
passes: false,
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
stories.push(...prefixedStories(inputs, 2, 'AUTH'));
|
|
106
149
|
}
|
|
107
150
|
if (context.modules.api) {
|
|
108
151
|
const baseUrl = context.modules.api.baseUrl ?? 'API_BASE_URL env variable';
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
152
|
+
const inputs = [
|
|
153
|
+
{
|
|
154
|
+
phase: 2,
|
|
155
|
+
priority: 'P1',
|
|
156
|
+
module: 'api',
|
|
157
|
+
title: 'Implement API client with Dio and interceptors',
|
|
158
|
+
description: `Configure a Dio HTTP client in \`lib/features/api/\`. Base URL: ${baseUrl}. Add interceptors for auth token injection, retry on transient failures, and request logging. Expose via \`dioClientProvider\`. Define \`ApiException\` for typed error handling.`,
|
|
159
|
+
storyPoints: 5,
|
|
160
|
+
dependencies: [coreSetupId, riverpodId],
|
|
161
|
+
acceptanceCriteria: [
|
|
162
|
+
ac('`dioClientProvider` is a Riverpod Provider returning a configured `Dio` instance'),
|
|
163
|
+
ac('Auth interceptor injects Bearer token from auth state (if auth module is enabled)'),
|
|
164
|
+
ac('Retry interceptor handles 5xx errors with exponential backoff'),
|
|
165
|
+
ac('`ApiException` maps HTTP status codes to typed errors'),
|
|
166
|
+
ac('Unit tests for interceptors pass'),
|
|
167
|
+
ac('`flutter analyze` reports zero errors'),
|
|
168
|
+
],
|
|
169
|
+
passes: false,
|
|
170
|
+
},
|
|
171
|
+
];
|
|
172
|
+
stories.push(...prefixedStories(inputs, 2, 'API'));
|
|
124
173
|
}
|
|
125
174
|
if (context.modules.database) {
|
|
126
175
|
const engine = context.modules.database.engine;
|
|
127
176
|
const engineLabel = engine === 'drift' ? 'Drift (SQLite)' : engine === 'hive' ? 'Hive' : 'Isar';
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
177
|
+
const inputs = [
|
|
178
|
+
{
|
|
179
|
+
phase: 2,
|
|
180
|
+
priority: 'P1',
|
|
181
|
+
module: 'database',
|
|
182
|
+
title: `Configure local database with ${engineLabel}`,
|
|
183
|
+
description: `Set up ${engineLabel} in \`lib/features/database/\`. Define initial schema/collections. Expose database via \`databaseProvider\`. Add initialization in main.dart before runApp. Run build_runner to generate database code.`,
|
|
184
|
+
storyPoints: 5,
|
|
185
|
+
dependencies: [coreSetupId, riverpodId],
|
|
186
|
+
acceptanceCriteria: [
|
|
187
|
+
ac(`${engineLabel} is initialized before the app starts`),
|
|
188
|
+
ac('`databaseProvider` exposes the database instance via Riverpod'),
|
|
189
|
+
ac(engine === 'drift'
|
|
190
|
+
? '`AppDatabase` class with at least one table defined'
|
|
191
|
+
: `${engineLabel} adapter/collection defined`),
|
|
192
|
+
ac('build_runner generates code without conflicts'),
|
|
193
|
+
ac('Unit test verifies database can be opened and written to'),
|
|
194
|
+
ac('`flutter analyze` reports zero errors'),
|
|
195
|
+
],
|
|
196
|
+
passes: false,
|
|
197
|
+
},
|
|
198
|
+
];
|
|
199
|
+
stories.push(...prefixedStories(inputs, 2, 'DB'));
|
|
143
200
|
}
|
|
144
201
|
if (context.modules.i18n) {
|
|
145
202
|
const { defaultLocale, supportedLocales } = context.modules.i18n;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
203
|
+
const inputs = [
|
|
204
|
+
{
|
|
205
|
+
phase: 2,
|
|
206
|
+
priority: 'P1',
|
|
207
|
+
module: 'i18n',
|
|
208
|
+
title: 'Implement internationalization with flutter_localizations',
|
|
209
|
+
description: `Set up i18n in \`lib/core/l10n/\`. Create ARB files for: ${supportedLocales.join(', ')} (default: ${defaultLocale}). Run \`flutter gen-l10n\` to generate \`AppLocalizations\`. Update MaterialApp to include localization delegates.`,
|
|
210
|
+
storyPoints: 3,
|
|
211
|
+
dependencies: [coreSetupId],
|
|
212
|
+
acceptanceCriteria: [
|
|
213
|
+
ac(`ARB files exist for all supported locales: ${supportedLocales.join(', ')}`),
|
|
214
|
+
ac('`AppLocalizations` is generated and available via `AppLocalizations.of(context)!`'),
|
|
215
|
+
ac('MaterialApp includes `AppLocalizations.delegate` and `supportedLocales`'),
|
|
216
|
+
ac('At minimum, app title and home screen greeting are localized'),
|
|
217
|
+
ac('`flutter analyze` reports zero errors'),
|
|
218
|
+
],
|
|
219
|
+
passes: false,
|
|
220
|
+
},
|
|
221
|
+
];
|
|
222
|
+
stories.push(...prefixedStories(inputs, 2, 'I18N'));
|
|
160
223
|
}
|
|
161
224
|
if (context.modules.theme) {
|
|
162
225
|
const { seedColor, darkMode } = context.modules.theme;
|
|
163
226
|
const seedNote = seedColor ? `seed color ${seedColor}` : 'default purple seed color';
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
227
|
+
const inputs = [
|
|
228
|
+
{
|
|
229
|
+
phase: 2,
|
|
230
|
+
priority: 'P1',
|
|
231
|
+
module: 'theme',
|
|
232
|
+
title: 'Implement Material 3 theme system',
|
|
233
|
+
description: `Build the theme in \`lib/core/theme/app_theme.dart\` using Material 3 ColorScheme.fromSeed with ${seedNote}. ${darkMode ? 'Support both light and dark themes via `appThemeModeProvider`.' : 'Light theme only.'} Apply Google Fonts (Inter) as the default text theme.`,
|
|
234
|
+
storyPoints: 3,
|
|
235
|
+
dependencies: [coreSetupId],
|
|
236
|
+
acceptanceCriteria: [
|
|
237
|
+
ac('`AppTheme.light()` returns a `ThemeData` with Material 3 enabled'),
|
|
238
|
+
ac(darkMode
|
|
239
|
+
? '`AppTheme.dark()` returns a dark `ThemeData`'
|
|
240
|
+
: 'Light theme applied consistently'),
|
|
241
|
+
ac(darkMode
|
|
242
|
+
? '`appThemeModeProvider` toggles between light and dark modes'
|
|
243
|
+
: 'Theme applied to MaterialApp'),
|
|
244
|
+
ac('Google Fonts Inter is applied as the text theme'),
|
|
245
|
+
ac('`flutter analyze` reports zero errors'),
|
|
246
|
+
],
|
|
247
|
+
passes: false,
|
|
248
|
+
},
|
|
249
|
+
];
|
|
250
|
+
stories.push(...prefixedStories(inputs, 2, 'THEME'));
|
|
178
251
|
}
|
|
179
252
|
if (context.modules.push) {
|
|
180
253
|
const provider = context.modules.push.provider;
|
|
181
254
|
const providerLabel = provider === 'firebase' ? 'Firebase Cloud Messaging' : 'OneSignal';
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
255
|
+
const inputs = [
|
|
256
|
+
{
|
|
257
|
+
phase: 2,
|
|
258
|
+
priority: 'P2',
|
|
259
|
+
module: 'push',
|
|
260
|
+
title: `Implement push notifications with ${providerLabel}`,
|
|
261
|
+
description: `Configure ${providerLabel} in \`lib/features/push/\`. Request notification permissions at app startup. Handle foreground, background, and terminated state notifications. Expose push token via \`pushTokenProvider\`.`,
|
|
262
|
+
storyPoints: 5,
|
|
263
|
+
dependencies: [coreSetupId, riverpodId],
|
|
264
|
+
acceptanceCriteria: [
|
|
265
|
+
ac(`${providerLabel} is initialized before the app starts`),
|
|
266
|
+
ac('Notification permission is requested on first launch'),
|
|
267
|
+
ac('Foreground notification handler displays an in-app notification'),
|
|
268
|
+
ac('Background/terminated notification tap navigates to correct screen'),
|
|
269
|
+
ac('`pushTokenProvider` returns the device token as a Future<String?>'),
|
|
270
|
+
ac('`flutter analyze` reports zero errors'),
|
|
271
|
+
],
|
|
272
|
+
passes: false,
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
stories.push(...prefixedStories(inputs, 2, 'PUSH'));
|
|
197
276
|
}
|
|
198
277
|
if (context.modules.analytics) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
'`AnalyticsService`
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
278
|
+
const inputs = [
|
|
279
|
+
{
|
|
280
|
+
phase: 2,
|
|
281
|
+
priority: 'P2',
|
|
282
|
+
module: 'analytics',
|
|
283
|
+
title: 'Implement analytics event tracking',
|
|
284
|
+
description: 'Create `AnalyticsService` abstraction in `lib/features/analytics/`. Implement a GoRouter observer that tracks screen views automatically. Provide `analyticsServiceProvider` for logging custom events. Log app open event on startup.',
|
|
285
|
+
storyPoints: 3,
|
|
286
|
+
dependencies: [coreSetupId, routerId],
|
|
287
|
+
acceptanceCriteria: [
|
|
288
|
+
ac('`AnalyticsService` interface defines `logEvent(name, params)` and `logScreen(name)`'),
|
|
289
|
+
ac('GoRouter observer automatically tracks screen navigation'),
|
|
290
|
+
ac('`analyticsServiceProvider` exposes the `AnalyticsService`'),
|
|
291
|
+
ac('App open event is logged on startup'),
|
|
292
|
+
ac('Unit tests mock `AnalyticsService` and verify event calls'),
|
|
293
|
+
ac('`flutter analyze` reports zero errors'),
|
|
294
|
+
],
|
|
295
|
+
passes: false,
|
|
296
|
+
},
|
|
297
|
+
];
|
|
298
|
+
stories.push(...prefixedStories(inputs, 2, 'ANLT'));
|
|
214
299
|
}
|
|
215
300
|
if (context.modules.cicd) {
|
|
216
301
|
const providerLabel = context.modules.cicd.provider;
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
302
|
+
const inputs = [
|
|
303
|
+
{
|
|
304
|
+
phase: 2,
|
|
305
|
+
priority: 'P2',
|
|
306
|
+
module: 'cicd',
|
|
307
|
+
title: `Configure ${capitalize(providerLabel)} CI/CD pipeline`,
|
|
308
|
+
description: `Set up CI/CD pipeline for ${capitalize(providerLabel)}. Pipeline should run on every push: (1) flutter analyze, (2) flutter test, (3) flutter build. Cache Flutter SDK and pub dependencies for speed.`,
|
|
309
|
+
storyPoints: 2,
|
|
310
|
+
dependencies: [coreSetupId],
|
|
311
|
+
acceptanceCriteria: [
|
|
312
|
+
ac(providerLabel === 'github'
|
|
313
|
+
? '`.github/workflows/ci.yml` exists and is valid YAML'
|
|
314
|
+
: providerLabel === 'gitlab'
|
|
315
|
+
? '`.gitlab-ci.yml` exists and is valid YAML'
|
|
316
|
+
: '`bitbucket-pipelines.yml` exists and is valid YAML'),
|
|
317
|
+
ac('Pipeline includes analyze, test, and build stages/jobs'),
|
|
318
|
+
ac('Flutter pub cache is configured for fast runs'),
|
|
319
|
+
ac('Pipeline triggers on push to main and pull requests'),
|
|
320
|
+
ac('`flutter analyze` reports zero errors in CI config files'),
|
|
321
|
+
],
|
|
322
|
+
passes: false,
|
|
323
|
+
},
|
|
324
|
+
];
|
|
325
|
+
stories.push(...prefixedStories(inputs, 2, 'CICD'));
|
|
231
326
|
}
|
|
232
327
|
if (context.modules.deepLinking) {
|
|
233
328
|
const { scheme, host } = context.modules.deepLinking;
|
|
234
329
|
const linkExample = scheme && host ? `${scheme}://${host}` : 'app://example.com';
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
330
|
+
const inputs = [
|
|
331
|
+
{
|
|
332
|
+
phase: 2,
|
|
333
|
+
priority: 'P2',
|
|
334
|
+
module: 'deepLinking',
|
|
335
|
+
title: 'Implement deep linking with app_links',
|
|
336
|
+
description: `Configure deep links using \`app_links\` package. Handle Universal Links (iOS) and App Links (Android). Integrate with go_router for automatic route resolution. Example link: \`${linkExample}\`.`,
|
|
337
|
+
storyPoints: 5,
|
|
338
|
+
dependencies: [coreSetupId, routerId],
|
|
339
|
+
acceptanceCriteria: [
|
|
340
|
+
ac('`app_links` is initialized at app startup'),
|
|
341
|
+
ac('Incoming deep links are forwarded to go_router for navigation'),
|
|
342
|
+
ac(scheme
|
|
343
|
+
? `Custom scheme \`${scheme}://\` is handled`
|
|
344
|
+
: 'Deep link scheme is configured in platform files'),
|
|
345
|
+
ac(host
|
|
346
|
+
? `Host \`${host}\` is configured for Universal/App Links`
|
|
347
|
+
: 'Host is configured in platform-specific files'),
|
|
348
|
+
ac('Widget test verifies deep link navigation'),
|
|
349
|
+
ac('`flutter analyze` reports zero errors'),
|
|
350
|
+
],
|
|
351
|
+
passes: false,
|
|
352
|
+
},
|
|
353
|
+
];
|
|
354
|
+
stories.push(...prefixedStories(inputs, 2, 'LINK'));
|
|
250
355
|
}
|
|
251
356
|
return stories;
|
|
252
357
|
}
|
|
253
|
-
function
|
|
358
|
+
function buildPhase3Stories(context, phase1Ids, phase2Stories) {
|
|
254
359
|
const enabledModules = [];
|
|
255
360
|
if (context.modules.auth)
|
|
256
361
|
enabledModules.push('auth');
|
|
@@ -258,18 +363,21 @@ function generatePhase3Stories(context) {
|
|
|
258
363
|
enabledModules.push('api');
|
|
259
364
|
if (context.modules.database)
|
|
260
365
|
enabledModules.push('database');
|
|
261
|
-
|
|
366
|
+
const allPrecedingIds = [...phase1Ids, ...phase2Stories.map((s) => s.id)];
|
|
367
|
+
const inputs = [
|
|
262
368
|
{
|
|
263
369
|
phase: 3,
|
|
264
370
|
priority: 'P1',
|
|
265
371
|
title: 'Write integration tests for core user flows',
|
|
266
372
|
description: `Write integration tests covering the main user journeys in ${context.projectName}. ${enabledModules.length > 0 ? `Test flows involving: ${enabledModules.join(', ')}.` : 'Test home screen navigation and basic app flows.'} Use \`integration_test\` package with \`flutter_test\`.`,
|
|
373
|
+
storyPoints: 5,
|
|
374
|
+
dependencies: allPrecedingIds,
|
|
267
375
|
acceptanceCriteria: [
|
|
268
|
-
'`integration_test/` directory exists with at least one integration test file',
|
|
269
|
-
'Tests cover the happy path for core user journeys',
|
|
270
|
-
'Tests use `WidgetTester` for UI interactions',
|
|
271
|
-
'`flutter test integration_test/` passes all tests',
|
|
272
|
-
'Test coverage report shows >70% coverage for presentation layer',
|
|
376
|
+
ac('`integration_test/` directory exists with at least one integration test file'),
|
|
377
|
+
ac('Tests cover the happy path for core user journeys'),
|
|
378
|
+
ac('Tests use `WidgetTester` for UI interactions'),
|
|
379
|
+
ac('`flutter test integration_test/` passes all tests'),
|
|
380
|
+
ac('Test coverage report shows >70% coverage for presentation layer'),
|
|
273
381
|
],
|
|
274
382
|
passes: false,
|
|
275
383
|
},
|
|
@@ -278,16 +386,19 @@ function generatePhase3Stories(context) {
|
|
|
278
386
|
priority: 'P2',
|
|
279
387
|
title: 'Final quality audit and documentation',
|
|
280
388
|
description: `Perform a final quality pass on all code in ${context.projectName}. Fix any remaining analyzer warnings. Ensure all public APIs have dartdoc comments. Verify README.md documents how to run the app and run tests.`,
|
|
389
|
+
storyPoints: 2,
|
|
390
|
+
dependencies: ['P3-QA-001'],
|
|
281
391
|
acceptanceCriteria: [
|
|
282
|
-
'`flutter analyze` reports zero errors AND zero warnings',
|
|
283
|
-
'`flutter test` passes all tests',
|
|
284
|
-
'`dart format --set-exit-if-changed .` passes',
|
|
285
|
-
'README.md includes setup instructions and how to run the app',
|
|
286
|
-
'All public provider declarations have dartdoc comments',
|
|
392
|
+
ac('`flutter analyze` reports zero errors AND zero warnings'),
|
|
393
|
+
ac('`flutter test` passes all tests'),
|
|
394
|
+
ac('`dart format --set-exit-if-changed .` passes'),
|
|
395
|
+
ac('README.md includes setup instructions and how to run the app'),
|
|
396
|
+
ac('All public provider declarations have dartdoc comments'),
|
|
287
397
|
],
|
|
288
398
|
passes: false,
|
|
289
399
|
},
|
|
290
400
|
];
|
|
401
|
+
return prefixedStories(inputs, 3, 'QA');
|
|
291
402
|
}
|
|
292
403
|
function capitalize(str) {
|
|
293
404
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd-generator.js","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prd-generator.js","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,13 +35,13 @@ export declare const PrdStorySchema: z.ZodObject<{
|
|
|
35
35
|
phase: number;
|
|
36
36
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
37
37
|
title: string;
|
|
38
|
+
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
39
|
+
dependencies: string[];
|
|
38
40
|
acceptanceCriteria: {
|
|
39
41
|
description: string;
|
|
40
42
|
predicate?: string | undefined;
|
|
41
43
|
}[];
|
|
42
44
|
passes: boolean;
|
|
43
|
-
dependencies: string[];
|
|
44
|
-
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
45
45
|
module?: string | undefined;
|
|
46
46
|
}, {
|
|
47
47
|
description: string;
|
|
@@ -49,13 +49,13 @@ export declare const PrdStorySchema: z.ZodObject<{
|
|
|
49
49
|
phase: number;
|
|
50
50
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
51
51
|
title: string;
|
|
52
|
+
storyPoints: number;
|
|
53
|
+
dependencies: string[];
|
|
52
54
|
acceptanceCriteria: {
|
|
53
55
|
description: string;
|
|
54
56
|
predicate?: string | undefined;
|
|
55
57
|
}[];
|
|
56
58
|
passes: boolean;
|
|
57
|
-
dependencies: string[];
|
|
58
|
-
storyPoints: number;
|
|
59
59
|
module?: string | undefined;
|
|
60
60
|
}>;
|
|
61
61
|
declare const PrdPhaseSchema: z.ZodObject<{
|
|
@@ -114,13 +114,13 @@ export declare const PrdSchema: z.ZodObject<{
|
|
|
114
114
|
phase: number;
|
|
115
115
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
116
116
|
title: string;
|
|
117
|
+
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
118
|
+
dependencies: string[];
|
|
117
119
|
acceptanceCriteria: {
|
|
118
120
|
description: string;
|
|
119
121
|
predicate?: string | undefined;
|
|
120
122
|
}[];
|
|
121
123
|
passes: boolean;
|
|
122
|
-
dependencies: string[];
|
|
123
|
-
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
124
124
|
module?: string | undefined;
|
|
125
125
|
}, {
|
|
126
126
|
description: string;
|
|
@@ -128,13 +128,13 @@ export declare const PrdSchema: z.ZodObject<{
|
|
|
128
128
|
phase: number;
|
|
129
129
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
130
130
|
title: string;
|
|
131
|
+
storyPoints: number;
|
|
132
|
+
dependencies: string[];
|
|
131
133
|
acceptanceCriteria: {
|
|
132
134
|
description: string;
|
|
133
135
|
predicate?: string | undefined;
|
|
134
136
|
}[];
|
|
135
137
|
passes: boolean;
|
|
136
|
-
dependencies: string[];
|
|
137
|
-
storyPoints: number;
|
|
138
138
|
module?: string | undefined;
|
|
139
139
|
}>, "many">;
|
|
140
140
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -146,13 +146,13 @@ export declare const PrdSchema: z.ZodObject<{
|
|
|
146
146
|
phase: number;
|
|
147
147
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
148
148
|
title: string;
|
|
149
|
+
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
150
|
+
dependencies: string[];
|
|
149
151
|
acceptanceCriteria: {
|
|
150
152
|
description: string;
|
|
151
153
|
predicate?: string | undefined;
|
|
152
154
|
}[];
|
|
153
155
|
passes: boolean;
|
|
154
|
-
dependencies: string[];
|
|
155
|
-
storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
|
|
156
156
|
module?: string | undefined;
|
|
157
157
|
}[];
|
|
158
158
|
generatedAt?: string | undefined;
|
|
@@ -170,13 +170,13 @@ export declare const PrdSchema: z.ZodObject<{
|
|
|
170
170
|
phase: number;
|
|
171
171
|
priority: "P0" | "P1" | "P2" | "P3";
|
|
172
172
|
title: string;
|
|
173
|
+
storyPoints: number;
|
|
174
|
+
dependencies: string[];
|
|
173
175
|
acceptanceCriteria: {
|
|
174
176
|
description: string;
|
|
175
177
|
predicate?: string | undefined;
|
|
176
178
|
}[];
|
|
177
179
|
passes: boolean;
|
|
178
|
-
dependencies: string[];
|
|
179
|
-
storyPoints: number;
|
|
180
180
|
module?: string | undefined;
|
|
181
181
|
}[];
|
|
182
182
|
generatedAt?: string | undefined;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ResolvedClaudeOptions {
|
|
2
|
+
claudeMd: boolean;
|
|
3
|
+
rules: boolean;
|
|
4
|
+
agents: boolean;
|
|
5
|
+
hooks: boolean;
|
|
6
|
+
skills: boolean;
|
|
7
|
+
commands: boolean;
|
|
8
|
+
mcp: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolvePreset(preset?: 'minimal' | 'standard' | 'full', overrides?: Partial<ResolvedClaudeOptions>): ResolvedClaudeOptions;
|
|
11
|
+
//# sourceMappingURL=preset-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-resolver.d.ts","sourceRoot":"","sources":["../../src/claude-setup/preset-resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;CACd;AAgCD,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,EACxC,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACzC,qBAAqB,CAYvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const PRESETS = {
|
|
2
|
+
minimal: {
|
|
3
|
+
claudeMd: true,
|
|
4
|
+
rules: true,
|
|
5
|
+
agents: false,
|
|
6
|
+
hooks: false,
|
|
7
|
+
skills: false,
|
|
8
|
+
commands: false,
|
|
9
|
+
mcp: false,
|
|
10
|
+
},
|
|
11
|
+
standard: {
|
|
12
|
+
claudeMd: true,
|
|
13
|
+
rules: true,
|
|
14
|
+
agents: true,
|
|
15
|
+
hooks: true,
|
|
16
|
+
skills: true,
|
|
17
|
+
commands: true,
|
|
18
|
+
mcp: false,
|
|
19
|
+
},
|
|
20
|
+
full: {
|
|
21
|
+
claudeMd: true,
|
|
22
|
+
rules: true,
|
|
23
|
+
agents: true,
|
|
24
|
+
hooks: true,
|
|
25
|
+
skills: true,
|
|
26
|
+
commands: true,
|
|
27
|
+
mcp: true,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export function resolvePreset(preset, overrides) {
|
|
31
|
+
const base = PRESETS[preset ?? 'standard'];
|
|
32
|
+
if (!overrides)
|
|
33
|
+
return { ...base };
|
|
34
|
+
const result = { ...base };
|
|
35
|
+
for (const key of Object.keys(overrides)) {
|
|
36
|
+
const value = overrides[key];
|
|
37
|
+
if (value !== undefined) {
|
|
38
|
+
result[key] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=preset-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-resolver.js","sourceRoot":"","sources":["../../src/claude-setup/preset-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,GAAmE;IAC9E,OAAO,EAAE;QACP,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,KAAK;KACX;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,KAAK;KACX;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,IAAI;KACV;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,MAAwC,EACxC,SAA0C;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAoC,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/skill-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"skill-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/skill-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5F"}
|
|
@@ -8,6 +8,9 @@ export async function writeSkills(context, outputPath) {
|
|
|
8
8
|
fs.writeFile(path.join(skillsDir, 'go-router-patterns.md'), generateGoRouterPatterns(context)),
|
|
9
9
|
fs.writeFile(path.join(skillsDir, 'module-conventions.md'), generateModuleConventions()),
|
|
10
10
|
fs.writeFile(path.join(skillsDir, 'prd.md'), generatePrdGuide()),
|
|
11
|
+
fs.writeFile(path.join(skillsDir, 'security-review.md'), generateSecurityReview()),
|
|
12
|
+
fs.writeFile(path.join(skillsDir, 'performance-check.md'), generatePerformanceCheck()),
|
|
13
|
+
fs.writeFile(path.join(skillsDir, 'add-feature.md'), generateAddFeatureSkill(context)),
|
|
11
14
|
]);
|
|
12
15
|
}
|
|
13
16
|
function generateFlutterPatterns() {
|
|
@@ -341,4 +344,180 @@ function generatePrdGuide() {
|
|
|
341
344
|
'- Code follows Clean Architecture layer rules',
|
|
342
345
|
].join('\n');
|
|
343
346
|
}
|
|
347
|
+
function generateSecurityReview() {
|
|
348
|
+
return [
|
|
349
|
+
'---',
|
|
350
|
+
'model: sonnet',
|
|
351
|
+
'---',
|
|
352
|
+
'',
|
|
353
|
+
'# Security Review Checklist',
|
|
354
|
+
'',
|
|
355
|
+
'Run a security audit of the current feature or codebase. Check each category and report findings.',
|
|
356
|
+
'',
|
|
357
|
+
'## 1. Secrets & Credentials Scanning',
|
|
358
|
+
'',
|
|
359
|
+
'- [ ] No hardcoded API keys, tokens, or passwords in source files',
|
|
360
|
+
'- [ ] `.env` files are listed in `.gitignore`',
|
|
361
|
+
'- [ ] Firebase `google-services.json` / `GoogleService-Info.plist` excluded from VCS',
|
|
362
|
+
'- [ ] Secret values injected via CI environment variables, not committed',
|
|
363
|
+
'',
|
|
364
|
+
'## 2. Input Validation',
|
|
365
|
+
'',
|
|
366
|
+
'- [ ] All user input is validated before use (length, format, allowed characters)',
|
|
367
|
+
'- [ ] Input validation applied at the domain layer, not just in UI widgets',
|
|
368
|
+
'- [ ] No raw `eval`-equivalent construction from user strings',
|
|
369
|
+
'- [ ] Form fields use `validator` callbacks with strict rules',
|
|
370
|
+
'',
|
|
371
|
+
'## 3. API Security',
|
|
372
|
+
'',
|
|
373
|
+
'- [ ] All API requests use HTTPS; no plain HTTP endpoints',
|
|
374
|
+
'- [ ] Authentication headers (Bearer tokens) sent on every authenticated request',
|
|
375
|
+
'- [ ] API responses are validated against expected schemas before use',
|
|
376
|
+
'- [ ] Network timeouts configured to prevent hanging requests',
|
|
377
|
+
'- [ ] Error responses do not leak stack traces or internal details to the UI',
|
|
378
|
+
'',
|
|
379
|
+
'## 4. Data Protection Audit',
|
|
380
|
+
'',
|
|
381
|
+
'- [ ] Sensitive data (tokens, PII) stored in `flutter_secure_storage`, not `SharedPreferences`',
|
|
382
|
+
'- [ ] Sensitive data not logged to console or crash reporters',
|
|
383
|
+
'- [ ] Deep link parameters sanitised before use in navigation or queries',
|
|
384
|
+
'- [ ] User data deleted on logout (local cache, secure storage cleared)',
|
|
385
|
+
'',
|
|
386
|
+
'## Reporting',
|
|
387
|
+
'',
|
|
388
|
+
'For each finding, report:',
|
|
389
|
+
'- **Severity**: Critical / High / Medium / Low',
|
|
390
|
+
'- **Location**: File path and line number',
|
|
391
|
+
'- **Description**: What the issue is and why it matters',
|
|
392
|
+
'- **Fix**: Concrete code change to resolve it',
|
|
393
|
+
].join('\n');
|
|
394
|
+
}
|
|
395
|
+
function generatePerformanceCheck() {
|
|
396
|
+
return [
|
|
397
|
+
'---',
|
|
398
|
+
'model: haiku',
|
|
399
|
+
'---',
|
|
400
|
+
'',
|
|
401
|
+
'# Performance Check Checklist',
|
|
402
|
+
'',
|
|
403
|
+
'Audit the current feature for Flutter performance issues. Check each area and flag regressions.',
|
|
404
|
+
'',
|
|
405
|
+
'## 1. Widget Rebuild Detection',
|
|
406
|
+
'',
|
|
407
|
+
'- [ ] No unnecessary `setState` calls in parent widgets that repaint large subtrees',
|
|
408
|
+
'- [ ] `const` constructors used wherever widget parameters are compile-time constants',
|
|
409
|
+
'- [ ] `ConsumerWidget` / `Consumer` scoped as narrowly as possible to minimise rebuild area',
|
|
410
|
+
'- [ ] `RepaintBoundary` wrapping expensive, frequently-animated widgets',
|
|
411
|
+
'',
|
|
412
|
+
'## 2. Provider Efficiency',
|
|
413
|
+
'',
|
|
414
|
+
'- [ ] `ref.watch` only used in `build()` — never inside callbacks or `initState`',
|
|
415
|
+
'- [ ] `.autoDispose` applied to providers not needed globally',
|
|
416
|
+
'- [ ] `select()` used to subscribe to a sub-field, avoiding full-state rebuilds',
|
|
417
|
+
'- [ ] No provider created inside a `build()` method (causes re-creation each frame)',
|
|
418
|
+
'',
|
|
419
|
+
'## 3. Image & Asset Optimisation',
|
|
420
|
+
'',
|
|
421
|
+
'- [ ] All images served in WebP or AVIF format where possible',
|
|
422
|
+
'- [ ] `cached_network_image` (or equivalent) used for remote images',
|
|
423
|
+
'- [ ] Large images resized to display dimensions — no 4K image in a 48×48 avatar',
|
|
424
|
+
'- [ ] SVG assets used for icons instead of raster PNGs where supported',
|
|
425
|
+
'',
|
|
426
|
+
'## 4. Lists & Scrolling Performance',
|
|
427
|
+
'',
|
|
428
|
+
'- [ ] `ListView.builder` used for any list with more than 20 items',
|
|
429
|
+
'- [ ] `itemExtent` or `SliverFixedExtentList` set when item height is uniform',
|
|
430
|
+
'- [ ] Heavy list items wrapped in `AutomaticKeepAliveClientMixin` only when truly needed',
|
|
431
|
+
'- [ ] `Sliver` widgets used in complex scroll layouts instead of nested `ListView`',
|
|
432
|
+
'',
|
|
433
|
+
'## Reporting',
|
|
434
|
+
'',
|
|
435
|
+
'For each issue found:',
|
|
436
|
+
'- **Widget / Provider**: Name and file path',
|
|
437
|
+
'- **Problem**: Description of the performance issue',
|
|
438
|
+
'- **Measured impact**: Frame time, rebuild count, or memory delta if measurable',
|
|
439
|
+
'- **Fix**: Specific code change with before/after snippet',
|
|
440
|
+
].join('\n');
|
|
441
|
+
}
|
|
442
|
+
function generateAddFeatureSkill(context) {
|
|
443
|
+
const authGuardStep = context.modules.auth
|
|
444
|
+
? [
|
|
445
|
+
'',
|
|
446
|
+
'### Optional: Add Route Guard',
|
|
447
|
+
'',
|
|
448
|
+
'If the feature requires authentication:',
|
|
449
|
+
'',
|
|
450
|
+
'```dart',
|
|
451
|
+
'// In app_router.dart redirect',
|
|
452
|
+
'if (!ref.read(isLoggedInProvider) && state.matchedLocation == \'/<feature>\') {',
|
|
453
|
+
' return \'/auth/login\';',
|
|
454
|
+
'}',
|
|
455
|
+
'```',
|
|
456
|
+
].join('\n')
|
|
457
|
+
: '';
|
|
458
|
+
return [
|
|
459
|
+
'---',
|
|
460
|
+
'model: sonnet',
|
|
461
|
+
'---',
|
|
462
|
+
'',
|
|
463
|
+
'# Add a New Clean Architecture Feature',
|
|
464
|
+
'',
|
|
465
|
+
'Follow these steps to add a new feature to this Flutter project. Replace `<name>` with the feature name (snake_case).',
|
|
466
|
+
'',
|
|
467
|
+
'## Step 1 — Create the domain layer',
|
|
468
|
+
'',
|
|
469
|
+
'```',
|
|
470
|
+
'lib/features/<name>/domain/',
|
|
471
|
+
'├── entities/ ← freezed data classes',
|
|
472
|
+
'├── repositories/ ← abstract interfaces',
|
|
473
|
+
'└── usecases/ ← single-responsibility operations',
|
|
474
|
+
'```',
|
|
475
|
+
'',
|
|
476
|
+
'Define entities with `@freezed`, repository interfaces (abstract classes), and use cases.',
|
|
477
|
+
'',
|
|
478
|
+
'## Step 2 — Create the data layer',
|
|
479
|
+
'',
|
|
480
|
+
'```',
|
|
481
|
+
'lib/features/<name>/data/',
|
|
482
|
+
'├── models/ ← DTOs with fromJson/toJson',
|
|
483
|
+
'├── datasources/ ← remote and local data sources',
|
|
484
|
+
'└── repositories/ ← repository implementations',
|
|
485
|
+
'```',
|
|
486
|
+
'',
|
|
487
|
+
'## Step 3 — Create the presentation layer',
|
|
488
|
+
'',
|
|
489
|
+
'```',
|
|
490
|
+
'lib/features/<name>/presentation/',
|
|
491
|
+
'├── providers/ ← Riverpod AsyncNotifierProvider',
|
|
492
|
+
'├── pages/ ← full-screen route targets',
|
|
493
|
+
'└── widgets/ ← reusable UI components',
|
|
494
|
+
'```',
|
|
495
|
+
'',
|
|
496
|
+
'## Step 4 — Run code generation',
|
|
497
|
+
'',
|
|
498
|
+
'```bash',
|
|
499
|
+
'dart run build_runner build --delete-conflicting-outputs',
|
|
500
|
+
'```',
|
|
501
|
+
'',
|
|
502
|
+
'## Step 5 — Register routes',
|
|
503
|
+
'',
|
|
504
|
+
'Add `@TypedGoRoute` annotation in `lib/core/router/app_router.dart` and re-run build_runner.',
|
|
505
|
+
authGuardStep,
|
|
506
|
+
'',
|
|
507
|
+
'## Step 6 — Register providers',
|
|
508
|
+
'',
|
|
509
|
+
'Export new providers from `lib/features/<name>/presentation/providers/<name>_provider.dart`.',
|
|
510
|
+
'',
|
|
511
|
+
'## Step 7 — Write tests',
|
|
512
|
+
'',
|
|
513
|
+
'```',
|
|
514
|
+
'test/features/<name>/',
|
|
515
|
+
'├── domain/ ← entity and use case unit tests',
|
|
516
|
+
'├── data/ ← repository and data source tests',
|
|
517
|
+
'└── presentation/ ← widget and provider tests',
|
|
518
|
+
'```',
|
|
519
|
+
'',
|
|
520
|
+
'Run: `flutter test test/features/<name>/`',
|
|
521
|
+
].join('\n');
|
|
522
|
+
}
|
|
344
523
|
//# sourceMappingURL=skill-writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-writer.js","sourceRoot":"","sources":["../../src/claude-setup/skill-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAuB,EAAE,UAAkB;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAE9B,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,uBAAuB,EAAE,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC9F,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,yBAAyB,EAAE,CAAC;QACxF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-writer.js","sourceRoot":"","sources":["../../src/claude-setup/skill-writer.ts"],"names":[],"mappings":"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"}
|