@eventmodelers/cli 1.0.13 → 1.0.14

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/README.md CHANGED
@@ -105,6 +105,7 @@ npx @eventmodelers/cli re-init # refresh an already-install
105
105
  npx @eventmodelers/cli run # start the agent loop (ralph-claude.js) from the installed kit dir
106
106
  npx @eventmodelers/cli run --ollama # same, via local Ollama (ralph-ollama.js)
107
107
  npx @eventmodelers/cli run --bash # bash-only loop, no realtime (ralph.sh)
108
+ npx @eventmodelers/cli run --local # skip platform config/credential lookup entirely — local-only, no board sync
108
109
  npx @eventmodelers/cli fetch --context <name> # pull full slice detail for one context on the board into <kit-dir>/.slices/
109
110
  npx @eventmodelers/cli fetch --context <name> --slice-id <id> # same, then print just that slice
110
111
  npx @eventmodelers/cli fetch --context <name> --slice-title <title> # same, then print just the slice matching this title
package/cli.js CHANGED
@@ -1772,6 +1772,7 @@ program
1772
1772
  .option('--ollama', 'Use ralph-ollama.js instead of the default Claude runner (build-kit stacks only)')
1773
1773
  .option('--bash', 'Use the bash-only ralph.sh loop (build-kit stacks only, no realtime)')
1774
1774
  .option('--modeling', 'Keep one Claude process warm across prompts instead of spawning a fresh one per task, for low-latency voice/live use. Modeling-kit installs only — there is no cold-spawn/tasks.json loop for modeling-kit. Built into the CLI, not a per-project file.')
1775
+ .option('--local', 'Skip platform config/credential lookup entirely and run the local-only loop (no board sync, no realtime agent) — even if .eventmodelers/config.json has credentials (build-kit stacks only)')
1775
1776
  .option('--verbose', 'Log every tool call\'s full input (commands, skill args, file paths) and assistant reasoning text. Default is condensed, high-level per-step logging only.')
1776
1777
  .action(async (opts) => {
1777
1778
  const cwd = process.cwd();
@@ -1799,6 +1800,10 @@ program
1799
1800
  console.error('❌ --modeling is mutually exclusive with --bash/--ollama — those select a build-kit runner, which --modeling has no use for.');
1800
1801
  process.exit(1);
1801
1802
  }
1803
+ if (opts.local) {
1804
+ console.error('❌ --modeling has no local-only mode — it is always driven by the org-wide realtime prompt queue, so --local has no use for it.');
1805
+ process.exit(1);
1806
+ }
1802
1807
  if (!modelingKitDir) {
1803
1808
  console.error(`❌ --modeling only supports a modeling-kit install (${MODELING_KIT.kitDirName}/) — it subscribes to the org-wide prompt queue, which build-kit stacks don't have. Use \`eventmodelers run\` (optionally with --ollama/--bash) for build-kit's slice-status loop instead.`);
1804
1809
  process.exit(1);
@@ -1850,9 +1855,11 @@ program
1850
1855
  console.log(`▶ Starting ${relative(cwd, runnerPath)}...\n`);
1851
1856
  const cmd = runner.endsWith('.sh') ? `"${runnerPath}"` : `node "${runnerPath}"`;
1852
1857
  try {
1853
- // Only ralph-claude.js reads this — the bash loop and the ollama executor have
1854
- // their own separate output paths with no stream-json parsing to gate.
1855
- execSync(cmd, { cwd: kitDir, stdio: 'inherit', env: { ...process.env, RALPH_VERBOSE: opts.verbose ? '1' : '' } });
1858
+ // Only ralph-claude.js reads RALPH_VERBOSE — the bash loop and the ollama executor have
1859
+ // their own separate output paths with no stream-json parsing to gate. RALPH_LOCAL is
1860
+ // read by all three runners (ralph.js's startRalph, and ralph.sh directly) to force the
1861
+ // local-only branch even when .eventmodelers/config.json has valid credentials.
1862
+ execSync(cmd, { cwd: kitDir, stdio: 'inherit', env: { ...process.env, RALPH_VERBOSE: opts.verbose ? '1' : '', RALPH_LOCAL: opts.local ? '1' : '' } });
1856
1863
  } catch (err) {
1857
1864
  process.exit(err.status || 1);
1858
1865
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventmodelers/cli",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, Cratis, or modeling-only)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -397,15 +397,19 @@ async function ralphLoop(kitDir, cfg, onTask, onPlannedSlice) {
397
397
 
398
398
  export { loadLocalConfig, fetchPlatformConfig, retryOn401, startRealtimeAgent };
399
399
 
400
- export async function startRalph({ kitDir, projectDir, onTask, onPlannedSlice, agentType = 'BUILD', queueAllStatuses = false }) {
400
+ export async function startRalph({ kitDir, projectDir, onTask, onPlannedSlice, agentType = 'BUILD', queueAllStatuses = false, localOnly = false }) {
401
401
  const local = loadLocalConfig(kitDir);
402
402
  local.agentId = ensureAgentId(kitDir, agentType);
403
403
 
404
404
  console.log(`Ralph — kit: ${kitDir}`);
405
405
  console.log(` project: ${projectDir}`);
406
406
 
407
- if (!hasCredentials(local)) {
408
- console.log(` mode: local-only (no platform sync)\n`);
407
+ // localOnly (set via `eventmodelers run --local`) forces this branch even when
408
+ // credentials are present — it skips fetchPlatformConfig's network call to
409
+ // ${baseUrl}/api/config and startRealtimeAgent entirely, so the loop never
410
+ // reaches out to the platform at all.
411
+ if (localOnly || !hasCredentials(local)) {
412
+ console.log(` mode: local-only (no platform sync)${localOnly ? ' — forced by --local' : ''}\n`);
409
413
  await ralphLoop(kitDir, local, onTask, onPlannedSlice);
410
414
  return;
411
415
  }
@@ -96,6 +96,7 @@ startRalph({
96
96
  projectDir,
97
97
  onTask: runClaude,
98
98
  onPlannedSlice: runClaude,
99
+ localOnly: process.env.RALPH_LOCAL === '1',
99
100
  }).catch((err) => {
100
101
  console.error('[ralph] Fatal:', err);
101
102
  process.exit(1);
@@ -33,6 +33,7 @@ startRalph({
33
33
  projectDir,
34
34
  onTask: runOllama,
35
35
  // onPlannedSlice omitted — ollama-agent manages its own task queue
36
+ localOnly: process.env.RALPH_LOCAL === '1',
36
37
  }).catch((err) => {
37
38
  console.error('[ralph] Fatal:', err);
38
39
  process.exit(1);
@@ -21,7 +21,10 @@ BACKEND_PROMPT_FILE="$KIT_DIR/lib/backend-prompt.md"
21
21
  AGENT_SCRIPT="$KIT_DIR/lib/agent.sh"
22
22
 
23
23
  HAS_CREDENTIALS=true
24
- if [[ ! -f "$KIT_DIR/.eventmodelers/config.json" ]]; then
24
+ if [[ "${RALPH_LOCAL:-}" == "1" ]]; then
25
+ echo "[ralph] --local — platform sync disabled." >&2
26
+ HAS_CREDENTIALS=false
27
+ elif [[ ! -f "$KIT_DIR/.eventmodelers/config.json" ]]; then
25
28
  echo "[ralph] Note: no .eventmodelers/config.json found — platform sync disabled." >&2
26
29
  echo " To enable board sync, follow: https://app.eventmodelers.ai/documentation#build" >&2
27
30
  echo " Code generation from local slice definitions will still run." >&2