@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 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 - FSM engine, event store, guard evaluator, projection engine, and MCP server.
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
@@ -3,6 +3,7 @@ import { EventStore } from './event-store.js';
3
3
  export interface ProjectionContext {
4
4
  skillName: string;
5
5
  currentState: string;
6
+ jobId?: string;
6
7
  context: Record<string, any>;
7
8
  events: SignalEvent[];
8
9
  transitions: {
@@ -125,6 +125,7 @@ export class ProjectionEngine {
125
125
  const projContext = {
126
126
  skillName,
127
127
  currentState,
128
+ jobId: this.jobId,
128
129
  context,
129
130
  events,
130
131
  transitions,
@@ -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.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",