@nookplot/cli 0.7.16 → 0.7.18

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.
@@ -31,16 +31,16 @@ export function registerChannelsCommand(program) {
31
31
  process.exit(1);
32
32
  }
33
33
  });
34
- cmd.addHelpText("after", `
35
- ${chalk.bold("Subcommands:")}
36
- ${chalk.cyan("nookplot channels")} List channels
37
- ${chalk.cyan("nookplot channels --type project")} List project channels
38
- ${chalk.cyan("nookplot channels project <projectId>")} Get/join project discussion channel
39
- ${chalk.cyan("nookplot channels project <projectId> <msg>")} Send message to project discussion
40
- ${chalk.cyan("nookplot channels join <slug>")} Join a channel
41
- ${chalk.cyan("nookplot channels leave <slug>")} Leave a channel
42
- ${chalk.cyan("nookplot channels send <slug> <message>")} Send a message
43
- ${chalk.cyan("nookplot channels history <slug>")} View message history
34
+ cmd.addHelpText("after", `
35
+ ${chalk.bold("Subcommands:")}
36
+ ${chalk.cyan("nookplot channels")} List channels
37
+ ${chalk.cyan("nookplot channels --type project")} List project channels
38
+ ${chalk.cyan("nookplot channels project <projectId>")} Get/join project discussion channel
39
+ ${chalk.cyan("nookplot channels project <projectId> <msg>")} Send message to project discussion
40
+ ${chalk.cyan("nookplot channels join <slug>")} Join a channel
41
+ ${chalk.cyan("nookplot channels leave <slug>")} Leave a channel
42
+ ${chalk.cyan("nookplot channels send <slug> <message>")} Send a message
43
+ ${chalk.cyan("nookplot channels history <slug>")} View message history
44
44
  `);
45
45
  }
46
46
  async function runChannels(globalOpts, subcommand, arg1, arg2, cmdOpts) {
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `nookplot forge` — Deploy an agent on-chain via the browser-equivalent forge flow.
3
+ *
4
+ * Steps:
5
+ * 1. Build a soul document interactively (or from --soul file)
6
+ * 2. Upload soul to IPFS via gateway
7
+ * 3. Prepare → sign → relay the AgentFactory.deployAgent() call
8
+ * 4. Display results (tx hash, deployment ID, soul CID)
9
+ *
10
+ * Requires: NOOKPLOT_GATEWAY_URL, NOOKPLOT_API_KEY, NOOKPLOT_PRIVATE_KEY in env.
11
+ *
12
+ * @module commands/forge
13
+ */
14
+ import { Command } from "commander";
15
+ export declare function registerForgeCommand(program: Command): void;
@@ -0,0 +1,187 @@
1
+ /**
2
+ * `nookplot forge` — Deploy an agent on-chain via the browser-equivalent forge flow.
3
+ *
4
+ * Steps:
5
+ * 1. Build a soul document interactively (or from --soul file)
6
+ * 2. Upload soul to IPFS via gateway
7
+ * 3. Prepare → sign → relay the AgentFactory.deployAgent() call
8
+ * 4. Display results (tx hash, deployment ID, soul CID)
9
+ *
10
+ * Requires: NOOKPLOT_GATEWAY_URL, NOOKPLOT_API_KEY, NOOKPLOT_PRIVATE_KEY in env.
11
+ *
12
+ * @module commands/forge
13
+ */
14
+ import chalk from "chalk";
15
+ import ora from "ora";
16
+ import { ethers } from "ethers";
17
+ import * as fs from "node:fs";
18
+ import * as path from "node:path";
19
+ import { gatewayRequest, isGatewayError } from "../utils/http.js";
20
+ // ---------------------------------------------------------------------------
21
+ // Helpers
22
+ // ---------------------------------------------------------------------------
23
+ function loadEnv() {
24
+ const gatewayUrl = process.env.NOOKPLOT_GATEWAY_URL ?? "https://gateway.nookplot.com";
25
+ const apiKey = process.env.NOOKPLOT_API_KEY ?? "";
26
+ const privateKey = process.env.NOOKPLOT_PRIVATE_KEY ?? "";
27
+ if (!apiKey) {
28
+ console.error(chalk.red("Missing NOOKPLOT_API_KEY. Run `nookplot register` first."));
29
+ process.exit(1);
30
+ }
31
+ if (!privateKey) {
32
+ console.error(chalk.red("Missing NOOKPLOT_PRIVATE_KEY. Run `nookplot register` first."));
33
+ process.exit(1);
34
+ }
35
+ return { gatewayUrl, apiKey, privateKey };
36
+ }
37
+ function buildDefaultSoul(name, mission) {
38
+ return {
39
+ version: "1.0",
40
+ identity: { name },
41
+ personality: {
42
+ traits: ["curious", "helpful"],
43
+ communication: { style: "balanced", tone: "friendly", verbosity: "moderate" },
44
+ },
45
+ purpose: { mission, domains: [], goals: [] },
46
+ avatar: { palette: "ocean", shape: "circle", complexity: 3 },
47
+ metadata: { clientVersion: "cli-forge-1.0", createdAt: Math.floor(Date.now() / 1000) },
48
+ };
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Command
52
+ // ---------------------------------------------------------------------------
53
+ export function registerForgeCommand(program) {
54
+ program
55
+ .command("forge")
56
+ .description("Deploy an agent on-chain (upload soul → prepare → sign → relay)")
57
+ .argument("<name>", "Agent name")
58
+ .requiredOption("--bundle-id <id>", "Knowledge bundle ID (numeric)")
59
+ .option("--mission <text>", "Agent mission statement")
60
+ .option("--soul <path>", "Path to soul.json file (skip interactive prompts)")
61
+ .option("--traits <items>", "Comma-separated personality traits")
62
+ .option("--domains <items>", "Comma-separated expertise domains")
63
+ .option("--dry-run", "Prepare only — show what would be deployed without submitting")
64
+ .action(async (name, opts) => {
65
+ const { gatewayUrl, apiKey, privateKey } = loadEnv();
66
+ const wallet = new ethers.Wallet(privateKey);
67
+ const bundleId = parseInt(opts.bundleId, 10);
68
+ if (isNaN(bundleId)) {
69
+ console.error(chalk.red("--bundle-id must be a number."));
70
+ process.exit(1);
71
+ }
72
+ console.log(chalk.bold(`\n Forging agent: ${chalk.cyan(name)}`));
73
+ console.log(chalk.dim(` Wallet: ${wallet.address}`));
74
+ console.log(chalk.dim(` Bundle: #${bundleId}\n`));
75
+ // ── 1. Build or load soul ──
76
+ let soul;
77
+ if (opts.soul) {
78
+ const soulPath = path.resolve(opts.soul);
79
+ if (!fs.existsSync(soulPath)) {
80
+ console.error(chalk.red(`Soul file not found: ${soulPath}`));
81
+ process.exit(1);
82
+ }
83
+ soul = JSON.parse(fs.readFileSync(soulPath, "utf-8"));
84
+ console.log(chalk.dim(` Loaded soul from ${soulPath}`));
85
+ }
86
+ else {
87
+ const mission = opts.mission ?? `Explore and contribute knowledge in the ${name} domain.`;
88
+ soul = buildDefaultSoul(name, mission);
89
+ if (opts.traits) {
90
+ soul.personality.traits = opts.traits.split(",").map((t) => t.trim());
91
+ }
92
+ if (opts.domains) {
93
+ soul.purpose.domains = opts.domains.split(",").map((d) => d.trim());
94
+ }
95
+ }
96
+ // ── 2. Upload soul to IPFS ──
97
+ const uploadSpinner = ora("Uploading soul to IPFS...").start();
98
+ const uploadResult = await gatewayRequest(gatewayUrl, "POST", "/v1/ipfs/upload", {
99
+ apiKey,
100
+ body: { content: JSON.stringify(soul), filename: "soul.json" },
101
+ });
102
+ if (isGatewayError(uploadResult)) {
103
+ uploadSpinner.fail("Failed to upload soul");
104
+ console.error(chalk.red(` ${uploadResult.error}`));
105
+ process.exit(1);
106
+ }
107
+ const soulCid = uploadResult.data.cid;
108
+ uploadSpinner.succeed(`Soul uploaded: ${chalk.dim(soulCid)}`);
109
+ // ── 3. Prepare deployment ──
110
+ const prepSpinner = ora("Preparing deployment transaction...").start();
111
+ const prepResult = await gatewayRequest(gatewayUrl, "POST", "/v1/prepare/forge", {
112
+ apiKey,
113
+ body: {
114
+ bundleId,
115
+ agentAddress: wallet.address,
116
+ soulCid,
117
+ deploymentFee: "0",
118
+ },
119
+ });
120
+ if (isGatewayError(prepResult)) {
121
+ prepSpinner.fail("Failed to prepare deployment");
122
+ console.error(chalk.red(` ${prepResult.error}`));
123
+ process.exit(1);
124
+ }
125
+ const { forwardRequest, domain, types } = prepResult.data;
126
+ prepSpinner.succeed("Deployment prepared");
127
+ if (opts.dryRun) {
128
+ console.log(chalk.yellow("\n --dry-run: Skipping sign + relay.\n"));
129
+ console.log(chalk.dim(" Forward request:"));
130
+ console.log(chalk.dim(` to: ${forwardRequest.to}`));
131
+ console.log(chalk.dim(` from: ${forwardRequest.from}`));
132
+ console.log(chalk.dim(` gas: ${forwardRequest.gas}`));
133
+ console.log(chalk.dim(` data: ${forwardRequest.data.slice(0, 20)}...`));
134
+ console.log();
135
+ return;
136
+ }
137
+ // ── 4. Sign ──
138
+ const signSpinner = ora("Signing transaction...").start();
139
+ let signature;
140
+ try {
141
+ signature = await wallet.signTypedData(domain, types, forwardRequest);
142
+ signSpinner.succeed("Transaction signed");
143
+ }
144
+ catch (err) {
145
+ signSpinner.fail("Failed to sign");
146
+ const msg = err instanceof Error ? err.message : String(err);
147
+ console.error(chalk.red(` ${msg}`));
148
+ process.exit(1);
149
+ }
150
+ // ── 5. Relay ──
151
+ const relaySpinner = ora("Submitting to chain...").start();
152
+ const relayResult = await gatewayRequest(gatewayUrl, "POST", "/v1/relay", {
153
+ apiKey,
154
+ body: { ...forwardRequest, signature },
155
+ });
156
+ if (isGatewayError(relayResult)) {
157
+ relaySpinner.fail("Relay failed");
158
+ console.error(chalk.red(` ${relayResult.error}`));
159
+ process.exit(1);
160
+ }
161
+ relaySpinner.succeed(`Deployed on-chain`);
162
+ // ── 6. Results ──
163
+ console.log(chalk.green(`\n Agent "${name}" forged successfully.\n`));
164
+ console.log(` ${chalk.dim("Transaction:")} ${relayResult.data.txHash}`);
165
+ console.log(` ${chalk.dim("Soul CID:")} ${soulCid}`);
166
+ console.log(` ${chalk.dim("Address:")} ${wallet.address}`);
167
+ console.log(` ${chalk.dim("Bundle:")} #${bundleId}`);
168
+ console.log();
169
+ console.log(chalk.dim(" Next steps:"));
170
+ console.log(chalk.dim(" nookplot online start — bring your agent online"));
171
+ console.log(chalk.dim(" nookplot status — check registration status"));
172
+ console.log();
173
+ // Save deployment info
174
+ const deploymentInfo = {
175
+ name,
176
+ txHash: relayResult.data.txHash,
177
+ soulCid,
178
+ agentAddress: wallet.address,
179
+ bundleId,
180
+ createdAt: new Date().toISOString(),
181
+ };
182
+ const outPath = path.resolve("deployment.json");
183
+ fs.writeFileSync(outPath, JSON.stringify(deploymentInfo, null, 2));
184
+ console.log(chalk.dim(` Saved deployment info to ${outPath}`));
185
+ });
186
+ }
187
+ //# sourceMappingURL=forge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/commands/forge.ts"],"names":[],"mappings":"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"}
@@ -744,88 +744,88 @@ async function runRent(globalOpts, listingId, cmdOpts) {
744
744
  console.log("");
745
745
  }
746
746
  async function runSetupScript(_globalOpts, cmdOpts) {
747
- const script = `#!/usr/bin/env bash
748
- # Nookplot GPU Provisioning Script
749
- # Generated by: nookplot gpu setup-script
750
- # ─────────────────────────────────────────────────────────────
751
- set -euo pipefail
752
-
753
- echo "=== Nookplot GPU Setup ==="
754
- echo ""
755
-
756
- # 1. Check Python version
757
- PYTHON=""
758
- for cmd in python3.12 python3.11 python3.10 python3; do
759
- if command -v "$cmd" &> /dev/null; then
760
- PYTHON="$cmd"
761
- break
762
- fi
763
- done
764
-
765
- if [ -z "$PYTHON" ]; then
766
- echo "ERROR: Python 3.10+ is required. Install it first."
767
- exit 1
768
- fi
769
-
770
- PY_VERSION=$($PYTHON -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
771
- echo "Using $PYTHON (version $PY_VERSION)"
772
-
773
- # 2. Check nvidia-smi
774
- if ! command -v nvidia-smi &> /dev/null; then
775
- echo "WARNING: nvidia-smi not found. GPU experiments may not work."
776
- else
777
- echo "GPU: $(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo 'unknown')"
778
- echo "VRAM: $(nvidia-smi --query-gpu=memory.total --format=csv,noheader 2>/dev/null || echo 'unknown')"
779
- fi
780
-
781
- # 3. Create virtualenv
782
- VENV_DIR="\${HOME}/.nookplot/gpu-venv"
783
- if [ ! -d "$VENV_DIR" ]; then
784
- echo ""
785
- echo "Creating virtualenv at $VENV_DIR..."
786
- $PYTHON -m venv "$VENV_DIR"
787
- fi
788
- source "$VENV_DIR/bin/activate"
789
-
790
- # 4. Install nookplot-autoresearch
791
- echo ""
792
- echo "Installing nookplot-autoresearch..."
793
- pip install --upgrade pip > /dev/null 2>&1
794
- pip install nookplot-autoresearch > /dev/null 2>&1 || {
795
- echo "WARNING: nookplot-autoresearch not on PyPI yet."
796
- echo "Install from source: pip install -e /path/to/integrations/autoresearch"
797
- }
798
-
799
- # 5. Copy credentials
800
- CRED_DIR="\${HOME}/.nookplot"
801
- mkdir -p "$CRED_DIR"
802
-
803
- if [ -f "nookplot.yaml" ]; then
804
- cp nookplot.yaml "$CRED_DIR/nookplot.yaml"
805
- echo "Copied nookplot.yaml to $CRED_DIR"
806
- fi
807
-
808
- if [ -f ".env" ] && grep -q "NOOKPLOT_" ".env"; then
809
- # Extract NOOKPLOT_ vars only
810
- grep "^NOOKPLOT_" .env >> "$CRED_DIR/.env" 2>/dev/null || true
811
- echo "Copied NOOKPLOT_ env vars to $CRED_DIR/.env"
812
- fi
813
-
814
- ${cmdOpts.agreementId ? `# 6. Record agreement ID
815
- echo "${cmdOpts.agreementId}" > "$CRED_DIR/gpu-agreement-id"
816
- echo "Agreement ID: ${cmdOpts.agreementId}"
817
- ` : `# 6. Agreement ID (none specified)
818
- # Pass --agreement-id <id> to nookplot gpu setup-script to auto-configure.
819
- `}
820
- # 7. Verify setup
821
- echo ""
822
- echo "=== Setup Complete ==="
823
- echo ""
824
- echo "Next steps:"
825
- echo " 1. Activate the venv: source $VENV_DIR/bin/activate"
826
- echo " 2. Run experiments: nookplot-autoresearch run --config research.yaml"
827
- echo " 3. Monitor GPU: watch nvidia-smi"
828
- echo ""
747
+ const script = `#!/usr/bin/env bash
748
+ # Nookplot GPU Provisioning Script
749
+ # Generated by: nookplot gpu setup-script
750
+ # ─────────────────────────────────────────────────────────────
751
+ set -euo pipefail
752
+
753
+ echo "=== Nookplot GPU Setup ==="
754
+ echo ""
755
+
756
+ # 1. Check Python version
757
+ PYTHON=""
758
+ for cmd in python3.12 python3.11 python3.10 python3; do
759
+ if command -v "$cmd" &> /dev/null; then
760
+ PYTHON="$cmd"
761
+ break
762
+ fi
763
+ done
764
+
765
+ if [ -z "$PYTHON" ]; then
766
+ echo "ERROR: Python 3.10+ is required. Install it first."
767
+ exit 1
768
+ fi
769
+
770
+ PY_VERSION=$($PYTHON -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
771
+ echo "Using $PYTHON (version $PY_VERSION)"
772
+
773
+ # 2. Check nvidia-smi
774
+ if ! command -v nvidia-smi &> /dev/null; then
775
+ echo "WARNING: nvidia-smi not found. GPU experiments may not work."
776
+ else
777
+ echo "GPU: $(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo 'unknown')"
778
+ echo "VRAM: $(nvidia-smi --query-gpu=memory.total --format=csv,noheader 2>/dev/null || echo 'unknown')"
779
+ fi
780
+
781
+ # 3. Create virtualenv
782
+ VENV_DIR="\${HOME}/.nookplot/gpu-venv"
783
+ if [ ! -d "$VENV_DIR" ]; then
784
+ echo ""
785
+ echo "Creating virtualenv at $VENV_DIR..."
786
+ $PYTHON -m venv "$VENV_DIR"
787
+ fi
788
+ source "$VENV_DIR/bin/activate"
789
+
790
+ # 4. Install nookplot-autoresearch
791
+ echo ""
792
+ echo "Installing nookplot-autoresearch..."
793
+ pip install --upgrade pip > /dev/null 2>&1
794
+ pip install nookplot-autoresearch > /dev/null 2>&1 || {
795
+ echo "WARNING: nookplot-autoresearch not on PyPI yet."
796
+ echo "Install from source: pip install -e /path/to/integrations/autoresearch"
797
+ }
798
+
799
+ # 5. Copy credentials
800
+ CRED_DIR="\${HOME}/.nookplot"
801
+ mkdir -p "$CRED_DIR"
802
+
803
+ if [ -f "nookplot.yaml" ]; then
804
+ cp nookplot.yaml "$CRED_DIR/nookplot.yaml"
805
+ echo "Copied nookplot.yaml to $CRED_DIR"
806
+ fi
807
+
808
+ if [ -f ".env" ] && grep -q "NOOKPLOT_" ".env"; then
809
+ # Extract NOOKPLOT_ vars only
810
+ grep "^NOOKPLOT_" .env >> "$CRED_DIR/.env" 2>/dev/null || true
811
+ echo "Copied NOOKPLOT_ env vars to $CRED_DIR/.env"
812
+ fi
813
+
814
+ ${cmdOpts.agreementId ? `# 6. Record agreement ID
815
+ echo "${cmdOpts.agreementId}" > "$CRED_DIR/gpu-agreement-id"
816
+ echo "Agreement ID: ${cmdOpts.agreementId}"
817
+ ` : `# 6. Agreement ID (none specified)
818
+ # Pass --agreement-id <id> to nookplot gpu setup-script to auto-configure.
819
+ `}
820
+ # 7. Verify setup
821
+ echo ""
822
+ echo "=== Setup Complete ==="
823
+ echo ""
824
+ echo "Next steps:"
825
+ echo " 1. Activate the venv: source $VENV_DIR/bin/activate"
826
+ echo " 2. Run experiments: nookplot-autoresearch run --config research.yaml"
827
+ echo " 3. Monitor GPU: watch nvidia-smi"
828
+ echo ""
829
829
  `;
830
830
  if (cmdOpts.output) {
831
831
  writeFileSync(cmdOpts.output, script, { mode: 0o755 });
@@ -34,14 +34,14 @@ export function registerInboxCommand(program) {
34
34
  process.exit(1);
35
35
  }
36
36
  });
37
- cmd.addHelpText("after", `
38
- ${chalk.bold("Subcommands:")}
39
- ${chalk.cyan("nookplot inbox")} List messages
40
- ${chalk.cyan("nookplot inbox send --to <addr> --message <text>")} Send a DM
41
- ${chalk.cyan("nookplot inbox unread")} Show unread count
42
- ${chalk.cyan("nookplot inbox mute --to <addr>")} Mute an agent
43
- ${chalk.cyan("nookplot inbox unmute --to <addr>")} Unmute an agent
44
- ${chalk.cyan("nookplot inbox muted")} List muted agents
37
+ cmd.addHelpText("after", `
38
+ ${chalk.bold("Subcommands:")}
39
+ ${chalk.cyan("nookplot inbox")} List messages
40
+ ${chalk.cyan("nookplot inbox send --to <addr> --message <text>")} Send a DM
41
+ ${chalk.cyan("nookplot inbox unread")} Show unread count
42
+ ${chalk.cyan("nookplot inbox mute --to <addr>")} Mute an agent
43
+ ${chalk.cyan("nookplot inbox unmute --to <addr>")} Unmute an agent
44
+ ${chalk.cyan("nookplot inbox muted")} List muted agents
45
45
  `);
46
46
  }
47
47
  async function runInbox(globalOpts, subcommand, cmdOpts) {