@nextsparkjs/ai-workflow 0.1.0-beta.100

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.
Files changed (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/claude/_docs/workflows-optimizations.md +359 -0
  4. package/claude/agents/api-tester.md +634 -0
  5. package/claude/agents/architecture-supervisor.md +1351 -0
  6. package/claude/agents/backend-developer.md +997 -0
  7. package/claude/agents/backend-validator.md +417 -0
  8. package/claude/agents/bdd-docs-writer.md +737 -0
  9. package/claude/agents/block-developer.md +677 -0
  10. package/claude/agents/code-reviewer.md +1432 -0
  11. package/claude/agents/db-developer.md +721 -0
  12. package/claude/agents/db-validator.md +407 -0
  13. package/claude/agents/demo-video-generator.md +493 -0
  14. package/claude/agents/documentation-writer.md +1268 -0
  15. package/claude/agents/frontend-developer.md +1234 -0
  16. package/claude/agents/frontend-validator.md +777 -0
  17. package/claude/agents/functional-validator.md +630 -0
  18. package/claude/agents/mock-analyst.md +387 -0
  19. package/claude/agents/product-manager.md +963 -0
  20. package/claude/agents/qa-automation.md +1762 -0
  21. package/claude/agents/release-manager.md +634 -0
  22. package/claude/agents/selectors-translator.md +262 -0
  23. package/claude/agents/unit-test-writer.md +785 -0
  24. package/claude/agents/visual-comparator.md +329 -0
  25. package/claude/agents/workflow-maintainer.md +352 -0
  26. package/claude/commands/do/README.md +88 -0
  27. package/claude/commands/do/create-api.md +64 -0
  28. package/claude/commands/do/create-entity.md +66 -0
  29. package/claude/commands/do/create-migration.md +64 -0
  30. package/claude/commands/do/create-plugin.md +56 -0
  31. package/claude/commands/do/create-theme.md +70 -0
  32. package/claude/commands/do/mock-data.md +67 -0
  33. package/claude/commands/do/reset-db.md +71 -0
  34. package/claude/commands/do/setup-scheduled-action.md +75 -0
  35. package/claude/commands/do/sync-code-review.md +117 -0
  36. package/claude/commands/do/update-selectors.md +112 -0
  37. package/claude/commands/do/use-skills.md +90 -0
  38. package/claude/commands/do/validate-blocks.md +69 -0
  39. package/claude/commands/how-to/README.md +261 -0
  40. package/claude/commands/how-to/add-metadata.md +692 -0
  41. package/claude/commands/how-to/add-taxonomies.md +806 -0
  42. package/claude/commands/how-to/add-translations.md +571 -0
  43. package/claude/commands/how-to/create-api.md +577 -0
  44. package/claude/commands/how-to/create-block.md +575 -0
  45. package/claude/commands/how-to/create-child-entities.md +771 -0
  46. package/claude/commands/how-to/create-entity.md +597 -0
  47. package/claude/commands/how-to/create-migrations.md +605 -0
  48. package/claude/commands/how-to/create-plugin.md +654 -0
  49. package/claude/commands/how-to/customize-app.md +481 -0
  50. package/claude/commands/how-to/customize-dashboard.md +553 -0
  51. package/claude/commands/how-to/customize-theme.md +438 -0
  52. package/claude/commands/how-to/define-features-flows.md +632 -0
  53. package/claude/commands/how-to/deploy.md +507 -0
  54. package/claude/commands/how-to/handle-file-uploads.md +746 -0
  55. package/claude/commands/how-to/implement-search.md +1001 -0
  56. package/claude/commands/how-to/install-plugins.md +352 -0
  57. package/claude/commands/how-to/manage-test-coverage.md +984 -0
  58. package/claude/commands/how-to/run-tests.md +400 -0
  59. package/claude/commands/how-to/set-app-languages.md +601 -0
  60. package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
  61. package/claude/commands/how-to/set-scheduled-actions.md +527 -0
  62. package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
  63. package/claude/commands/how-to/setup-authentication.md +388 -0
  64. package/claude/commands/how-to/setup-claude-code.md +440 -0
  65. package/claude/commands/how-to/setup-database.md +274 -0
  66. package/claude/commands/how-to/setup-email-providers.md +598 -0
  67. package/claude/commands/how-to/setup-mobile-dev.md +627 -0
  68. package/claude/commands/how-to/start.md +500 -0
  69. package/claude/commands/how-to/use-devtools.md +639 -0
  70. package/claude/commands/how-to/use-superadmin.md +622 -0
  71. package/claude/commands/session/README.md +193 -0
  72. package/claude/commands/session/block-create.md +190 -0
  73. package/claude/commands/session/block-list.md +203 -0
  74. package/claude/commands/session/block-update.md +192 -0
  75. package/claude/commands/session/block-validate.md +218 -0
  76. package/claude/commands/session/changelog.md +115 -0
  77. package/claude/commands/session/close.md +225 -0
  78. package/claude/commands/session/commit.md +174 -0
  79. package/claude/commands/session/db-entity.md +206 -0
  80. package/claude/commands/session/db-fix.md +212 -0
  81. package/claude/commands/session/db-sample.md +206 -0
  82. package/claude/commands/session/demo.md +178 -0
  83. package/claude/commands/session/doc-bdd.md +207 -0
  84. package/claude/commands/session/doc-feature.md +218 -0
  85. package/claude/commands/session/doc-read.md +225 -0
  86. package/claude/commands/session/execute.md +204 -0
  87. package/claude/commands/session/explain.md +202 -0
  88. package/claude/commands/session/fix-bug.md +210 -0
  89. package/claude/commands/session/fix-build.md +182 -0
  90. package/claude/commands/session/fix-test.md +189 -0
  91. package/claude/commands/session/pending.md +232 -0
  92. package/claude/commands/session/refine.md +188 -0
  93. package/claude/commands/session/resume.md +192 -0
  94. package/claude/commands/session/review.md +192 -0
  95. package/claude/commands/session/scope-change.md +181 -0
  96. package/claude/commands/session/start-blocks.md +347 -0
  97. package/claude/commands/session/start.md +604 -0
  98. package/claude/commands/session/status.md +169 -0
  99. package/claude/commands/session/test-fix.md +221 -0
  100. package/claude/commands/session/test-run.md +203 -0
  101. package/claude/commands/session/test-write.md +242 -0
  102. package/claude/commands/session/validate.md +162 -0
  103. package/claude/config/context.json +40 -0
  104. package/claude/config/github.json +69 -0
  105. package/claude/config/github.schema.json +106 -0
  106. package/claude/config/team.json +46 -0
  107. package/claude/config/team.schema.json +106 -0
  108. package/claude/config/workspace.json +43 -0
  109. package/claude/config/workspace.schema.json +75 -0
  110. package/claude/skills/README.md +228 -0
  111. package/claude/skills/accessibility/SKILL.md +573 -0
  112. package/claude/skills/api-bypass-layers/SKILL.md +550 -0
  113. package/claude/skills/asana-integration/SKILL.md +499 -0
  114. package/claude/skills/better-auth/SKILL.md +666 -0
  115. package/claude/skills/billing-subscriptions/SKILL.md +660 -0
  116. package/claude/skills/block-decision-matrix/SKILL.md +359 -0
  117. package/claude/skills/clickup-integration/SKILL.md +434 -0
  118. package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
  119. package/claude/skills/create-plugin/SKILL.md +425 -0
  120. package/claude/skills/create-theme/SKILL.md +331 -0
  121. package/claude/skills/cypress-api/SKILL.md +511 -0
  122. package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
  123. package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
  124. package/claude/skills/cypress-e2e/SKILL.md +526 -0
  125. package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
  126. package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
  127. package/claude/skills/cypress-selectors/SKILL.md +309 -0
  128. package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
  129. package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
  130. package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
  131. package/claude/skills/database-migrations/SKILL.md +335 -0
  132. package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
  133. package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
  134. package/claude/skills/design-system/SKILL.md +682 -0
  135. package/claude/skills/documentation/SKILL.md +540 -0
  136. package/claude/skills/entity-api/SKILL.md +482 -0
  137. package/claude/skills/entity-system/SKILL.md +635 -0
  138. package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
  139. package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
  140. package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
  141. package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
  142. package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
  143. package/claude/skills/github/SKILL.md +467 -0
  144. package/claude/skills/i18n-nextintl/SKILL.md +302 -0
  145. package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
  146. package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
  147. package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
  148. package/claude/skills/impact-analysis/SKILL.md +203 -0
  149. package/claude/skills/jest-unit/SKILL.md +306 -0
  150. package/claude/skills/jest-unit/references/component-testing.md +371 -0
  151. package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
  152. package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
  153. package/claude/skills/jira-integration/SKILL.md +539 -0
  154. package/claude/skills/media-library/SKILL.md +743 -0
  155. package/claude/skills/mock-analysis/SKILL.md +276 -0
  156. package/claude/skills/monorepo-architecture/SKILL.md +162 -0
  157. package/claude/skills/nextjs-api-development/SKILL.md +364 -0
  158. package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
  159. package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
  160. package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
  161. package/claude/skills/notion-integration/SKILL.md +641 -0
  162. package/claude/skills/npm-development-workflow/SKILL.md +480 -0
  163. package/claude/skills/page-builder-blocks/SKILL.md +530 -0
  164. package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
  165. package/claude/skills/permissions-system/SKILL.md +619 -0
  166. package/claude/skills/plugins/SKILL.md +340 -0
  167. package/claude/skills/plugins/references/plugin-templates.md +414 -0
  168. package/claude/skills/plugins/references/plugin-testing.md +353 -0
  169. package/claude/skills/plugins/references/plugin-types.md +198 -0
  170. package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
  171. package/claude/skills/pom-patterns/SKILL.md +452 -0
  172. package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
  173. package/claude/skills/rate-limiting/SKILL.md +342 -0
  174. package/claude/skills/react-best-practices/AGENTS.md +2410 -0
  175. package/claude/skills/react-best-practices/README.md +123 -0
  176. package/claude/skills/react-best-practices/SKILL.md +125 -0
  177. package/claude/skills/react-best-practices/metadata.json +15 -0
  178. package/claude/skills/react-best-practices/rules/_sections.md +46 -0
  179. package/claude/skills/react-best-practices/rules/_template.md +28 -0
  180. package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  181. package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  182. package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
  183. package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
  184. package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
  185. package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
  186. package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  187. package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  188. package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  189. package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  190. package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  191. package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
  192. package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  193. package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  194. package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  195. package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  196. package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  197. package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  198. package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  199. package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  200. package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  201. package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
  202. package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  203. package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
  204. package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  205. package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  206. package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  207. package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  208. package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
  209. package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  210. package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  211. package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  212. package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  213. package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  214. package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  215. package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  216. package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  217. package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  218. package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  219. package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  220. package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
  221. package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  222. package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  223. package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  224. package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
  225. package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  226. package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
  227. package/claude/skills/react-patterns/SKILL.md +688 -0
  228. package/claude/skills/registry-system/SKILL.md +331 -0
  229. package/claude/skills/scheduled-actions/SKILL.md +671 -0
  230. package/claude/skills/scope-enforcement/SKILL.md +542 -0
  231. package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
  232. package/claude/skills/server-actions/SKILL.md +493 -0
  233. package/claude/skills/service-layer/SKILL.md +587 -0
  234. package/claude/skills/session-management/SKILL.md +266 -0
  235. package/claude/skills/session-management/scripts/create-session.py +166 -0
  236. package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
  237. package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
  238. package/claude/skills/session-management/scripts/session-archive.sh +87 -0
  239. package/claude/skills/session-management/scripts/session-close.sh +133 -0
  240. package/claude/skills/session-management/scripts/session-init.sh +225 -0
  241. package/claude/skills/session-management/scripts/session-list.sh +163 -0
  242. package/claude/skills/session-management/scripts/split-plan.sh +116 -0
  243. package/claude/skills/shadcn-components/SKILL.md +586 -0
  244. package/claude/skills/shadcn-theming/SKILL.md +446 -0
  245. package/claude/skills/suspense-loading/SKILL.md +280 -0
  246. package/claude/skills/tailwind-theming/SKILL.md +507 -0
  247. package/claude/skills/tanstack-query/SKILL.md +608 -0
  248. package/claude/skills/test-coverage/SKILL.md +239 -0
  249. package/claude/skills/web-design-guidelines/SKILL.md +39 -0
  250. package/claude/skills/zod-validation/SKILL.md +537 -0
  251. package/claude/templates/blocks/progress.md +86 -0
  252. package/claude/templates/iteration/changes.md +61 -0
  253. package/claude/templates/iteration/progress.md +55 -0
  254. package/claude/templates/log.md +31 -0
  255. package/claude/templates/story/context.md +77 -0
  256. package/claude/templates/story/pendings.md +37 -0
  257. package/claude/templates/story/plan.md +299 -0
  258. package/claude/templates/story/requirements.md +109 -0
  259. package/claude/templates/story/scope.json +10 -0
  260. package/claude/templates/story/tests.md +91 -0
  261. package/claude/templates/task/progress.md +58 -0
  262. package/claude/templates/task/requirements.md +54 -0
  263. package/claude/workflows/README.md +154 -0
  264. package/claude/workflows/blocks.md +614 -0
  265. package/claude/workflows/story.md +1207 -0
  266. package/claude/workflows/task.md +927 -0
  267. package/claude/workflows/tweak.md +527 -0
  268. package/cursor/.gitkeep +0 -0
  269. package/package.json +35 -0
  270. package/scripts/postinstall.mjs +198 -0
  271. package/scripts/setup.mjs +282 -0
  272. package/scripts/sync.mjs +209 -0
@@ -0,0 +1,180 @@
1
+ #!/bin/bash
2
+ #
3
+ # iteration-init.sh - Create a new iteration within a story
4
+ #
5
+ # Usage: iteration-init.sh <session-path> <reason> [name]
6
+ # session-path: path to story (e.g., stories/2026-01-11-new-entity)
7
+ # reason: scope-change | blocked | review-feedback | continuation
8
+ # name: optional custom name for the iteration
9
+ #
10
+ # Examples:
11
+ # ./iteration-init.sh stories/2026-01-11-new-products-entity scope-change
12
+ # ./iteration-init.sh stories/2026-01-11-new-products-entity blocked "api-dependency"
13
+ #
14
+
15
+ set -e
16
+
17
+ # Colors
18
+ RED='\033[0;31m'
19
+ GREEN='\033[0;32m'
20
+ YELLOW='\033[1;33m'
21
+ BLUE='\033[0;34m'
22
+ NC='\033[0m'
23
+
24
+ # Get script directory
25
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
26
+ SESSIONS_DIR="$(dirname "$SCRIPT_DIR")"
27
+ TEMPLATES_DIR="$SESSIONS_DIR/templates"
28
+
29
+ # Parse arguments
30
+ SESSION_PATH="$1"
31
+ REASON="$2"
32
+ CUSTOM_NAME="${3:-}"
33
+
34
+ # Validate session path
35
+ if [[ -z "$SESSION_PATH" ]]; then
36
+ echo -e "${RED}Error: Session path is required${NC}"
37
+ echo "Usage: $0 <session-path> <reason> [name]"
38
+ exit 1
39
+ fi
40
+
41
+ # Validate reason
42
+ if [[ ! "$REASON" =~ ^(scope-change|blocked|review-feedback|continuation)$ ]]; then
43
+ echo -e "${RED}Error: Invalid reason '$REASON'${NC}"
44
+ echo "Valid reasons: scope-change, blocked, review-feedback, continuation"
45
+ exit 1
46
+ fi
47
+
48
+ # Resolve full path
49
+ if [[ "$SESSION_PATH" != /* ]]; then
50
+ FULL_PATH="$SESSIONS_DIR/$SESSION_PATH"
51
+ else
52
+ FULL_PATH="$SESSION_PATH"
53
+ fi
54
+
55
+ # Check if session exists
56
+ if [[ ! -d "$FULL_PATH" ]]; then
57
+ echo -e "${RED}Error: Session not found: $FULL_PATH${NC}"
58
+ exit 1
59
+ fi
60
+
61
+ # Verify it's a story (has iterations folder)
62
+ if [[ ! -d "$FULL_PATH/iterations" ]]; then
63
+ echo -e "${RED}Error: Not a story session (no iterations folder)${NC}"
64
+ exit 1
65
+ fi
66
+
67
+ # Find current iteration number
68
+ CURRENT_NUM=$(ls -1 "$FULL_PATH/iterations" 2>/dev/null | grep -E '^[0-9]' | wc -l)
69
+ NEXT_NUM=$(printf "%02d" $((CURRENT_NUM + 1)))
70
+
71
+ # Build iteration name
72
+ if [[ -n "$CUSTOM_NAME" ]]; then
73
+ ITERATION_NAME="${NEXT_NUM}-${REASON}-${CUSTOM_NAME}"
74
+ else
75
+ ITERATION_NAME="${NEXT_NUM}-${REASON}"
76
+ fi
77
+
78
+ # Clean name
79
+ ITERATION_NAME=$(echo "$ITERATION_NAME" | tr ' ' '-' | tr '[:upper:]' '[:lower:]')
80
+
81
+ ITERATION_DIR="$FULL_PATH/iterations/$ITERATION_NAME"
82
+ CLOSED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
83
+
84
+ echo -e "${BLUE}Creating iteration: $ITERATION_NAME${NC}"
85
+ echo ""
86
+
87
+ # Close current iteration first
88
+ CURRENT_DIR="$FULL_PATH/current"
89
+ if [[ -d "$CURRENT_DIR" ]]; then
90
+ CURRENT_PROGRESS=$(readlink "$CURRENT_DIR/progress.md" 2>/dev/null || echo "")
91
+ if [[ -n "$CURRENT_PROGRESS" ]]; then
92
+ OLD_ITERATION_DIR=$(dirname "$CURRENT_PROGRESS")
93
+ OLD_ITERATION_DIR=$(cd "$CURRENT_DIR" && cd "$OLD_ITERATION_DIR" && pwd)
94
+ OLD_ITERATION_NAME=$(basename "$OLD_ITERATION_DIR")
95
+
96
+ # Create closed.json for previous iteration
97
+ cat > "$OLD_ITERATION_DIR/closed.json" << EOF
98
+ {
99
+ "iteration": "$OLD_ITERATION_NAME",
100
+ "status": "completed",
101
+ "closedAt": "$CLOSED_AT",
102
+ "closedBy": "claude",
103
+ "summary": "Closed to start iteration: $ITERATION_NAME",
104
+ "reason": "$REASON",
105
+ "nextIteration": "$ITERATION_NAME"
106
+ }
107
+ EOF
108
+ echo -e "${GREEN}Closed iteration: $OLD_ITERATION_NAME${NC}"
109
+ fi
110
+ fi
111
+
112
+ # Create new iteration directory
113
+ mkdir -p "$ITERATION_DIR"
114
+
115
+ # Create iteration files
116
+ cat > "$ITERATION_DIR/progress.md" << EOF
117
+ # Progress: $ITERATION_NAME
118
+
119
+ **Started:** $(date '+%Y-%m-%d %H:%M')
120
+ **Reason:** $REASON
121
+
122
+ ## Current Phase
123
+
124
+
125
+ ## Completed
126
+
127
+
128
+ ## In Progress
129
+
130
+
131
+ ## Pending
132
+
133
+ EOF
134
+
135
+ cat > "$ITERATION_DIR/changes.md" << EOF
136
+ # Changes: $ITERATION_NAME
137
+
138
+ **Started:** $(date '+%Y-%m-%d %H:%M')
139
+
140
+ ## Files Modified
141
+
142
+
143
+ ## Files Created
144
+
145
+
146
+ ## Files Deleted
147
+
148
+ EOF
149
+
150
+ # Create scope-change.md if reason is scope-change
151
+ if [[ "$REASON" == "scope-change" ]]; then
152
+ cat > "$ITERATION_DIR/scope-change.md" << EOF
153
+ # Scope Change: $ITERATION_NAME
154
+
155
+ **Date:** $(date '+%Y-%m-%d %H:%M')
156
+
157
+ ## What Changed
158
+
159
+
160
+ ## Why
161
+
162
+
163
+ ## Impact on Plan
164
+
165
+
166
+ ## Updated Acceptance Criteria
167
+
168
+ EOF
169
+ echo -e "${GREEN}Created: scope-change.md${NC}"
170
+ fi
171
+
172
+ # Update current symlinks
173
+ rm -f "$CURRENT_DIR/progress.md" "$CURRENT_DIR/changes.md" 2>/dev/null || true
174
+ ln -sf "../iterations/$ITERATION_NAME/progress.md" "$CURRENT_DIR/progress.md"
175
+ ln -sf "../iterations/$ITERATION_NAME/changes.md" "$CURRENT_DIR/changes.md"
176
+
177
+ echo -e "${GREEN}Created iteration: $ITERATION_NAME${NC}"
178
+ echo -e "${GREEN}Updated current/ symlinks${NC}"
179
+ echo ""
180
+ echo -e "${BLUE}Iteration path: $ITERATION_DIR${NC}"
@@ -0,0 +1,87 @@
1
+ #!/bin/bash
2
+ #
3
+ # session-archive.sh - Move a closed session to archive
4
+ #
5
+ # Usage: session-archive.sh <session-path>
6
+ # session-path: path to session (e.g., stories/2026-01-11-new-entity)
7
+ #
8
+ # Examples:
9
+ # ./session-archive.sh stories/2026-01-11-new-products-entity
10
+ # ./session-archive.sh tasks/2026-01-10-improve-search
11
+ #
12
+
13
+ set -e
14
+
15
+ # Colors
16
+ RED='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ NC='\033[0m'
21
+
22
+ # Get script directory
23
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
24
+ SESSIONS_DIR="$(dirname "$SCRIPT_DIR")"
25
+
26
+ # Parse arguments
27
+ SESSION_PATH="$1"
28
+
29
+ # Validate session path
30
+ if [[ -z "$SESSION_PATH" ]]; then
31
+ echo -e "${RED}Error: Session path is required${NC}"
32
+ echo "Usage: $0 <session-path>"
33
+ exit 1
34
+ fi
35
+
36
+ # Resolve full path
37
+ if [[ "$SESSION_PATH" != /* ]]; then
38
+ FULL_PATH="$SESSIONS_DIR/$SESSION_PATH"
39
+ else
40
+ FULL_PATH="$SESSION_PATH"
41
+ fi
42
+
43
+ # Check if session exists
44
+ if [[ ! -d "$FULL_PATH" && ! -f "$FULL_PATH" ]]; then
45
+ echo -e "${RED}Error: Session not found: $FULL_PATH${NC}"
46
+ exit 1
47
+ fi
48
+
49
+ # Determine session type
50
+ if [[ "$SESSION_PATH" == *"stories"* ]]; then
51
+ TYPE="stories"
52
+ elif [[ "$SESSION_PATH" == *"tasks"* ]]; then
53
+ TYPE="tasks"
54
+ elif [[ "$SESSION_PATH" == *"logs"* ]]; then
55
+ TYPE="logs"
56
+ else
57
+ echo -e "${RED}Error: Cannot determine session type from path${NC}"
58
+ exit 1
59
+ fi
60
+
61
+ SESSION_NAME=$(basename "$FULL_PATH" .md)
62
+ ARCHIVE_DIR="$SESSIONS_DIR/archive/$TYPE"
63
+
64
+ # Create archive directory if needed
65
+ mkdir -p "$ARCHIVE_DIR"
66
+
67
+ # Check if already archived
68
+ if [[ -e "$ARCHIVE_DIR/$SESSION_NAME" || -e "$ARCHIVE_DIR/${SESSION_NAME}.md" ]]; then
69
+ echo -e "${YELLOW}Warning: Session already exists in archive. Adding timestamp.${NC}"
70
+ TIMESTAMP=$(date +%H%M%S)
71
+ SESSION_NAME="${SESSION_NAME}-${TIMESTAMP}"
72
+ fi
73
+
74
+ echo -e "${BLUE}Archiving session: $SESSION_PATH${NC}"
75
+ echo ""
76
+
77
+ # Move to archive
78
+ if [[ -d "$FULL_PATH" ]]; then
79
+ mv "$FULL_PATH" "$ARCHIVE_DIR/$SESSION_NAME"
80
+ echo -e "${GREEN}Archived: archive/$TYPE/$SESSION_NAME/${NC}"
81
+ else
82
+ mv "$FULL_PATH" "$ARCHIVE_DIR/${SESSION_NAME}.md"
83
+ echo -e "${GREEN}Archived: archive/$TYPE/${SESSION_NAME}.md${NC}"
84
+ fi
85
+
86
+ echo ""
87
+ echo -e "${BLUE}Session archived successfully${NC}"
@@ -0,0 +1,133 @@
1
+ #!/bin/bash
2
+ #
3
+ # session-close.sh - Close an active session (mark as completed)
4
+ #
5
+ # Usage: session-close.sh <session-path> [summary]
6
+ # session-path: path to session (e.g., stories/2026-01-11-new-entity)
7
+ # summary: optional summary message
8
+ #
9
+ # Examples:
10
+ # ./session-close.sh stories/2026-01-11-new-products-entity
11
+ # ./session-close.sh stories/2026-01-11-new-products-entity "Feature completed successfully"
12
+ #
13
+
14
+ set -e
15
+
16
+ # Colors
17
+ RED='\033[0;31m'
18
+ GREEN='\033[0;32m'
19
+ YELLOW='\033[1;33m'
20
+ BLUE='\033[0;34m'
21
+ NC='\033[0m'
22
+
23
+ # Get script directory
24
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ SESSIONS_DIR="$(dirname "$SCRIPT_DIR")"
26
+
27
+ # Parse arguments
28
+ SESSION_PATH="$1"
29
+ SUMMARY="${2:-Session closed}"
30
+
31
+ # Validate session path
32
+ if [[ -z "$SESSION_PATH" ]]; then
33
+ echo -e "${RED}Error: Session path is required${NC}"
34
+ echo "Usage: $0 <session-path> [summary]"
35
+ exit 1
36
+ fi
37
+
38
+ # Resolve full path
39
+ if [[ "$SESSION_PATH" != /* ]]; then
40
+ FULL_PATH="$SESSIONS_DIR/$SESSION_PATH"
41
+ else
42
+ FULL_PATH="$SESSION_PATH"
43
+ fi
44
+
45
+ # Check if session exists
46
+ if [[ ! -d "$FULL_PATH" ]]; then
47
+ echo -e "${RED}Error: Session not found: $FULL_PATH${NC}"
48
+ exit 1
49
+ fi
50
+
51
+ # Determine session type
52
+ if [[ "$SESSION_PATH" == *"stories"* ]]; then
53
+ TYPE="story"
54
+ elif [[ "$SESSION_PATH" == *"tasks"* ]]; then
55
+ TYPE="task"
56
+ else
57
+ echo -e "${RED}Error: Cannot determine session type from path${NC}"
58
+ exit 1
59
+ fi
60
+
61
+ SESSION_NAME=$(basename "$FULL_PATH")
62
+ CLOSED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
63
+
64
+ echo -e "${BLUE}Closing session: $SESSION_NAME${NC}"
65
+ echo ""
66
+
67
+ if [[ "$TYPE" == "story" ]]; then
68
+ # Close current iteration first
69
+ CURRENT_DIR="$FULL_PATH/current"
70
+ if [[ -d "$CURRENT_DIR" ]]; then
71
+ # Find current iteration
72
+ CURRENT_PROGRESS=$(readlink "$CURRENT_DIR/progress.md" 2>/dev/null || echo "")
73
+ if [[ -n "$CURRENT_PROGRESS" ]]; then
74
+ ITERATION_DIR=$(dirname "$CURRENT_PROGRESS")
75
+ ITERATION_DIR=$(cd "$CURRENT_DIR" && cd "$ITERATION_DIR" && pwd)
76
+ ITERATION_NAME=$(basename "$ITERATION_DIR")
77
+
78
+ # Create closed.json for current iteration
79
+ cat > "$ITERATION_DIR/closed.json" << EOF
80
+ {
81
+ "iteration": "$ITERATION_NAME",
82
+ "status": "completed",
83
+ "closedAt": "$CLOSED_AT",
84
+ "closedBy": "claude",
85
+ "summary": "$SUMMARY"
86
+ }
87
+ EOF
88
+ echo -e "${GREEN}Closed iteration: $ITERATION_NAME${NC}"
89
+ fi
90
+ fi
91
+
92
+ # Calculate stats
93
+ ITERATIONS=$(find "$FULL_PATH/iterations" -maxdepth 1 -type d | wc -l)
94
+ ITERATIONS=$((ITERATIONS - 1)) # Subtract the iterations dir itself
95
+
96
+ # Calculate duration
97
+ CREATED_DATE=$(echo "$SESSION_NAME" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}')
98
+ if [[ -n "$CREATED_DATE" ]]; then
99
+ CREATED_EPOCH=$(date -j -f "%Y-%m-%d" "$CREATED_DATE" "+%s" 2>/dev/null || echo "0")
100
+ NOW_EPOCH=$(date "+%s")
101
+ if [[ "$CREATED_EPOCH" != "0" ]]; then
102
+ DURATION_DAYS=$(( (NOW_EPOCH - CREATED_EPOCH) / 86400 ))
103
+ else
104
+ DURATION_DAYS="?"
105
+ fi
106
+ else
107
+ DURATION_DAYS="?"
108
+ fi
109
+
110
+ echo -e "${GREEN}Status: completed${NC}"
111
+ echo -e "${GREEN}Duration: ${DURATION_DAYS} days${NC}"
112
+ echo -e "${GREEN}Iterations: ${ITERATIONS}${NC}"
113
+ else
114
+ # Task: just update progress.md
115
+ PROGRESS_FILE="$FULL_PATH/progress.md"
116
+ if [[ -f "$PROGRESS_FILE" ]]; then
117
+ # Append closed status
118
+ echo "" >> "$PROGRESS_FILE"
119
+ echo "---" >> "$PROGRESS_FILE"
120
+ echo "" >> "$PROGRESS_FILE"
121
+ echo "## Session Closed" >> "$PROGRESS_FILE"
122
+ echo "" >> "$PROGRESS_FILE"
123
+ echo "- **Status:** Completed" >> "$PROGRESS_FILE"
124
+ echo "- **Closed at:** $CLOSED_AT" >> "$PROGRESS_FILE"
125
+ echo "- **Summary:** $SUMMARY" >> "$PROGRESS_FILE"
126
+ fi
127
+
128
+ echo -e "${GREEN}Status: completed${NC}"
129
+ fi
130
+
131
+ echo ""
132
+ echo -e "${BLUE}Session closed: $SESSION_PATH${NC}"
133
+ echo -e "${YELLOW}Tip: Use session-archive.sh to move to archive/${NC}"
@@ -0,0 +1,225 @@
1
+ #!/bin/bash
2
+ #
3
+ # session-init.sh - Create a new session with proper structure
4
+ #
5
+ # Usage: session-init.sh <type> <name> [tshirt]
6
+ # type: story | task | log
7
+ # name: descriptive name (without date, added automatically)
8
+ # tshirt: xs | s | m | l | xl (optional, defaults based on type)
9
+ #
10
+ # Examples:
11
+ # ./session-init.sh story new-products-entity L
12
+ # ./session-init.sh task improve-search M
13
+ # ./session-init.sh log fix-typo
14
+ #
15
+
16
+ set -e
17
+
18
+ # Colors for output
19
+ RED='\033[0;31m'
20
+ GREEN='\033[0;32m'
21
+ YELLOW='\033[1;33m'
22
+ BLUE='\033[0;34m'
23
+ NC='\033[0m' # No Color
24
+
25
+ # Get script directory
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
+ SESSIONS_DIR="$(dirname "$SCRIPT_DIR")"
28
+ TEMPLATES_DIR="$SESSIONS_DIR/templates"
29
+
30
+ # Parse arguments
31
+ TYPE="$1"
32
+ NAME="$2"
33
+ TSHIRT="${3:-}"
34
+
35
+ # Validate type
36
+ if [[ ! "$TYPE" =~ ^(story|task|log)$ ]]; then
37
+ echo -e "${RED}Error: Invalid type '$TYPE'. Must be: story, task, or log${NC}"
38
+ echo "Usage: $0 <type> <name> [tshirt]"
39
+ exit 1
40
+ fi
41
+
42
+ # Validate name
43
+ if [[ -z "$NAME" ]]; then
44
+ echo -e "${RED}Error: Name is required${NC}"
45
+ echo "Usage: $0 <type> <name> [tshirt]"
46
+ exit 1
47
+ fi
48
+
49
+ # Clean name (lowercase, replace spaces with dashes)
50
+ NAME=$(echo "$NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed 's/[^a-z0-9-]//g')
51
+
52
+ # Set default tshirt based on type
53
+ if [[ -z "$TSHIRT" ]]; then
54
+ case "$TYPE" in
55
+ story) TSHIRT="L" ;;
56
+ task) TSHIRT="M" ;;
57
+ log) TSHIRT="XS" ;;
58
+ esac
59
+ else
60
+ TSHIRT=$(echo "$TSHIRT" | tr '[:lower:]' '[:upper:]')
61
+ fi
62
+
63
+ # Validate tshirt
64
+ if [[ ! "$TSHIRT" =~ ^(XS|S|M|L|XL)$ ]]; then
65
+ echo -e "${RED}Error: Invalid tshirt size '$TSHIRT'. Must be: XS, S, M, L, or XL${NC}"
66
+ exit 1
67
+ fi
68
+
69
+ # Generate date and full name
70
+ DATE=$(date +%Y-%m-%d)
71
+ FULL_NAME="${DATE}-${NAME}"
72
+
73
+ # Determine target directory
74
+ case "$TYPE" in
75
+ story) TARGET_DIR="$SESSIONS_DIR/stories/$FULL_NAME" ;;
76
+ task) TARGET_DIR="$SESSIONS_DIR/tasks/$FULL_NAME" ;;
77
+ log) TARGET_DIR="$SESSIONS_DIR/logs" ;;
78
+ esac
79
+
80
+ # Check if session already exists
81
+ if [[ "$TYPE" == "log" ]]; then
82
+ if [[ -f "$TARGET_DIR/${FULL_NAME}.md" ]]; then
83
+ echo -e "${YELLOW}Warning: Log already exists: ${FULL_NAME}.md${NC}"
84
+ echo "Adding timestamp to name..."
85
+ TIMESTAMP=$(date +%H%M%S)
86
+ FULL_NAME="${DATE}-${NAME}-${TIMESTAMP}"
87
+ fi
88
+ else
89
+ if [[ -d "$TARGET_DIR" ]]; then
90
+ echo -e "${RED}Error: Session already exists: $TARGET_DIR${NC}"
91
+ exit 1
92
+ fi
93
+ fi
94
+
95
+ # Replace placeholders in template content
96
+ replace_placeholders() {
97
+ local content="$1"
98
+ content="${content//\{\{SESSION_NAME\}\}/$NAME}"
99
+ content="${content//\{\{SESSION_FULL\}\}/$FULL_NAME}"
100
+ content="${content//\{\{DATE\}\}/$DATE}"
101
+ content="${content//\{\{TSHIRT\}\}/$TSHIRT}"
102
+ content="${content//\{\{ITERATION\}\}/01}"
103
+ content="${content//\{\{ITERATION_NAME\}\}/initial}"
104
+ echo "$content"
105
+ }
106
+
107
+ echo -e "${BLUE}Creating $TYPE session: $FULL_NAME${NC}"
108
+ echo ""
109
+
110
+ case "$TYPE" in
111
+ story)
112
+ # Create story structure
113
+ mkdir -p "$TARGET_DIR"
114
+ mkdir -p "$TARGET_DIR/iterations/01-initial"
115
+ mkdir -p "$TARGET_DIR/current"
116
+
117
+ # Copy and process story templates (scope.json handled separately)
118
+ for template in context requirements plan pendings tests; do
119
+ TEMPLATE_FILE="$TEMPLATES_DIR/story/${template}.md"
120
+ if [[ -f "$TEMPLATE_FILE" ]]; then
121
+ content=$(cat "$TEMPLATE_FILE")
122
+ replace_placeholders "$content" > "$TARGET_DIR/${template}.md"
123
+ else
124
+ # Create minimal file if template doesn't exist
125
+ template_title=$(echo "$template" | awk '{print toupper(substr($0,1,1)) substr($0,2)}')
126
+ echo "# $template_title" > "$TARGET_DIR/${template}.md"
127
+ echo "" >> "$TARGET_DIR/${template}.md"
128
+ echo "Session: $FULL_NAME" >> "$TARGET_DIR/${template}.md"
129
+ fi
130
+ done
131
+
132
+ # Handle scope.json separately
133
+ if [[ -f "$TEMPLATES_DIR/story/scope.json" ]]; then
134
+ content=$(cat "$TEMPLATES_DIR/story/scope.json")
135
+ replace_placeholders "$content" > "$TARGET_DIR/scope.json"
136
+ else
137
+ cat > "$TARGET_DIR/scope.json" << EOF
138
+ {
139
+ "session": "$FULL_NAME",
140
+ "type": "story",
141
+ "tshirt": "$TSHIRT",
142
+ "paths": [],
143
+ "createdAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
144
+ }
145
+ EOF
146
+ fi
147
+
148
+ # Create initial iteration files
149
+ for template in progress changes; do
150
+ TEMPLATE_FILE="$TEMPLATES_DIR/iteration/${template}.md"
151
+ if [[ -f "$TEMPLATE_FILE" ]]; then
152
+ content=$(cat "$TEMPLATE_FILE")
153
+ replace_placeholders "$content" > "$TARGET_DIR/iterations/01-initial/${template}.md"
154
+ else
155
+ template_title=$(echo "$template" | awk '{print toupper(substr($0,1,1)) substr($0,2)}')
156
+ echo "# $template_title" > "$TARGET_DIR/iterations/01-initial/${template}.md"
157
+ echo "" >> "$TARGET_DIR/iterations/01-initial/${template}.md"
158
+ echo "Iteration: 01-initial" >> "$TARGET_DIR/iterations/01-initial/${template}.md"
159
+ fi
160
+ done
161
+
162
+ # Create symlinks for current
163
+ ln -sf ../iterations/01-initial/progress.md "$TARGET_DIR/current/progress.md"
164
+ ln -sf ../iterations/01-initial/changes.md "$TARGET_DIR/current/changes.md"
165
+
166
+ echo -e "${GREEN}Created: stories/$FULL_NAME/${NC}"
167
+ echo -e "${GREEN}Files: context.md, requirements.md, plan.md, scope.json, pendings.md, tests.md${NC}"
168
+ echo -e "${GREEN}Iteration: iterations/01-initial/${NC}"
169
+ echo -e "${GREEN}Current: current/ -> iterations/01-initial/${NC}"
170
+ ;;
171
+
172
+ task)
173
+ # Create task structure
174
+ mkdir -p "$TARGET_DIR"
175
+
176
+ # Copy and process task templates
177
+ for template in requirements progress; do
178
+ TEMPLATE_FILE="$TEMPLATES_DIR/task/${template}.md"
179
+ if [[ -f "$TEMPLATE_FILE" ]]; then
180
+ content=$(cat "$TEMPLATE_FILE")
181
+ replace_placeholders "$content" > "$TARGET_DIR/${template}.md"
182
+ else
183
+ template_title=$(echo "$template" | awk '{print toupper(substr($0,1,1)) substr($0,2)}')
184
+ echo "# $template_title" > "$TARGET_DIR/${template}.md"
185
+ echo "" >> "$TARGET_DIR/${template}.md"
186
+ echo "Task: $FULL_NAME" >> "$TARGET_DIR/${template}.md"
187
+ fi
188
+ done
189
+
190
+ echo -e "${GREEN}Created: tasks/$FULL_NAME/${NC}"
191
+ echo -e "${GREEN}Files: requirements.md, progress.md${NC}"
192
+ ;;
193
+
194
+ log)
195
+ # Create log file
196
+ TEMPLATE_FILE="$TEMPLATES_DIR/log.md"
197
+ if [[ -f "$TEMPLATE_FILE" ]]; then
198
+ content=$(cat "$TEMPLATE_FILE")
199
+ replace_placeholders "$content" > "$TARGET_DIR/${FULL_NAME}.md"
200
+ else
201
+ cat > "$TARGET_DIR/${FULL_NAME}.md" << EOF
202
+ # Quick Fix: $NAME
203
+
204
+ **Date:** $(date '+%Y-%m-%d %H:%M')
205
+ **Type:** quick-fix
206
+ **T-Shirt:** $TSHIRT
207
+
208
+ ## What was done
209
+
210
+
211
+ ## Files changed
212
+
213
+
214
+ ## Verification
215
+ - [ ] Visual check
216
+ - [ ] Build passes
217
+ EOF
218
+ fi
219
+
220
+ echo -e "${GREEN}Created: logs/${FULL_NAME}.md${NC}"
221
+ ;;
222
+ esac
223
+
224
+ echo ""
225
+ echo -e "${BLUE}Session path: $TARGET_DIR${NC}"