@devran-ai/kit 4.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/.agent/CheatSheet.md +350 -0
- package/.agent/README.md +76 -0
- package/.agent/agents/README.md +155 -0
- package/.agent/agents/architect.md +185 -0
- package/.agent/agents/backend-specialist.md +276 -0
- package/.agent/agents/build-error-resolver.md +207 -0
- package/.agent/agents/code-reviewer.md +162 -0
- package/.agent/agents/database-architect.md +138 -0
- package/.agent/agents/devops-engineer.md +144 -0
- package/.agent/agents/doc-updater.md +229 -0
- package/.agent/agents/e2e-runner.md +145 -0
- package/.agent/agents/explorer-agent.md +143 -0
- package/.agent/agents/frontend-specialist.md +144 -0
- package/.agent/agents/go-reviewer.md +128 -0
- package/.agent/agents/knowledge-agent.md +197 -0
- package/.agent/agents/mobile-developer.md +150 -0
- package/.agent/agents/performance-optimizer.md +175 -0
- package/.agent/agents/planner.md +133 -0
- package/.agent/agents/pr-reviewer.md +148 -0
- package/.agent/agents/python-reviewer.md +123 -0
- package/.agent/agents/refactor-cleaner.md +201 -0
- package/.agent/agents/reliability-engineer.md +156 -0
- package/.agent/agents/security-reviewer.md +141 -0
- package/.agent/agents/sprint-orchestrator.md +124 -0
- package/.agent/agents/tdd-guide.md +179 -0
- package/.agent/agents/typescript-reviewer.md +110 -0
- package/.agent/checklists/README.md +102 -0
- package/.agent/checklists/pre-commit.md +93 -0
- package/.agent/checklists/session-end.md +99 -0
- package/.agent/checklists/session-start.md +102 -0
- package/.agent/checklists/task-complete.md +81 -0
- package/.agent/commands/README.md +130 -0
- package/.agent/commands/adr.md +29 -0
- package/.agent/commands/ask.md +28 -0
- package/.agent/commands/build.md +30 -0
- package/.agent/commands/changelog.md +40 -0
- package/.agent/commands/checkpoint.md +28 -0
- package/.agent/commands/code-review.md +65 -0
- package/.agent/commands/compact.md +28 -0
- package/.agent/commands/cook.md +30 -0
- package/.agent/commands/db.md +30 -0
- package/.agent/commands/debug.md +31 -0
- package/.agent/commands/deploy.md +37 -0
- package/.agent/commands/design.md +29 -0
- package/.agent/commands/doc.md +30 -0
- package/.agent/commands/eval.md +30 -0
- package/.agent/commands/fix.md +32 -0
- package/.agent/commands/git.md +32 -0
- package/.agent/commands/help.md +273 -0
- package/.agent/commands/implement.md +30 -0
- package/.agent/commands/integrate.md +32 -0
- package/.agent/commands/learn.md +29 -0
- package/.agent/commands/perf.md +31 -0
- package/.agent/commands/plan.md +56 -0
- package/.agent/commands/pr-describe.md +65 -0
- package/.agent/commands/pr-fix.md +45 -0
- package/.agent/commands/pr-merge.md +45 -0
- package/.agent/commands/pr-review.md +50 -0
- package/.agent/commands/pr-split.md +54 -0
- package/.agent/commands/pr-status.md +56 -0
- package/.agent/commands/pr.md +58 -0
- package/.agent/commands/refactor.md +32 -0
- package/.agent/commands/research.md +28 -0
- package/.agent/commands/scout.md +30 -0
- package/.agent/commands/security-scan.md +33 -0
- package/.agent/commands/setup.md +31 -0
- package/.agent/commands/status.md +59 -0
- package/.agent/commands/tdd.md +73 -0
- package/.agent/commands/verify.md +58 -0
- package/.agent/contexts/brainstorm.md +26 -0
- package/.agent/contexts/debug.md +28 -0
- package/.agent/contexts/implement.md +29 -0
- package/.agent/contexts/plan-quality-log.md +30 -0
- package/.agent/contexts/review.md +27 -0
- package/.agent/contexts/ship.md +28 -0
- package/.agent/decisions/001-trust-grade-governance.md +46 -0
- package/.agent/decisions/002-cross-ide-generation.md +15 -0
- package/.agent/engine/identity.json +4 -0
- package/.agent/engine/loading-rules.json +193 -0
- package/.agent/engine/marketplace-index.json +29 -0
- package/.agent/engine/mcp-servers/filesystem.json +9 -0
- package/.agent/engine/mcp-servers/github.json +11 -0
- package/.agent/engine/mcp-servers/postgres.json +11 -0
- package/.agent/engine/mcp-servers/supabase.json +11 -0
- package/.agent/engine/mcp-servers/vercel.json +11 -0
- package/.agent/engine/reliability-config.json +14 -0
- package/.agent/engine/sdlc-map.json +50 -0
- package/.agent/engine/workflow-state.json +167 -0
- package/.agent/hooks/README.md +101 -0
- package/.agent/hooks/hooks.json +104 -0
- package/.agent/hooks/templates/session-end.md +110 -0
- package/.agent/hooks/templates/session-start.md +95 -0
- package/.agent/manifest.json +466 -0
- package/.agent/rules/agent-upgrade-policy.md +56 -0
- package/.agent/rules/architecture.md +111 -0
- package/.agent/rules/coding-style.md +75 -0
- package/.agent/rules/documentation.md +74 -0
- package/.agent/rules/git-workflow.md +140 -0
- package/.agent/rules/quality-gate.md +117 -0
- package/.agent/rules/security.md +67 -0
- package/.agent/rules/sprint-tracking.md +103 -0
- package/.agent/rules/testing.md +80 -0
- package/.agent/rules/workflow-standards.md +30 -0
- package/.agent/rules.md +293 -0
- package/.agent/session-context.md +69 -0
- package/.agent/session-state.json +27 -0
- package/.agent/skills/README.md +135 -0
- package/.agent/skills/api-patterns/SKILL.md +117 -0
- package/.agent/skills/app-builder/SKILL.md +202 -0
- package/.agent/skills/architecture/SKILL.md +101 -0
- package/.agent/skills/behavioral-modes/SKILL.md +295 -0
- package/.agent/skills/brainstorming/SKILL.md +156 -0
- package/.agent/skills/clean-code/SKILL.md +142 -0
- package/.agent/skills/context-budget/SKILL.md +78 -0
- package/.agent/skills/continuous-learning/SKILL.md +145 -0
- package/.agent/skills/database-design/SKILL.md +303 -0
- package/.agent/skills/debugging-strategies/SKILL.md +158 -0
- package/.agent/skills/deployment-procedures/SKILL.md +191 -0
- package/.agent/skills/docker-patterns/SKILL.md +161 -0
- package/.agent/skills/eval-harness/SKILL.md +89 -0
- package/.agent/skills/frontend-patterns/SKILL.md +141 -0
- package/.agent/skills/git-workflow/SKILL.md +159 -0
- package/.agent/skills/i18n-localization/SKILL.md +191 -0
- package/.agent/skills/intelligent-routing/SKILL.md +180 -0
- package/.agent/skills/mcp-integration/SKILL.md +240 -0
- package/.agent/skills/mobile-design/SKILL.md +191 -0
- package/.agent/skills/nodejs-patterns/SKILL.md +164 -0
- package/.agent/skills/parallel-agents/SKILL.md +200 -0
- package/.agent/skills/performance-profiling/SKILL.md +134 -0
- package/.agent/skills/plan-validation/SKILL.md +192 -0
- package/.agent/skills/plan-writing/SKILL.md +183 -0
- package/.agent/skills/plan-writing/domain-enhancers.md +184 -0
- package/.agent/skills/plan-writing/plan-retrospective.md +116 -0
- package/.agent/skills/plan-writing/plan-schema.md +119 -0
- package/.agent/skills/pr-toolkit/SKILL.md +174 -0
- package/.agent/skills/production-readiness/SKILL.md +126 -0
- package/.agent/skills/security-practices/SKILL.md +109 -0
- package/.agent/skills/shell-conventions/SKILL.md +92 -0
- package/.agent/skills/strategic-compact/SKILL.md +62 -0
- package/.agent/skills/testing-patterns/SKILL.md +141 -0
- package/.agent/skills/typescript-expert/SKILL.md +160 -0
- package/.agent/skills/ui-ux-pro-max/SKILL.md +137 -0
- package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/.agent/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/.agent/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/.agent/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/.agent/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/.agent/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/.agent/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agent/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.agent/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/.agent/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/.agent/skills/verification-loop/SKILL.md +89 -0
- package/.agent/skills/webapp-testing/SKILL.md +175 -0
- package/.agent/templates/adr-template.md +32 -0
- package/.agent/templates/bug-report.md +37 -0
- package/.agent/templates/feature-request.md +32 -0
- package/.agent/workflows/README.md +101 -0
- package/.agent/workflows/brainstorm.md +86 -0
- package/.agent/workflows/create.md +85 -0
- package/.agent/workflows/debug.md +83 -0
- package/.agent/workflows/deploy.md +114 -0
- package/.agent/workflows/enhance.md +85 -0
- package/.agent/workflows/orchestrate.md +106 -0
- package/.agent/workflows/plan.md +105 -0
- package/.agent/workflows/pr-fix.md +163 -0
- package/.agent/workflows/pr-merge.md +117 -0
- package/.agent/workflows/pr-review.md +178 -0
- package/.agent/workflows/pr-split.md +118 -0
- package/.agent/workflows/pr.md +184 -0
- package/.agent/workflows/preflight.md +107 -0
- package/.agent/workflows/preview.md +95 -0
- package/.agent/workflows/quality-gate.md +103 -0
- package/.agent/workflows/retrospective.md +100 -0
- package/.agent/workflows/review.md +104 -0
- package/.agent/workflows/status.md +89 -0
- package/.agent/workflows/test.md +98 -0
- package/.agent/workflows/ui-ux-pro-max.md +93 -0
- package/.agent/workflows/upgrade.md +97 -0
- package/LICENSE +21 -0
- package/README.md +218 -0
- package/bin/kit.js +773 -0
- package/lib/agent-registry.js +228 -0
- package/lib/agent-reputation.js +343 -0
- package/lib/circuit-breaker.js +195 -0
- package/lib/cli-commands.js +322 -0
- package/lib/config-validator.js +274 -0
- package/lib/conflict-detector.js +252 -0
- package/lib/constants.js +47 -0
- package/lib/engineering-manager.js +336 -0
- package/lib/error-budget.js +370 -0
- package/lib/hook-system.js +256 -0
- package/lib/ide-generator.js +434 -0
- package/lib/identity.js +240 -0
- package/lib/io.js +146 -0
- package/lib/learning-engine.js +163 -0
- package/lib/loading-engine.js +421 -0
- package/lib/logger.js +118 -0
- package/lib/marketplace.js +321 -0
- package/lib/plugin-system.js +604 -0
- package/lib/plugin-verifier.js +197 -0
- package/lib/rate-limiter.js +113 -0
- package/lib/security-scanner.js +312 -0
- package/lib/self-healing.js +468 -0
- package/lib/session-manager.js +264 -0
- package/lib/skill-sandbox.js +244 -0
- package/lib/task-governance.js +522 -0
- package/lib/task-model.js +332 -0
- package/lib/updater.js +240 -0
- package/lib/verify.js +279 -0
- package/lib/workflow-engine.js +373 -0
- package/lib/workflow-events.js +166 -0
- package/lib/workflow-persistence.js +160 -0
- package/package.json +57 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devran AI Kit — Workflow Event Emitter
|
|
3
|
+
*
|
|
4
|
+
* Provides an event-driven interface for workflow state transitions.
|
|
5
|
+
* Enables reactive hook triggering and observability when the
|
|
6
|
+
* workflow engine changes phases.
|
|
7
|
+
*
|
|
8
|
+
* @module lib/workflow-events
|
|
9
|
+
* @author Emre Dursun
|
|
10
|
+
* @since v3.2.0
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
const { EventEmitter } = require('events');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {object} WorkflowEvent
|
|
19
|
+
* @property {string} type - Event type
|
|
20
|
+
* @property {string} fromPhase - Source phase
|
|
21
|
+
* @property {string} toPhase - Target phase
|
|
22
|
+
* @property {string} trigger - What triggered the transition
|
|
23
|
+
* @property {string} timestamp - ISO timestamp
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** Singleton workflow event bus */
|
|
27
|
+
const workflowBus = new EventEmitter();
|
|
28
|
+
|
|
29
|
+
/** Event type constants */
|
|
30
|
+
const EVENTS = {
|
|
31
|
+
TRANSITION_START: 'workflow:transition:start',
|
|
32
|
+
TRANSITION_COMPLETE: 'workflow:transition:complete',
|
|
33
|
+
TRANSITION_FAILED: 'workflow:transition:failed',
|
|
34
|
+
PHASE_ENTERED: 'workflow:phase:entered',
|
|
35
|
+
WORKFLOW_RESET: 'workflow:reset',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Emits a transition start event.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} fromPhase - Source phase
|
|
42
|
+
* @param {string} toPhase - Target phase
|
|
43
|
+
* @param {string} trigger - Transition trigger
|
|
44
|
+
* @returns {void}
|
|
45
|
+
*/
|
|
46
|
+
function emitTransitionStart(fromPhase, toPhase, trigger) {
|
|
47
|
+
const event = {
|
|
48
|
+
type: EVENTS.TRANSITION_START,
|
|
49
|
+
fromPhase,
|
|
50
|
+
toPhase,
|
|
51
|
+
trigger,
|
|
52
|
+
timestamp: new Date().toISOString(),
|
|
53
|
+
};
|
|
54
|
+
workflowBus.emit(EVENTS.TRANSITION_START, event);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Emits a transition complete event.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} fromPhase - Source phase
|
|
61
|
+
* @param {string} toPhase - Target phase
|
|
62
|
+
* @param {string} trigger - Transition trigger
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
function emitTransitionComplete(fromPhase, toPhase, trigger) {
|
|
66
|
+
const event = {
|
|
67
|
+
type: EVENTS.TRANSITION_COMPLETE,
|
|
68
|
+
fromPhase,
|
|
69
|
+
toPhase,
|
|
70
|
+
trigger,
|
|
71
|
+
timestamp: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
workflowBus.emit(EVENTS.TRANSITION_COMPLETE, event);
|
|
74
|
+
workflowBus.emit(EVENTS.PHASE_ENTERED, { ...event, type: EVENTS.PHASE_ENTERED, phase: toPhase });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Emits a transition failed event.
|
|
79
|
+
*
|
|
80
|
+
* @param {string} fromPhase - Source phase
|
|
81
|
+
* @param {string} toPhase - Target phase
|
|
82
|
+
* @param {string} error - Error message
|
|
83
|
+
* @returns {void}
|
|
84
|
+
*/
|
|
85
|
+
function emitTransitionFailed(fromPhase, toPhase, error) {
|
|
86
|
+
const event = {
|
|
87
|
+
type: EVENTS.TRANSITION_FAILED,
|
|
88
|
+
fromPhase,
|
|
89
|
+
toPhase,
|
|
90
|
+
trigger: '',
|
|
91
|
+
error,
|
|
92
|
+
timestamp: new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
workflowBus.emit(EVENTS.TRANSITION_FAILED, event);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Emits a workflow reset event.
|
|
99
|
+
*
|
|
100
|
+
* @param {string} previousPhase - Phase before reset
|
|
101
|
+
* @returns {void}
|
|
102
|
+
*/
|
|
103
|
+
function emitWorkflowReset(previousPhase) {
|
|
104
|
+
const event = {
|
|
105
|
+
type: EVENTS.WORKFLOW_RESET,
|
|
106
|
+
fromPhase: previousPhase,
|
|
107
|
+
toPhase: 'IDLE',
|
|
108
|
+
trigger: 'reset',
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
};
|
|
111
|
+
workflowBus.emit(EVENTS.WORKFLOW_RESET, event);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Subscribes to a workflow event.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} eventType - Event type from EVENTS
|
|
118
|
+
* @param {Function} handler - Event handler
|
|
119
|
+
* @returns {void}
|
|
120
|
+
*/
|
|
121
|
+
function on(eventType, handler) {
|
|
122
|
+
workflowBus.on(eventType, handler);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Subscribes to a workflow event once.
|
|
127
|
+
*
|
|
128
|
+
* @param {string} eventType - Event type from EVENTS
|
|
129
|
+
* @param {Function} handler - Event handler
|
|
130
|
+
* @returns {void}
|
|
131
|
+
*/
|
|
132
|
+
function once(eventType, handler) {
|
|
133
|
+
workflowBus.once(eventType, handler);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Removes an event listener.
|
|
138
|
+
*
|
|
139
|
+
* @param {string} eventType - Event type
|
|
140
|
+
* @param {Function} handler - Handler to remove
|
|
141
|
+
* @returns {void}
|
|
142
|
+
*/
|
|
143
|
+
function off(eventType, handler) {
|
|
144
|
+
workflowBus.off(eventType, handler);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Removes all listeners for testing cleanup.
|
|
149
|
+
*
|
|
150
|
+
* @returns {void}
|
|
151
|
+
*/
|
|
152
|
+
function removeAllListeners() {
|
|
153
|
+
workflowBus.removeAllListeners();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
module.exports = {
|
|
157
|
+
EVENTS,
|
|
158
|
+
emitTransitionStart,
|
|
159
|
+
emitTransitionComplete,
|
|
160
|
+
emitTransitionFailed,
|
|
161
|
+
emitWorkflowReset,
|
|
162
|
+
on,
|
|
163
|
+
once,
|
|
164
|
+
off,
|
|
165
|
+
removeAllListeners,
|
|
166
|
+
};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devran AI Kit — Workflow Persistence
|
|
3
|
+
*
|
|
4
|
+
* Extends the workflow engine with checkpoint/resume capability.
|
|
5
|
+
* Workflow state survives across agent sessions via JSON file snapshots.
|
|
6
|
+
*
|
|
7
|
+
* @module lib/workflow-persistence
|
|
8
|
+
* @author Emre Dursun
|
|
9
|
+
* @since v3.0.0
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const crypto = require('crypto');
|
|
17
|
+
const workflowEngine = require('./workflow-engine');
|
|
18
|
+
|
|
19
|
+
const { AGENT_DIR, ENGINE_DIR } = require('./constants');
|
|
20
|
+
const { writeJsonAtomic } = require('./io');
|
|
21
|
+
const CHECKPOINTS_DIR = 'checkpoints';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolves the checkpoints directory path.
|
|
25
|
+
*
|
|
26
|
+
* @param {string} projectRoot - Root directory of the project
|
|
27
|
+
* @returns {string} Absolute path to checkpoints directory
|
|
28
|
+
*/
|
|
29
|
+
function resolveCheckpointsDir(projectRoot) {
|
|
30
|
+
return path.join(projectRoot, AGENT_DIR, ENGINE_DIR, CHECKPOINTS_DIR);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Creates a checkpoint of the current workflow state.
|
|
35
|
+
*
|
|
36
|
+
* @param {string} projectRoot - Root directory of the project
|
|
37
|
+
* @param {string} [label] - Optional human-readable label
|
|
38
|
+
* @returns {{ checkpointId: string, filePath: string, timestamp: string }}
|
|
39
|
+
*/
|
|
40
|
+
function createCheckpoint(projectRoot, label) {
|
|
41
|
+
const { state } = workflowEngine.loadWorkflowState(projectRoot);
|
|
42
|
+
const checkpointsDir = resolveCheckpointsDir(projectRoot);
|
|
43
|
+
|
|
44
|
+
const timestamp = new Date().toISOString();
|
|
45
|
+
const checkpointId = crypto.randomUUID().slice(0, 8);
|
|
46
|
+
|
|
47
|
+
const checkpoint = {
|
|
48
|
+
id: checkpointId,
|
|
49
|
+
label: label || `Checkpoint at ${state.currentPhase}`,
|
|
50
|
+
timestamp,
|
|
51
|
+
phase: state.currentPhase,
|
|
52
|
+
state: JSON.parse(JSON.stringify(state)),
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const filePath = path.join(checkpointsDir, `${checkpointId}.json`);
|
|
56
|
+
writeJsonAtomic(filePath, checkpoint);
|
|
57
|
+
|
|
58
|
+
return { checkpointId, filePath, timestamp };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Lists all available checkpoints, sorted by timestamp (newest first).
|
|
63
|
+
*
|
|
64
|
+
* @param {string} projectRoot - Root directory of the project
|
|
65
|
+
* @returns {Array<{ id: string, label: string, phase: string, timestamp: string }>}
|
|
66
|
+
*/
|
|
67
|
+
function listCheckpoints(projectRoot) {
|
|
68
|
+
const checkpointsDir = resolveCheckpointsDir(projectRoot);
|
|
69
|
+
|
|
70
|
+
if (!fs.existsSync(checkpointsDir)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const files = fs.readdirSync(checkpointsDir).filter((f) => f.endsWith('.json'));
|
|
75
|
+
|
|
76
|
+
return files
|
|
77
|
+
.map((file) => {
|
|
78
|
+
try {
|
|
79
|
+
const data = JSON.parse(fs.readFileSync(path.join(checkpointsDir, file), 'utf-8'));
|
|
80
|
+
return { id: data.id, label: data.label, phase: data.phase, timestamp: data.timestamp };
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Restores workflow state from a checkpoint.
|
|
91
|
+
*
|
|
92
|
+
* @param {string} projectRoot - Root directory of the project
|
|
93
|
+
* @param {string} checkpointId - ID of the checkpoint to restore
|
|
94
|
+
* @returns {{ success: boolean, restoredPhase: string }}
|
|
95
|
+
*/
|
|
96
|
+
function resumeFromCheckpoint(projectRoot, checkpointId) {
|
|
97
|
+
const checkpointsDir = resolveCheckpointsDir(projectRoot);
|
|
98
|
+
const filePath = path.join(checkpointsDir, `${checkpointId}.json`);
|
|
99
|
+
|
|
100
|
+
if (!fs.existsSync(filePath)) {
|
|
101
|
+
throw new Error(`Checkpoint not found: ${checkpointId}`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const checkpoint = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
105
|
+
const statePath = path.join(projectRoot, AGENT_DIR, ENGINE_DIR, 'workflow-state.json');
|
|
106
|
+
|
|
107
|
+
// Create restored state with appended history (H-9: immutable — no mutation of checkpoint)
|
|
108
|
+
const restoredState = {
|
|
109
|
+
...checkpoint.state,
|
|
110
|
+
history: [
|
|
111
|
+
...(checkpoint.state.history || []),
|
|
112
|
+
{
|
|
113
|
+
from: 'RESTORED',
|
|
114
|
+
to: checkpoint.state.currentPhase,
|
|
115
|
+
trigger: `Restored from checkpoint ${checkpointId}`,
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
writeJsonAtomic(statePath, restoredState);
|
|
122
|
+
|
|
123
|
+
return { success: true, restoredPhase: checkpoint.state.currentPhase };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Returns a rich summary of the current workflow state.
|
|
128
|
+
*
|
|
129
|
+
* @param {string} projectRoot - Root directory of the project
|
|
130
|
+
* @returns {object} Workflow summary with phase durations and checkpoint count
|
|
131
|
+
*/
|
|
132
|
+
function getWorkflowSummary(projectRoot) {
|
|
133
|
+
const { state } = workflowEngine.loadWorkflowState(projectRoot);
|
|
134
|
+
const checkpoints = listCheckpoints(projectRoot);
|
|
135
|
+
const history = state.history || [];
|
|
136
|
+
|
|
137
|
+
const phaseDurations = {};
|
|
138
|
+
for (const [phaseName, phaseData] of Object.entries(state.phases || {})) {
|
|
139
|
+
if (phaseData.startedAt && phaseData.completedAt) {
|
|
140
|
+
const duration = new Date(phaseData.completedAt).getTime() - new Date(phaseData.startedAt).getTime();
|
|
141
|
+
phaseDurations[phaseName] = Math.round(duration / 1000);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
currentPhase: state.currentPhase,
|
|
147
|
+
startedAt: state.startedAt,
|
|
148
|
+
transitionCount: history.length,
|
|
149
|
+
checkpointCount: checkpoints.length,
|
|
150
|
+
phaseDurations,
|
|
151
|
+
lastTransition: history.length > 0 ? history[history.length - 1] : null,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
module.exports = {
|
|
156
|
+
createCheckpoint,
|
|
157
|
+
listCheckpoints,
|
|
158
|
+
resumeFromCheckpoint,
|
|
159
|
+
getWorkflowSummary,
|
|
160
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@devran-ai/kit",
|
|
3
|
+
"version": "4.1.0",
|
|
4
|
+
"description": "Trust-grade AI development framework — zero-dependency runtime engine for agent orchestration, workflow governance, and skill management.",
|
|
5
|
+
"main": "bin/kit.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"kit": "./bin/kit.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "vitest run",
|
|
11
|
+
"test:watch": "vitest watch",
|
|
12
|
+
"preversion": "npm test",
|
|
13
|
+
"version": "node scripts/sync-version.js && git add -A -- . ':!.agent/engine/identity.json'",
|
|
14
|
+
"prepublishOnly": "node scripts/clean-identity.js",
|
|
15
|
+
"postinstall": "echo 'Devran AI Kit installed. Run: kit init'"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"ai",
|
|
19
|
+
"agents",
|
|
20
|
+
"gemini",
|
|
21
|
+
"claude",
|
|
22
|
+
"devran-ai",
|
|
23
|
+
"kit",
|
|
24
|
+
"governance",
|
|
25
|
+
"development",
|
|
26
|
+
"workflow",
|
|
27
|
+
"skills",
|
|
28
|
+
"commands",
|
|
29
|
+
"devtools",
|
|
30
|
+
"productivity",
|
|
31
|
+
"cli"
|
|
32
|
+
],
|
|
33
|
+
"author": "Emre Dursun <info.emredursun@gmail.com>",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/devran-ai/kit.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/devran-ai/kit/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/devran-ai/kit#readme",
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18.0.0",
|
|
45
|
+
"npm": ">=9.0.0"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"bin/",
|
|
49
|
+
"lib/",
|
|
50
|
+
".agent/",
|
|
51
|
+
"README.md",
|
|
52
|
+
"LICENSE"
|
|
53
|
+
],
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"vitest": "^4.1.0"
|
|
56
|
+
}
|
|
57
|
+
}
|