wyrm-mcp 7.2.2 → 7.2.3
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/dist/activation.d.ts +8 -9
- package/dist/activation.d.ts.map +1 -1
- package/dist/activation.js.map +1 -1
- package/dist/agent-daemon.d.ts +1 -1
- package/dist/agent-loop.d.ts +1 -1
- package/dist/analytics.d.ts +1 -1
- package/dist/attribution.d.ts +1 -1
- package/dist/audit.d.ts +1 -1
- package/dist/auto-orchestrator.d.ts +1 -1
- package/dist/autoconfig.d.ts +1 -1
- package/dist/buddy-runner.d.ts +1 -1
- package/dist/buddy.d.ts +1 -1
- package/dist/build-flags.d.ts +6 -8
- package/dist/build-flags.d.ts.map +1 -1
- package/dist/build-flags.js.map +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/capture.d.ts +1 -1
- package/dist/causality.d.ts +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cloud/machine-id.d.ts +1 -1
- package/dist/cloud-backup.d.ts +1 -1
- package/dist/cloud-profile.d.ts +1 -1
- package/dist/cloud-sync-entrypoint.d.ts +1 -1
- package/dist/cloud-sync.d.ts +1 -1
- package/dist/constellation.d.ts +1 -1
- package/dist/context-build-budgeted.d.ts +1 -1
- package/dist/context-ranking.d.ts +1 -1
- package/dist/crypto.d.ts +1 -1
- package/dist/daemon-write-endpoint.d.ts +1 -1
- package/dist/daemon-writer.d.ts +1 -1
- package/dist/database.d.ts +1 -1
- package/dist/design.d.ts +1 -1
- package/dist/event-replication.d.ts +1 -1
- package/dist/events-sse.d.ts +1 -1
- package/dist/failure-patterns.d.ts +1 -1
- package/dist/federation.d.ts +1 -1
- package/dist/goals.d.ts +1 -1
- package/dist/handlers/agent.d.ts +1 -1
- package/dist/handlers/alias-adapters.d.ts +1 -1
- package/dist/handlers/aliases.d.ts +1 -1
- package/dist/handlers/audit.d.ts +1 -1
- package/dist/handlers/boundary.d.ts +1 -1
- package/dist/handlers/capture.d.ts +1 -1
- package/dist/handlers/causality.d.ts +1 -1
- package/dist/handlers/cloud.d.ts +1 -1
- package/dist/handlers/companion.d.ts +1 -1
- package/dist/handlers/datalake.d.ts +1 -1
- package/dist/handlers/dispatch-context.d.ts +1 -1
- package/dist/handlers/entity.d.ts +1 -1
- package/dist/handlers/events.d.ts +1 -1
- package/dist/handlers/failure.d.ts +1 -1
- package/dist/handlers/goals.d.ts +1 -1
- package/dist/handlers/intelligence.d.ts +1 -1
- package/dist/handlers/invoicing.d.ts +1 -1
- package/dist/handlers/mcpclient.d.ts +1 -1
- package/dist/handlers/orchestration.d.ts +1 -1
- package/dist/handlers/output-schemas.d.ts +1 -1
- package/dist/handlers/presence.d.ts +1 -1
- package/dist/handlers/project.d.ts +1 -1
- package/dist/handlers/prompts.d.ts +1 -1
- package/dist/handlers/quest.d.ts +1 -1
- package/dist/handlers/recall.d.ts +1 -1
- package/dist/handlers/registry.d.ts +1 -1
- package/dist/handlers/resources.d.ts +1 -1
- package/dist/handlers/review.d.ts +1 -1
- package/dist/handlers/run.d.ts +1 -1
- package/dist/handlers/search.d.ts +1 -1
- package/dist/handlers/session.d.ts +1 -1
- package/dist/handlers/share.d.ts +1 -1
- package/dist/handlers/shims.d.ts +1 -1
- package/dist/handlers/skill.d.ts +1 -1
- package/dist/handlers/survivors.d.ts +1 -1
- package/dist/handlers/symbols.d.ts +1 -1
- package/dist/handlers/syncops.d.ts +1 -1
- package/dist/handlers/types.d.ts +1 -1
- package/dist/harvest.d.ts +1 -1
- package/dist/hours.d.ts +1 -1
- package/dist/http-auth.d.ts +1 -1
- package/dist/icons.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +1 -1
- package/dist/intelligence.d.ts +1 -1
- package/dist/internal-dispatch.d.ts +1 -1
- package/dist/keyset.d.ts +1 -1
- package/dist/knowledge-graph.d.ts +1 -1
- package/dist/license.d.ts +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/maintenance.d.ts +1 -1
- package/dist/mcp-client.d.ts +1 -1
- package/dist/memory-artifacts.d.ts +1 -1
- package/dist/migrate-prompt.d.ts +1 -1
- package/dist/migrations.d.ts +1 -1
- package/dist/presence.d.ts +1 -1
- package/dist/priority-embed.d.ts +1 -1
- package/dist/providers/embedding-provider.d.ts +1 -1
- package/dist/rehydration.d.ts +1 -1
- package/dist/reindex.d.ts +1 -1
- package/dist/render-target.d.ts +1 -1
- package/dist/render.d.ts +1 -1
- package/dist/repl-guard.d.ts +1 -1
- package/dist/replication-daemon-entrypoint.d.ts +1 -1
- package/dist/replication-daemon.d.ts +1 -1
- package/dist/resilience.d.ts +1 -1
- package/dist/reverse-bridge.d.ts +1 -1
- package/dist/security.d.ts +1 -1
- package/dist/session-seen.d.ts +1 -1
- package/dist/setup.d.ts +1 -1
- package/dist/skill-author.d.ts +1 -1
- package/dist/spec-kit.d.ts +1 -1
- package/dist/sqlite-busy.d.ts +1 -1
- package/dist/statusline.d.ts +1 -1
- package/dist/sub-agent.d.ts +1 -1
- package/dist/symbols.d.ts +1 -1
- package/dist/sync.d.ts +1 -1
- package/dist/token-budget.d.ts +1 -1
- package/dist/tool-analytics.d.ts +1 -1
- package/dist/tool-manifest-v2.json +1 -1
- package/dist/tool-manifest.json +1 -1
- package/dist/tool-profiles.d.ts +1 -1
- package/dist/trace-harvest.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/ui-dashboard.d.ts +1 -1
- package/dist/ulid.d.ts +1 -1
- package/dist/validate.d.ts +1 -1
- package/dist/vectors.d.ts +1 -1
- package/dist/version-check.d.ts +1 -1
- package/dist/visibility.d.ts +1 -1
- package/dist/wyrm-cli.d.ts +1 -1
- package/dist/wyrm-cli.js +4 -4
- package/dist/wyrm-cli.js.map +1 -1
- package/dist/wyrm-guard.d.ts +1 -1
- package/dist/wyrm-manifest.json +1 -1
- package/dist/wyrm-ui.d.ts +1 -1
- package/package.json +1 -1
package/dist/reverse-bridge.d.ts
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* one file never aborts the sweep.
|
|
28
28
|
*
|
|
29
29
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
30
|
-
* @license
|
|
30
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
31
31
|
*/
|
|
32
32
|
import { type RenderClient } from './render-target.js';
|
|
33
33
|
import type { ArtifactKind } from './memory-artifacts.js';
|
package/dist/security.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm Security Module - Input validation and path security
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
* @module security
|
|
7
7
|
* @version 3.0.0
|
|
8
8
|
*/
|
package/dist/session-seen.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* them to stub references. Backed by the migration-12 table.
|
|
7
7
|
*
|
|
8
8
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
9
|
-
* @license
|
|
9
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
10
10
|
*/
|
|
11
11
|
import type Database from 'better-sqlite3';
|
|
12
12
|
export type ArtifactKind = 'memory' | 'truth' | 'scaffold' | 'failure';
|
package/dist/setup.d.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* wyrm-setup --list List all supported AI clients
|
|
14
14
|
*
|
|
15
15
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
16
|
-
* @license
|
|
16
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
17
17
|
* @module setup
|
|
18
18
|
* @version 3.0.0
|
|
19
19
|
*/
|
package/dist/skill-author.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* from kitchen-sink mega-skills toward small composable ones.
|
|
13
13
|
*
|
|
14
14
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
15
|
-
* @license
|
|
15
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
16
16
|
*/
|
|
17
17
|
/** Where skills live. Overridable for tests / non-default layouts. */
|
|
18
18
|
export declare function getSkillsDir(): string;
|
package/dist/spec-kit.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* filesystem reads only — no DB coupling, so it's trivially unit-testable.
|
|
7
7
|
*
|
|
8
8
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
9
|
-
* @license
|
|
9
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
10
10
|
*/
|
|
11
11
|
export interface ParsedSpecTask {
|
|
12
12
|
/** Stable task id when the line has one (e.g. 'T001'), else a synthesized 'L<n>' from the ordinal. */
|
package/dist/sqlite-busy.d.ts
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* better-sqlite3 error code; the retry hint is a fixed documented constant.
|
|
31
31
|
*
|
|
32
32
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
33
|
-
* @license
|
|
33
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
34
34
|
*/
|
|
35
35
|
/** Machine-readable error code subagents key their retry logic on. */
|
|
36
36
|
export declare const WYRM_BUSY_CODE: "WYRM_BUSY";
|
package/dist/statusline.d.ts
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* WYRM_STATUSLINE_PRIVATE=1 — collapse to "<brand> ●●●" for screen-share safety
|
|
25
25
|
*
|
|
26
26
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
27
|
-
* @license
|
|
27
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
28
28
|
*/
|
|
29
29
|
import type Database from 'better-sqlite3';
|
|
30
30
|
export interface StatuslineRequest {
|
package/dist/sub-agent.d.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* quality analysis.
|
|
16
16
|
*
|
|
17
17
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
18
|
-
* @license
|
|
18
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
19
19
|
*/
|
|
20
20
|
import type Database from 'better-sqlite3';
|
|
21
21
|
export interface AskInput {
|
package/dist/symbols.d.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* - Ruby (.rb)
|
|
17
17
|
*
|
|
18
18
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
19
|
-
* @license
|
|
19
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
20
20
|
*/
|
|
21
21
|
import type Database from 'better-sqlite3';
|
|
22
22
|
export type SymbolKind = 'function' | 'class' | 'type' | 'interface' | 'const' | 'export';
|
package/dist/sync.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm File Sync - Watches and syncs .wyrm folder with database
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
*
|
|
7
7
|
* - Watches for changes to markdown files
|
|
8
8
|
* - Syncs changes to SQLite database
|
package/dist/token-budget.d.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* the session are demoted to a "seen" elision bucket.
|
|
14
14
|
*
|
|
15
15
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
16
|
-
* @license
|
|
16
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
17
17
|
*/
|
|
18
18
|
export interface TokenEstimator {
|
|
19
19
|
count(text: string): number;
|
package/dist/tool-analytics.d.ts
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* analysis, never full payloads.
|
|
20
20
|
*
|
|
21
21
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
22
|
-
* @license
|
|
22
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
23
23
|
*/
|
|
24
24
|
import type Database from 'better-sqlite3';
|
|
25
25
|
export interface ToolCallRow {
|
package/dist/tool-manifest.json
CHANGED
package/dist/tool-profiles.d.ts
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* byte-stability suite — update together.)
|
|
24
24
|
*
|
|
25
25
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
26
|
-
* @license
|
|
26
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
27
27
|
*/
|
|
28
28
|
export type ProfileName = 'essential' | 'standard' | 'legacy';
|
|
29
29
|
/**
|
package/dist/trace-harvest.d.ts
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* RNG). The MCP handler injects the DB writes + the extractor.
|
|
29
29
|
*
|
|
30
30
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
31
|
-
* @license
|
|
31
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
32
32
|
*/
|
|
33
33
|
/** A normalized chunk of trace text, ready for extraction. */
|
|
34
34
|
export interface TraceSegment {
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm Types - Core type definitions
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
* @module types
|
|
7
7
|
* @version 3.0.0
|
|
8
8
|
*/
|
package/dist/ui-dashboard.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm Visual Web Dashboard — Self-contained HTML SPA
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
*/
|
|
7
7
|
export declare function getUIDashboardHTML(): string;
|
|
8
8
|
//# sourceMappingURL=ui-dashboard.d.ts.map
|
package/dist/ulid.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm ULID — crypto-based monotonic ULID generator (v7 F2, T008).
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
*
|
|
7
7
|
* 26-char Crockford-base32 identifier: 10 chars of millisecond timestamp +
|
|
8
8
|
* 16 chars (80 bits) of crypto randomness. Used as `runs.run_id` (migration 20)
|
package/dist/validate.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* advisory only, so this is the real enforcement layer.
|
|
13
13
|
*
|
|
14
14
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
15
|
-
* @license
|
|
15
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
16
16
|
*/
|
|
17
17
|
export declare class ValidationError extends Error {
|
|
18
18
|
readonly field: string;
|
package/dist/vectors.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wyrm Vector Embeddings — Semantic Search Support
|
|
3
3
|
*
|
|
4
4
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license
|
|
5
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
6
6
|
*
|
|
7
7
|
* Features:
|
|
8
8
|
* - Provider-agnostic embeddings (local, OpenAI, Ollama)
|
package/dist/version-check.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - `fetch` is the Node 22+ global; no extra deps.
|
|
13
13
|
*
|
|
14
14
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
15
|
-
* @license
|
|
15
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
16
16
|
*/
|
|
17
17
|
import type Database from 'better-sqlite3';
|
|
18
18
|
export interface UpdateStatus {
|
package/dist/visibility.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* highlights from the operator's actual usage data.
|
|
15
15
|
*
|
|
16
16
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
17
|
-
* @license
|
|
17
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
18
18
|
*/
|
|
19
19
|
import type Database from 'better-sqlite3';
|
|
20
20
|
export interface DigestPeriod {
|
package/dist/wyrm-cli.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Usage: wyrm <command> [options]
|
|
6
6
|
*
|
|
7
7
|
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
8
|
-
* @license
|
|
8
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
9
9
|
*/
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=wyrm-cli.d.ts.map
|
package/dist/wyrm-cli.js
CHANGED
|
@@ -50,18 +50,18 @@ import{join as oe,dirname as ae}from"path";import{homedir as Ee}from"os";import{
|
|
|
50
50
|
_... brief truncated at ${t} chars, run \`wyrm show session:${m.session_id}\` for the full record._`),process.stdout.write(y+`
|
|
51
51
|
`)}finally{o.close(),console.log=a}}async function Oe(l){const{flags:i}=x(l),e=i.path,s=i.project,r=i.out,t=i.brief===!0,n=i.force===!0,a=i.quiet===!0,o=(typeof i.client=="string"?i.client:"").split(",").map(g=>g.trim().toLowerCase()).filter(Boolean),u=["claude","cursor","copilot","agents"],c=o.filter(g=>u.includes(g)),m=o.filter(g=>!u.includes(g));m.length>0&&(p(`Unknown --client value(s): ${m.join(", ")} (valid: ${u.join("|")})`),process.exit(1));const y=console.log;t&&(console.log=()=>{});const f=E();try{let g=e?f.getProject(e):void 0;!g&&s&&(g=P(f,s)??void 0),g||(g=f.getProject(process.cwd())),g||(console.log=y,p("wyrm render: no Wyrm project for this directory (use --path or --project)."),process.exit(1));const w=pe(f.getDatabase()),h={wyrm_version:O().version??"unknown",compiled_at:new Date().toISOString()};if(t){const $=se(w,g,h);console.log=y,process.stdout.write($.sessionBrief+`
|
|
52
52
|
`);return}const b=r??g.path;{const $=await import("./reverse-bridge.js"),T=se(w,g,h),Y={"MEMORY.md":T.memoryMd};for(const q of c){const A=ue(q,T.model,h);Y[A.relPath]=A.block}try{const q=$.makeBridgeDeps(f.getDatabase()),A=await $.sweepProject(q,{id:g.id,path:g.path},Y,{rootDir:b});A.added>0&&!a&&console.log(` ${L.warning} harvested ${A.added} human edit(s) \u2192 review queue before overwrite`)}catch{}}const{plan:_,writes:S}=Re(w,g,h,{rootDir:b,clients:c,force:n});if(!a){v(`Rendered ${g.name} memory (${_.model.truths.length} truths, ${_.model.failures.length} failures, ${_.model.quests.length} quests, ${_.model.artifacts.length} patterns) to ${b}`);for(const $ of S){const T=$.action==="created"?L.success:$.action==="updated"?L.info:L.warning;console.log(` ${T} ${$.action.padEnd(7)} ${$.path}${$.reason?` (${$.reason})`:""}`)}}}finally{f.close(),console.log=y}}async function We(l){const{flags:i}=x(l),e=i.path,s=i.project,r=i.root,t=i["dry-run"]===!0||i.dry===!0,n=(typeof i.client=="string"?i.client:"").split(",").map(m=>m.trim().toLowerCase()).filter(Boolean),a=["claude","cursor","copilot","agents"],o=n.filter(m=>a.includes(m)),u=await import("./reverse-bridge.js"),c=E();try{let m=e?c.getProject(e):void 0;if(!m&&s&&(m=P(c,s)??void 0),m||(m=c.getProject(process.cwd())),!m){p("wyrm reverse-bridge: no Wyrm project for this directory (use --path or --project)."),process.exitCode=1;return}const y=pe(c.getDatabase()),f={wyrm_version:O().version??"unknown",compiled_at:new Date().toISOString()},g=se(y,m,f),w={"MEMORY.md":g.memoryMd};for(const _ of o){const S=ue(_,g.model,f);w[S.relPath]=S.block}const h=u.makeBridgeDeps(c.getDatabase()),b=await u.sweepProject(h,{id:m.id,path:m.path},w,{dryRun:t,rootDir:r});j(`Reverse bridge ${t?"(dry run) ":""}\u2014 ${b.added} candidate(s) queued, ${b.skipped} already present (${b.filesWithEdits}/${b.filesScanned} file(s) with edits)`);for(const _ of b.sample)console.log(` ${L.bullet} ${_}`);!t&&b.added>0&&v("Review with: wyrm review")}finally{c.close()}}async function Ye(l){const{positional:i,flags:e}=x(l.slice(1)),s=l[0],r=e.project;if(s==="git"){const t=R(e.last,20),n=E(),a=n.getDatabase();let o=null;if(r){const g=P(n,r);g||(p(`Project not found: ${r}`),n.close(),process.exit(1)),o=g.id}else{const g=a.prepare("SELECT p.* FROM projects p JOIN sessions s ON s.project_id = p.id ORDER BY s.created_at DESC LIMIT 1").get();g&&(o=g.id)}o||(p("No project found. Use --project <name>"),n.close(),process.exit(1));const u=B("git",["log","--pretty=format:%H%x1f%s%x1f%an%x1f%ai",`-${t}`],{cwd:process.cwd(),encoding:"utf-8",timeout:1e4,shell:!1});(u.error||u.status!==0)&&(p("git log failed. Make sure you are in a git repository."),n.close(),process.exit(1));const c=u.stdout.split(`
|
|
53
|
-
`).filter(g=>g.trim()),m=new G(a);let y=0,f=0;for(const g of c){const[,w,h,b]=g.split(""),_=w??"";if(/^Merge /i.test(_)||/^(chore|bump|release|version)/i.test(_)){f++;continue}let S="pattern";/^fix(\(.+\))?:/i.test(_)?S="lesson":/^refactor(\(.+\))?:/i.test(_)&&(S="heuristic");const $=_.split(":")[0]??"commit";m.add(o,{kind:S,problem:_,whyItWorked:`Committed by ${h??"unknown"} on ${b??"unknown"}`,tags:["git","commit",$.toLowerCase()],confidence:.6,needsReview:1}),y++}n.close(),v(`Imported ${y} commits (${f} skipped). Run ${d.cyan("wyrm review")} to activate.`)}else if(s==="rules"){const t=i[0],n=e.format??"plain";t||(p("Usage: wyrm import rules <path> [--project <name>] [--format cursorrules|copilot|plain]"),process.exit(1)),ce(t)||(p(`File not found: ${t}`),process.exit(1));const a=V(t,"utf-8"),o=E(),u=o.getDatabase();let c=null;if(r){const $=P(o,r);$||(p(`Project not found: ${r}`),o.close(),process.exit(1)),c=$.id}else{const $=u.prepare("SELECT p.* FROM projects p JOIN sessions s ON s.project_id = p.id ORDER BY s.created_at DESC LIMIT 1").get();$&&(c=$.id)}c||(p("No project found. Use --project <name>"),o.close(),process.exit(1));const m=t.split("/").pop()??"rules",y=["imported",n,m],f=a.split(/\n(?=#)/),g=a.split(/\n\n+/),w=(f.length>=g.length?f:g).map($=>$.trim()).filter($=>$.length>=15),h=new G(u),b=new de(u);let _=0,S=0;for(const $ of w)/\b(always|never|must|use|don't|avoid|prefer)\b/i.test($)?(b.set(c,{category:"constraint",key:$.slice(0,50).replace(/\n/g," "),value:$,source:m}),_++):(h.add(c,{kind:"heuristic",problem:$,tags:y,confidence:.7,needsReview:1}),S++);o.close(),v(`Imported ${_} ground truths + ${S} artifacts (pending review).`)}else p("Usage: wyrm import git [--project <name>] [--last N]"),p(" wyrm import rules <path> [--project <name>] [--format cursorrules|copilot|plain]"),process.exit(1)}async function qe(l){const{flags:i}=x(l),e=i.project,s=E(),r=s.getDatabase();if(j("Wyrm Statistics"),e){const t=P(s,e);t||(p(`Project not found: ${e}`),s.close(),process.exit(1));const n=s.getProjectStats(t.id),a=[["Sessions",String(n.sessions)],["Quests (pending)",String(n.quests.pending)],["Quests (completed)",String(n.quests.completed)],["Data Points",String(n.dataPoints)]];console.log(M(["Metric","Value"],a))}else{const t=s.getStats(),n=[["Projects",String(t.projects)],["Sessions",String(t.sessions)],["Quests",String(t.quests)],["Data Points",String(t.dataPoints)],["DB Size",t.dbSize]],a=r.prepare("SELECT COUNT(*) as n FROM memory_artifacts").get().n,o=r.prepare("SELECT COUNT(*) as n FROM ground_truths WHERE is_current = 1").get().n;n.push(["Memories",String(a)],["Ground Truths",String(o)]),console.log(M(["Metric","Value"],n))}s.close()}async function
|
|
53
|
+
`).filter(g=>g.trim()),m=new G(a);let y=0,f=0;for(const g of c){const[,w,h,b]=g.split(""),_=w??"";if(/^Merge /i.test(_)||/^(chore|bump|release|version)/i.test(_)){f++;continue}let S="pattern";/^fix(\(.+\))?:/i.test(_)?S="lesson":/^refactor(\(.+\))?:/i.test(_)&&(S="heuristic");const $=_.split(":")[0]??"commit";m.add(o,{kind:S,problem:_,whyItWorked:`Committed by ${h??"unknown"} on ${b??"unknown"}`,tags:["git","commit",$.toLowerCase()],confidence:.6,needsReview:1}),y++}n.close(),v(`Imported ${y} commits (${f} skipped). Run ${d.cyan("wyrm review")} to activate.`)}else if(s==="rules"){const t=i[0],n=e.format??"plain";t||(p("Usage: wyrm import rules <path> [--project <name>] [--format cursorrules|copilot|plain]"),process.exit(1)),ce(t)||(p(`File not found: ${t}`),process.exit(1));const a=V(t,"utf-8"),o=E(),u=o.getDatabase();let c=null;if(r){const $=P(o,r);$||(p(`Project not found: ${r}`),o.close(),process.exit(1)),c=$.id}else{const $=u.prepare("SELECT p.* FROM projects p JOIN sessions s ON s.project_id = p.id ORDER BY s.created_at DESC LIMIT 1").get();$&&(c=$.id)}c||(p("No project found. Use --project <name>"),o.close(),process.exit(1));const m=t.split("/").pop()??"rules",y=["imported",n,m],f=a.split(/\n(?=#)/),g=a.split(/\n\n+/),w=(f.length>=g.length?f:g).map($=>$.trim()).filter($=>$.length>=15),h=new G(u),b=new de(u);let _=0,S=0;for(const $ of w)/\b(always|never|must|use|don't|avoid|prefer)\b/i.test($)?(b.set(c,{category:"constraint",key:$.slice(0,50).replace(/\n/g," "),value:$,source:m}),_++):(h.add(c,{kind:"heuristic",problem:$,tags:y,confidence:.7,needsReview:1}),S++);o.close(),v(`Imported ${_} ground truths + ${S} artifacts (pending review).`)}else p("Usage: wyrm import git [--project <name>] [--last N]"),p(" wyrm import rules <path> [--project <name>] [--format cursorrules|copilot|plain]"),process.exit(1)}async function qe(l){const{flags:i}=x(l),e=i.project,s=E(),r=s.getDatabase();if(j("Wyrm Statistics"),e){const t=P(s,e);t||(p(`Project not found: ${e}`),s.close(),process.exit(1));const n=s.getProjectStats(t.id),a=[["Sessions",String(n.sessions)],["Quests (pending)",String(n.quests.pending)],["Quests (completed)",String(n.quests.completed)],["Data Points",String(n.dataPoints)]];console.log(M(["Metric","Value"],a))}else{const t=s.getStats(),n=[["Projects",String(t.projects)],["Sessions",String(t.sessions)],["Quests",String(t.quests)],["Data Points",String(t.dataPoints)],["DB Size",t.dbSize]],a=r.prepare("SELECT COUNT(*) as n FROM memory_artifacts").get().n,o=r.prepare("SELECT COUNT(*) as n FROM ground_truths WHERE is_current = 1").get().n;n.push(["Memories",String(a)],["Ground Truths",String(o)]),console.log(M(["Metric","Value"],n))}s.close()}async function Ue(l){const{flags:i}=x(l),e=i.project,s=E(),r=s.getDatabase();let t=null;if(e){const c=P(s,e);c||(p(`Project not found: ${e}`),s.close(),process.exit(1)),t=c.id}const n=t?`AND project_id = ${t}`:"",a=r.prepare(`
|
|
54
54
|
SELECT id, kind, problem FROM memory_artifacts
|
|
55
55
|
WHERE needs_review = 1 ${n}
|
|
56
56
|
ORDER BY created_at ASC
|
|
57
57
|
`).all();if(a.length===0){console.log(d.dim(` No artifacts pending review${e?` for ${e}`:""}.`)),s.close();return}j(`Review Queue (${a.length} items)`);const o=K({input:process.stdin,output:process.stdout}),u=c=>new Promise(m=>{o.question(c,m)});for(const c of a){console.log(`
|
|
58
58
|
${d.bold(`[${c.kind}] #${c.id}`)}`),console.log(d.dim("\u2500".repeat(60))),console.log(c.problem.slice(0,300)),console.log(d.dim("\u2500".repeat(60)));const y=(await u(`${d.cyan("[a]")}pprove / ${d.red("[r]")}eject / ${d.yellow("[s]")}kip? `)).trim().toLowerCase();y==="a"?(r.prepare("UPDATE memory_artifacts SET needs_review = 0, updated_at = datetime('now') WHERE id = ?").run(c.id),v(`Approved #${c.id}`)):y==="r"?(r.prepare("DELETE FROM memory_artifacts WHERE id = ?").run(c.id),console.log(`${L.cross} Rejected #${c.id}`)):console.log(d.dim(` Skipped #${c.id}`))}o.close(),s.close(),console.log(`
|
|
59
|
-
Review complete.`)}async function
|
|
59
|
+
Review complete.`)}async function Fe(l){const{positional:i,flags:e}=x(l),s=i[0];(!s||!["export","import","preview"].includes(s))&&(p("Usage: wyrm sync export --out <path> | wyrm sync import --from <path> | wyrm sync preview --from <path>"),process.exit(1));const{randomBytes:r,pbkdf2Sync:t,createCipheriv:n,createDecipheriv:a}=await import("crypto"),{readFileSync:o,writeFileSync:u,copyFileSync:c,unlinkSync:m,existsSync:y,chmodSync:f}=await import("fs"),{homedir:g}=await import("os"),{join:w}=await import("path"),h=(await import("better-sqlite3")).default;let b=process.env.WYRM_SYNC_PASSPHRASE??"";if(!b){const C=K({input:process.stdin,output:process.stdout});b=await new Promise(D=>{process.stdout.write("Passphrase: "),process.stdin.isTTY&&process.stdin.setRawMode?.(!0),C.question("",N=>{process.stdin.isTTY&&process.stdin.setRawMode?.(!1),console.log(""),C.close(),D(N)})})}b||(p("Passphrase is required. Set WYRM_SYNC_PASSPHRASE or enter interactively."),process.exit(1));const _=w(g(),".wyrm"),S=E();if(s==="export"){const C=e.out;C||(p("--out <path> is required"),process.exit(1));const D=w(_,"wyrm_cli_export_temp.db");try{const N=S.getDatabase();y(D)&&m(D),N.prepare("VACUUM INTO ?").run(D);const F=o(D),W=r(32),H=r(16),$e=t(b,W,6e5,32,"sha256"),te=n("aes-256-gcm",$e,H),ke=Buffer.concat([te.update(F),te.final()]),Se=te.getAuthTag(),je=Buffer.from("WYRM"),ne=Buffer.alloc(1);ne.writeUInt8(1,0);const ie=Buffer.concat([je,ne,W,H,Se,ke]);u(C,ie);try{f(C,384)}catch{}try{m(D)}catch{}const _e=(ie.length/(1024*1024)).toFixed(2);v(`Exported to ${C} (${_e} MB)`)}catch(N){try{y(D)&&m(D)}catch{}p(`Export failed: ${N}`)}S.close();return}const $=e.from;$||(p("--from <path> is required"),process.exit(1));const T=o($);T.subarray(0,4).toString("ascii")!=="WYRM"&&(p("Invalid Wyrm snapshot file."),process.exit(1));const Y=T.readUInt8(4);Y!==1&&(p(`Unsupported snapshot version: ${Y}`),process.exit(1));const q=T.subarray(5,37),A=T.subarray(37,53),ge=T.subarray(53,69),he=T.subarray(69),we=t(b,q,6e5,32,"sha256"),Q=a("aes-256-gcm",we,A);Q.setAuthTag(ge);let X;try{X=Buffer.concat([Q.update(he),Q.final()])}catch{p("Decryption failed \u2014 wrong passphrase or corrupted file."),process.exit(1)}if(s==="preview"){const C=w(_,"wyrm_cli_preview_temp.db");y(C)&&m(C),u(C,X);try{const D=new h(C,{readonly:!0}),N=["projects","sessions","ground_truths","memory_artifacts","quests"];j("Snapshot Preview");const F=[];for(const W of N)try{const H=D.prepare(`SELECT COUNT(*) as n FROM ${W}`).get();F.push([W,String(H.n)])}catch{F.push([W,"?"])}console.log(M(["Table","Count"],F)),D.close()}catch(D){p(`Preview failed: ${D}`)}try{y(C)&&m(C)}catch{}S.close();return}const U=S.getDatabasePath(),re=K({input:process.stdin,output:process.stdout}),be=await new Promise(C=>{re.question("This will REPLACE your current database. Type CONFIRM to proceed: ",C)});if(re.close(),be.trim()!=="CONFIRM"){console.log(d.dim("Aborted.")),S.close();return}const ve=new Date().toISOString().replace(/[:.]/g,"-"),Z=`${U}.backup.${ve}`;c(U,Z),v(`Backed up to ${Z}`);const ee=w(_,"wyrm_cli_restore_temp.db");u(ee,X),S.getDatabase().close(),c(ee,U);for(const C of["-wal","-shm"])try{y(U+C)&&m(U+C)}catch{}try{m(ee)}catch{}v(`Restored from ${$}. Backup at ${Z}`)}async function He(l){const{flags:i}=x(l),e=i.project,s=i.path,r=z(i["min-confidence"],.3),t=R(i["older-than"],90),n=i["no-dry-run"]===!0,a=i.yes===!0,o=E(),u=o.getDatabase();let c=null;if(s||e){const w=s?o.getProject(s):P(o,e);w||(p(`Project not found: ${s??e}`),o.close(),process.exit(1)),c=w.id}const m=new G(u),{candidates:y}=m.pruneStale({projectId:c,minConfidence:r,olderThanDays:t,dryRun:!0});if(j(`Prune Candidates${n?" (LIVE DELETE)":" (dry-run)"}`),y.length===0){console.log(d.dim(" No artifacts match prune criteria.")),o.close();return}const f=y.map(w=>[String(w.id),w.kind,w.problem.slice(0,60),(w.confidence*100).toFixed(0)+"%",w.last_accessed_at??"never"]);if(console.log(M(["ID","Kind","Problem","Conf","Last Accessed"],f)),console.log(`
|
|
60
60
|
Total: ${y.length} candidate(s)`),!n){console.log(d.dim(`
|
|
61
61
|
This is a dry run. Use --no-dry-run to delete (confirm each ID).`)),o.close();return}if(!a){const w=K({input:process.stdin,output:process.stdout}),h=await new Promise(b=>{w.question(`
|
|
62
62
|
Delete these ${y.length} artifact(s)? Type CONFIRM to proceed: `,b)});if(w.close(),h.trim()!=="CONFIRM"){console.log(d.dim("Aborted.")),o.close();return}}const g=m.deleteArtifacts(y.map(w=>w.id));v(`Deleted ${g} artifact(s).`),o.close()}function me(){return V(0,"utf-8").trim()}async function Ve(){const{initializeLicense:l,getLicenseInfo:i,getTier:e}=await import("./license.js");l();const s=i();j("Wyrm License");const r=[["Tier",e()],["Status",s.valid?"valid":"free tier (no license key)"]];s.valid&&s.key&&(r.push(["Key",s.key]),r.push(["Issued to",s.issuedTo??"unknown"]),r.push(["Expires",s.expiresAt?new Date(s.expiresAt).toLocaleDateString():"never"])),r.push(["Features",s.features.join(", ")||"(free)"]),console.log(M(["Field","Value"],r)),s.valid||console.log(d.dim(`
|
|
63
63
|
Activate with: wyrm login (free) \xB7 or: wyrm activate <license.json | key>`)),console.log(d.dim(`
|
|
64
|
-
|
|
64
|
+
\xA9 2026 Ghost Protocol (Pvt) Ltd \xB7 Proprietary \xB7 https://wyrm.ghosts.lk`)),console.log(d.dim(" Licensed under the Wyrm Terms of Service. No open-source license is granted."))}async function Be(){const l=(process.env.WYRM_ACCOUNT_URL??"https://account.ghosts.lk").replace(/\/$/,""),i=(()=>{try{return O().version??"unknown"}catch{return"unknown"}})();let e;try{const c=await fetch(`${l}/api/v1/cli/auth/start`,{method:"POST",headers:{"x-wyrm-version":i}});if(!c.ok)throw new Error(`HTTP ${c.status}`);e=await c.json()}catch(c){p(`Couldn't reach ${l} (${c instanceof Error?c.message:"network error"}).`),process.exitCode=1;return}const s=e.verification_uri_complete||e.verification_uri||`${l}/cli`;console.log(`
|
|
65
65
|
${d.cyan("Sign in to activate Wyrm (free):")}`),console.log(` 1. Open ${d.cyan(s)}`),console.log(` 2. Approve the code ${d.cyan(e.user_code)}`),console.log(d.dim(`
|
|
66
66
|
Waiting for approval\u2026 (Ctrl-C to cancel)`));const r=(e.interval??3)*1e3,t=Date.now()+(e.expires_in??600)*1e3;let n="";for(;Date.now()<t;){await new Promise(c=>setTimeout(c,r));try{const m=await(await fetch(`${l}/api/v1/cli/auth/poll`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_code:e.device_code})})).json();if(m.status==="approved"&&m.token){n=m.token;break}if(m.status==="denied"||m.error==="expired"){p("Login was denied or the code expired. Run `wyrm login` again."),process.exitCode=1;return}}catch{}}if(!n){p("Login timed out. Run `wyrm login` again."),process.exitCode=1;return}let a;try{const c=await fetch(`${l}/api/v1/license/free`,{method:"POST",headers:{authorization:`Bearer ${n}`,"x-wyrm-version":i}});if(!c.ok){const m=await c.json().catch(()=>({}));p(`Activation failed (${c.status}): ${m.hint||m.error||"unknown error"}`),process.exitCode=1;return}a=JSON.stringify(await c.json())}catch(c){p(`Activation request failed (${c instanceof Error?c.message:"network error"}).`),process.exitCode=1;return}const{activateLicense:o}=await import("./license.js"),u=o(a);u.valid?(v(`Signed in & activated \u2014 ${u.tier} tier (expires ${u.expiresAt??"never"}).`),console.log(d.dim(" Restart the Wyrm MCP server / daemon to apply."))):(p(`Activation failed: ${u.error??"unknown error"}`),process.exitCode=1)}async function Ke(l){const{positional:i}=x(l),e=i[0];let s;e&&ce(e)?s=V(e,"utf-8"):e?s=e:process.stdin.isTTY?(p("Usage: wyrm activate <license.json path | license JSON> (or pipe the JSON on stdin)"),process.exit(1)):s=me();const{activateLicense:r}=await import("./license.js");try{const t=r(s);t.valid?(v(`License activated \u2014 ${t.tier} tier (${t.features.join(", ")})`),console.log(d.dim(" Restart Wyrm (MCP server / daemon) to apply all features."))):(p(`License activation failed: ${t.error??"unknown error"}`),process.exitCode=1)}catch{p("Invalid license format. Please verify your license key."),process.exitCode=1}}async function Ge(l){const{flags:i}=x(l),{runMaintenance:e}=await import("./maintenance.js"),{FailurePatterns:s}=await import("./failure-patterns.js"),{SessionSeen:r}=await import("./session-seen.js"),{AgentPresence:t}=await import("./presence.js"),n=E();try{const a=n.getDatabase(),o=R(i["archive-days"],0),u=e({db:n,sessionSeen:new r(a),failures:new s(a),presence:new t(a)},{vacuum:i.vacuum===!0,archiveDays:o>0?o:void 0});j("Maintenance complete");for(const c of u.lines)console.log(` - ${c}`);console.log(d.dim(`
|
|
67
67
|
Database size: ${u.dbSize}`))}finally{n.close()}}async function Je(l){const{positional:i,flags:e}=x(l),s=i[0]??"status",{createVectorStore:r}=await import("./vectors.js"),n={provider:e.provider??process.env.WYRM_VECTOR_PROVIDER??"auto",model:e.model,apiKey:e["api-key"]??process.env.OPENAI_API_KEY,ollamaUrl:e["ollama-url"]};if(s==="setup"){const{createProvider:o}=await import("./providers/embedding-provider.js"),u=o(n);if(!await u.isReady()&&n.provider!=="none"){p(`Provider not ready: ${u.name}. Check the configuration and try again.`),process.exitCode=1;return}v(`Vector provider verified: ${u.name} (model ${u.model}, ${u.dimensions}d)`),console.log(d.dim(" The MCP server reads WYRM_VECTOR_PROVIDER (and provider-specific env) at boot \u2014")),console.log(d.dim(` set WYRM_VECTOR_PROVIDER=${u.name==="none"?"none":n.provider} in the server env, then: wyrm index rebuild`));return}const a=E();try{const o=a.getDatabase(),u=r(n,o);if(s==="status"){const c=u.getStats();j("Vector index");const m=[["Provider",c.provider],["Model",c.model],["Vectors",String(c.total)],...Object.entries(c.byType).map(([y,f])=>[` ${y}`,String(f)])];console.log(M(["Field","Value"],m));return}if(s==="rebuild"){const{reindexProjects:c}=await import("./reindex.js"),m=e["dry-run"]===!0,y=e.project;let f;if(y){const h=a.getProject(y)??P(a,y);if(!h){p(`Project not found: ${y}`),process.exitCode=1;return}f=[h.id]}else f=a.getAllProjects(1e3).map(h=>h.id);const{indexed:g,skipped:w}=await c(o,u,f,{dryRun:m,onError:(h,b)=>p(`${h}: ${JSON.stringify(b)}`)});v(`Reindex ${m?"(dry run) ":""}\u2014 ${f.length} project(s), ${g} indexed, ${w} skipped`);return}p("Usage: wyrm index <setup|rebuild|status> [--provider auto|local|ollama|openai|none] [--model M] [--project P] [--dry-run]"),process.exitCode=1}finally{a.close()}}async function ze(l){const{flags:i}=x(l),{getUpdateStatus:e}=await import("./version-check.js"),s=O().version??"0.0.0",r=E();let t;try{t=await e(r.getDatabase(),s,{force:i.force===!0||i.check===!0})}finally{r.close()}if(j("Wyrm update"),console.log(M(["Field","Value"],[["Current",t.current],["Latest",t.latest??"unknown (offline?)"],["Update available",t.updateAvailable?"yes":"no"],["Checked",`${t.checkedAt} (${t.source})`]])),i.check===!0)return;if(!t.updateAvailable&&i.force!==!0){console.log(d.dim(`
|
|
@@ -144,4 +144,4 @@ ${d.bold("Examples:")}
|
|
|
144
144
|
private = never replicates . cloud = your own cloud backup . team = federates to a team Wyrm`),c>0&&console.log(d.red(`
|
|
145
145
|
! ${c} private grove(s) hold rows marked to leave. Re-private those rows or change the grove lane.`)),e.close();return}if(i==="policy"||i==="set"){const t=l[1],n=l[2];(!t||!["private","cloud","team"].includes(n))&&(p("Usage: wyrm grove policy <project|id> <private|cloud|team>"),e.close(),process.exit(1));let a=P(e,t);!a&&/^\d+$/.test(t)&&(a=s.prepare("SELECT id, name FROM projects WHERE id = ?").get(Number(t))),a||(p(`Grove not found: ${t}`),e.close(),process.exit(1)),s.prepare("UPDATE projects SET sync_policy = ? WHERE id = ?").run(n,a.id),v(`Grove "${a.name}" set to '${n}'.`),n!=="private"&&console.log(` Rows still only leave when also marked ${n==="team"?"is_shared (team)":"org/public (cloud)"}. The grove is the outer gate.`),e.close();return}p(`Unknown grove subcommand: ${i}`),console.log(`Usage:
|
|
146
146
|
wyrm grove status
|
|
147
|
-
wyrm grove policy <project|id> <private|cloud|team>`),e.close(),process.exit(1)}if(I==="--version"||I==="-v"||I==="version"){const l=O();console.log(`${l.name??"wyrm-mcp"} v${l.version??"unknown"}`)}else!I||I==="--help"||I==="-h"||I==="help"?fe():(async()=>{try{switch(I){case"search":await Me(k);break;case"ls":await Ie(k);break;case"show":await Ae(k);break;case"capture":await Ne(k);break;case"rehydrate":await Le(k);break;case"render":await Oe(k);break;case"reverse-bridge":await We(k);break;case"import":await Ye(k);break;case"stats":await qe(k);break;case"review":await
|
|
147
|
+
wyrm grove policy <project|id> <private|cloud|team>`),e.close(),process.exit(1)}if(I==="--version"||I==="-v"||I==="version"){const l=O();console.log(`${l.name??"wyrm-mcp"} v${l.version??"unknown"}`)}else!I||I==="--help"||I==="-h"||I==="help"?fe():(async()=>{try{switch(I){case"search":await Me(k);break;case"ls":await Ie(k);break;case"show":await Ae(k);break;case"capture":await Ne(k);break;case"rehydrate":await Le(k);break;case"render":await Oe(k);break;case"reverse-bridge":await We(k);break;case"import":await Ye(k);break;case"stats":await qe(k);break;case"review":await Ue(k);break;case"sync":await Fe(k);break;case"cloud":{const{cmdCloud:l}=await import("./cloud/cli.js");await l(k);break}case"grove":await ct(k);break;case"skill":await at(k);break;case"prune":await He(k);break;case"license":await Ve();break;case"login":await Be();break;case"activate":await Ke(k);break;case"maintenance":await Ge(k);break;case"index":await Je(k);break;case"update":await ze(k);break;case"prompt":await Qe(k);break;case"hours":await Xe(k);break;case"invoice":await Ze(k);break;case"agent":await et(k);break;case"setup":await tt(k);break;case"intro":{const{renderIntro:l}=await import("./visibility.js");console.log(l(O().version??"unknown"));break}case"events":await ot(k);break;case"watch":await st(k);break;case"embed":await rt(k);break;case"harvest":await nt(k);break;case"vault":await it(k);break;case"statusline":{const{installClaudeStatusline:l,removeClaudeStatusline:i}=await import("./autoconfig.js"),e=k.includes("--remove")?i():l();e?v(e.message):p("Claude Code not detected (~/.claude missing).");break}case"ui":case"dashboard":k.includes("--ui")||k.push("--ui");case"serve":{const l=k.includes("--ui");if(l){const{enableDevMode:r}=await import("./http-auth.js");r()}const{server:i}=await import("./http-fast.js"),e=parseInt(process.env.WYRM_PORT??process.env.PORT??"3333",10),s=process.env.WYRM_BIND_HOST||"127.0.0.1";i.listen(e,s,()=>{if(v(`Wyrm HTTP server running on ${s}:${e}`),process.env.WYRM_UI_READONLY==="1"&&console.log("\u{1F512} READ-ONLY mode: writes + off-box egress are blocked; safe to expose."),l){const r=`http://localhost:${e}/ui`;console.log(`\u{1F5A5}\uFE0F Dashboard: ${r}`),import("child_process").then(({spawn:t})=>{const n=process.platform;try{const a=n==="darwin"?t("open",[r],{stdio:"ignore",detached:!0}):n==="win32"?t("cmd",["/c","start","",r],{stdio:"ignore",detached:!0}):t("xdg-open",[r],{stdio:"ignore",detached:!0});a.on("error",()=>{}),a.unref()}catch{}}).catch(()=>{})}});break}default:p(`Unknown command: ${I}`),fe(),process.exit(1)}}catch(l){p(String(l)),process.exit(1)}})();
|