aped-method 1.8.0 → 1.9.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aped-method",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "type": "module",
5
5
  "description": "Scaffold the APED pipeline (Analyze, PRD, Epics, Dev, Review) into any Claude Code project",
6
6
  "bin": {
@@ -50,6 +50,22 @@ export function references(c) {
50
50
  path: `${a}/aped-ux/references/ux-patterns.md`,
51
51
  content: UX_PATTERNS,
52
52
  },
53
+ {
54
+ path: `${a}/aped-s/references/status-format.md`,
55
+ content: STATUS_FORMAT,
56
+ },
57
+ {
58
+ path: `${a}/aped-c/references/scope-change-guide.md`,
59
+ content: SCOPE_CHANGE_GUIDE,
60
+ },
61
+ {
62
+ path: `${a}/aped-ctx/references/analysis-checklist.md`,
63
+ content: ANALYSIS_CHECKLIST,
64
+ },
65
+ {
66
+ path: `${a}/aped-qa/references/test-patterns.md`,
67
+ content: TEST_PATTERNS,
68
+ },
53
69
  ];
54
70
  }
55
71
 
@@ -799,3 +815,299 @@ Rules ranked by impact. Apply in order — never skip a higher-priority rule for
799
815
  - [ ] Reduced motion and dynamic text size supported
800
816
  - [ ] ARIA roles/states announced correctly
801
817
  `;
818
+
819
+ const STATUS_FORMAT = `# Sprint Status Dashboard Format
820
+
821
+ ## Pipeline Progress Bar
822
+
823
+ Display format:
824
+ \`\`\`
825
+ Pipeline: A[✓] → P[✓] → UX[✓] → E[✓] → D[▶] → R[ ]
826
+ \`\`\`
827
+
828
+ Symbols:
829
+ - \`✓\` = phase done
830
+ - \`▶\` = phase in-progress
831
+ - \` \` = phase not started
832
+ - \`—\` = phase skipped
833
+
834
+ ## Epic Progress Bar
835
+
836
+ \`\`\`
837
+ Epic 1: {{title}} [████████░░] 80% (4/5 stories)
838
+ \`\`\`
839
+
840
+ - Bar: 10 chars wide, \`█\` for done, \`░\` for remaining
841
+ - Show fraction and percentage
842
+
843
+ ## Story Status Icons
844
+
845
+ | Status | Icon | Meaning |
846
+ |--------|------|---------|
847
+ | done | ✓ | Story completed and reviewed |
848
+ | review | ⟳ | Waiting for adversarial review |
849
+ | in-progress | ▶ | Currently being implemented |
850
+ | ready-for-dev | ○ | Ready to start |
851
+ | backlog | · | Not yet planned |
852
+ | blocked | ✗ | Blocked by issue |
853
+
854
+ ## Blocker Categories
855
+
856
+ - **[AI-Review]** items — review findings not yet addressed
857
+ - **HALT** — dev stopped due to missing config/dependency/ambiguity
858
+ - **Stuck** — in-progress for multiple sessions without progress
859
+ - **Dependency** — blocked by another story
860
+
861
+ ## Next Action Logic
862
+
863
+ | Current State | Suggestion |
864
+ |---------------|------------|
865
+ | Stories ready-for-dev | "Run /aped-d to implement next story" |
866
+ | Stories in review | "Run /aped-r to review completed story" |
867
+ | All stories done | "Pipeline complete! Run /aped-qa for E2E tests" |
868
+ | Blockers found | Describe each blocker and resolution path |
869
+ | No state file | "Run /aped-a to start the pipeline" |
870
+ `;
871
+
872
+ const SCOPE_CHANGE_GUIDE = `# Scope Change Management Guide
873
+
874
+ ## Impact Assessment Matrix
875
+
876
+ | Change Type | PRD | UX | Epics | Stories | Code | Severity |
877
+ |-------------|-----|-----|-------|---------|------|----------|
878
+ | New feature added | Add FRs | Add screens | New stories | Create | None | Minor |
879
+ | Feature removed | Remove FRs | Remove screens | Archive stories | Archive | May delete | Minor |
880
+ | FR modified | Update FR | May update | Update story ACs | Update | May refactor | Medium |
881
+ | Architecture change | Update NFRs | May rebuild | Update all Dev Notes | Reset | May rewrite | Major |
882
+ | Priority reorder | No change | No change | Reorder | Reset status | None | Minor |
883
+ | Complete pivot | Restart | Restart | Restart | Restart | Archive | Critical |
884
+
885
+ ## Change Process
886
+
887
+ ### Step 1: Document the Change
888
+ - What changed and why
889
+ - Who requested it (user, stakeholder, technical discovery)
890
+ - Date of change
891
+
892
+ ### Step 2: Impact Analysis
893
+ - List all affected artifacts (PRD sections, stories, code files)
894
+ - Classify severity (minor/medium/major/critical)
895
+ - Estimate effort to apply change
896
+
897
+ ### Step 3: User Confirmation
898
+ - Present impact summary to user
899
+ - Get explicit "proceed" before making changes
900
+ - For major/critical: warn about in-progress work loss
901
+
902
+ ### Step 4: Execute Change
903
+ - Archive affected artifacts to \`{output}/archive/{date}/\`
904
+ - Apply changes top-down (PRD → UX → Epics → Stories)
905
+ - Re-validate at each level (scripts)
906
+ - Update state.yaml
907
+
908
+ ### Step 5: Verify Consistency
909
+ - FR coverage still 100%
910
+ - No orphan stories
911
+ - No broken dependencies
912
+ - State reflects new reality
913
+
914
+ ## Scope Creep Detection
915
+
916
+ Warning signs:
917
+ - Total FRs grew >20% from original PRD
918
+ - Epic count increased
919
+ - Stories consistently exceed single-session size
920
+ - "Just one more thing" pattern repeating
921
+
922
+ Response:
923
+ - Flag to user with metrics
924
+ - Suggest moving additions to Growth phase
925
+ - Enforce MVP discipline
926
+ `;
927
+
928
+ const ANALYSIS_CHECKLIST = `# Brownfield Project Analysis Checklist
929
+
930
+ ## Phase 1: Structure Discovery
931
+
932
+ - [ ] Identify primary language(s) from config files
933
+ - [ ] Map directory structure (max 3 levels)
934
+ - [ ] Find entry points (main, index, app, server)
935
+ - [ ] Count: files, LOC, languages
936
+ - [ ] Identify package manager (npm, yarn, pnpm, cargo, pip, go mod)
937
+ - [ ] Check for monorepo structure (workspaces, packages/)
938
+
939
+ ## Phase 2: Architecture Mapping
940
+
941
+ - [ ] Identify pattern (MVC, hexagonal, microservices, monolith, serverless)
942
+ - [ ] Map data flow: entry → processing → storage → response
943
+ - [ ] List databases and data stores
944
+ - [ ] List external API integrations
945
+ - [ ] List message queues/event systems
946
+ - [ ] Identify caching layer
947
+ - [ ] Map authentication/authorization flow
948
+
949
+ ## Phase 3: Convention Extraction
950
+
951
+ - [ ] File naming convention (camelCase, kebab-case, PascalCase)
952
+ - [ ] Function/method naming convention
953
+ - [ ] Code organization (feature-based, layer-based, domain-based)
954
+ - [ ] Error handling pattern (try/catch, Result type, error codes)
955
+ - [ ] Logging approach (structured, unstructured, library used)
956
+ - [ ] Config management (env vars, .env files, config files, vault)
957
+ - [ ] Linting/formatting (ESLint, Prettier, Biome, rustfmt)
958
+
959
+ ## Phase 4: Dependency Audit
960
+
961
+ - [ ] List production dependencies with versions
962
+ - [ ] Flag outdated packages (major versions behind)
963
+ - [ ] Check for known security advisories
964
+ - [ ] Identify lock file type
965
+ - [ ] Note any vendored/bundled dependencies
966
+ - [ ] Check for deprecated packages
967
+
968
+ ## Phase 5: Testing
969
+
970
+ - [ ] Identify test framework(s)
971
+ - [ ] Estimate test coverage (file count, coverage reports)
972
+ - [ ] Check for CI/CD pipeline config
973
+ - [ ] Identify test types present (unit, integration, E2E)
974
+ - [ ] Check for test fixtures/factories/mocks
975
+
976
+ ## Output Format
977
+
978
+ \`\`\`markdown
979
+ # Project Context: {name}
980
+
981
+ ## Tech Stack
982
+ - Language: {lang} {version}
983
+ - Framework: {framework} {version}
984
+ - Database: {db}
985
+ - Test Framework: {test_fw}
986
+
987
+ ## Architecture
988
+ - Pattern: {pattern}
989
+ - Entry: {entry_point}
990
+ - Modules: {key_modules}
991
+
992
+ ## Conventions
993
+ - Files: {naming}
994
+ - Code style: {linter}
995
+ - Error handling: {pattern}
996
+
997
+ ## Dependencies ({count} total)
998
+ | Package | Version | Purpose | Status |
999
+ |---------|---------|---------|--------|
1000
+
1001
+ ## Integration Points
1002
+ | Service | Purpose | Protocol |
1003
+ |---------|---------|----------|
1004
+
1005
+ ## Notes
1006
+ - {important_context_for_dev}
1007
+ \`\`\`
1008
+ `;
1009
+
1010
+ const TEST_PATTERNS = `# E2E & Integration Test Patterns
1011
+
1012
+ ## Framework Selection
1013
+
1014
+ | Project Type | E2E Framework | Integration Framework |
1015
+ |-------------|---------------|----------------------|
1016
+ | Node.js + React | Playwright or Cypress | Supertest + Vitest |
1017
+ | Node.js + API only | - | Supertest + Jest/Vitest |
1018
+ | Next.js | Playwright | Next.js test utils |
1019
+ | Python + Django/Flask | Playwright | pytest + httpx |
1020
+ | Python + FastAPI | Playwright | pytest + httpx |
1021
+ | Go | - | go test + httptest |
1022
+ | Rust | - | reqwest + tokio::test |
1023
+
1024
+ ## E2E Test Structure
1025
+
1026
+ \`\`\`
1027
+ tests/e2e/
1028
+ {journey-name}.test.{ext} # One file per user journey
1029
+ fixtures/ # Test data
1030
+ helpers/ # Page objects, utilities
1031
+ \`\`\`
1032
+
1033
+ ### User Journey Test Template
1034
+
1035
+ \`\`\`
1036
+ describe("{Journey Name}", () => {
1037
+ test("happy path: {description}", async () => {
1038
+ // Given: {precondition from AC}
1039
+ // When: {action from AC}
1040
+ // Then: {outcome from AC}
1041
+ });
1042
+
1043
+ test("error: {error scenario}", async () => {
1044
+ // Given: {invalid state}
1045
+ // When: {action}
1046
+ // Then: {error handling}
1047
+ });
1048
+
1049
+ test("edge: {edge case}", async () => {
1050
+ // Given: {boundary condition}
1051
+ // When: {action}
1052
+ // Then: {expected behavior}
1053
+ });
1054
+ });
1055
+ \`\`\`
1056
+
1057
+ ## Integration Test Structure
1058
+
1059
+ \`\`\`
1060
+ tests/integration/
1061
+ {endpoint-or-service}.test.{ext}
1062
+ fixtures/
1063
+ helpers/
1064
+ \`\`\`
1065
+
1066
+ ### API Test Template
1067
+
1068
+ \`\`\`
1069
+ describe("{Endpoint/Service}", () => {
1070
+ test("POST /api/resource - creates resource", async () => {
1071
+ // Arrange: valid payload
1072
+ // Act: POST request
1073
+ // Assert: 201, response body, DB state
1074
+ });
1075
+
1076
+ test("POST /api/resource - 400 on invalid input", async () => {
1077
+ // Arrange: invalid payload
1078
+ // Act: POST request
1079
+ // Assert: 400, error message
1080
+ });
1081
+
1082
+ test("GET /api/resource/:id - 404 on missing", async () => {
1083
+ // Arrange: non-existent ID
1084
+ // Act: GET request
1085
+ // Assert: 404
1086
+ });
1087
+
1088
+ test("auth: rejects unauthenticated requests", async () => {
1089
+ // Arrange: no auth header
1090
+ // Act: request
1091
+ // Assert: 401
1092
+ });
1093
+ });
1094
+ \`\`\`
1095
+
1096
+ ## Test Coverage Goals
1097
+
1098
+ | Category | Target | How to verify |
1099
+ |----------|--------|---------------|
1100
+ | AC coverage | 100% of ACs have tests | Map each AC → test |
1101
+ | Happy paths | Every user journey | 1 E2E test per journey |
1102
+ | Error paths | All error states | 1 test per error scenario |
1103
+ | Auth boundaries | All protected routes | Unauthorized + forbidden |
1104
+ | Edge cases | Empty, null, max values | Boundary value analysis |
1105
+
1106
+ ## Anti-Patterns
1107
+
1108
+ - **Flaky tests**: Don't depend on timing. Use waitFor, retries, explicit waits.
1109
+ - **Shared state**: Each test must be independent. Reset DB/state before each.
1110
+ - **Hardcoded selectors**: Use data-testid or accessible roles, not CSS classes.
1111
+ - **Testing implementation**: Test behavior, not internal structure.
1112
+ - **No assertions**: Every test must assert something. \`expect(true).toBe(true)\` is not a test.
1113
+ `;
@@ -338,6 +338,105 @@ if [[ \${#IN_STORY_NOT_GIT[@]} -gt 0 ]]; then
338
338
  exit 1
339
339
  fi
340
340
 
341
+ exit 0
342
+ `,
343
+ },
344
+ {
345
+ path: `${a}/aped-ux/scripts/validate-ux.sh`,
346
+ executable: true,
347
+ content: `#!/usr/bin/env bash
348
+ # Validate UX design spec completeness
349
+ # Usage: validate-ux.sh <ux-dir>
350
+ # Exit 0 if valid, exit 1 with missing items listed
351
+
352
+ set -euo pipefail
353
+
354
+ if [[ $# -ne 1 ]]; then
355
+ echo "Usage: $0 <ux-directory>"
356
+ exit 1
357
+ fi
358
+
359
+ UX_DIR="$1"
360
+
361
+ if [[ ! -d "$UX_DIR" ]]; then
362
+ echo "ERROR: Directory not found: $UX_DIR"
363
+ exit 1
364
+ fi
365
+
366
+ ISSUES=()
367
+
368
+ # Check required output files
369
+ REQUIRED_FILES=(
370
+ "design-spec.md"
371
+ "screen-inventory.md"
372
+ "components.md"
373
+ "flows.md"
374
+ )
375
+
376
+ for file in "\${REQUIRED_FILES[@]}"; do
377
+ if [[ ! -f "$UX_DIR/$file" ]]; then
378
+ ISSUES+=("MISSING FILE: $UX_DIR/$file")
379
+ fi
380
+ done
381
+
382
+ # Check design-spec.md has required sections
383
+ if [[ -f "$UX_DIR/design-spec.md" ]]; then
384
+ SPEC_SECTIONS=(
385
+ "## Tech Stack"
386
+ "## Architecture"
387
+ "## Conventions"
388
+ "## Dependencies"
389
+ )
390
+
391
+ # Reuse pattern: check for sections about design tokens and UI library
392
+ if ! grep -q "color\\|Color\\|palette\\|token" "$UX_DIR/design-spec.md" 2>/dev/null; then
393
+ ISSUES+=("MISSING CONTENT: design-spec.md has no color/token definitions")
394
+ fi
395
+
396
+ if ! grep -q "typography\\|Typography\\|font\\|Font" "$UX_DIR/design-spec.md" 2>/dev/null; then
397
+ ISSUES+=("MISSING CONTENT: design-spec.md has no typography definitions")
398
+ fi
399
+ fi
400
+
401
+ # Check screen-inventory.md has content
402
+ if [[ -f "$UX_DIR/screen-inventory.md" ]]; then
403
+ SCREEN_COUNT=$(grep -cE '^\\|.*\\|.*\\|' "$UX_DIR/screen-inventory.md" 2>/dev/null || echo 0)
404
+ if [[ "$SCREEN_COUNT" -lt 3 ]]; then
405
+ ISSUES+=("LOW SCREEN COUNT: Found $SCREEN_COUNT screens (expected at least 3)")
406
+ fi
407
+ fi
408
+
409
+ # Check components.md has component entries
410
+ if [[ -f "$UX_DIR/components.md" ]]; then
411
+ COMP_COUNT=$(grep -cE '^#{2,3} ' "$UX_DIR/components.md" 2>/dev/null || echo 0)
412
+ if [[ "$COMP_COUNT" -lt 3 ]]; then
413
+ ISSUES+=("LOW COMPONENT COUNT: Found $COMP_COUNT components (expected at least 3)")
414
+ fi
415
+ fi
416
+
417
+ # Check preview app exists
418
+ PREVIEW_DIR="\${UX_DIR}-preview"
419
+ if [[ -d "$PREVIEW_DIR" ]]; then
420
+ if [[ ! -f "$PREVIEW_DIR/package.json" ]]; then
421
+ ISSUES+=("MISSING: Preview app has no package.json")
422
+ fi
423
+ if [[ ! -d "$PREVIEW_DIR/src" ]]; then
424
+ ISSUES+=("MISSING: Preview app has no src/ directory")
425
+ fi
426
+ else
427
+ ISSUES+=("WARNING: No preview app at $PREVIEW_DIR (optional but recommended)")
428
+ fi
429
+
430
+ # Report
431
+ if [[ \${#ISSUES[@]} -gt 0 ]]; then
432
+ echo "UX VALIDATION FAILED — Issues found:"
433
+ for issue in "\${ISSUES[@]}"; do
434
+ echo " - $issue"
435
+ done
436
+ exit 1
437
+ fi
438
+
439
+ echo "UX VALIDATION PASSED — All required files and content present"
341
440
  exit 0
342
441
  `,
343
442
  },
@@ -860,6 +860,14 @@ mkdir -p ${o}/ux
860
860
  5. Write \`${o}/ux/flows.md\` — navigation flow diagrams
861
861
  6. Take **screenshots** of each screen at desktop resolution → \`${o}/ux/screenshots/\`
862
862
 
863
+ ## Validation
864
+
865
+ \`\`\`bash
866
+ bash ${a}/aped-ux/scripts/validate-ux.sh ${o}/ux
867
+ \`\`\`
868
+
869
+ If validation fails: fix missing files or content and re-validate.
870
+
863
871
  ## State Update
864
872
 
865
873
  Update \`${o}/state.yaml\`:
@@ -913,6 +921,7 @@ metadata:
913
921
 
914
922
  1. Read \`${a}/config.yaml\` — extract \`communication_language\`, \`ticket_system\`
915
923
  2. Read \`${o}/state.yaml\` — load full pipeline and sprint state
924
+ 3. Read \`${a}/aped-s/references/status-format.md\` for display conventions
916
925
 
917
926
  ## Pipeline Overview
918
927
 
@@ -1004,6 +1013,7 @@ Use when requirements change, priorities shift, or the current approach needs re
1004
1013
  1. Read \`${a}/config.yaml\` — extract config
1005
1014
  2. Read \`${o}/state.yaml\` — understand current pipeline state
1006
1015
  3. Read existing artifacts: brief, PRD, epics, stories
1016
+ 4. Read \`${a}/aped-c/references/scope-change-guide.md\` for impact matrix and process
1007
1017
 
1008
1018
  ## Impact Assessment
1009
1019
 
@@ -1105,6 +1115,7 @@ Use on existing codebases to generate project context before running the APED pi
1105
1115
 
1106
1116
  1. Read \`${a}/config.yaml\` — extract config
1107
1117
  2. Verify this is a brownfield project (existing code, not greenfield)
1118
+ 3. Read \`${a}/aped-ctx/references/analysis-checklist.md\` for the full analysis checklist
1108
1119
 
1109
1120
  ## Codebase Analysis
1110
1121
 
@@ -1223,6 +1234,7 @@ Generate comprehensive end-to-end and integration tests for completed stories or
1223
1234
 
1224
1235
  1. Read \`${a}/config.yaml\` — extract config
1225
1236
  2. Read \`${o}/state.yaml\` — find completed stories/epics
1237
+ 3. Read \`${a}/aped-qa/references/test-patterns.md\` for framework selection and test templates
1226
1238
 
1227
1239
  ## Scope Selection
1228
1240