@dv.nghiem/flowdeck 0.1.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/LICENSE +21 -0
- package/README.md +136 -0
- package/bin/flowdeck.js +108 -0
- package/dist/agents/architect.d.ts +3 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/code-explorer.d.ts +3 -0
- package/dist/agents/code-explorer.d.ts.map +1 -0
- package/dist/agents/coder.d.ts +3 -0
- package/dist/agents/coder.d.ts.map +1 -0
- package/dist/agents/debug.d.ts +4 -0
- package/dist/agents/debug.d.ts.map +1 -0
- package/dist/agents/doc-updater.d.ts +3 -0
- package/dist/agents/doc-updater.d.ts.map +1 -0
- package/dist/agents/flowdeck.d.ts +5 -0
- package/dist/agents/flowdeck.d.ts.map +1 -0
- package/dist/agents/index.d.ts +38 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/mapper.d.ts +3 -0
- package/dist/agents/mapper.d.ts.map +1 -0
- package/dist/agents/orchestrator.d.ts +10 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/performance.d.ts +4 -0
- package/dist/agents/performance.d.ts.map +1 -0
- package/dist/agents/planner.d.ts +3 -0
- package/dist/agents/planner.d.ts.map +1 -0
- package/dist/agents/policy-enforcer.d.ts +3 -0
- package/dist/agents/policy-enforcer.d.ts.map +1 -0
- package/dist/agents/researcher.d.ts +3 -0
- package/dist/agents/researcher.d.ts.map +1 -0
- package/dist/agents/reviewer.d.ts +3 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/risk-analyst.d.ts +3 -0
- package/dist/agents/risk-analyst.d.ts.map +1 -0
- package/dist/agents/security-auditor.d.ts +3 -0
- package/dist/agents/security-auditor.d.ts.map +1 -0
- package/dist/agents/specialist.d.ts +5 -0
- package/dist/agents/specialist.d.ts.map +1 -0
- package/dist/agents/tester.d.ts +3 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/types.d.ts +20 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/writer.d.ts +3 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/commands/analysis/analysis.test.d.ts +2 -0
- package/dist/commands/analysis/analysis.test.d.ts.map +1 -0
- package/dist/commands/analysis/analyze-change.d.ts +148 -0
- package/dist/commands/analysis/analyze-change.d.ts.map +1 -0
- package/dist/commands/analysis/evaluate-risk.d.ts +77 -0
- package/dist/commands/analysis/evaluate-risk.d.ts.map +1 -0
- package/dist/commands/analysis/guarded-edit.d.ts +72 -0
- package/dist/commands/analysis/guarded-edit.d.ts.map +1 -0
- package/dist/commands/execution/deploy-check.d.ts +91 -0
- package/dist/commands/execution/deploy-check.d.ts.map +1 -0
- package/dist/commands/execution/fix-bug.d.ts +187 -0
- package/dist/commands/execution/fix-bug.d.ts.map +1 -0
- package/dist/commands/execution/new-feature.d.ts +171 -0
- package/dist/commands/execution/new-feature.d.ts.map +1 -0
- package/dist/commands/execution/review-code.d.ts +130 -0
- package/dist/commands/execution/review-code.d.ts.map +1 -0
- package/dist/commands/execution/write-docs.d.ts +94 -0
- package/dist/commands/execution/write-docs.d.ts.map +1 -0
- package/dist/commands/governance/approve.d.ts +80 -0
- package/dist/commands/governance/approve.d.ts.map +1 -0
- package/dist/commands/intelligence/blast-radius.d.ts +67 -0
- package/dist/commands/intelligence/blast-radius.d.ts.map +1 -0
- package/dist/commands/intelligence/impact-radar.d.ts +71 -0
- package/dist/commands/intelligence/impact-radar.d.ts.map +1 -0
- package/dist/commands/intelligence/intelligence.test.d.ts +2 -0
- package/dist/commands/intelligence/intelligence.test.d.ts.map +1 -0
- package/dist/commands/intelligence/regression-predict.d.ts +75 -0
- package/dist/commands/intelligence/regression-predict.d.ts.map +1 -0
- package/dist/commands/intelligence/review-route.d.ts +65 -0
- package/dist/commands/intelligence/review-route.d.ts.map +1 -0
- package/dist/commands/intelligence/test-gap.d.ts +73 -0
- package/dist/commands/intelligence/test-gap.d.ts.map +1 -0
- package/dist/commands/intelligence/translate-intent.d.ts +87 -0
- package/dist/commands/intelligence/translate-intent.d.ts.map +1 -0
- package/dist/commands/intelligence/volatility-map-cmd.d.ts +68 -0
- package/dist/commands/intelligence/volatility-map-cmd.d.ts.map +1 -0
- package/dist/commands/planning/ask.d.ts +62 -0
- package/dist/commands/planning/ask.d.ts.map +1 -0
- package/dist/commands/planning/ask.test.d.ts +2 -0
- package/dist/commands/planning/ask.test.d.ts.map +1 -0
- package/dist/commands/planning/dashboard.d.ts +30 -0
- package/dist/commands/planning/dashboard.d.ts.map +1 -0
- package/dist/commands/planning/discuss.d.ts +39 -0
- package/dist/commands/planning/discuss.d.ts.map +1 -0
- package/dist/commands/planning/plan.d.ts +67 -0
- package/dist/commands/planning/plan.d.ts.map +1 -0
- package/dist/commands/planning/roadmap.d.ts +105 -0
- package/dist/commands/planning/roadmap.d.ts.map +1 -0
- package/dist/commands/setup/doctor.d.ts +10 -0
- package/dist/commands/setup/doctor.d.ts.map +1 -0
- package/dist/commands/setup/map-codebase.d.ts +62 -0
- package/dist/commands/setup/map-codebase.d.ts.map +1 -0
- package/dist/commands/setup/new-project.d.ts +19 -0
- package/dist/commands/setup/new-project.d.ts.map +1 -0
- package/dist/commands/setup/settings.d.ts +57 -0
- package/dist/commands/setup/settings.d.ts.map +1 -0
- package/dist/commands/state/checkpoint.d.ts +27 -0
- package/dist/commands/state/checkpoint.d.ts.map +1 -0
- package/dist/commands/state/multi-repo.d.ts +63 -0
- package/dist/commands/state/multi-repo.d.ts.map +1 -0
- package/dist/commands/state/progress.d.ts +57 -0
- package/dist/commands/state/progress.d.ts.map +1 -0
- package/dist/commands/state/resume.d.ts +11 -0
- package/dist/commands/state/resume.d.ts.map +1 -0
- package/dist/commands/state/workspace-commands.d.ts +207 -0
- package/dist/commands/state/workspace-commands.d.ts.map +1 -0
- package/dist/dashboard/lib/port-finder.d.ts +10 -0
- package/dist/dashboard/lib/port-finder.d.ts.map +1 -0
- package/dist/dashboard/lib/port-finder.test.d.ts +2 -0
- package/dist/dashboard/lib/port-finder.test.d.ts.map +1 -0
- package/dist/dashboard/lib/state-reader.d.ts +3 -0
- package/dist/dashboard/lib/state-reader.d.ts.map +1 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.mjs +13649 -0
- package/dist/dashboard/types.d.ts +72 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/views/index.ejs +391 -0
- package/dist/dashboard/views/partials/blockers.ejs +10 -0
- package/dist/dashboard/views/partials/header.ejs +20 -0
- package/dist/dashboard/views/partials/phase-timeline.ejs +40 -0
- package/dist/dashboard/views/partials/progress.ejs +12 -0
- package/dist/hooks/approval-hook.d.ts +13 -0
- package/dist/hooks/approval-hook.d.ts.map +1 -0
- package/dist/hooks/compaction-hook.d.ts +23 -0
- package/dist/hooks/compaction-hook.d.ts.map +1 -0
- package/dist/hooks/context-window-monitor.d.ts +21 -0
- package/dist/hooks/context-window-monitor.d.ts.map +1 -0
- package/dist/hooks/decision-trace-hook.d.ts +13 -0
- package/dist/hooks/decision-trace-hook.d.ts.map +1 -0
- package/dist/hooks/file-tracker.d.ts +29 -0
- package/dist/hooks/file-tracker.d.ts.map +1 -0
- package/dist/hooks/guard-rails.d.ts +33 -0
- package/dist/hooks/guard-rails.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/notifications.d.ts +21 -0
- package/dist/hooks/notifications.d.ts.map +1 -0
- package/dist/hooks/patch-trust.d.ts +27 -0
- package/dist/hooks/patch-trust.d.ts.map +1 -0
- package/dist/hooks/patch-trust.test.d.ts +2 -0
- package/dist/hooks/patch-trust.test.d.ts.map +1 -0
- package/dist/hooks/session-events.d.ts +8 -0
- package/dist/hooks/session-events.d.ts.map +1 -0
- package/dist/hooks/session-idle-hook.d.ts +21 -0
- package/dist/hooks/session-idle-hook.d.ts.map +1 -0
- package/dist/hooks/session-start.d.ts +10 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/shell-env-hook.d.ts +21 -0
- package/dist/hooks/shell-env-hook.d.ts.map +1 -0
- package/dist/hooks/telemetry-hook.d.ts +25 -0
- package/dist/hooks/telemetry-hook.d.ts.map +1 -0
- package/dist/hooks/todo-hook.d.ts +25 -0
- package/dist/hooks/todo-hook.d.ts.map +1 -0
- package/dist/hooks/tool-guard.d.ts +41 -0
- package/dist/hooks/tool-guard.d.ts.map +1 -0
- package/dist/hooks/tool-guard.test.d.ts +2 -0
- package/dist/hooks/tool-guard.test.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6639 -0
- package/dist/lib/confirmation.d.ts +20 -0
- package/dist/lib/confirmation.d.ts.map +1 -0
- package/dist/lib/impact-radar.d.ts +35 -0
- package/dist/lib/impact-radar.d.ts.map +1 -0
- package/dist/lib/signatures.d.ts +12 -0
- package/dist/lib/signatures.d.ts.map +1 -0
- package/dist/lib/timestamps.d.ts +23 -0
- package/dist/lib/timestamps.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +20 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/services/agent-performance.d.ts +29 -0
- package/dist/services/agent-performance.d.ts.map +1 -0
- package/dist/services/approval-manager.d.ts +30 -0
- package/dist/services/approval-manager.d.ts.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/model-router.d.ts +35 -0
- package/dist/services/model-router.d.ts.map +1 -0
- package/dist/services/policy-compiler.d.ts +27 -0
- package/dist/services/policy-compiler.d.ts.map +1 -0
- package/dist/services/run-trace.d.ts +34 -0
- package/dist/services/run-trace.d.ts.map +1 -0
- package/dist/services/services.test.d.ts +2 -0
- package/dist/services/services.test.d.ts.map +1 -0
- package/dist/services/telemetry.d.ts +34 -0
- package/dist/services/telemetry.d.ts.map +1 -0
- package/dist/tools/agent-dispatch.test.d.ts +2 -0
- package/dist/tools/agent-dispatch.test.d.ts.map +1 -0
- package/dist/tools/codebase-state.d.ts +4 -0
- package/dist/tools/codebase-state.d.ts.map +1 -0
- package/dist/tools/context-generator.d.ts +3 -0
- package/dist/tools/context-generator.d.ts.map +1 -0
- package/dist/tools/council.d.ts +4 -0
- package/dist/tools/council.d.ts.map +1 -0
- package/dist/tools/decision-trace.d.ts +16 -0
- package/dist/tools/decision-trace.d.ts.map +1 -0
- package/dist/tools/delegate.d.ts +4 -0
- package/dist/tools/delegate.d.ts.map +1 -0
- package/dist/tools/failure-replay.d.ts +19 -0
- package/dist/tools/failure-replay.d.ts.map +1 -0
- package/dist/tools/failure-replay.test.d.ts +2 -0
- package/dist/tools/failure-replay.test.d.ts.map +1 -0
- package/dist/tools/hash-edit.d.ts +3 -0
- package/dist/tools/hash-edit.d.ts.map +1 -0
- package/dist/tools/planning-state-lib.d.ts +65 -0
- package/dist/tools/planning-state-lib.d.ts.map +1 -0
- package/dist/tools/planning-state.d.ts +3 -0
- package/dist/tools/planning-state.d.ts.map +1 -0
- package/dist/tools/policy-engine.d.ts +19 -0
- package/dist/tools/policy-engine.d.ts.map +1 -0
- package/dist/tools/repo-memory.d.ts +20 -0
- package/dist/tools/repo-memory.d.ts.map +1 -0
- package/dist/tools/repo-memory.test.d.ts +2 -0
- package/dist/tools/repo-memory.test.d.ts.map +1 -0
- package/dist/tools/run-parallel.d.ts +4 -0
- package/dist/tools/run-parallel.d.ts.map +1 -0
- package/dist/tools/run-pipeline.d.ts +4 -0
- package/dist/tools/run-pipeline.d.ts.map +1 -0
- package/dist/tools/volatility-map.d.ts +18 -0
- package/dist/tools/volatility-map.d.ts.map +1 -0
- package/dist/tools/volatility-map.test.d.ts +2 -0
- package/dist/tools/volatility-map.test.d.ts.map +1 -0
- package/dist/tools/workspace-state.d.ts +3 -0
- package/dist/tools/workspace-state.d.ts.map +1 -0
- package/docs/USER_GUIDE.md +20 -0
- package/docs/agents.md +562 -0
- package/docs/best-practices.md +47 -0
- package/docs/command-migration.md +175 -0
- package/docs/commands/fd-analyze-change.md +107 -0
- package/docs/commands/fd-ask.md +51 -0
- package/docs/commands/fd-checkpoint.md +10 -0
- package/docs/commands/fd-dashboard.md +11 -0
- package/docs/commands/fd-deploy-check.md +11 -0
- package/docs/commands/fd-discuss.md +28 -0
- package/docs/commands/fd-evaluate-risk.md +134 -0
- package/docs/commands/fd-fix-bug.md +24 -0
- package/docs/commands/fd-guarded-edit.md +105 -0
- package/docs/commands/fd-map-codebase.md +27 -0
- package/docs/commands/fd-multi-repo.md +63 -0
- package/docs/commands/fd-new-feature.md +25 -0
- package/docs/commands/fd-new-project.md +24 -0
- package/docs/commands/fd-plan.md +33 -0
- package/docs/commands/fd-progress.md +11 -0
- package/docs/commands/fd-resume.md +10 -0
- package/docs/commands/fd-review-code.md +29 -0
- package/docs/commands/fd-roadmap.md +10 -0
- package/docs/commands/fd-settings.md +10 -0
- package/docs/commands/fd-write-docs.md +10 -0
- package/docs/commands.md +476 -0
- package/docs/configuration.md +211 -0
- package/docs/feature-integration-architecture.md +255 -0
- package/docs/index.md +75 -0
- package/docs/installation.md +134 -0
- package/docs/intelligence.md +294 -0
- package/docs/multi-repo.md +201 -0
- package/docs/notifications.md +170 -0
- package/docs/parallel-execution.md +227 -0
- package/docs/quick-start.md +174 -0
- package/docs/rules.md +459 -0
- package/docs/skills.md +408 -0
- package/docs/workflows.md +376 -0
- package/package.json +58 -0
- package/postinstall.mjs +102 -0
- package/src/rules/README.md +37 -0
- package/src/rules/common/agent-orchestration.md +86 -0
- package/src/rules/common/coding-style.md +120 -0
- package/src/rules/common/git-workflow.md +77 -0
- package/src/rules/common/security.md +94 -0
- package/src/rules/common/testing.md +105 -0
- package/src/rules/golang/patterns.md +187 -0
- package/src/rules/java/patterns.md +204 -0
- package/src/rules/python/patterns.md +141 -0
- package/src/rules/rust/patterns.md +210 -0
- package/src/rules/typescript/patterns.md +168 -0
- package/src/skills/api-design/SKILL.md +143 -0
- package/src/skills/arch-constraint-guard/SKILL.md +61 -0
- package/src/skills/blast-radius-preview/SKILL.md +65 -0
- package/src/skills/change-impact-radar/SKILL.md +63 -0
- package/src/skills/code-review/SKILL.md +108 -0
- package/src/skills/code-tour/SKILL.md +101 -0
- package/src/skills/codebase-mapping/SKILL.md +87 -0
- package/src/skills/codebase-onboarding/SKILL.md +133 -0
- package/src/skills/confidence-aware-planning/SKILL.md +67 -0
- package/src/skills/context-load/SKILL.md +63 -0
- package/src/skills/debug-flow/SKILL.md +75 -0
- package/src/skills/decision-trace/SKILL.md +72 -0
- package/src/skills/dependency-audit/SKILL.md +126 -0
- package/src/skills/deploy-check/SKILL.md +87 -0
- package/src/skills/documentation-writer/SKILL.md +154 -0
- package/src/skills/failure-replay-engine/SKILL.md +59 -0
- package/src/skills/git-release/SKILL.md +94 -0
- package/src/skills/git-workflow/SKILL.md +177 -0
- package/src/skills/golang-patterns/SKILL.md +511 -0
- package/src/skills/human-review-routing/SKILL.md +65 -0
- package/src/skills/intent-translator/SKILL.md +57 -0
- package/src/skills/java-patterns/SKILL.md +479 -0
- package/src/skills/multi-repo/SKILL.md +187 -0
- package/src/skills/parallel-execute/SKILL.md +92 -0
- package/src/skills/patch-trust-score/SKILL.md +44 -0
- package/src/skills/performance-profiling/SKILL.md +153 -0
- package/src/skills/plan-task/SKILL.md +101 -0
- package/src/skills/python-patterns/SKILL.md +529 -0
- package/src/skills/refactor-guide/SKILL.md +117 -0
- package/src/skills/regression-prediction/SKILL.md +57 -0
- package/src/skills/repo-memory-graph/SKILL.md +49 -0
- package/src/skills/rust-patterns/SKILL.md +492 -0
- package/src/skills/security-scan/SKILL.md +91 -0
- package/src/skills/self-healing-policies/SKILL.md +76 -0
- package/src/skills/tdd-workflow/SKILL.md +126 -0
- package/src/skills/test-coverage/SKILL.md +94 -0
- package/src/skills/test-gap-detector/SKILL.md +58 -0
- package/src/skills/volatility-map/SKILL.md +52 -0
- package/src/workflows/debug-flow.md +119 -0
- package/src/workflows/deploy-check-flow.md +98 -0
- package/src/workflows/discuss-flow.md +97 -0
- package/src/workflows/execute-flow.md +233 -0
- package/src/workflows/execute-phase.md +142 -0
- package/src/workflows/fix-bug-flow.md +210 -0
- package/src/workflows/map-codebase-flow.md +92 -0
- package/src/workflows/multi-repo-flow.md +226 -0
- package/src/workflows/parallel-execution-flow.md +236 -0
- package/src/workflows/plan-flow.md +126 -0
- package/src/workflows/plan-phase.md +101 -0
- package/src/workflows/refactor-flow.md +122 -0
- package/src/workflows/review-code-flow.md +105 -0
- package/src/workflows/spec-driven-flow.md +43 -0
- package/src/workflows/write-docs-flow.md +95 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export interface Phase {
|
|
2
|
+
number: number;
|
|
3
|
+
name: string;
|
|
4
|
+
status: "complete" | "in_progress" | "pending";
|
|
5
|
+
stepsComplete: number;
|
|
6
|
+
stepsPending: number;
|
|
7
|
+
dependsOn?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TelemetrySummary {
|
|
10
|
+
command: string;
|
|
11
|
+
total_runs: number;
|
|
12
|
+
successes: number;
|
|
13
|
+
failures: number;
|
|
14
|
+
avg_duration_ms: number;
|
|
15
|
+
last_run: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RecentRun {
|
|
18
|
+
run_id: string;
|
|
19
|
+
command: string;
|
|
20
|
+
started_at: string;
|
|
21
|
+
ended_at?: string;
|
|
22
|
+
status: string;
|
|
23
|
+
risk_score: number;
|
|
24
|
+
files_touched: number;
|
|
25
|
+
outcome?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface PendingApproval {
|
|
28
|
+
id: string;
|
|
29
|
+
trigger: string;
|
|
30
|
+
reason: string;
|
|
31
|
+
risk_score: number;
|
|
32
|
+
file_path?: string;
|
|
33
|
+
requested_at: string;
|
|
34
|
+
}
|
|
35
|
+
export interface AgentPerfSummary {
|
|
36
|
+
agent: string;
|
|
37
|
+
model: string;
|
|
38
|
+
task_type: string;
|
|
39
|
+
success_rate: number;
|
|
40
|
+
runs: number;
|
|
41
|
+
avg_duration_ms: number;
|
|
42
|
+
}
|
|
43
|
+
export interface TDDDashboardState {
|
|
44
|
+
stage: string;
|
|
45
|
+
cycle: number;
|
|
46
|
+
failing_tests: number;
|
|
47
|
+
passing_tests: number;
|
|
48
|
+
behaviors_completed: number;
|
|
49
|
+
behaviors_pending: number;
|
|
50
|
+
bugs_missing_regression: number;
|
|
51
|
+
overrides_used: number;
|
|
52
|
+
}
|
|
53
|
+
export interface DashboardData {
|
|
54
|
+
project: string;
|
|
55
|
+
milestone: string;
|
|
56
|
+
milestone_name: string;
|
|
57
|
+
phases: Phase[];
|
|
58
|
+
blockers: string[];
|
|
59
|
+
progress: {
|
|
60
|
+
total: number;
|
|
61
|
+
completed: number;
|
|
62
|
+
percent: number;
|
|
63
|
+
};
|
|
64
|
+
currentPhase: number;
|
|
65
|
+
telemetrySummary: TelemetrySummary[];
|
|
66
|
+
recentRuns: RecentRun[];
|
|
67
|
+
pendingApprovals: PendingApproval[];
|
|
68
|
+
agentPerf: AgentPerfSummary[];
|
|
69
|
+
toolFailureCount: number;
|
|
70
|
+
tdd?: TDDDashboardState;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAAA;IAC9C,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,YAAY,EAAE,MAAM,CAAA;IAEpB,gBAAgB,EAAE,gBAAgB,EAAE,CAAA;IACpC,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IAExB,GAAG,CAAC,EAAE,iBAAiB,CAAA;CACxB"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title><%= project %> — Dashboard</title>
|
|
7
|
+
<style>
|
|
8
|
+
/* === Design Tokens === */
|
|
9
|
+
:root {
|
|
10
|
+
--color-bg: #111827;
|
|
11
|
+
--color-surface: #1F2937;
|
|
12
|
+
--color-border: #374151;
|
|
13
|
+
--color-accent: #3B82F6;
|
|
14
|
+
--color-accent-hover: #2563eb;
|
|
15
|
+
--color-text-primary: #f9fafb;
|
|
16
|
+
--color-text-secondary: #d1d5db;
|
|
17
|
+
--color-text-muted: #9ca3af;
|
|
18
|
+
--color-success: #10b981;
|
|
19
|
+
--color-danger: #ef4444;
|
|
20
|
+
--color-pending: #6b7280;
|
|
21
|
+
|
|
22
|
+
--space-xs: 4px;
|
|
23
|
+
--space-sm: 8px;
|
|
24
|
+
--space-md: 16px;
|
|
25
|
+
--space-lg: 24px;
|
|
26
|
+
--space-xl: 32px;
|
|
27
|
+
--space-2xl: 48px;
|
|
28
|
+
--space-3xl: 64px;
|
|
29
|
+
|
|
30
|
+
--font-display: 28px;
|
|
31
|
+
--font-heading: 20px;
|
|
32
|
+
--font-body: 14px;
|
|
33
|
+
--font-label: 12px;
|
|
34
|
+
|
|
35
|
+
--radius-sm: 4px;
|
|
36
|
+
--radius-md: 8px;
|
|
37
|
+
--radius-lg: 12px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* === Reset & Base === */
|
|
41
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
42
|
+
|
|
43
|
+
body {
|
|
44
|
+
background: var(--color-bg);
|
|
45
|
+
color: var(--color-text-primary);
|
|
46
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
47
|
+
font-size: var(--font-body);
|
|
48
|
+
line-height: 1.5;
|
|
49
|
+
min-height: 100vh;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* === Typography === */
|
|
53
|
+
.display {
|
|
54
|
+
font-size: var(--font-display);
|
|
55
|
+
font-weight: 700;
|
|
56
|
+
line-height: 1.1;
|
|
57
|
+
color: var(--color-text-primary);
|
|
58
|
+
}
|
|
59
|
+
.heading {
|
|
60
|
+
font-size: var(--font-heading);
|
|
61
|
+
font-weight: 600;
|
|
62
|
+
line-height: 1.2;
|
|
63
|
+
color: var(--color-text-primary);
|
|
64
|
+
}
|
|
65
|
+
.label {
|
|
66
|
+
font-size: var(--font-label);
|
|
67
|
+
font-weight: 500;
|
|
68
|
+
color: var(--color-text-muted);
|
|
69
|
+
text-transform: uppercase;
|
|
70
|
+
letter-spacing: 0.05em;
|
|
71
|
+
}
|
|
72
|
+
.body {
|
|
73
|
+
font-size: var(--font-body);
|
|
74
|
+
font-weight: 400;
|
|
75
|
+
color: var(--color-text-secondary);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* === Layout === */
|
|
79
|
+
.page {
|
|
80
|
+
max-width: 800px;
|
|
81
|
+
margin: 0 auto;
|
|
82
|
+
padding: var(--space-xl) var(--space-md);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* === Header === */
|
|
86
|
+
.header {
|
|
87
|
+
background: var(--color-surface);
|
|
88
|
+
border: 1px solid var(--color-border);
|
|
89
|
+
border-radius: var(--radius-lg);
|
|
90
|
+
padding: var(--space-lg);
|
|
91
|
+
margin-bottom: var(--space-lg);
|
|
92
|
+
}
|
|
93
|
+
.header-top {
|
|
94
|
+
display: flex;
|
|
95
|
+
align-items: flex-start;
|
|
96
|
+
justify-content: space-between;
|
|
97
|
+
gap: var(--space-md);
|
|
98
|
+
}
|
|
99
|
+
.header-milestone {
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
gap: var(--space-sm);
|
|
103
|
+
margin-top: var(--space-xs);
|
|
104
|
+
}
|
|
105
|
+
.refresh-link {
|
|
106
|
+
display: inline-flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
gap: var(--space-xs);
|
|
109
|
+
background: var(--color-accent);
|
|
110
|
+
color: white;
|
|
111
|
+
padding: var(--space-sm) var(--space-md);
|
|
112
|
+
border-radius: var(--radius-md);
|
|
113
|
+
font-size: var(--font-body);
|
|
114
|
+
font-weight: 500;
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
white-space: nowrap;
|
|
117
|
+
flex-shrink: 0;
|
|
118
|
+
transition: background 150ms;
|
|
119
|
+
}
|
|
120
|
+
.refresh-link:hover { background: var(--color-accent-hover); }
|
|
121
|
+
|
|
122
|
+
/* === Section Card === */
|
|
123
|
+
.section-card {
|
|
124
|
+
background: var(--color-surface);
|
|
125
|
+
border: 1px solid var(--color-border);
|
|
126
|
+
border-radius: var(--radius-lg);
|
|
127
|
+
padding: var(--space-lg);
|
|
128
|
+
margin-bottom: var(--space-lg);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* === Phase Timeline === */
|
|
132
|
+
.phase-list { display: flex; flex-direction: column; gap: var(--space-xs); margin-top: var(--space-md); }
|
|
133
|
+
.phase-item {
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
gap: var(--space-md);
|
|
137
|
+
padding: var(--space-sm) var(--space-md);
|
|
138
|
+
border-radius: var(--radius-md);
|
|
139
|
+
transition: background 150ms;
|
|
140
|
+
}
|
|
141
|
+
.phase-item:last-child { border-bottom: none; }
|
|
142
|
+
.phase-item.phase-complete { background: rgba(16, 185, 129, 0.05); }
|
|
143
|
+
.phase-item.phase-in_progress { background: rgba(59, 130, 246, 0.1); border: 1px solid rgba(59, 130, 246, 0.3); }
|
|
144
|
+
.phase-item.phase-pending { opacity: 0.6; }
|
|
145
|
+
|
|
146
|
+
.phase-indicator {
|
|
147
|
+
width: 24px;
|
|
148
|
+
height: 24px;
|
|
149
|
+
display: flex;
|
|
150
|
+
align-items: center;
|
|
151
|
+
justify-content: center;
|
|
152
|
+
flex-shrink: 0;
|
|
153
|
+
}
|
|
154
|
+
.icon-check { color: var(--color-success); }
|
|
155
|
+
.phase-pulse {
|
|
156
|
+
width: 10px;
|
|
157
|
+
height: 10px;
|
|
158
|
+
background: var(--color-accent);
|
|
159
|
+
border-radius: 50%;
|
|
160
|
+
animation: pulse 2s ease-in-out infinite;
|
|
161
|
+
}
|
|
162
|
+
@keyframes pulse {
|
|
163
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
164
|
+
50% { opacity: 0.6; transform: scale(0.85); }
|
|
165
|
+
}
|
|
166
|
+
.phase-dot {
|
|
167
|
+
width: 8px;
|
|
168
|
+
height: 8px;
|
|
169
|
+
background: var(--color-pending);
|
|
170
|
+
border-radius: 50%;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.phase-content { flex: 1; min-width: 0; }
|
|
174
|
+
.phase-number { font-size: var(--font-label); color: var(--color-text-muted); font-weight: 500; }
|
|
175
|
+
.phase-name { font-size: var(--font-body); color: var(--color-text-primary); font-weight: 400; }
|
|
176
|
+
|
|
177
|
+
.phase-status { flex-shrink: 0; }
|
|
178
|
+
.status-complete { font-size: var(--font-label); color: var(--color-success); font-weight: 500; }
|
|
179
|
+
.status-in-progress { font-size: var(--font-label); color: var(--color-accent); font-weight: 600; }
|
|
180
|
+
.status-pending { font-size: var(--font-label); color: var(--color-pending); font-weight: 500; }
|
|
181
|
+
|
|
182
|
+
/* === Blockers === */
|
|
183
|
+
.blockers-list { list-style: none; padding: 0; margin-top: var(--space-sm); display: flex; flex-direction: column; gap: var(--space-xs); }
|
|
184
|
+
.blocker-item {
|
|
185
|
+
font-size: var(--font-body);
|
|
186
|
+
color: var(--color-danger);
|
|
187
|
+
padding: var(--space-sm) var(--space-md);
|
|
188
|
+
background: rgba(239, 68, 68, 0.08);
|
|
189
|
+
border-radius: var(--radius-sm);
|
|
190
|
+
border-left: 3px solid var(--color-danger);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* === Progress === */
|
|
194
|
+
.progress-section { }
|
|
195
|
+
.progress-header {
|
|
196
|
+
display: flex;
|
|
197
|
+
justify-content: space-between;
|
|
198
|
+
align-items: center;
|
|
199
|
+
margin-bottom: var(--space-sm);
|
|
200
|
+
}
|
|
201
|
+
.progress-percent {
|
|
202
|
+
font-size: var(--font-heading);
|
|
203
|
+
font-weight: 700;
|
|
204
|
+
color: var(--color-accent);
|
|
205
|
+
}
|
|
206
|
+
.progress-bar-track {
|
|
207
|
+
height: 8px;
|
|
208
|
+
background: var(--color-border);
|
|
209
|
+
border-radius: 4px;
|
|
210
|
+
overflow: hidden;
|
|
211
|
+
}
|
|
212
|
+
.progress-bar-fill {
|
|
213
|
+
height: 100%;
|
|
214
|
+
background: var(--color-accent);
|
|
215
|
+
border-radius: 4px;
|
|
216
|
+
transition: width 300ms ease-out;
|
|
217
|
+
}
|
|
218
|
+
.progress-detail { margin-top: var(--space-sm); }
|
|
219
|
+
|
|
220
|
+
/* === Empty State === */
|
|
221
|
+
.empty-state { text-align: center; padding: var(--space-xl) var(--space-md); }
|
|
222
|
+
.empty-state-heading { font-size: var(--font-heading); font-weight: 600; color: var(--color-text-muted); margin-bottom: var(--space-xs); }
|
|
223
|
+
.empty-state-body { font-size: var(--font-body); color: var(--color-pending); }
|
|
224
|
+
|
|
225
|
+
/* === Spacing Utilities === */
|
|
226
|
+
.space-sm { height: var(--space-sm); }
|
|
227
|
+
.space-md { height: var(--space-md); }
|
|
228
|
+
.space-lg { height: var(--space-lg); }
|
|
229
|
+
|
|
230
|
+
/* === Telemetry / Ops === */
|
|
231
|
+
.ops-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-md); margin-top: var(--space-md); }
|
|
232
|
+
@media (max-width: 640px) { .ops-grid { grid-template-columns: 1fr; } }
|
|
233
|
+
.stat-card {
|
|
234
|
+
background: rgba(59, 130, 246, 0.05);
|
|
235
|
+
border: 1px solid rgba(59, 130, 246, 0.15);
|
|
236
|
+
border-radius: var(--radius-md);
|
|
237
|
+
padding: var(--space-md);
|
|
238
|
+
}
|
|
239
|
+
.stat-value { font-size: 22px; font-weight: 700; color: var(--color-accent); }
|
|
240
|
+
.stat-label { font-size: var(--font-label); color: var(--color-text-muted); margin-top: 2px; }
|
|
241
|
+
|
|
242
|
+
.table { width: 100%; border-collapse: collapse; margin-top: var(--space-md); }
|
|
243
|
+
.table th { font-size: var(--font-label); color: var(--color-text-muted); text-align: left; padding: var(--space-xs) var(--space-sm); border-bottom: 1px solid var(--color-border); }
|
|
244
|
+
.table td { font-size: var(--font-body); color: var(--color-text-secondary); padding: var(--space-xs) var(--space-sm); border-bottom: 1px solid rgba(55, 65, 81, 0.4); vertical-align: top; }
|
|
245
|
+
.table tr:last-child td { border-bottom: none; }
|
|
246
|
+
|
|
247
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 99px; font-size: 11px; font-weight: 600; }
|
|
248
|
+
.badge-ok { background: rgba(16,185,129,0.15); color: #10b981; }
|
|
249
|
+
.badge-fail { background: rgba(239,68,68,0.15); color: #ef4444; }
|
|
250
|
+
.badge-running { background: rgba(59,130,246,0.15); color: #3b82f6; }
|
|
251
|
+
.badge-pending { background: rgba(107,114,128,0.15); color: #9ca3af; }
|
|
252
|
+
.badge-risk-high { background: rgba(239,68,68,0.15); color: #ef4444; }
|
|
253
|
+
.badge-risk-med { background: rgba(251,146,60,0.15); color: #f97316; }
|
|
254
|
+
.badge-risk-low { background: rgba(16,185,129,0.15); color: #10b981; }
|
|
255
|
+
|
|
256
|
+
.approval-item {
|
|
257
|
+
padding: var(--space-sm) var(--space-md);
|
|
258
|
+
background: rgba(251, 146, 60, 0.08);
|
|
259
|
+
border-left: 3px solid #f97316;
|
|
260
|
+
border-radius: var(--radius-sm);
|
|
261
|
+
margin-bottom: var(--space-xs);
|
|
262
|
+
}
|
|
263
|
+
.approval-trigger { font-size: var(--font-label); color: #f97316; font-weight: 600; }
|
|
264
|
+
.approval-reason { font-size: var(--font-body); color: var(--color-text-secondary); }
|
|
265
|
+
|
|
266
|
+
/* === Responsive === */
|
|
267
|
+
@media (max-width: 640px) {
|
|
268
|
+
.header-top { flex-direction: column; }
|
|
269
|
+
.refresh-link { align-self: flex-start; }
|
|
270
|
+
.phase-item { gap: var(--space-sm); }
|
|
271
|
+
.phase-status { display: none; }
|
|
272
|
+
}
|
|
273
|
+
</style>
|
|
274
|
+
</head>
|
|
275
|
+
<body>
|
|
276
|
+
<main class="page">
|
|
277
|
+
<%- include('partials/header.ejs') %>
|
|
278
|
+
|
|
279
|
+
<div class="space-lg"></div>
|
|
280
|
+
|
|
281
|
+
<%- include('partials/progress.ejs') %>
|
|
282
|
+
|
|
283
|
+
<div class="space-lg"></div>
|
|
284
|
+
|
|
285
|
+
<div class="section-card">
|
|
286
|
+
<%- include('partials/phase-timeline.ejs') %>
|
|
287
|
+
</div>
|
|
288
|
+
|
|
289
|
+
<%- include('partials/blockers.ejs') %>
|
|
290
|
+
|
|
291
|
+
<% if (pendingApprovals && pendingApprovals.length > 0) { %>
|
|
292
|
+
<div class="space-lg"></div>
|
|
293
|
+
<div class="section-card">
|
|
294
|
+
<p class="label">⚠ Pending Approvals (<%= pendingApprovals.length %>)</p>
|
|
295
|
+
<div class="space-sm"></div>
|
|
296
|
+
<% for (const a of pendingApprovals) { %>
|
|
297
|
+
<div class="approval-item">
|
|
298
|
+
<div class="approval-trigger"><%= a.trigger %> — risk: <%= a.risk_score %></div>
|
|
299
|
+
<div class="approval-reason"><%= a.reason %></div>
|
|
300
|
+
<% if (a.file_path) { %><div style="font-size:11px;color:#9ca3af;margin-top:2px"><%= a.file_path %></div><% } %>
|
|
301
|
+
</div>
|
|
302
|
+
<% } %>
|
|
303
|
+
</div>
|
|
304
|
+
<% } %>
|
|
305
|
+
|
|
306
|
+
<% if (recentRuns && recentRuns.length > 0) { %>
|
|
307
|
+
<div class="space-lg"></div>
|
|
308
|
+
<div class="section-card">
|
|
309
|
+
<p class="label">Recent Runs</p>
|
|
310
|
+
<table class="table">
|
|
311
|
+
<thead>
|
|
312
|
+
<tr>
|
|
313
|
+
<th>Command</th><th>Status</th><th>Risk</th><th>Files</th><th>Started</th>
|
|
314
|
+
</tr>
|
|
315
|
+
</thead>
|
|
316
|
+
<tbody>
|
|
317
|
+
<% for (const r of recentRuns) { %>
|
|
318
|
+
<tr>
|
|
319
|
+
<td><code style="font-size:12px"><%= r.command %></code></td>
|
|
320
|
+
<td>
|
|
321
|
+
<span class="badge badge-<%= r.status === 'complete' ? 'ok' : r.status === 'failed' ? 'fail' : r.status === 'running' ? 'running' : 'pending' %>">
|
|
322
|
+
<%= r.status %>
|
|
323
|
+
</span>
|
|
324
|
+
</td>
|
|
325
|
+
<td>
|
|
326
|
+
<span class="badge badge-risk-<%= r.risk_score < 40 ? 'high' : r.risk_score < 70 ? 'med' : 'low' %>">
|
|
327
|
+
<%= r.risk_score %>
|
|
328
|
+
</span>
|
|
329
|
+
</td>
|
|
330
|
+
<td><%= r.files_touched %></td>
|
|
331
|
+
<td style="color:var(--color-text-muted);font-size:11px"><%= r.started_at.slice(0, 16).replace('T', ' ') %></td>
|
|
332
|
+
</tr>
|
|
333
|
+
<% } %>
|
|
334
|
+
</tbody>
|
|
335
|
+
</table>
|
|
336
|
+
</div>
|
|
337
|
+
<% } %>
|
|
338
|
+
|
|
339
|
+
<% if (telemetrySummary && telemetrySummary.length > 0) { %>
|
|
340
|
+
<div class="space-lg"></div>
|
|
341
|
+
<div class="section-card">
|
|
342
|
+
<p class="label">Command Telemetry</p>
|
|
343
|
+
<div class="ops-grid">
|
|
344
|
+
<% for (const s of telemetrySummary.slice(0, 4)) { %>
|
|
345
|
+
<div class="stat-card">
|
|
346
|
+
<div class="stat-value"><%= s.total_runs %></div>
|
|
347
|
+
<div class="stat-label"><%= s.command %></div>
|
|
348
|
+
<div style="font-size:11px;color:var(--color-text-muted);margin-top:4px">
|
|
349
|
+
✓ <%= s.successes %> ✗ <%= s.failures %> ~<%= s.avg_duration_ms %>ms
|
|
350
|
+
</div>
|
|
351
|
+
</div>
|
|
352
|
+
<% } %>
|
|
353
|
+
</div>
|
|
354
|
+
<% if (toolFailureCount > 0) { %>
|
|
355
|
+
<div style="margin-top:var(--space-sm);font-size:var(--font-label);color:#ef4444">
|
|
356
|
+
⚠ <%= toolFailureCount %> tool failures in recent session
|
|
357
|
+
</div>
|
|
358
|
+
<% } %>
|
|
359
|
+
</div>
|
|
360
|
+
<% } %>
|
|
361
|
+
|
|
362
|
+
<% if (agentPerf && agentPerf.length > 0) { %>
|
|
363
|
+
<div class="space-lg"></div>
|
|
364
|
+
<div class="section-card">
|
|
365
|
+
<p class="label">Agent Performance</p>
|
|
366
|
+
<table class="table">
|
|
367
|
+
<thead>
|
|
368
|
+
<tr><th>Agent</th><th>Model</th><th>Task</th><th>Success</th><th>Runs</th><th>Avg ms</th></tr>
|
|
369
|
+
</thead>
|
|
370
|
+
<tbody>
|
|
371
|
+
<% for (const p of agentPerf.slice(0, 8)) { %>
|
|
372
|
+
<tr>
|
|
373
|
+
<td><%= p.agent %></td>
|
|
374
|
+
<td style="font-size:11px;color:var(--color-text-muted)"><%= p.model.split('-').slice(-2).join('-') %></td>
|
|
375
|
+
<td><%= p.task_type %></td>
|
|
376
|
+
<td>
|
|
377
|
+
<span class="badge badge-<%= p.success_rate >= 80 ? 'ok' : p.success_rate >= 50 ? 'running' : 'fail' %>">
|
|
378
|
+
<%= p.success_rate %>%
|
|
379
|
+
</span>
|
|
380
|
+
</td>
|
|
381
|
+
<td><%= p.runs %></td>
|
|
382
|
+
<td><%= p.avg_duration_ms %></td>
|
|
383
|
+
</tr>
|
|
384
|
+
<% } %>
|
|
385
|
+
</tbody>
|
|
386
|
+
</table>
|
|
387
|
+
</div>
|
|
388
|
+
<% } %>
|
|
389
|
+
</main>
|
|
390
|
+
</body>
|
|
391
|
+
</html>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<% if (blockers && blockers.length > 0) { %>
|
|
2
|
+
<section class="blockers-panel">
|
|
3
|
+
<div class="heading">Pending Blockers</div>
|
|
4
|
+
<ul class="blockers-list">
|
|
5
|
+
<% blockers.forEach(function(blocker) { %>
|
|
6
|
+
<li class="blocker-item"><%= blocker %></li>
|
|
7
|
+
<% }); %>
|
|
8
|
+
</ul>
|
|
9
|
+
</section>
|
|
10
|
+
<% } %>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<header class="header">
|
|
2
|
+
<div class="header-top">
|
|
3
|
+
<div>
|
|
4
|
+
<div class="display"><%= project %></div>
|
|
5
|
+
<div class="header-milestone">
|
|
6
|
+
<span class="label">Milestone</span>
|
|
7
|
+
<span class="heading"><%= milestone %></span>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
<a href="/refresh" class="refresh-link" aria-label="Refresh dashboard">
|
|
11
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
12
|
+
<path d="M21 2v6h-6"/>
|
|
13
|
+
<path d="M3 12a9 9 0 0 1 15-6.7L21 8"/>
|
|
14
|
+
<path d="M3 22v-6h6"/>
|
|
15
|
+
<path d="M21 12a9 9 0 0 1-15 6.7L3 16"/>
|
|
16
|
+
</svg>
|
|
17
|
+
<span>Refresh</span>
|
|
18
|
+
</a>
|
|
19
|
+
</div>
|
|
20
|
+
</header>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<section class="phase-timeline">
|
|
2
|
+
<div class="heading">Phase Timeline</div>
|
|
3
|
+
<div class="phase-list">
|
|
4
|
+
<% if (phases.length === 0) { %>
|
|
5
|
+
<div class="empty-state">
|
|
6
|
+
<p class="empty-state-heading">No phases yet</p>
|
|
7
|
+
<p class="empty-state-body">Phases will appear here once they are defined in the roadmap.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<% } else { %>
|
|
10
|
+
<% phases.forEach(function(phase) { %>
|
|
11
|
+
<div class="phase-item phase-<%= phase.status %>">
|
|
12
|
+
<div class="phase-indicator">
|
|
13
|
+
<% if (phase.status === 'complete') { %>
|
|
14
|
+
<svg class="icon-check" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
|
|
15
|
+
<polyline points="20 6 9 17 4 12"/>
|
|
16
|
+
</svg>
|
|
17
|
+
<% } else if (phase.status === 'in_progress') { %>
|
|
18
|
+
<span class="phase-pulse"></span>
|
|
19
|
+
<% } else { %>
|
|
20
|
+
<span class="phase-dot"></span>
|
|
21
|
+
<% } %>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="phase-content">
|
|
24
|
+
<div class="phase-number">Phase <%= phase.number %></div>
|
|
25
|
+
<div class="phase-name"><%= phase.name %></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="phase-status">
|
|
28
|
+
<% if (phase.status === 'complete') { %>
|
|
29
|
+
<span class="status-complete">Complete</span>
|
|
30
|
+
<% } else if (phase.status === 'in_progress') { %>
|
|
31
|
+
<span class="status-in-progress">In Progress</span>
|
|
32
|
+
<% } else { %>
|
|
33
|
+
<span class="status-pending">Pending</span>
|
|
34
|
+
<% } %>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<% }); %>
|
|
38
|
+
<% } %>
|
|
39
|
+
</div>
|
|
40
|
+
</section>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<section class="progress-section">
|
|
2
|
+
<div class="progress-header">
|
|
3
|
+
<span class="label">Overall Progress</span>
|
|
4
|
+
<span class="progress-percent"><%= progress.percent %>%</span>
|
|
5
|
+
</div>
|
|
6
|
+
<div class="progress-bar-track">
|
|
7
|
+
<div class="progress-bar-fill" style="width: <%= progress.percent %>"></div>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="progress-detail">
|
|
10
|
+
<span class="body"><%= progress.completed %> of <%= progress.total %> phases complete</span>
|
|
11
|
+
</div>
|
|
12
|
+
</section>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function approvalHook(context: {
|
|
2
|
+
directory?: string;
|
|
3
|
+
}, toolInput: {
|
|
4
|
+
name?: string;
|
|
5
|
+
tool?: string;
|
|
6
|
+
parameters?: Record<string, unknown>;
|
|
7
|
+
}, _output: {
|
|
8
|
+
parts?: Array<{
|
|
9
|
+
type: string;
|
|
10
|
+
text: string;
|
|
11
|
+
}>;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=approval-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/approval-hook.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,CAChC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,SAAS,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACjF,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction Hook
|
|
3
|
+
* Fires on `experimental.session.compacting` to inject structured context
|
|
4
|
+
* so the LLM summarization preserves FlowDeck's planning state and recent work.
|
|
5
|
+
*
|
|
6
|
+
* Context includes:
|
|
7
|
+
* 1. FlowDeck planning state (phase, status, pending steps)
|
|
8
|
+
* 2. Recently edited files (from SessionFileTracker)
|
|
9
|
+
* 3. Structured 8-section summary prompt
|
|
10
|
+
*
|
|
11
|
+
* Inspired by oh-my-openagent's compaction-context-injector and
|
|
12
|
+
* ECC's experimental.session.compacting handler.
|
|
13
|
+
*/
|
|
14
|
+
import type { SessionFileTracker } from "./file-tracker";
|
|
15
|
+
export declare function createCompactionHook(ctx: {
|
|
16
|
+
directory: string;
|
|
17
|
+
}, tracker: SessionFileTracker): (_input: {
|
|
18
|
+
sessionID: string;
|
|
19
|
+
}, output: {
|
|
20
|
+
context: string[];
|
|
21
|
+
prompt?: string;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
//# sourceMappingURL=compaction-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/compaction-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAoDxD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,OAAO,EAAE,kBAAkB,IAGzB,QAAQ;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,mBA8BjD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Monitor
|
|
3
|
+
* Warns when session token usage exceeds 70% of the context limit.
|
|
4
|
+
* Appends a reminder to the next tool.execute.after output — once per session.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by oh-my-openagent's context-window-monitor.ts.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createContextWindowMonitorHook(): {
|
|
9
|
+
"tool.execute.after": (input: {
|
|
10
|
+
sessionID: string;
|
|
11
|
+
}, output: {
|
|
12
|
+
output: string;
|
|
13
|
+
}) => Promise<void>;
|
|
14
|
+
event: ({ event }: {
|
|
15
|
+
event: {
|
|
16
|
+
type: string;
|
|
17
|
+
properties?: unknown;
|
|
18
|
+
};
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=context-window-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-window-monitor.d.ts","sourceRoot":"","sources":["../../src/hooks/context-window-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH,wBAAgB,8BAA8B;kCAKnC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,UACpB;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;uBAwBI;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE;EAsBlF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Trace Hook
|
|
3
|
+
* Auto-records a concise decision entry whenever the agent applies a write or edit.
|
|
4
|
+
* Writes to .codebase/DECISIONS.jsonl for fast human review.
|
|
5
|
+
*/
|
|
6
|
+
export declare function decisionTraceHook(ctx: {
|
|
7
|
+
directory: string;
|
|
8
|
+
}, input: {
|
|
9
|
+
tool: string;
|
|
10
|
+
}, output: {
|
|
11
|
+
args: any;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=decision-trace-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-trace-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/decision-trace-hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,MAAM,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher + File Edited Hooks
|
|
3
|
+
* Tracks files modified during a session.
|
|
4
|
+
* Used by the compaction hook to include recently edited files in context.
|
|
5
|
+
*
|
|
6
|
+
* Ported/adapted from ECC's file.watcher.updated and file.edited handlers.
|
|
7
|
+
*/
|
|
8
|
+
export type ChangeType = "added" | "modified" | "deleted";
|
|
9
|
+
export interface FileChange {
|
|
10
|
+
path: string;
|
|
11
|
+
type: ChangeType;
|
|
12
|
+
}
|
|
13
|
+
export declare class SessionFileTracker {
|
|
14
|
+
private changes;
|
|
15
|
+
record(path: string, type: ChangeType): void;
|
|
16
|
+
getChanges(): FileChange[];
|
|
17
|
+
getEditedPaths(): string[];
|
|
18
|
+
clear(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare function createFileTrackerHooks(tracker: SessionFileTracker): {
|
|
21
|
+
fileEdited: (event: {
|
|
22
|
+
path: string;
|
|
23
|
+
}) => void;
|
|
24
|
+
fileWatcherUpdated: (event: {
|
|
25
|
+
path: string;
|
|
26
|
+
type: string;
|
|
27
|
+
}) => void;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=file-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-tracker.d.ts","sourceRoot":"","sources":["../../src/hooks/file-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAgC;IAE/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAI5C,UAAU,IAAI,UAAU,EAAE;IAI1B,cAAc,IAAI,MAAM,EAAE;IAM1B,KAAK,IAAI,IAAI;CAGd;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB;wBACrC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;gCAIR;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;EAQlE"}
|