prjct-cli 0.11.4 → 0.12.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/CHANGELOG.md +72 -0
- package/README.md +81 -25
- package/bin/dev.js +1 -1
- package/bin/generate-views.js +209 -0
- package/bin/migrate-to-json.js +742 -0
- package/bin/prjct +5 -5
- package/bin/serve.js +246 -54
- package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
- package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
- package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
- package/core/__tests__/utils/date-helper.test.ts +405 -0
- package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
- package/core/agentic/agent-router.ts +137 -0
- package/core/agentic/chain-of-thought.ts +228 -0
- package/core/agentic/command-executor/command-executor.ts +384 -0
- package/core/agentic/command-executor/index.ts +16 -0
- package/core/agentic/command-executor/status-signal.ts +38 -0
- package/core/agentic/command-executor/types.ts +79 -0
- package/core/agentic/command-executor.ts +8 -0
- package/core/agentic/{context-builder.js → context-builder.ts} +99 -89
- package/core/agentic/context-filter.ts +365 -0
- package/core/agentic/ground-truth/index.ts +76 -0
- package/core/agentic/ground-truth/types.ts +33 -0
- package/core/agentic/ground-truth/utils.ts +48 -0
- package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
- package/core/agentic/ground-truth/verifiers/done.ts +75 -0
- package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
- package/core/agentic/ground-truth/verifiers/index.ts +37 -0
- package/core/agentic/ground-truth/verifiers/init.ts +52 -0
- package/core/agentic/ground-truth/verifiers/now.ts +57 -0
- package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
- package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
- package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
- package/core/agentic/ground-truth/verifiers.ts +6 -0
- package/core/agentic/ground-truth.ts +8 -0
- package/core/agentic/loop-detector/error-analysis.ts +97 -0
- package/core/agentic/loop-detector/hallucination.ts +71 -0
- package/core/agentic/loop-detector/index.ts +41 -0
- package/core/agentic/loop-detector/loop-detector.ts +222 -0
- package/core/agentic/loop-detector/types.ts +66 -0
- package/core/agentic/loop-detector.ts +8 -0
- package/core/agentic/memory-system/history.ts +53 -0
- package/core/agentic/memory-system/index.ts +192 -0
- package/core/agentic/memory-system/patterns.ts +156 -0
- package/core/agentic/memory-system/semantic-memories.ts +277 -0
- package/core/agentic/memory-system/session.ts +21 -0
- package/core/agentic/memory-system/types.ts +159 -0
- package/core/agentic/memory-system.ts +8 -0
- package/core/agentic/parallel-tools.ts +165 -0
- package/core/agentic/plan-mode/approval.ts +57 -0
- package/core/agentic/plan-mode/constants.ts +44 -0
- package/core/agentic/plan-mode/index.ts +28 -0
- package/core/agentic/plan-mode/plan-mode.ts +406 -0
- package/core/agentic/plan-mode/types.ts +193 -0
- package/core/agentic/plan-mode.ts +8 -0
- package/core/agentic/prompt-builder.ts +566 -0
- package/core/agentic/response-templates.ts +164 -0
- package/core/agentic/semantic-compression.ts +273 -0
- package/core/agentic/services.ts +206 -0
- package/core/agentic/smart-context.ts +476 -0
- package/core/agentic/{template-loader.js → template-loader.ts} +35 -18
- package/core/agentic/think-blocks.ts +202 -0
- package/core/agentic/tool-registry.ts +119 -0
- package/core/agentic/validation-rules.ts +313 -0
- package/core/agents/index.ts +28 -0
- package/core/agents/performance.ts +444 -0
- package/core/agents/types.ts +126 -0
- package/core/bus/{index.js → index.ts} +57 -61
- package/core/command-registry/categories.ts +23 -0
- package/core/command-registry/commands.ts +15 -0
- package/core/command-registry/core-commands.ts +319 -0
- package/core/command-registry/index.ts +158 -0
- package/core/command-registry/optional-commands.ts +119 -0
- package/core/command-registry/setup-commands.ts +53 -0
- package/core/command-registry/types.ts +59 -0
- package/core/command-registry.ts +9 -0
- package/core/commands/analysis.ts +298 -0
- package/core/commands/analytics.ts +288 -0
- package/core/commands/base.ts +273 -0
- package/core/commands/index.ts +211 -0
- package/core/commands/maintenance.ts +226 -0
- package/core/commands/planning.ts +311 -0
- package/core/commands/setup.ts +309 -0
- package/core/commands/shipping.ts +188 -0
- package/core/commands/types.ts +183 -0
- package/core/commands/workflow.ts +226 -0
- package/core/commands.ts +11 -0
- package/core/constants/formats.ts +187 -0
- package/core/constants/index.ts +7 -0
- package/core/{context-sync.js → context-sync.ts} +59 -26
- package/core/data/agents-manager.ts +76 -0
- package/core/data/analysis-manager.ts +83 -0
- package/core/data/base-manager.ts +156 -0
- package/core/data/ideas-manager.ts +81 -0
- package/core/data/index.ts +32 -0
- package/core/data/outcomes-manager.ts +96 -0
- package/core/data/project-manager.ts +75 -0
- package/core/data/roadmap-manager.ts +118 -0
- package/core/data/shipped-manager.ts +65 -0
- package/core/data/state-manager.ts +214 -0
- package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
- package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
- package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
- package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
- package/core/domain/{analyzer.js → analyzer.ts} +91 -85
- package/core/domain/{architect-session.js → architect-session.ts} +49 -34
- package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
- package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
- package/core/domain/{product-standards.js → product-standards.ts} +40 -26
- package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
- package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
- package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
- package/core/domain/task-stack/index.ts +19 -0
- package/core/domain/task-stack/parser.ts +86 -0
- package/core/domain/task-stack/storage.ts +123 -0
- package/core/domain/task-stack/task-stack.ts +340 -0
- package/core/domain/task-stack/types.ts +51 -0
- package/core/domain/task-stack.ts +8 -0
- package/core/{index.js → index.ts} +61 -18
- package/core/infrastructure/{agent-detector.js → agent-detector.ts} +62 -23
- package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
- package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
- package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
- package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
- package/core/infrastructure/command-installer/global-config.ts +106 -0
- package/core/infrastructure/command-installer/index.ts +25 -0
- package/core/infrastructure/command-installer/types.ts +41 -0
- package/core/infrastructure/command-installer.ts +8 -0
- package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
- package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
- package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
- package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
- package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
- package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
- package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
- package/core/infrastructure/legacy-installer-detector.ts +7 -0
- package/core/infrastructure/migrator/file-operations.ts +125 -0
- package/core/infrastructure/migrator/index.ts +288 -0
- package/core/infrastructure/migrator/project-scanner.ts +89 -0
- package/core/infrastructure/migrator/reports.ts +117 -0
- package/core/infrastructure/migrator/types.ts +124 -0
- package/core/infrastructure/migrator/validation.ts +94 -0
- package/core/infrastructure/migrator/version-migration.ts +117 -0
- package/core/infrastructure/migrator.ts +10 -0
- package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
- package/core/infrastructure/session-manager/index.ts +23 -0
- package/core/infrastructure/session-manager/migration.ts +88 -0
- package/core/infrastructure/session-manager/session-manager.ts +307 -0
- package/core/infrastructure/session-manager/types.ts +45 -0
- package/core/infrastructure/session-manager.ts +8 -0
- package/core/infrastructure/{setup.js → setup.ts} +29 -21
- package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
- package/core/outcomes/analyzer.ts +333 -0
- package/core/outcomes/index.ts +34 -0
- package/core/outcomes/recorder.ts +194 -0
- package/core/outcomes/types.ts +145 -0
- package/core/plugin/{hooks.js → hooks.ts} +56 -58
- package/core/plugin/{index.js → index.ts} +19 -8
- package/core/plugin/{loader.js → loader.ts} +87 -69
- package/core/plugin/{registry.js → registry.ts} +49 -45
- package/core/plugins/{webhook.js → webhook.ts} +43 -27
- package/core/schemas/agents.ts +27 -0
- package/core/schemas/analysis.ts +41 -0
- package/core/schemas/ideas.ts +83 -0
- package/core/schemas/index.ts +73 -0
- package/core/schemas/outcomes.ts +22 -0
- package/core/schemas/project.ts +26 -0
- package/core/schemas/roadmap.ts +90 -0
- package/core/schemas/shipped.ts +82 -0
- package/core/schemas/state.ts +107 -0
- package/core/session/index.ts +17 -0
- package/core/session/{metrics.js → metrics.ts} +64 -46
- package/core/session/{index.js → session-manager.ts} +51 -117
- package/core/session/types.ts +29 -0
- package/core/session/utils.ts +57 -0
- package/core/state/index.ts +25 -0
- package/core/state/manager.ts +376 -0
- package/core/state/types.ts +185 -0
- package/core/tsconfig.json +22 -0
- package/core/types/index.ts +506 -0
- package/core/utils/{animations.js → animations.ts} +74 -28
- package/core/utils/{branding.js → branding.ts} +29 -4
- package/core/utils/{date-helper.js → date-helper.ts} +31 -74
- package/core/utils/file-helper.ts +262 -0
- package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
- package/core/utils/{logger.js → logger.ts} +24 -12
- package/core/utils/{output.js → output.ts} +25 -13
- package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
- package/core/utils/{session-helper.js → session-helper.ts} +79 -66
- package/core/utils/{version.js → version.ts} +23 -31
- package/core/view-generator.ts +536 -0
- package/package.json +23 -17
- package/packages/shared/.turbo/turbo-build.log +14 -0
- package/packages/shared/dist/index.d.ts +8 -613
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +4110 -118
- package/packages/shared/dist/schemas.d.ts +408 -0
- package/packages/shared/dist/schemas.d.ts.map +1 -0
- package/packages/shared/dist/types.d.ts +144 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/unified.d.ts +139 -0
- package/packages/shared/dist/unified.d.ts.map +1 -0
- package/packages/shared/dist/utils.d.ts +60 -0
- package/packages/shared/dist/utils.d.ts.map +1 -0
- package/packages/shared/package.json +4 -4
- package/packages/shared/src/index.ts +1 -0
- package/packages/shared/src/unified.ts +174 -0
- package/packages/web/app/api/claude/sessions/route.ts +1 -1
- package/packages/web/app/api/claude/status/route.ts +1 -1
- package/packages/web/app/api/migrate/route.ts +46 -0
- package/packages/web/app/api/projects/[id]/route.ts +1 -1
- package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
- package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
- package/packages/web/app/api/projects/route.ts +1 -1
- package/packages/web/app/api/settings/route.ts +97 -0
- package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
- package/packages/web/app/globals.css +38 -0
- package/packages/web/app/layout.tsx +10 -2
- package/packages/web/app/page.tsx +9 -224
- package/packages/web/app/project/[id]/page.tsx +191 -63
- package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
- package/packages/web/app/project/[id]/stats/page.tsx +203 -403
- package/packages/web/app/settings/page.tsx +222 -2
- package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
- package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
- package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
- package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
- package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
- package/packages/web/components/ActivityTimeline/index.ts +2 -0
- package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
- package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
- package/packages/web/components/AgentsCard/index.ts +2 -0
- package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
- package/packages/web/components/AppSidebar/index.ts +1 -0
- package/packages/web/components/BackLink/BackLink.tsx +18 -0
- package/packages/web/components/BackLink/BackLink.types.ts +5 -0
- package/packages/web/components/BackLink/index.ts +2 -0
- package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
- package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
- package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
- package/packages/web/components/BentoCard/index.ts +2 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
- package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
- package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
- package/packages/web/components/BentoGrid/BentoGrid.tsx +18 -0
- package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
- package/packages/web/components/BentoGrid/index.ts +2 -0
- package/packages/web/components/CommandButton/index.ts +1 -0
- package/packages/web/components/ConnectionStatus/index.ts +1 -0
- package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
- package/packages/web/components/DashboardContent/index.ts +1 -0
- package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
- package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
- package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
- package/packages/web/components/DateGroup/index.ts +2 -0
- package/packages/web/components/EmptyState/EmptyState.tsx +58 -0
- package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
- package/packages/web/components/EmptyState/index.ts +2 -0
- package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
- package/packages/web/components/EventRow/EventRow.tsx +49 -0
- package/packages/web/components/EventRow/EventRow.types.ts +7 -0
- package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
- package/packages/web/components/EventRow/index.ts +2 -0
- package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
- package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
- package/packages/web/components/ExpandButton/index.ts +2 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
- package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
- package/packages/web/components/HealthGradientBackground/index.ts +2 -0
- package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
- package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
- package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
- package/packages/web/components/HeroSection/hooks/index.ts +2 -0
- package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
- package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
- package/packages/web/components/HeroSection/index.ts +2 -0
- package/packages/web/components/IdeasCard/IdeasCard.tsx +48 -0
- package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
- package/packages/web/components/IdeasCard/index.ts +2 -0
- package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
- package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
- package/packages/web/components/InsightMessage/index.ts +2 -0
- package/packages/web/components/Logo/index.ts +1 -0
- package/packages/web/components/MarkdownContent/index.ts +1 -0
- package/packages/web/components/NowCard/NowCard.tsx +93 -0
- package/packages/web/components/NowCard/NowCard.types.ts +15 -0
- package/packages/web/components/NowCard/index.ts +2 -0
- package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
- package/packages/web/components/ProgressRing/ProgressRing.tsx +51 -0
- package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
- package/packages/web/components/ProgressRing/index.ts +2 -0
- package/packages/web/components/ProjectAvatar/index.ts +1 -0
- package/packages/web/components/Providers/index.ts +1 -0
- package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
- package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
- package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
- package/packages/web/components/QueueCard/index.ts +2 -0
- package/packages/web/components/RoadmapCard/RoadmapCard.tsx +77 -0
- package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
- package/packages/web/components/RoadmapCard/index.ts +2 -0
- package/packages/web/components/ShipsCard/ShipsCard.tsx +52 -0
- package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
- package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
- package/packages/web/components/ShipsCard/index.ts +2 -0
- package/packages/web/components/SparklineChart/SparklineChart.tsx +38 -0
- package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
- package/packages/web/components/SparklineChart/index.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
- package/packages/web/components/StreakCard/StreakCard.tsx +53 -0
- package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
- package/packages/web/components/StreakCard/index.ts +2 -0
- package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
- package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
- package/packages/web/components/TasksCounter/index.ts +2 -0
- package/packages/web/components/TechStackBadges/index.ts +1 -0
- package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
- package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
- package/packages/web/components/TerminalTabs/index.ts +1 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
- package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
- package/packages/web/components/VelocityBadge/index.ts +2 -0
- package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
- package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
- package/packages/web/components/VelocityCard/index.ts +2 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
- package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
- package/packages/web/components/WeeklySparkline/index.ts +2 -0
- package/packages/web/components/ui/input.tsx +21 -0
- package/packages/web/components/ui/tooltip.tsx +2 -2
- package/packages/web/context/TerminalTabsContext.tsx +46 -1
- package/packages/web/hooks/useClaudeTerminal.ts +71 -21
- package/packages/web/hooks/useProjectStats.ts +55 -0
- package/packages/web/hooks/useProjects.ts +6 -6
- package/packages/web/lib/actions/projects.ts +15 -0
- package/packages/web/lib/json-loader.ts +630 -0
- package/packages/web/lib/services/index.ts +9 -0
- package/packages/web/lib/services/migration.server.ts +598 -0
- package/packages/web/lib/services/projects.server.ts +52 -0
- package/packages/web/lib/services/stats.server.ts +264 -0
- package/packages/web/lib/unified-loader.ts +396 -0
- package/packages/web/next-env.d.ts +1 -1
- package/packages/web/package.json +10 -6
- package/packages/web/server.ts +36 -6
- package/templates/commands/done.md +76 -32
- package/templates/commands/feature.md +121 -47
- package/templates/commands/idea.md +81 -8
- package/templates/commands/now.md +41 -17
- package/templates/commands/ship.md +64 -25
- package/templates/commands/sync.md +28 -3
- package/core/agentic/agent-router.js +0 -128
- package/core/agentic/chain-of-thought.js +0 -578
- package/core/agentic/command-executor.js +0 -421
- package/core/agentic/context-filter.js +0 -354
- package/core/agentic/ground-truth.js +0 -591
- package/core/agentic/loop-detector.js +0 -406
- package/core/agentic/memory-system.js +0 -850
- package/core/agentic/parallel-tools.js +0 -366
- package/core/agentic/plan-mode.js +0 -572
- package/core/agentic/prompt-builder.js +0 -338
- package/core/agentic/response-templates.js +0 -290
- package/core/agentic/semantic-compression.js +0 -517
- package/core/agentic/think-blocks.js +0 -657
- package/core/agentic/tool-registry.js +0 -184
- package/core/agentic/validation-rules.js +0 -380
- package/core/command-registry.js +0 -698
- package/core/commands.js +0 -2237
- package/core/domain/task-stack.js +0 -497
- package/core/infrastructure/legacy-installer-detector.js +0 -546
- package/core/infrastructure/migrator.js +0 -799
- package/core/infrastructure/session-manager.js +0 -390
- package/core/utils/file-helper.js +0 -329
- package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
- package/packages/web/app/api/stats/route.ts +0 -38
- package/packages/web/components/AppSidebar.tsx +0 -113
- package/packages/web/hooks/useStats.ts +0 -28
- /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
- /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
- /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
- /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
- /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
- /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
- /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
package/packages/web/server.ts
CHANGED
|
@@ -12,7 +12,9 @@ import type { IPty } from 'node-pty'
|
|
|
12
12
|
|
|
13
13
|
const dev = process.env.NODE_ENV !== 'production'
|
|
14
14
|
const hostname = 'localhost'
|
|
15
|
-
|
|
15
|
+
// Dev: 9471, Prod: 9472 (allows running both simultaneously for testing)
|
|
16
|
+
const defaultPort = dev ? 9471 : 9472
|
|
17
|
+
const port = parseInt(process.env.PORT || String(defaultPort), 10)
|
|
16
18
|
|
|
17
19
|
// PTY Sessions stored in server memory
|
|
18
20
|
interface Session {
|
|
@@ -33,8 +35,14 @@ function createSession(sessionId: string, projectDir: string): { pty: IPty; isNe
|
|
|
33
35
|
return { pty: existing.pty, isNew: false }
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
+
// Use user's default shell (zsh, bash, etc.) - respects $SHELL env var
|
|
39
|
+
const shell = process.platform === 'win32'
|
|
40
|
+
? 'cmd.exe'
|
|
41
|
+
: process.env.SHELL || '/bin/zsh'
|
|
42
|
+
|
|
43
|
+
// -l for login shell (loads .zshrc, .bashrc, etc.)
|
|
44
|
+
// -i for interactive shell (enables job control, aliases)
|
|
45
|
+
const args = process.platform === 'win32' ? [] : ['-l', '-i']
|
|
38
46
|
|
|
39
47
|
const ptyProcess = pty.spawn(shell, args, {
|
|
40
48
|
name: 'xterm-256color',
|
|
@@ -44,7 +52,9 @@ function createSession(sessionId: string, projectDir: string): { pty: IPty; isNe
|
|
|
44
52
|
env: {
|
|
45
53
|
...process.env,
|
|
46
54
|
TERM: 'xterm-256color',
|
|
47
|
-
COLORTERM: 'truecolor'
|
|
55
|
+
COLORTERM: 'truecolor',
|
|
56
|
+
// Ensure shell knows it's interactive
|
|
57
|
+
SHELL: shell
|
|
48
58
|
}
|
|
49
59
|
})
|
|
50
60
|
|
|
@@ -204,10 +214,25 @@ app.prepare().then(() => {
|
|
|
204
214
|
|
|
205
215
|
const ptyProcess = session.pty
|
|
206
216
|
|
|
217
|
+
// Output buffering for smooth terminal rendering
|
|
218
|
+
// Batches PTY output and flushes every 16ms (one animation frame)
|
|
219
|
+
const outputBuffer: string[] = []
|
|
220
|
+
let flushTimer: NodeJS.Timeout | null = null
|
|
221
|
+
const BATCH_MS = 16
|
|
222
|
+
|
|
223
|
+
const flushBuffer = () => {
|
|
224
|
+
if (outputBuffer.length > 0 && ws.readyState === WebSocket.OPEN) {
|
|
225
|
+
ws.send(JSON.stringify({ type: 'output', data: outputBuffer.join('') }))
|
|
226
|
+
outputBuffer.length = 0
|
|
227
|
+
}
|
|
228
|
+
flushTimer = null
|
|
229
|
+
}
|
|
230
|
+
|
|
207
231
|
// Register data handler FIRST before sending any commands
|
|
208
232
|
const dataHandler = ptyProcess.onData((data: string) => {
|
|
209
|
-
|
|
210
|
-
|
|
233
|
+
outputBuffer.push(data)
|
|
234
|
+
if (!flushTimer) {
|
|
235
|
+
flushTimer = setTimeout(flushBuffer, BATCH_MS)
|
|
211
236
|
}
|
|
212
237
|
})
|
|
213
238
|
|
|
@@ -247,6 +272,11 @@ app.prepare().then(() => {
|
|
|
247
272
|
|
|
248
273
|
ws.on('close', () => {
|
|
249
274
|
console.log(`[WS] PTY connection closed: ${sessionId}`)
|
|
275
|
+
// Clear buffer flush timer
|
|
276
|
+
if (flushTimer) {
|
|
277
|
+
clearTimeout(flushTimer)
|
|
278
|
+
flushTimer = null
|
|
279
|
+
}
|
|
250
280
|
dataHandler.dispose()
|
|
251
281
|
exitHandler.dispose()
|
|
252
282
|
})
|
|
@@ -2,18 +2,28 @@
|
|
|
2
2
|
allowed-tools: [Read, Write, Bash]
|
|
3
3
|
description: 'Complete current task with session metrics'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() for all timestamps'
|
|
5
|
+
architecture: 'JSON-first - Write to data/*.json, views are generated'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# /p:done - Complete Current Task with Session Metrics
|
|
8
9
|
|
|
10
|
+
## Architecture: JSON-First
|
|
11
|
+
|
|
12
|
+
**Source of Truth**: `data/state.json`, `data/queue.json`, `data/metrics.json`
|
|
13
|
+
**Generated Views**: `views/now.md`, `views/next.md` (auto-generated)
|
|
14
|
+
|
|
15
|
+
All writes go to JSON. After writing, views are auto-regenerated.
|
|
16
|
+
|
|
9
17
|
## Context Variables
|
|
10
18
|
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
11
19
|
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
12
|
-
- `{
|
|
20
|
+
- `{dataPath}`: `{globalPath}/data`
|
|
21
|
+
- `{statePath}`: `{dataPath}/state.json`
|
|
22
|
+
- `{queuePath}`: `{dataPath}/queue.json`
|
|
23
|
+
- `{metricsJsonPath}`: `{dataPath}/metrics.json`
|
|
13
24
|
- `{sessionPath}`: `{globalPath}/sessions/current.json`
|
|
14
25
|
- `{archiveDir}`: `{globalPath}/sessions/archive`
|
|
15
26
|
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
16
|
-
- `{metricsPath}`: `{globalPath}/progress/metrics.md`
|
|
17
27
|
|
|
18
28
|
## Step 1: Read Config
|
|
19
29
|
|
|
@@ -26,18 +36,23 @@ IF file not found:
|
|
|
26
36
|
|
|
27
37
|
## Step 2: Check Session State
|
|
28
38
|
|
|
29
|
-
###
|
|
39
|
+
### Read state.json (source of truth)
|
|
40
|
+
READ: `{statePath}`
|
|
41
|
+
|
|
42
|
+
IF file exists AND has currentTask:
|
|
43
|
+
EXTRACT: {task} = state.currentTask
|
|
44
|
+
GOTO Step 3 (Session Completion)
|
|
45
|
+
|
|
46
|
+
### Try structured session (for detailed metrics)
|
|
30
47
|
READ: `{sessionPath}`
|
|
31
48
|
|
|
32
49
|
IF file exists:
|
|
33
50
|
PARSE as JSON
|
|
34
51
|
EXTRACT: {session} object
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
### Fallback to legacy now.md
|
|
38
|
-
READ: `{nowPath}`
|
|
52
|
+
ELSE:
|
|
53
|
+
CREATE session from state.currentTask data
|
|
39
54
|
|
|
40
|
-
IF
|
|
55
|
+
IF no currentTask in state.json:
|
|
41
56
|
OUTPUT: "⚠️ No active task to complete. Use /p:now to start one."
|
|
42
57
|
STOP
|
|
43
58
|
|
|
@@ -100,48 +115,77 @@ BASH: `mkdir -p {archiveDir}/{yearMonth}`
|
|
|
100
115
|
WRITE: `{archiveDir}/{yearMonth}/{session.id}.json`
|
|
101
116
|
Content: Updated session object from Step 3
|
|
102
117
|
|
|
103
|
-
## Step 5: Clear Current
|
|
118
|
+
## Step 5: Clear Current State (JSON)
|
|
104
119
|
|
|
105
|
-
|
|
120
|
+
### Clear state.json (SOURCE OF TRUTH)
|
|
121
|
+
READ: `{statePath}`
|
|
106
122
|
|
|
107
|
-
|
|
123
|
+
UPDATE state.json:
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"currentTask": null,
|
|
127
|
+
"lastUpdated": "{now}"
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
WRITE: `{statePath}`
|
|
132
|
+
|
|
133
|
+
### Clear session.json
|
|
108
134
|
WRITE: `{sessionPath}`
|
|
109
135
|
Content:
|
|
110
136
|
```json
|
|
111
137
|
{}
|
|
112
138
|
```
|
|
113
139
|
|
|
114
|
-
## Step 6: Update
|
|
140
|
+
## Step 6: Update Metrics (JSON)
|
|
115
141
|
|
|
116
|
-
|
|
117
|
-
Content:
|
|
118
|
-
```markdown
|
|
119
|
-
# NOW
|
|
142
|
+
READ: `{metricsJsonPath}` (or create default if not exists)
|
|
120
143
|
|
|
121
|
-
|
|
144
|
+
### Update metrics.json
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"velocity": {
|
|
148
|
+
"tasksPerDay": {calculated},
|
|
149
|
+
"avgTaskDuration": {calculated}
|
|
150
|
+
},
|
|
151
|
+
"allTime": {
|
|
152
|
+
"totalTasks": {increment by 1},
|
|
153
|
+
"totalTime": {add duration},
|
|
154
|
+
"daysActive": {recalculate}
|
|
155
|
+
},
|
|
156
|
+
"recentTasks": [
|
|
157
|
+
{
|
|
158
|
+
"task": "{session.task}",
|
|
159
|
+
"duration": {duration},
|
|
160
|
+
"completedAt": "{now}",
|
|
161
|
+
"metrics": {
|
|
162
|
+
"filesChanged": {filesChanged},
|
|
163
|
+
"linesAdded": {linesAdded},
|
|
164
|
+
"linesRemoved": {linesRemoved},
|
|
165
|
+
"commits": {commits}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
...existing recent tasks (keep last 10)
|
|
169
|
+
],
|
|
170
|
+
"lastUpdated": "{now}"
|
|
171
|
+
}
|
|
122
172
|
```
|
|
123
173
|
|
|
124
|
-
|
|
174
|
+
WRITE: `{metricsJsonPath}`
|
|
125
175
|
|
|
126
|
-
|
|
176
|
+
## Step 7: Generate Views
|
|
127
177
|
|
|
128
|
-
|
|
129
|
-
```json
|
|
130
|
-
{"timestamp":"{now}","action":"session_completed","sessionId":"{session.id}","task":"{session.task}","duration":{duration},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
|
|
131
|
-
```
|
|
178
|
+
BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
|
|
132
179
|
|
|
133
|
-
|
|
180
|
+
Note: This regenerates views/now.md, views/next.md from JSON automatically.
|
|
134
181
|
|
|
135
|
-
|
|
182
|
+
## Step 8: Log to Memory
|
|
136
183
|
|
|
137
|
-
|
|
138
|
-
GET: {date} = YYYY-MM-DD from {now}
|
|
184
|
+
APPEND to: `{memoryPath}`
|
|
139
185
|
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
- **{session.task}** ({durationFormatted})
|
|
144
|
-
- Files: {filesChanged} | +{linesAdded}/-{linesRemoved} | Commits: {commits}
|
|
186
|
+
Single line (JSONL format):
|
|
187
|
+
```json
|
|
188
|
+
{"timestamp":"{now}","action":"session_completed","sessionId":"{session.id}","task":"{session.task}","duration":{duration},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
|
|
145
189
|
```
|
|
146
190
|
|
|
147
191
|
## Output
|
|
@@ -2,10 +2,16 @@
|
|
|
2
2
|
allowed-tools: [Read, Write, Bash, Task, Glob]
|
|
3
3
|
description: 'Value analysis + roadmap + task breakdown + auto-start'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() and GetDate() for ALL timestamps'
|
|
5
|
+
architecture: 'JSON-first - Write to data/*.json, views are generated'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# /p:feature - Add Feature to Roadmap
|
|
8
9
|
|
|
10
|
+
## Architecture: JSON-First
|
|
11
|
+
|
|
12
|
+
**Source of Truth**: `data/roadmap.json`, `data/queue.json`, `data/state.json`
|
|
13
|
+
**Generated Views**: `views/roadmap.md`, `views/next.md`, `views/now.md` (auto-generated)
|
|
14
|
+
|
|
9
15
|
## Agent Delegation (REQUIRED)
|
|
10
16
|
|
|
11
17
|
Before executing any code-related task, delegate to a specialist agent:
|
|
@@ -46,9 +52,10 @@ Task(
|
|
|
46
52
|
## Context Variables
|
|
47
53
|
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
48
54
|
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
49
|
-
- `{
|
|
50
|
-
- `{
|
|
51
|
-
- `{
|
|
55
|
+
- `{dataPath}`: `{globalPath}/data`
|
|
56
|
+
- `{roadmapPath}`: `{dataPath}/roadmap.json`
|
|
57
|
+
- `{queuePath}`: `{dataPath}/queue.json`
|
|
58
|
+
- `{statePath}`: `{dataPath}/state.json`
|
|
52
59
|
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
53
60
|
- `{feature}`: User-provided feature description
|
|
54
61
|
|
|
@@ -142,90 +149,157 @@ For feature "add user authentication":
|
|
|
142
149
|
|
|
143
150
|
GENERATE: {tasks} = list of task descriptions
|
|
144
151
|
|
|
145
|
-
## Step 5: Update Roadmap
|
|
152
|
+
## Step 5: Update Roadmap (JSON)
|
|
146
153
|
|
|
147
|
-
READ: `{roadmapPath}` (create if not exists)
|
|
154
|
+
READ: `{roadmapPath}` (or create default if not exists)
|
|
148
155
|
|
|
149
|
-
|
|
156
|
+
Default structure:
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"features": [],
|
|
160
|
+
"backlog": [],
|
|
161
|
+
"lastUpdated": ""
|
|
162
|
+
}
|
|
163
|
+
```
|
|
150
164
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
- Tasks: {taskCount}
|
|
155
|
-
- Status: active
|
|
165
|
+
### Generate Feature ID
|
|
166
|
+
GENERATE: {featureId} = "feat_" + 8 random alphanumeric chars
|
|
167
|
+
SET: {now} = GetTimestamp()
|
|
156
168
|
|
|
157
|
-
###
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
169
|
+
### Create Feature Entry
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"id": "{featureId}",
|
|
173
|
+
"name": "{feature}",
|
|
174
|
+
"impact": "{impact}",
|
|
175
|
+
"effort": "{effort}",
|
|
176
|
+
"status": "active",
|
|
177
|
+
"progress": 0,
|
|
178
|
+
"tasks": [
|
|
179
|
+
{
|
|
180
|
+
"id": "task_{8_random}",
|
|
181
|
+
"description": "{task1}",
|
|
182
|
+
"completed": false,
|
|
183
|
+
"createdAt": "{now}"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"id": "task_{8_random}",
|
|
187
|
+
"description": "{task2}",
|
|
188
|
+
"completed": false,
|
|
189
|
+
"createdAt": "{now}"
|
|
190
|
+
}
|
|
191
|
+
...
|
|
192
|
+
],
|
|
193
|
+
"createdAt": "{now}"
|
|
194
|
+
}
|
|
161
195
|
```
|
|
162
196
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
197
|
+
### Update roadmap.json
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"features": [
|
|
201
|
+
{new feature entry},
|
|
202
|
+
...existing features
|
|
203
|
+
],
|
|
204
|
+
"backlog": [...existing],
|
|
205
|
+
"lastUpdated": "{now}"
|
|
206
|
+
}
|
|
207
|
+
```
|
|
168
208
|
|
|
169
209
|
WRITE: `{roadmapPath}`
|
|
170
210
|
|
|
171
|
-
## Step 6: Update Priority Queue
|
|
211
|
+
## Step 6: Update Priority Queue (JSON)
|
|
172
212
|
|
|
173
|
-
READ: `{
|
|
213
|
+
READ: `{queuePath}` (or create default if not exists)
|
|
174
214
|
|
|
175
|
-
|
|
215
|
+
Default structure:
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"tasks": [],
|
|
219
|
+
"lastUpdated": ""
|
|
220
|
+
}
|
|
221
|
+
```
|
|
176
222
|
|
|
223
|
+
### Add Tasks to Queue
|
|
177
224
|
For each task in {tasks}:
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"id": "task_{8_random}",
|
|
228
|
+
"description": "{task}",
|
|
229
|
+
"priority": "medium",
|
|
230
|
+
"featureId": "{featureId}",
|
|
231
|
+
"completed": false,
|
|
232
|
+
"createdAt": "{now}"
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Update queue.json
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"tasks": [
|
|
240
|
+
...new tasks,
|
|
241
|
+
...existing tasks
|
|
242
|
+
],
|
|
243
|
+
"lastUpdated": "{now}"
|
|
244
|
+
}
|
|
245
|
+
```
|
|
182
246
|
|
|
183
|
-
WRITE: `{
|
|
247
|
+
WRITE: `{queuePath}`
|
|
184
248
|
|
|
185
|
-
## Step 7: Auto-Start First Task
|
|
249
|
+
## Step 7: Auto-Start First Task (JSON)
|
|
186
250
|
|
|
187
|
-
READ: `{
|
|
251
|
+
READ: `{statePath}` (or create default)
|
|
188
252
|
|
|
189
|
-
IF
|
|
253
|
+
IF currentTask is null:
|
|
190
254
|
### Start First Task
|
|
191
255
|
{firstTask} = first item from {tasks}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
256
|
+
GENERATE: {sessionId} = "sess_" + 8 random alphanumeric chars
|
|
257
|
+
|
|
258
|
+
### Update state.json
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"currentTask": {
|
|
262
|
+
"id": "task_{8_random}",
|
|
263
|
+
"description": "{firstTask}",
|
|
264
|
+
"startedAt": "{now}",
|
|
265
|
+
"sessionId": "{sessionId}",
|
|
266
|
+
"featureId": "{featureId}"
|
|
267
|
+
},
|
|
268
|
+
"lastUpdated": "{now}"
|
|
269
|
+
}
|
|
201
270
|
```
|
|
202
271
|
|
|
272
|
+
WRITE: `{statePath}`
|
|
203
273
|
{autoStarted} = true
|
|
204
274
|
ELSE:
|
|
205
275
|
{autoStarted} = false
|
|
206
276
|
|
|
207
|
-
## Step 8:
|
|
277
|
+
## Step 8: Generate Views
|
|
278
|
+
|
|
279
|
+
BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
|
|
280
|
+
|
|
281
|
+
Note: This regenerates views/roadmap.md, views/next.md, views/now.md from JSON automatically.
|
|
282
|
+
|
|
283
|
+
## Step 9: Log to Memory
|
|
208
284
|
|
|
209
285
|
GET: {date} = GetDate()
|
|
210
286
|
EXTRACT: {yearMonth} = YYYY-MM from {date}
|
|
211
287
|
|
|
212
288
|
ENSURE directory:
|
|
213
|
-
BASH: `mkdir -p {globalPath}/
|
|
289
|
+
BASH: `mkdir -p {globalPath}/memory/sessions/{yearMonth}`
|
|
214
290
|
|
|
215
|
-
APPEND to: `{globalPath}/
|
|
291
|
+
APPEND to: `{globalPath}/memory/sessions/{yearMonth}/{date}.jsonl`
|
|
216
292
|
|
|
217
293
|
Single line (JSONL):
|
|
218
294
|
```json
|
|
219
|
-
{"ts":"{
|
|
295
|
+
{"ts":"{now}","type":"feature_add","featureId":"{featureId}","name":"{feature}","tasks":{taskCount},"impact":"{impact}","effort":"{effort}"}
|
|
220
296
|
```
|
|
221
297
|
|
|
222
|
-
## Step 9: Log to Memory
|
|
223
|
-
|
|
224
298
|
APPEND to: `{memoryPath}`
|
|
225
299
|
|
|
226
300
|
Single line (JSONL):
|
|
227
301
|
```json
|
|
228
|
-
{"timestamp":"{
|
|
302
|
+
{"timestamp":"{now}","action":"feature_added","featureId":"{featureId}","feature":"{feature}","tasks":{taskCount}}
|
|
229
303
|
```
|
|
230
304
|
|
|
231
305
|
## Output
|
|
@@ -1,16 +1,89 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Read, Write, GetTimestamp, GetDate]
|
|
2
|
+
allowed-tools: [Read, Write, Bash, GetTimestamp, GetDate]
|
|
3
3
|
description: 'Quick idea capture'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() and GetDate() for timestamps'
|
|
5
|
+
architecture: 'JSON-first - Write to data/ideas.json, views are generated'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
# /p:idea
|
|
8
|
+
# /p:idea - Quick Idea Capture
|
|
8
9
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
## Architecture: JSON-First
|
|
11
|
+
|
|
12
|
+
**Source of Truth**: `data/ideas.json`
|
|
13
|
+
**Generated View**: `views/ideas.md` (auto-generated)
|
|
14
|
+
|
|
15
|
+
## Context Variables
|
|
16
|
+
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
17
|
+
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
18
|
+
- `{dataPath}`: `{globalPath}/data`
|
|
19
|
+
- `{ideasPath}`: `{dataPath}/ideas.json`
|
|
20
|
+
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
21
|
+
- `{text}`: User-provided idea text
|
|
22
|
+
|
|
23
|
+
## Step 1: Read Config
|
|
24
|
+
|
|
25
|
+
READ: `.prjct/prjct.config.json`
|
|
26
|
+
EXTRACT: `projectId`
|
|
27
|
+
|
|
28
|
+
IF file not found:
|
|
29
|
+
OUTPUT: "No prjct project. Run /p:init first."
|
|
30
|
+
STOP
|
|
31
|
+
|
|
32
|
+
## Step 2: Read Current Ideas
|
|
33
|
+
|
|
34
|
+
READ: `{ideasPath}` (or create default if not exists)
|
|
35
|
+
|
|
36
|
+
Default structure:
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"ideas": [],
|
|
40
|
+
"lastUpdated": ""
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Step 3: Add New Idea (JSON)
|
|
45
|
+
|
|
46
|
+
GENERATE: {ideaId} = "idea_" + 8 random alphanumeric chars
|
|
47
|
+
SET: {now} = GetTimestamp()
|
|
48
|
+
|
|
49
|
+
### Analyze idea for tags
|
|
50
|
+
Based on {text}, detect tags:
|
|
51
|
+
- If mentions UI/design → add "ui" tag
|
|
52
|
+
- If mentions performance → add "perf" tag
|
|
53
|
+
- If mentions bug/fix → add "bug" tag
|
|
54
|
+
- If mentions API/backend → add "api" tag
|
|
55
|
+
|
|
56
|
+
### Update ideas.json
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"ideas": [
|
|
60
|
+
{
|
|
61
|
+
"id": "{ideaId}",
|
|
62
|
+
"text": "{text}",
|
|
63
|
+
"priority": "medium",
|
|
64
|
+
"status": "pending",
|
|
65
|
+
"tags": [{detected_tags}],
|
|
66
|
+
"createdAt": "{now}"
|
|
67
|
+
},
|
|
68
|
+
...existing ideas
|
|
69
|
+
],
|
|
70
|
+
"lastUpdated": "{now}"
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
WRITE: `{ideasPath}`
|
|
75
|
+
|
|
76
|
+
## Step 4: Generate Views
|
|
77
|
+
|
|
78
|
+
BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
|
|
79
|
+
|
|
80
|
+
## Step 5: Log to Memory
|
|
81
|
+
|
|
82
|
+
APPEND to: `{memoryPath}`
|
|
83
|
+
```json
|
|
84
|
+
{"timestamp":"{now}","action":"idea_added","ideaId":"{ideaId}","text":"{text}"}
|
|
85
|
+
```
|
|
14
86
|
|
|
15
87
|
## Response
|
|
16
|
-
|
|
88
|
+
|
|
89
|
+
`💡 {text} | Saved | Start: /p:feature "{text}"`
|
|
@@ -2,14 +2,23 @@
|
|
|
2
2
|
allowed-tools: [Read, Write, Bash]
|
|
3
3
|
description: 'Set or show current task with session tracking'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() for ALL timestamps'
|
|
5
|
+
architecture: 'JSON-first - Write to data/*.json, views are generated'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# /p:now - Current Task with Session Tracking
|
|
8
9
|
|
|
10
|
+
## Architecture: JSON-First
|
|
11
|
+
|
|
12
|
+
**Source of Truth**: `data/state.json`
|
|
13
|
+
**Generated View**: `views/now.md` (auto-generated, do not edit directly)
|
|
14
|
+
|
|
15
|
+
All writes go to JSON. After writing, run `prjct generate-views --project={projectId}` to regenerate MD views.
|
|
16
|
+
|
|
9
17
|
## Context Variables
|
|
10
18
|
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
11
19
|
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
12
|
-
- `{
|
|
20
|
+
- `{dataPath}`: `{globalPath}/data`
|
|
21
|
+
- `{statePath}`: `{dataPath}/state.json`
|
|
13
22
|
- `{sessionPath}`: `{globalPath}/sessions/current.json`
|
|
14
23
|
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
15
24
|
- `{task}`: User-provided task (optional)
|
|
@@ -25,15 +34,19 @@ IF file not found:
|
|
|
25
34
|
|
|
26
35
|
## Step 2: Check Current State
|
|
27
36
|
|
|
28
|
-
###
|
|
29
|
-
READ: `{
|
|
37
|
+
### Read state.json (source of truth)
|
|
38
|
+
READ: `{statePath}`
|
|
30
39
|
|
|
31
40
|
IF file exists:
|
|
32
41
|
PARSE as JSON
|
|
33
|
-
EXTRACT: {currentTask}
|
|
42
|
+
EXTRACT: {currentTask} from state.currentTask
|
|
43
|
+
|
|
44
|
+
### Check for active session (legacy support)
|
|
45
|
+
READ: `{sessionPath}`
|
|
34
46
|
|
|
35
|
-
|
|
36
|
-
|
|
47
|
+
IF file exists:
|
|
48
|
+
PARSE as JSON
|
|
49
|
+
EXTRACT: {session.task}, {session.status}, {session.startedAt}, {session.duration}
|
|
37
50
|
|
|
38
51
|
## Step 3: Handle Cases
|
|
39
52
|
|
|
@@ -91,7 +104,25 @@ IF {task} is provided:
|
|
|
91
104
|
GENERATE: {sessionId} = "sess_" + 8 random alphanumeric chars
|
|
92
105
|
SET: {startedAt} = GetTimestamp()
|
|
93
106
|
|
|
94
|
-
###
|
|
107
|
+
### Write state.json (SOURCE OF TRUTH)
|
|
108
|
+
READ: `{statePath}` (or create default if not exists)
|
|
109
|
+
|
|
110
|
+
UPDATE state.json:
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"currentTask": {
|
|
114
|
+
"id": "task_{8_random_chars}",
|
|
115
|
+
"description": "{task}",
|
|
116
|
+
"startedAt": "{startedAt}",
|
|
117
|
+
"sessionId": "{sessionId}"
|
|
118
|
+
},
|
|
119
|
+
"lastUpdated": "{startedAt}"
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
WRITE: `{statePath}`
|
|
124
|
+
|
|
125
|
+
### Create session JSON (for detailed tracking)
|
|
95
126
|
WRITE: `{sessionPath}`
|
|
96
127
|
Content:
|
|
97
128
|
```json
|
|
@@ -117,17 +148,10 @@ IF {task} is provided:
|
|
|
117
148
|
}
|
|
118
149
|
```
|
|
119
150
|
|
|
120
|
-
###
|
|
121
|
-
|
|
122
|
-
Content:
|
|
123
|
-
```markdown
|
|
124
|
-
# NOW
|
|
125
|
-
|
|
126
|
-
**{task}**
|
|
151
|
+
### Generate views (auto-regenerate MD from JSON)
|
|
152
|
+
BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
|
|
127
153
|
|
|
128
|
-
|
|
129
|
-
Session: {sessionId}
|
|
130
|
-
```
|
|
154
|
+
Note: This regenerates views/now.md from data/state.json automatically.
|
|
131
155
|
|
|
132
156
|
### Log to memory
|
|
133
157
|
APPEND to: `{memoryPath}`
|