@johpaz/hive-sdk 0.1.4 → 0.1.6
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 +129 -0
- package/README.md +78 -23
- package/bun.lock +55 -29
- package/bunfig.toml +4 -2
- package/docs/API-AGENTS.md +78 -27
- package/docs/API-CONTEXT-COMPILER.md +31 -34
- package/docs/API-TOOLS-SKILLS-CHANNELS.md +58 -22
- package/docs/HIVE-HARNESS.md +1 -1
- package/docs/INDEX.md +4 -4
- package/docs/TEMPLATE-HIVE-APP.md +10 -10
- package/package.json +17 -12
- package/packages/cli/package.json +2 -2
- package/packages/cli/src/commands/create-app.test.ts +36 -7
- package/packages/cli/src/commands/init.ts +3 -3
- package/packages/cli/src/commands/run.ts +1 -1
- package/packages/cli/src/commands/test.ts +37 -25
- package/packages/cli/src/commands/trace.ts +30 -28
- package/packages/cli/templates/hive-app/.env.example +10 -2
- package/packages/cli/templates/hive-app/README.md +103 -0
- package/packages/cli/templates/hive-app/hive.config.ts +9 -3
- package/packages/cli/templates/hive-app/src/agents/coordinator.ts +8 -1
- package/packages/cli/templates/hive-app/src/main.ts +12 -19
- package/packages/core/package.json +13 -12
- package/packages/core/src/agent/acceptance-checks.ts +172 -0
- package/packages/core/src/agent/agent-catalog.ts +348 -0
- package/packages/core/src/agent/agent-loop.ts +1373 -0
- package/packages/core/src/agent/capability-search.ts +186 -0
- package/packages/core/src/agent/catalog-selector.ts +103 -0
- package/packages/core/src/agent/{Compaction.ts → compaction.ts} +86 -63
- package/packages/core/src/agent/context-compiler.ts +689 -0
- package/packages/core/src/agent/conversation-store.ts +381 -0
- package/packages/core/src/agent/curator.ts +276 -0
- package/packages/core/src/agent/delegation-runtime.ts +241 -0
- package/packages/core/src/agent/goal-runner.ts +323 -0
- package/packages/core/src/agent/index.ts +17 -12
- package/packages/core/src/agent/llm-client.ts +266 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +264 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/{providers → llm-providers}/gemini.ts +98 -60
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/hiveagents.ts +253 -0
- package/packages/core/src/agent/{providers → llm-providers}/interface.ts +73 -13
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/modelscope.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/{providers → llm-providers}/ollama.ts +31 -5
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +418 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/llm-providers/z-ai.ts +5 -0
- package/packages/core/src/agent/minimal-loadout.ts +47 -0
- package/packages/core/src/agent/playbook-selector.ts +119 -0
- package/packages/core/src/agent/{PromptBuilder.ts → prompt-builder.ts} +21 -22
- package/packages/core/src/{harness → agent}/proof-packet.ts +16 -21
- package/packages/core/src/agent/providers/index.ts +35 -16
- package/packages/core/src/agent/reflector.ts +320 -0
- package/packages/core/src/agent/routing-intent.ts +22 -0
- package/packages/core/src/{harness → agent}/run-epoch.ts +4 -3
- package/packages/core/src/{harness → agent}/run-store.ts +142 -81
- package/packages/core/src/agent/{Service.ts → service.ts} +37 -26
- package/packages/core/src/agent/skill-selector.ts +374 -0
- package/packages/core/src/agent/stuck-loop.ts +209 -0
- package/packages/core/src/agent/{selectors/ToolSelector.ts → tool-selector.ts} +188 -178
- package/packages/core/src/{ace/Tracer.ts → agent/tracer.ts} +37 -27
- package/packages/core/src/api/createAgent.test.ts +139 -27
- package/packages/core/src/api/createAgent.ts +232 -44
- package/packages/core/src/artifacts/store.ts +162 -0
- package/packages/core/src/canvas/canvas-manager.ts +161 -0
- package/packages/core/src/canvas/canvas.test.ts +8 -4
- package/packages/core/src/canvas/emitter.ts +131 -80
- package/packages/core/src/canvas/index.ts +1 -3
- package/packages/core/src/channels/base.ts +9 -1
- package/packages/core/src/channels/discord.ts +5 -4
- package/packages/core/src/channels/manager.ts +122 -30
- package/packages/core/src/channels/slack.ts +5 -4
- package/packages/core/src/channels/telegram.ts +36 -6
- package/packages/core/src/channels/webchat.ts +11 -10
- package/packages/core/src/channels/whatsapp.ts +23 -7
- package/packages/core/src/config/index.ts +13 -2
- package/packages/core/src/config/loader.ts +76 -29
- package/packages/core/src/ethics/EthicsGuard.test.ts +90 -36
- package/packages/core/src/ethics/EthicsGuard.ts +51 -47
- package/packages/core/src/events/agent-bus.ts +44 -68
- package/packages/core/src/events/channel-narration.ts +150 -0
- package/packages/core/src/events/narration.ts +82 -0
- package/packages/core/src/events/tool-narration.ts +62 -0
- package/packages/core/src/gateway/delegation-groups.ts +258 -0
- package/packages/core/src/{harness → gateway}/durable-queue.ts +102 -42
- package/packages/core/src/{harness → gateway}/job-store.ts +85 -48
- package/packages/core/src/gateway/lane-queue.ts +173 -0
- package/packages/core/src/gateway/notification-inbox.ts +57 -0
- package/packages/core/src/gateway/server.ts +1 -1
- package/packages/core/src/harness/index.ts +46 -27
- package/packages/core/src/index.ts +33 -27
- package/packages/core/src/mcp/hot-reload.ts +32 -23
- package/packages/core/src/mcp/index.ts +6 -3
- package/packages/core/src/mcp/singleton.ts +1 -4
- package/packages/core/src/mcp/tool-sync.ts +138 -0
- package/packages/core/src/memory/Scratchpad.test.ts +39 -20
- package/packages/core/src/memory/Scratchpad.ts +27 -34
- package/packages/core/src/multimodal/vision-service.ts +44 -38
- package/packages/core/src/resilience/retry.ts +95 -0
- package/packages/core/src/scheduler/CronScheduler.ts +334 -287
- package/packages/core/src/scheduler/index.ts +9 -7
- package/packages/core/src/scheduler/integration.ts +46 -26
- package/packages/core/src/scheduler/scheduler.test.ts +9 -13
- package/packages/core/src/scheduler/types.ts +7 -2
- package/packages/core/src/security/Pairing.ts +1 -1
- package/packages/core/src/skills/bundled/a2ui/a2ui_dashboard/SKILL.md +176 -0
- package/packages/core/src/skills/bundled/a2ui/a2ui_form/SKILL.md +202 -0
- package/packages/core/src/skills/bundled/a2ui/a2ui_interactive/SKILL.md +206 -0
- package/packages/core/src/skills/bundled/agents/agent_spawner/SKILL.md +173 -0
- package/packages/core/src/skills/bundled/agents/memory_manager/SKILL.md +143 -0
- package/packages/core/src/skills/bundled/agents/research_and_remember/SKILL.md +139 -0
- package/packages/core/src/skills/bundled/agents/task_orchestrator/SKILL.md +98 -0
- package/packages/core/src/skills/bundled/api/api_client/SKILL.md +132 -0
- package/packages/core/src/skills/bundled/cli/cli_pipeline/SKILL.md +135 -0
- package/packages/core/src/skills/bundled/cli/cli_safe_exec/SKILL.md +125 -0
- package/packages/core/src/skills/bundled/cli/software_engineering/SKILL.md +23 -0
- package/packages/core/src/skills/bundled/cron_manager/SKILL.md +188 -0
- package/packages/core/src/skills/bundled/cron_reminder/SKILL.md +112 -0
- package/packages/core/src/skills/bundled/filesystem/file_manager/SKILL.md +118 -0
- package/packages/core/src/skills/bundled/filesystem/file_read_and_summarize/SKILL.md +109 -0
- package/packages/core/src/skills/bundled/filesystem/file_writer/SKILL.md +129 -0
- package/packages/core/src/skills/bundled/filesystem/workspace_file_operator/SKILL.md +22 -0
- package/packages/core/src/skills/bundled/office/office_document_manager/SKILL.md +262 -0
- package/packages/core/src/skills/bundled/search_knowledge/capability_discovery/SKILL.md +75 -0
- package/packages/core/src/skills/bundled/web/browser_automate/SKILL.md +120 -0
- package/packages/core/src/skills/bundled/web/browser_scrape/SKILL.md +109 -0
- package/packages/core/src/skills/bundled/web/web_monitor/SKILL.md +127 -0
- package/packages/core/src/skills/bundled/web/web_research/SKILL.md +119 -0
- package/packages/core/src/skills/bundled-data.generated.ts +731 -2678
- package/packages/core/src/skills/skills.test.ts +52 -11
- package/packages/core/src/{harness → storage}/boot-id.ts +5 -2
- package/packages/core/src/storage/bootstrap.ts +151 -0
- package/packages/core/src/storage/causal-events.ts +84 -0
- package/packages/core/src/storage/collections.ts +680 -0
- package/packages/core/src/storage/crypto.ts +205 -74
- package/packages/core/src/{harness/db-helpers.ts → storage/hive.ts} +63 -7
- package/packages/core/src/storage/hivedb.ts +61 -0
- package/packages/core/src/storage/index.ts +111 -18
- package/packages/core/src/storage/model-id.ts +53 -0
- package/packages/core/src/storage/onboarding.ts +540 -972
- package/packages/core/src/storage/reconcile.ts +238 -0
- package/packages/core/src/storage/seed.ts +572 -406
- package/packages/core/src/storage/usage.ts +285 -225
- package/packages/core/src/storage/user-email.ts +11 -0
- package/packages/core/src/swarm/AgentExecutor.ts +1 -1
- package/packages/core/src/swarm/EventBridge.ts +1 -1
- package/packages/core/src/swarm/index.ts +12 -9
- package/packages/core/src/tool-runtime/index.ts +146 -23
- package/packages/core/src/tool-runtime/tool-worker.ts +2 -2
- package/packages/core/src/tool-runtime/worker-tools.ts +27 -0
- package/packages/core/src/{canvas/a2ui-tools.ts → tools/a2ui/index.ts} +17 -8
- package/packages/core/src/tools/agents/get-available-models.ts +36 -54
- package/packages/core/src/tools/agents/index.ts +784 -292
- package/packages/core/src/tools/api/api-request.test.ts +164 -0
- package/packages/core/src/tools/api/api-request.ts +174 -0
- package/packages/core/src/tools/api/index.ts +16 -0
- package/packages/core/src/tools/cli/index.ts +4 -0
- package/packages/core/src/tools/core/index.ts +281 -112
- package/packages/core/src/tools/cron/index.ts +121 -124
- package/packages/core/src/tools/index.ts +63 -78
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +3 -1
- package/packages/core/src/tools/types.ts +3 -1
- package/packages/core/src/tools/web/artifact-inspect.ts +23 -0
- package/packages/core/src/tools/web/browser-backend.ts +129 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +26 -5
- package/packages/core/src/tools/web/browser-service.ts +80 -35
- package/packages/core/src/tools/web/browser-type.ts +3 -8
- package/packages/core/src/tools/web/index.ts +4 -4
- package/packages/core/src/tools/web/webview-backend.ts +412 -0
- package/packages/core/src/voice/index.ts +89 -63
- package/packages/core/src/workers/agent.worker.ts +2 -2
- package/packages/core/src/workers/workers.test.ts +3 -10
- package/scripts/bump-version.ts +248 -0
- package/scripts/generate-skill-bundle.ts +108 -0
- package/test/acceptance-checks.test.ts +403 -0
- package/test/agent-loop-terminal-synthesis.test.ts +32 -0
- package/test/browser-backend.test.ts +308 -0
- package/test/catalog-agents-stay-enabled.test.ts +117 -0
- package/test/causal-events.test.ts +117 -0
- package/test/compaction.test.ts +105 -0
- package/test/context-compiler.test.ts +269 -0
- package/test/curator.test.ts +130 -0
- package/test/durable-queue.test.ts +114 -0
- package/test/harness-barrel.test.ts +64 -0
- package/test/hive-helpers.test.ts +130 -0
- package/test/hivedb-search.test.ts +189 -0
- package/test/internal-turns.test.ts +166 -0
- package/test/job-idempotency.test.ts +68 -0
- package/test/job-retry-backoff.test.ts +184 -0
- package/test/job-store.test.ts +381 -0
- package/test/llm-retry.test.ts +97 -0
- package/test/memory-perf.test.ts +774 -0
- package/test/minimal-loadout.test.ts +78 -0
- package/test/model-catalog.test.ts +105 -0
- package/test/preload.ts +12 -0
- package/test/reflector.test.ts +320 -0
- package/test/retention-cap.test.ts +91 -0
- package/test/retired-capabilities-pruned.test.ts +192 -0
- package/test/run-store.test.ts +355 -0
- package/test/scratchpad.test.ts +74 -0
- package/test/secrets-durability.test.ts +119 -0
- package/test/seed-model-reseed.test.ts +155 -0
- package/test/setup-agent-seed.test.ts +264 -0
- package/test/tool-inventory.test.ts +65 -0
- package/test/tool-runtime.test.ts +258 -0
- package/test/tool-selector-runtime-tools.test.ts +117 -0
- package/test/toon.test.ts +429 -0
- package/tsconfig.json +2 -0
- package/packages/core/src/ace/Curator.ts +0 -158
- package/packages/core/src/ace/Reflector.ts +0 -200
- package/packages/core/src/ace/index.ts +0 -4
- package/packages/core/src/agent/AgentRunner.ts +0 -711
- package/packages/core/src/agent/ContextCompiler.ts +0 -567
- package/packages/core/src/agent/ContextGuard.ts +0 -91
- package/packages/core/src/agent/ConversationStore.ts +0 -254
- package/packages/core/src/agent/Hooks.ts +0 -166
- package/packages/core/src/agent/StuckLoop.ts +0 -133
- package/packages/core/src/agent/providers/LLMClient.ts +0 -149
- package/packages/core/src/agent/providers/anthropic.ts +0 -212
- package/packages/core/src/agent/providers/openai-compat.ts +0 -231
- package/packages/core/src/agent/selectors/PlaybookSelector.ts +0 -121
- package/packages/core/src/agent/selectors/SkillSelector.ts +0 -322
- package/packages/core/src/agent/selectors/index.ts +0 -6
- package/packages/core/src/auth/auth.ts +0 -121
- package/packages/core/src/auth/index.ts +0 -1
- package/packages/core/src/canvas/CanvasManager.ts +0 -390
- package/packages/core/src/canvas/canvas-tools.ts +0 -448
- package/packages/core/src/harness/collections.ts +0 -98
- package/packages/core/src/harness/goal-verifier.ts +0 -141
- package/packages/core/src/harness/harness.test.ts +0 -236
- package/packages/core/src/harness/reconcile.ts +0 -149
- package/packages/core/src/mcp/MCPToolAdapter.ts +0 -176
- package/packages/core/src/multimodal/VisionService.ts +0 -293
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +0 -53
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +0 -250
- package/packages/core/src/scheduler/dag/EventBridge.ts +0 -122
- package/packages/core/src/scheduler/dag/TaskGraph.ts +0 -192
- package/packages/core/src/scheduler/dag/TaskNode.ts +0 -97
- package/packages/core/src/scheduler/dag/TaskResult.ts +0 -22
- package/packages/core/src/scheduler/dag/errors.ts +0 -37
- package/packages/core/src/scheduler/dag/index.ts +0 -26
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +0 -97
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +0 -21
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +0 -46
- package/packages/core/src/storage/HiveDBStorage.ts +0 -64
- package/packages/core/src/storage/SQLiteStorage.ts +0 -414
- package/packages/core/src/storage/hiveSeed.ts +0 -308
- package/packages/core/src/storage/hiveStorage.test.ts +0 -38
- package/packages/core/src/storage/schema.ts +0 -689
- package/packages/core/src/storage/storage.test.ts +0 -37
- package/packages/core/src/swarm/AgentBus.ts +0 -460
- package/packages/core/src/swarm/EventBus.ts +0 -169
- package/packages/core/src/swarm/WorkerPool.ts +0 -236
- package/packages/core/src/tools/bridge-events.ts +0 -26
- package/packages/core/src/tools/canvas/index.ts +0 -375
- package/packages/core/src/tools/codebridge/index.ts +0 -342
- package/packages/core/src/tools/meeting/index.ts +0 -353
- package/packages/core/src/tools/projects/index.ts +0 -37
- package/packages/core/src/tools/projects/project-create.ts +0 -94
- package/packages/core/src/tools/projects/project-done.ts +0 -66
- package/packages/core/src/tools/projects/project-fail.ts +0 -66
- package/packages/core/src/tools/projects/project-list.ts +0 -96
- package/packages/core/src/tools/projects/project-update.ts +0 -72
- package/packages/core/src/tools/projects/task-create.ts +0 -68
- package/packages/core/src/tools/projects/task-evaluate.ts +0 -93
- package/packages/core/src/tools/projects/task-update.ts +0 -93
- package/packages/core/src/tools/voice/index.ts +0 -104
- package/packages/core/src/tools/web/api-request.test.ts +0 -170
- package/packages/core/src/tools/web/api-request.ts +0 -239
- package/test/setup-db.ts +0 -216
- /package/packages/core/src/agent/{NativeTools.ts → native-tools.ts} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Bump de versión del SDK.
|
|
5
|
+
*
|
|
6
|
+
* Portado de `hive/scripts/bump-version.ts`, adaptado a este repo: acá el
|
|
7
|
+
* artefacto publicado es **sólo el paquete raíz** (`@johpaz/hive-sdk`);
|
|
8
|
+
* `packages/core` y `packages/cli` son workspaces internos que se versionan en
|
|
9
|
+
* paralelo por consistencia, no se publican.
|
|
10
|
+
*
|
|
11
|
+
* El push del tag `vX.Y.Z` es lo que dispara `.github/workflows/publish.yml`.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const dryRun = args.includes("--dry-run");
|
|
16
|
+
const shouldPush = args.includes("--push");
|
|
17
|
+
const npmTagArg = args.find((a) => a.startsWith("--npm-tag="));
|
|
18
|
+
const npmTag = npmTagArg ? npmTagArg.split("=")[1] : "latest";
|
|
19
|
+
const positional = args.filter((a) => !a.startsWith("--"));
|
|
20
|
+
const bumpType = positional[0] as "patch" | "minor" | "major" | string;
|
|
21
|
+
const explicitVersion = positional[0]?.match(/^\d+\.\d+\.\d+(-[\w.]+)?$/) ? positional[0] : null;
|
|
22
|
+
|
|
23
|
+
if (!bumpType || (!["patch", "minor", "major"].includes(bumpType) && !explicitVersion)) {
|
|
24
|
+
console.log("Usage:");
|
|
25
|
+
console.log(" bun scripts/bump-version.ts patch|minor|major [--push] [--dry-run] [--npm-tag=<tag>]");
|
|
26
|
+
console.log(" bun scripts/bump-version.ts 0.1.5 [--push] [--dry-run] [--npm-tag=<tag>]");
|
|
27
|
+
console.log("");
|
|
28
|
+
console.log(" (sin flags) Solo actualiza archivos locales (package.json, README, CHANGELOG).");
|
|
29
|
+
console.log(" No toca git. Revisá el diff vos mismo.");
|
|
30
|
+
console.log(" --dry-run Muestra qué cambiaría, sin escribir nada.");
|
|
31
|
+
console.log(" --push Además de bumpear: commitea, crea el tag vX.Y.Z y pushea.");
|
|
32
|
+
console.log(" El tag dispara publish.yml, que publica en npm.");
|
|
33
|
+
console.log(" --npm-tag=X dist-tag de npm (default: latest). Usá `next` o `beta` para");
|
|
34
|
+
console.log(" una preview que no se instale con `bun add @johpaz/hive-sdk`.");
|
|
35
|
+
console.log("");
|
|
36
|
+
console.log("Ejemplos:");
|
|
37
|
+
console.log(" bun scripts/bump-version.ts 0.1.5 # solo archivos");
|
|
38
|
+
console.log(" bun scripts/bump-version.ts 0.1.5 --push # release a latest");
|
|
39
|
+
console.log(" bun scripts/bump-version.ts 0.2.0-rc.1 --push --npm-tag=next");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function bumpVersion(current: string, type: "patch" | "minor" | "major"): string {
|
|
44
|
+
const [major, minor, patch] = current.split("-")[0].split(".").map(Number);
|
|
45
|
+
return type === "major"
|
|
46
|
+
? `${major + 1}.0.0`
|
|
47
|
+
: type === "minor"
|
|
48
|
+
? `${major}.${minor + 1}.0`
|
|
49
|
+
: `${major}.${minor}.${patch + 1}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function confirm(message: string): Promise<boolean> {
|
|
53
|
+
const readline = await import("node:readline/promises");
|
|
54
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
55
|
+
const answer = await rl.question(`${message} (escribe "si" para confirmar): `);
|
|
56
|
+
rl.close();
|
|
57
|
+
return answer.trim().toLowerCase() === "si";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** El raíz es el que se publica; los workspaces van en paralelo por consistencia. */
|
|
61
|
+
const packageFiles = [
|
|
62
|
+
"package.json",
|
|
63
|
+
"packages/core/package.json",
|
|
64
|
+
"packages/cli/package.json",
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
/** Menciones de versión en prosa que no salen de ningún package.json. */
|
|
68
|
+
function textReplacements(newVersion: string) {
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
path: "README.md",
|
|
72
|
+
pattern: /\*Hive SDK v[\d.]+(?:-[\w.]+)? — MIT\*/g,
|
|
73
|
+
replacement: `*Hive SDK v${newVersion} — MIT*`,
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function main() {
|
|
79
|
+
const rootPkg = JSON.parse(await Bun.file("package.json").text());
|
|
80
|
+
const currentVersion: string = rootPkg.version;
|
|
81
|
+
const newVersion = explicitVersion || bumpVersion(currentVersion, bumpType as "patch" | "minor" | "major");
|
|
82
|
+
|
|
83
|
+
console.log(`\n📦 Bumping version: ${currentVersion} → ${newVersion}`);
|
|
84
|
+
console.log(` npm dist-tag: ${npmTag}\n`);
|
|
85
|
+
|
|
86
|
+
if (newVersion === currentVersion && !explicitVersion) {
|
|
87
|
+
console.log("⚠️ La versión nueva es igual a la actual. Abortando.");
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// npm rechaza republicar una versión existente: mejor enterarse acá que en CI.
|
|
92
|
+
try {
|
|
93
|
+
const published = await fetch(`https://registry.npmjs.org/${rootPkg.name}`)
|
|
94
|
+
.then((r) => (r.ok ? r.json() : null)) as { versions?: Record<string, unknown> } | null;
|
|
95
|
+
if (published?.versions?.[newVersion]) {
|
|
96
|
+
console.log(`⚠️ ${rootPkg.name}@${newVersion} YA está publicada en npm.`);
|
|
97
|
+
console.log(` Un publish con esta versión falla con 403. Elegí otra.\n`);
|
|
98
|
+
if (!dryRun) process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
console.log(" (no se pudo consultar npm — sigo igual)\n");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (dryRun) {
|
|
105
|
+
console.log("🔎 Dry run — nada se escribe.\n");
|
|
106
|
+
for (const filePath of packageFiles) {
|
|
107
|
+
try {
|
|
108
|
+
const json = JSON.parse(await Bun.file(filePath).text());
|
|
109
|
+
console.log(` ${filePath}: ${json.version} → ${newVersion}`);
|
|
110
|
+
} catch (e) {
|
|
111
|
+
console.log(` ⚠️ ${filePath}: ${(e as Error).message}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (const file of textReplacements(newVersion)) {
|
|
115
|
+
try {
|
|
116
|
+
const content = await Bun.file(file.path).text();
|
|
117
|
+
const matches = content.match(file.pattern);
|
|
118
|
+
console.log(` ${file.path}: ${matches ? `${matches.length} coincidencia(s)` : "sin coincidencias (revisar patrón)"}`);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
console.log(` ⚠️ ${file.path}: ${(e as Error).message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (shouldPush) {
|
|
124
|
+
console.log(`\n Luego: git add -A && git commit -m "chore: release v${newVersion}"`);
|
|
125
|
+
console.log(` git tag v${newVersion} && git push origin main && git push origin v${newVersion}`);
|
|
126
|
+
console.log(` → publish.yml publica con dist-tag "${npmTag}"`);
|
|
127
|
+
} else {
|
|
128
|
+
console.log(`\n Sin --push: no se toca git.`);
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
for (const filePath of packageFiles) {
|
|
134
|
+
try {
|
|
135
|
+
const json = JSON.parse(await Bun.file(filePath).text());
|
|
136
|
+
const oldVersion = json.version;
|
|
137
|
+
json.version = newVersion;
|
|
138
|
+
await Bun.write(filePath, JSON.stringify(json, null, 2) + "\n");
|
|
139
|
+
console.log(`✅ ${filePath}`);
|
|
140
|
+
console.log(` ${json.name}: ${oldVersion} → ${newVersion}`);
|
|
141
|
+
} catch (e) {
|
|
142
|
+
console.log(`⚠️ ${filePath}: ${(e as Error).message}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const file of textReplacements(newVersion)) {
|
|
147
|
+
try {
|
|
148
|
+
const content = await Bun.file(file.path).text();
|
|
149
|
+
const matched = file.pattern.test(content);
|
|
150
|
+
file.pattern.lastIndex = 0; // test() con /g deja estado — resetear
|
|
151
|
+
const newContent = content.replace(file.pattern, file.replacement);
|
|
152
|
+
|
|
153
|
+
if (!matched) {
|
|
154
|
+
console.log(`⚠️ ${file.path}: el patrón no matcheó nada — revisar manualmente`);
|
|
155
|
+
} else if (newContent !== content) {
|
|
156
|
+
await Bun.write(file.path, newContent);
|
|
157
|
+
console.log(`✅ ${file.path}`);
|
|
158
|
+
} else {
|
|
159
|
+
console.log(`✅ ${file.path} (ya estaba en ${newVersion})`);
|
|
160
|
+
}
|
|
161
|
+
} catch (e) {
|
|
162
|
+
console.log(`⚠️ ${file.path}: ${(e as Error).message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// El CHANGELOG lo escribe una persona; acá sólo avisamos si falta la entrada.
|
|
167
|
+
try {
|
|
168
|
+
const changelog = await Bun.file("CHANGELOG.md").text();
|
|
169
|
+
if (!changelog.includes(`## ${newVersion}`)) {
|
|
170
|
+
console.log(`\n⚠️ CHANGELOG.md no tiene una sección "## ${newVersion}". Agregala antes de publicar.`);
|
|
171
|
+
}
|
|
172
|
+
} catch {
|
|
173
|
+
console.log("\n⚠️ No hay CHANGELOG.md.");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const { execSync } = await import("child_process");
|
|
177
|
+
const run = (cmd: string) => execSync(cmd, { stdio: "inherit" });
|
|
178
|
+
|
|
179
|
+
console.log(`\n✨ Archivos actualizados. Versión: ${newVersion}\n`);
|
|
180
|
+
|
|
181
|
+
if (!shouldPush) {
|
|
182
|
+
console.log("Sin --push: no se tocó git. Revisá `git diff`, y cuando estés conforme:");
|
|
183
|
+
console.log(` bun scripts/bump-version.ts ${explicitVersion || bumpType} --push${npmTag !== "latest" ? ` --npm-tag=${npmTag}` : ""}\n`);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── Git: commit, tag y push — con confirmación antes de publicar ──────────
|
|
188
|
+
console.log("Antes de publicar corro typecheck y tests.\n");
|
|
189
|
+
try {
|
|
190
|
+
run("bun run typecheck");
|
|
191
|
+
run("bun test");
|
|
192
|
+
} catch {
|
|
193
|
+
console.log("\n❌ typecheck o tests fallaron. No se publica.");
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
console.log("\nEsto es lo que se va a commitear (git add -A):\n");
|
|
198
|
+
run("git status --short");
|
|
199
|
+
|
|
200
|
+
const tagExists = (() => {
|
|
201
|
+
try {
|
|
202
|
+
execSync(`git rev-parse v${newVersion}`, { stdio: "ignore" });
|
|
203
|
+
return true;
|
|
204
|
+
} catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
})();
|
|
208
|
+
|
|
209
|
+
if (tagExists) {
|
|
210
|
+
console.log(`\n⚠️ El tag v${newVersion} ya existe localmente. Suele indicar que esta`);
|
|
211
|
+
console.log(` versión ya se publicó. Abortando — si es intencional, borralo primero`);
|
|
212
|
+
console.log(` (git tag -d v${newVersion}) y volvé a correr con --push.`);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const branch = execSync("git branch --show-current").toString().trim();
|
|
217
|
+
|
|
218
|
+
console.log(`\nEsto va a: commitear todo lo de arriba como "chore: release v${newVersion}",`);
|
|
219
|
+
console.log(`crear el tag v${newVersion}, y pushear ${branch} + el tag a origin.`);
|
|
220
|
+
console.log(`El push del tag dispara publish.yml, que publica en npm con dist-tag "${npmTag}".\n`);
|
|
221
|
+
|
|
222
|
+
const ok = await confirm(`¿Publicar v${newVersion} como "${npmTag}"?`);
|
|
223
|
+
if (!ok) {
|
|
224
|
+
console.log("Cancelado. No se tocó git.");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
console.log("🔧 Committing changes...");
|
|
229
|
+
run("git add -A");
|
|
230
|
+
try {
|
|
231
|
+
run(`git commit -m "chore: release v${newVersion}"`);
|
|
232
|
+
} catch {
|
|
233
|
+
console.log(" (nothing to commit, skipping)");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
console.log(`🏷️ Creating tag v${newVersion}...`);
|
|
237
|
+
// El dist-tag viaja en el mensaje del tag: publish.yml lo lee de ahí.
|
|
238
|
+
run(`git tag -a v${newVersion} -m "release v${newVersion} [npm-tag:${npmTag}]"`);
|
|
239
|
+
|
|
240
|
+
console.log("🚀 Pushing commit and tag...");
|
|
241
|
+
run(`git push origin ${branch}`);
|
|
242
|
+
run(`git push origin v${newVersion}`);
|
|
243
|
+
|
|
244
|
+
console.log(`\n🎉 Released v${newVersion} (dist-tag: ${npmTag})\n`);
|
|
245
|
+
console.log(`Verificá en unos minutos: npm view ${rootPkg.name} dist-tags\n`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate-bundle.ts
|
|
3
|
+
* Scans all SKILL.md files from src/bundled/ and generates
|
|
4
|
+
* src/bundled-data.generated.ts with all skill data inlined as TypeScript.
|
|
5
|
+
* This file is then bundled into dist/hive.js so skills load without FS access.
|
|
6
|
+
*
|
|
7
|
+
* Usage: bun scripts/generate-skill-bundle.ts
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { YAML } from "bun";
|
|
13
|
+
|
|
14
|
+
const BUNDLED_DIR = path.join(import.meta.dir, "../packages/core/src/skills/bundled");
|
|
15
|
+
const OUTPUT_FILE = path.join(import.meta.dir, "../packages/core/src/skills/bundled-data.generated.ts");
|
|
16
|
+
|
|
17
|
+
interface SkillEntry {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
category: string;
|
|
21
|
+
version: string;
|
|
22
|
+
tools: string[];
|
|
23
|
+
triggers: string[];
|
|
24
|
+
body: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function parseFrontmatter(content: string): { frontmatter: Record<string, unknown>; body: string } {
|
|
28
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
29
|
+
if (!match) return { frontmatter: {}, body: content };
|
|
30
|
+
try {
|
|
31
|
+
const frontmatter = YAML.parse(match[1]!) as Record<string, unknown>;
|
|
32
|
+
return { frontmatter, body: match[2]! };
|
|
33
|
+
} catch {
|
|
34
|
+
return { frontmatter: {}, body: content };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function scanDir(dir: string): SkillEntry[] {
|
|
39
|
+
const skills: SkillEntry[] = [];
|
|
40
|
+
|
|
41
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
42
|
+
if (!entry.isDirectory()) continue;
|
|
43
|
+
const entryPath = path.join(dir, entry.name);
|
|
44
|
+
const skillMdPath = path.join(entryPath, "SKILL.md");
|
|
45
|
+
|
|
46
|
+
if (fs.existsSync(skillMdPath)) {
|
|
47
|
+
const content = fs.readFileSync(skillMdPath, "utf-8");
|
|
48
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
49
|
+
|
|
50
|
+
skills.push({
|
|
51
|
+
name: (frontmatter.name as string) ?? entry.name,
|
|
52
|
+
description: (frontmatter.description as string) ?? "",
|
|
53
|
+
category: (frontmatter.category as string) ?? "general",
|
|
54
|
+
version: String(frontmatter.version ?? "1.0.0"),
|
|
55
|
+
tools: (frontmatter.tools as string[]) ?? [],
|
|
56
|
+
triggers: (frontmatter.triggers as string[]) ?? [],
|
|
57
|
+
body,
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
// Category directory — recurse one level
|
|
61
|
+
skills.push(...scanDir(entryPath));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return skills;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const skills = scanDir(BUNDLED_DIR);
|
|
69
|
+
|
|
70
|
+
const lines: string[] = [
|
|
71
|
+
"// AUTO-GENERATED by scripts/generate-skill-bundle.ts",
|
|
72
|
+
"// Do NOT edit manually — run `bun scripts/generate-skill-bundle.ts` to regenerate",
|
|
73
|
+
"",
|
|
74
|
+
"export interface BundledSkillEntry {",
|
|
75
|
+
" name: string;",
|
|
76
|
+
" description: string;",
|
|
77
|
+
" category: string;",
|
|
78
|
+
" version: string;",
|
|
79
|
+
" tools: string[];",
|
|
80
|
+
" triggers: string[];",
|
|
81
|
+
" body: string;",
|
|
82
|
+
"}",
|
|
83
|
+
"",
|
|
84
|
+
`export const BUNDLED_SKILLS_DATA: BundledSkillEntry[] = [`,
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
for (const skill of skills) {
|
|
88
|
+
// Escape backticks and template literal delimiters in body content
|
|
89
|
+
const escapedBody = skill.body.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
|
|
90
|
+
const escapedDescription = skill.description.replace(/\\/g, "\\\\").replace(/`/g, "\\`");
|
|
91
|
+
|
|
92
|
+
lines.push(` {`);
|
|
93
|
+
lines.push(` name: ${JSON.stringify(skill.name)},`);
|
|
94
|
+
lines.push(` description: \`${escapedDescription}\`,`);
|
|
95
|
+
lines.push(` category: ${JSON.stringify(skill.category)},`);
|
|
96
|
+
lines.push(` version: ${JSON.stringify(skill.version)},`);
|
|
97
|
+
lines.push(` tools: ${JSON.stringify(skill.tools)},`);
|
|
98
|
+
lines.push(` triggers: ${JSON.stringify(skill.triggers)},`);
|
|
99
|
+
lines.push(` body: \`${escapedBody}\`,`);
|
|
100
|
+
lines.push(` },`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
lines.push(`];`);
|
|
104
|
+
lines.push(``);
|
|
105
|
+
|
|
106
|
+
fs.writeFileSync(OUTPUT_FILE, lines.join("\n"), "utf-8");
|
|
107
|
+
|
|
108
|
+
console.info(`[generate-bundle] ✅ Generated ${skills.length} skills → ${path.relative(process.cwd(), OUTPUT_FILE)}`);
|