@reactive-skills/runtime 0.3.0 โ 0.4.1
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 +53 -0
- package/README.md +6 -3
- package/dist/core/projection-engine.d.ts +1 -0
- package/dist/core/projection-engine.js +1 -0
- package/dist/mcp/server.js +104 -1
- package/package.json +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
|
|
2
|
+
## [0.4.1] - 2026-09-14
|
|
3
|
+
|
|
4
|
+
- feat(runtime,axi): add mcp job tools, template jobId context, and flexible jobs cli arguments (2b31451)
|
|
5
|
+
- feat(mcp): add reactive_switch_job and reactive_archive_job tools with active job indicators
|
|
6
|
+
- feat(projections): expose jobId directly in ProjectionContext for Handlebars templates
|
|
7
|
+
- feat(axi): support bidirectional argument ordering in jobs command (jobs list <skill> and jobs <skill> list)
|
|
8
|
+
- docs: introduce PERFORMANCE-STANDARDS.md for P0-P3 latency budgets, caching tiers, and CRAP score limits
|
|
9
|
+
|
|
10
|
+
## [0.4.0] - 2026-09-14
|
|
11
|
+
|
|
12
|
+
- feat(axi): implement native validate command for skill manifest and statechart verification (3b75a21)
|
|
13
|
+
- docs: add v0.3.0 release highlights to READMEs and bundle changelog in package files (732f72b)
|
|
14
|
+
- chore: release v0.3.0 (ae379ca)
|
|
15
|
+
- feat(core): implement job management, isolated run storage, dual-write projections, and AXI jobs suite (c76c6cb)
|
|
16
|
+
- chore: release v0.2.0 (bb33cfc)
|
|
17
|
+
|
|
18
|
+
## [0.3.0] - 2026-09-13
|
|
19
|
+
|
|
20
|
+
- feat(core): implement job management, isolated run storage, dual-write projections, and AXI jobs suite (c76c6cb)
|
|
21
|
+
|
|
22
|
+
## [2.0.0] - 2026-09-01
|
|
23
|
+
|
|
24
|
+
- feat: implement SQLite event store engine, state snapshotting, and JSONL log rotation with supporting documentation (6912493)
|
|
25
|
+
- feat: implement skill-scoped SQLite event storage and migration infrastructure (b28fb19)
|
|
26
|
+
- feat: implement core event-store with SQLite persistence, FSM engine, and projection tracking. (5926118)
|
|
27
|
+
- feat: implement reactive skill core with FSM engine, event-sourced SQLite storage, and Zod-validated manifest schemas (b542c0a)
|
|
28
|
+
- feat: add CLI tool for reactive skill management, project documentation, and state inspection workflows (39830d0)
|
|
29
|
+
|
|
30
|
+
## [1.0.3] - 2026-08-31
|
|
31
|
+
|
|
32
|
+
- refactor(core): migrate to clean semantic state filenames and convention-over-configuration resolution (8180b1b)
|
|
33
|
+
- feat(hitl): add pre-implementation collaboration gate with 3 interaction modes (direct build, brainstorm, plan review) (0cd22b7)
|
|
34
|
+
- fix(core): resolve P2 memory leak - add bounded in-memory sliding buffer with SQLite backing (7fefae5)
|
|
35
|
+
- fix(core): resolve all Principal Engineer review findings - state rehydration, lifecycle signal queue, VM sandbox, and dual-write durability (791753e)
|
|
36
|
+
- feat(mcp): add reactive_migrate tool to MCP server suite (e35779c)
|
|
37
|
+
|
|
38
|
+
## [1.0.2] - 2026-08-31
|
|
39
|
+
|
|
40
|
+
- chore(release): add automated multi-file semver bumping script and changelog generator (d0f9abd)
|
|
41
|
+
- feat(docs): add automated doc invariant checker script and synchronize all project docs (280a95d)
|
|
42
|
+
- feat(core): upgrade to v2 with Event Modeling 4-slice CQRS, statechart topology validation, and retroactive migration (c9801ed)
|
|
43
|
+
- docs: clarify workspace layout, file destination paths, and greenfield/brownfield execution (1c79455)
|
|
44
|
+
- docs: add Model Context Protocol (MCP) server documentation to README, architecture, and AGENTS (f2e638b)
|
|
45
|
+
# Changelog
|
|
46
|
+
|
|
47
|
+
## [1.0.1] - 2026-08-31
|
|
48
|
+
|
|
49
|
+
- feat(docs): add automated doc invariant checker script and synchronize all project docs (280a95d)
|
|
50
|
+
- feat(core): upgrade to v2 with Event Modeling 4-slice CQRS, statechart topology validation, and retroactive migration (c9801ed)
|
|
51
|
+
- docs: clarify workspace layout, file destination paths, and greenfield/brownfield execution (1c79455)
|
|
52
|
+
- docs: add Model Context Protocol (MCP) server documentation to README, architecture, and AGENTS (f2e638b)
|
|
53
|
+
- feat(mcp): build universal reactive-mcp-server with 6 tools and live resources (9a01807)
|
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @reactive-skills/runtime
|
|
2
2
|
|
|
3
|
-
Reactive Skills Architecture (RSA) core runtime
|
|
3
|
+
Reactive Skills Architecture (RSA) core runtime โ FSM engine, event store, guard evaluator, projection engine, job manager, and MCP server.
|
|
4
|
+
|
|
5
|
+
> ๐ **What's New in v0.4.1:** MCP job management tools (`reactive_switch_job`, `reactive_archive_job`), template-level `jobId` context, and `PERFORMANCE-STANDARDS.md`. [Read Full Release Notes โ](https://github.com/Reactive-Skills/reactive-skills/releases/tag/v0.4.1) ยท [View Changelog](https://github.com/Reactive-Skills/reactive-skills/blob/main/CHANGELOG.md)
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
@@ -11,15 +13,16 @@ npm install @reactive-skills/runtime
|
|
|
11
13
|
## Usage
|
|
12
14
|
|
|
13
15
|
```ts
|
|
14
|
-
import { FSMEngine, EventStore, LegacySkillAdapter, ProjectionEngine } from '@reactive-skills/runtime';
|
|
16
|
+
import { FSMEngine, EventStore, JobManager, LegacySkillAdapter, ProjectionEngine } from '@reactive-skills/runtime';
|
|
15
17
|
```
|
|
16
18
|
|
|
17
19
|
## Core Modules
|
|
18
20
|
|
|
19
21
|
- `FSMEngine` - Hierarchical State Machine loader, state path resolver, and signal-driven transition engine
|
|
22
|
+
- `JobManager` - Run isolation, active pointer resolution, metadata management, and safe directory pathing
|
|
20
23
|
- `EventStore` - Immutable append-only event ledger (JSONL + SQLite)
|
|
21
24
|
- `GuardEvaluator` - Sandbox evaluator for transition guard expressions
|
|
22
|
-
- `ProjectionEngine` - Handlebars deliverable generator for read-model projections
|
|
25
|
+
- `ProjectionEngine` - Handlebars deliverable generator for read-model projections with dual-write archiving
|
|
23
26
|
- `LegacySkillAdapter` - Backward compatibility wrapper and converter for SKILL.md
|
|
24
27
|
- `McpServer` - Stdio Model Context Protocol (MCP) server integration
|
|
25
28
|
- `TelemetryServer` - Real-time Server-Sent Events (SSE) broadcaster and Private Network Access (PNA) HTTP bridge
|
package/dist/mcp/server.js
CHANGED
|
@@ -455,7 +455,10 @@ export function createReactiveMcpServer(options = {}) {
|
|
|
455
455
|
const targetSkill = skill || defaultSkill;
|
|
456
456
|
const jobManager = new JobManager(workspaceDir);
|
|
457
457
|
const activeJobId = jobManager.getActiveJobId(targetSkill);
|
|
458
|
-
const jobs = jobManager.listJobs(targetSkill)
|
|
458
|
+
const jobs = jobManager.listJobs(targetSkill).map(j => ({
|
|
459
|
+
...j,
|
|
460
|
+
isActive: j.id === activeJobId,
|
|
461
|
+
}));
|
|
459
462
|
return {
|
|
460
463
|
content: [
|
|
461
464
|
{
|
|
@@ -476,6 +479,106 @@ export function createReactiveMcpServer(options = {}) {
|
|
|
476
479
|
};
|
|
477
480
|
}
|
|
478
481
|
});
|
|
482
|
+
// 10. TOOL: reactive_switch_job
|
|
483
|
+
server.tool('reactive_switch_job', 'Switch the active execution job pointer for a reactive skill and synchronize deliverables', {
|
|
484
|
+
skill: z.string().optional().describe('Name of the reactive skill (defaults to active skill)'),
|
|
485
|
+
job_id: z.string().describe('Target job ID to set as active'),
|
|
486
|
+
}, async ({ skill, job_id }) => {
|
|
487
|
+
try {
|
|
488
|
+
const skillName = skill || defaultSkill;
|
|
489
|
+
const jobManager = new JobManager(workspaceDir);
|
|
490
|
+
const job = jobManager.getJob(skillName, job_id);
|
|
491
|
+
if (!job) {
|
|
492
|
+
return {
|
|
493
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Job '${job_id}' not found for skill '${skillName}'` }) }],
|
|
494
|
+
isError: true,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
jobManager.setActiveJobId(skillName, job_id);
|
|
498
|
+
// Re-mirror deliverables: copy archive deliverables to root if they exist
|
|
499
|
+
const docsDir = path.join(workspaceDir, '.docs', skillName);
|
|
500
|
+
const archiveDir = path.join(docsDir, 'jobs', job_id);
|
|
501
|
+
let mirroredCount = 0;
|
|
502
|
+
if (fs.existsSync(archiveDir)) {
|
|
503
|
+
const files = fs.readdirSync(archiveDir);
|
|
504
|
+
for (const file of files) {
|
|
505
|
+
const src = path.join(archiveDir, file);
|
|
506
|
+
if (fs.statSync(src).isFile()) {
|
|
507
|
+
const dest = path.join(docsDir, file);
|
|
508
|
+
fs.copyFileSync(src, dest);
|
|
509
|
+
mirroredCount++;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return {
|
|
514
|
+
content: [
|
|
515
|
+
{
|
|
516
|
+
type: 'text',
|
|
517
|
+
text: JSON.stringify({
|
|
518
|
+
skill: skillName,
|
|
519
|
+
activeJobId: job_id,
|
|
520
|
+
status: job.status,
|
|
521
|
+
currentState: job.currentState,
|
|
522
|
+
mirroredDeliverables: mirroredCount,
|
|
523
|
+
}, null, 2),
|
|
524
|
+
},
|
|
525
|
+
],
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
catch (err) {
|
|
529
|
+
return {
|
|
530
|
+
content: [{ type: 'text', text: JSON.stringify({ error: err.message }) }],
|
|
531
|
+
isError: true,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
// 11. TOOL: reactive_archive_job
|
|
536
|
+
server.tool('reactive_archive_job', 'Archive an execution job for a reactive skill and rotate active pointer if archived was active', {
|
|
537
|
+
skill: z.string().optional().describe('Name of the reactive skill (defaults to active skill)'),
|
|
538
|
+
job_id: z.string().optional().describe('Job ID to archive (defaults to active job)'),
|
|
539
|
+
}, async ({ skill, job_id }) => {
|
|
540
|
+
try {
|
|
541
|
+
const skillName = skill || defaultSkill;
|
|
542
|
+
const jobManager = new JobManager(workspaceDir);
|
|
543
|
+
const targetId = job_id || jobManager.getActiveJobId(skillName);
|
|
544
|
+
const currentActive = jobManager.getActiveJobId(skillName);
|
|
545
|
+
const job = jobManager.getJob(skillName, targetId);
|
|
546
|
+
if (!job) {
|
|
547
|
+
return {
|
|
548
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Job '${targetId}' not found for skill '${skillName}'` }) }],
|
|
549
|
+
isError: true,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
jobManager.updateJob(skillName, targetId, {
|
|
553
|
+
status: 'archived',
|
|
554
|
+
completedAt: new Date().toISOString(),
|
|
555
|
+
});
|
|
556
|
+
let freshJobId = currentActive;
|
|
557
|
+
if (currentActive === targetId) {
|
|
558
|
+
const freshJob = jobManager.createJob(skillName, { setActive: true });
|
|
559
|
+
freshJobId = freshJob.id;
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
content: [
|
|
563
|
+
{
|
|
564
|
+
type: 'text',
|
|
565
|
+
text: JSON.stringify({
|
|
566
|
+
skill: skillName,
|
|
567
|
+
archivedJobId: targetId,
|
|
568
|
+
status: 'archived',
|
|
569
|
+
activeJobId: freshJobId,
|
|
570
|
+
}, null, 2),
|
|
571
|
+
},
|
|
572
|
+
],
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
catch (err) {
|
|
576
|
+
return {
|
|
577
|
+
content: [{ type: 'text', text: JSON.stringify({ error: err.message }) }],
|
|
578
|
+
isError: true,
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
});
|
|
479
582
|
// RESOURCE 1: reactive://events
|
|
480
583
|
server.resource('reactive-events', 'reactive://events', async (uri) => {
|
|
481
584
|
const store = new EventStore({ enableSqlite: true });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reactive-skills/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Reactive Skills Architecture (RSA) core runtime โ FSM engine, event store, guard evaluator, projection engine, MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"reactive-skills-mcp": "./dist/mcp/server.js"
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
|
-
"dist"
|
|
17
|
+
"dist",
|
|
18
|
+
"CHANGELOG.md"
|
|
18
19
|
],
|
|
19
20
|
"keywords": [
|
|
20
21
|
"ai",
|