mthds 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/agents/claude-code.d.ts +2 -0
- package/dist/agents/claude-code.js +21 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor.d.ts +2 -0
- package/dist/agents/cursor.js +11 -0
- package/dist/agents/cursor.js.map +1 -0
- package/dist/agents/github-copilot.d.ts +2 -0
- package/dist/agents/github-copilot.js +11 -0
- package/dist/agents/github-copilot.js.map +1 -0
- package/dist/agents/registry.d.ts +4 -0
- package/dist/agents/registry.js +24 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +26 -0
- package/dist/agents/types.js +11 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/windsurf.d.ts +2 -0
- package/dist/agents/windsurf.js +11 -0
- package/dist/agents/windsurf.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +67 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +45 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +104 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.js +9 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +26 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -0
- package/dist/postinstall.d.ts +1 -0
- package/dist/postinstall.js +4 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/runtime/check.d.ts +2 -0
- package/dist/runtime/check.js +23 -0
- package/dist/runtime/check.js.map +1 -0
- package/dist/runtime/installer.d.ts +1 -0
- package/dist/runtime/installer.js +39 -0
- package/dist/runtime/installer.js.map +1 -0
- package/dist/runtime/spawn.d.ts +1 -0
- package/dist/runtime/spawn.js +16 -0
- package/dist/runtime/spawn.js.map +1 -0
- package/dist/supabase/client.d.ts +4 -0
- package/dist/supabase/client.js +5 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/methods.d.ts +2 -0
- package/dist/supabase/methods.js +12 -0
- package/dist/supabase/methods.js.map +1 -0
- package/dist/supabase/types.d.ts +25 -0
- package/dist/supabase/types.js +2 -0
- package/dist/supabase/types.js.map +1 -0
- package/dist/telemetry/posthog.d.ts +2 -0
- package/dist/telemetry/posthog.js +35 -0
- package/dist/telemetry/posthog.js.map +1 -0
- package/package.json +31 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Evotis S.A.S.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# mthds
|
|
2
|
+
|
|
3
|
+
CLI for installing and managing **methods** — reusable workflows for AI coding agents.
|
|
4
|
+
|
|
5
|
+
## What is a method?
|
|
6
|
+
|
|
7
|
+
A method is a packaged workflow that an AI agent (like Claude Code) can use. Methods are stored in a registry and installed locally via their unique slug.
|
|
8
|
+
|
|
9
|
+
## Install a method
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx mthds install <slug>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The CLI will:
|
|
16
|
+
|
|
17
|
+
1. Look up the method in the registry
|
|
18
|
+
2. Ask which AI agent to install it for (Claude Code, with more coming soon)
|
|
19
|
+
3. Ask where to install — **local** (current project) or **global** (your machine)
|
|
20
|
+
4. Optionally install the pipelex software runtime
|
|
21
|
+
5. Write the method to `.claude/methods/<slug>/METHOD.mthds`
|
|
22
|
+
|
|
23
|
+
### Install locations
|
|
24
|
+
|
|
25
|
+
| Location | Path |
|
|
26
|
+
|----------|------|
|
|
27
|
+
| Local | `<cwd>/.claude/methods/<slug>/` |
|
|
28
|
+
| Global | `~/.claude/methods/<slug>/` |
|
|
29
|
+
|
|
30
|
+
## Install software runtime
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx mthds setup software pipelex
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Installs [uv](https://docs.astral.sh/uv/) and [pipelex](https://pipelex.dev) so methods that depend on them can run.
|
|
37
|
+
|
|
38
|
+
## Telemetry
|
|
39
|
+
|
|
40
|
+
Anonymous usage data (method slug + timestamp) is collected to help rank methods on the leaderboard. No personal or device information is collected.
|
|
41
|
+
|
|
42
|
+
To opt out:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
DISABLE_TELEMETRY=1 npx mthds install <slug>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Development
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
make install # install dependencies
|
|
52
|
+
make check # typecheck + build
|
|
53
|
+
make dev # watch mode
|
|
54
|
+
make run # build and run the CLI
|
|
55
|
+
make pack # create tarball for local npx testing
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
MIT
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import * as p from "@clack/prompts";
|
|
4
|
+
import { Agent } from "./types.js";
|
|
5
|
+
export const claudeCodeHandler = {
|
|
6
|
+
id: Agent.ClaudeCode,
|
|
7
|
+
label: "Claude Code",
|
|
8
|
+
supported: true,
|
|
9
|
+
async installMethod(ctx) {
|
|
10
|
+
const s = p.spinner();
|
|
11
|
+
s.start(`Installing method "${ctx.method}" for Claude Code...`);
|
|
12
|
+
// TODO: When multi-agent support ships, offer symlink vs copy strategy.
|
|
13
|
+
// Symlink: store method once in a canonical location, symlink from each agent's dir.
|
|
14
|
+
// Copy: independent copies per agent. Fallback when symlinks aren't supported.
|
|
15
|
+
const methodDir = join(ctx.targetDir, ctx.method);
|
|
16
|
+
mkdirSync(methodDir, { recursive: true });
|
|
17
|
+
writeFileSync(join(methodDir, "METHOD.mthds"), ctx.content, "utf-8");
|
|
18
|
+
s.stop(`Method "${ctx.method}" installed to ${methodDir}`);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,EAAE,EAAE,KAAK,CAAC,UAAU;IACpB,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,IAAI;IAEf,KAAK,CAAC,aAAa,CAAC,GAAmB;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,sBAAsB,CAAC,CAAC;QAEhE,wEAAwE;QACxE,qFAAqF;QACrF,+EAA+E;QAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAC/B,GAAG,CAAC,OAAO,EACX,OAAO,CACR,CAAC;QAEF,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,MAAM,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Agent } from "./types.js";
|
|
2
|
+
export const cursorHandler = {
|
|
3
|
+
id: Agent.Cursor,
|
|
4
|
+
label: "Cursor",
|
|
5
|
+
supported: false,
|
|
6
|
+
hint: "coming soon",
|
|
7
|
+
async installMethod(_ctx) {
|
|
8
|
+
throw new Error("Cursor is not supported yet.");
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,EAAE,EAAE,KAAK,CAAC,MAAM;IAChB,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,aAAa,CAAC,IAAoB;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Agent } from "./types.js";
|
|
2
|
+
export const githubCopilotHandler = {
|
|
3
|
+
id: Agent.GithubCopilot,
|
|
4
|
+
label: "GitHub Copilot",
|
|
5
|
+
supported: false,
|
|
6
|
+
hint: "coming soon",
|
|
7
|
+
async installMethod(_ctx) {
|
|
8
|
+
throw new Error("GitHub Copilot is not supported yet.");
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=github-copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-copilot.js","sourceRoot":"","sources":["../../src/agents/github-copilot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,EAAE,EAAE,KAAK,CAAC,aAAa;IACvB,KAAK,EAAE,gBAAgB;IACvB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,aAAa,CAAC,IAAoB;QACtC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { claudeCodeHandler } from "./claude-code.js";
|
|
2
|
+
import { cursorHandler } from "./cursor.js";
|
|
3
|
+
import { windsurfHandler } from "./windsurf.js";
|
|
4
|
+
import { githubCopilotHandler } from "./github-copilot.js";
|
|
5
|
+
const handlers = new Map([
|
|
6
|
+
[claudeCodeHandler.id, claudeCodeHandler],
|
|
7
|
+
[cursorHandler.id, cursorHandler],
|
|
8
|
+
[windsurfHandler.id, windsurfHandler],
|
|
9
|
+
[githubCopilotHandler.id, githubCopilotHandler],
|
|
10
|
+
]);
|
|
11
|
+
export function getAgentHandler(agent) {
|
|
12
|
+
const handler = handlers.get(agent);
|
|
13
|
+
if (!handler) {
|
|
14
|
+
throw new Error(`No handler registered for agent: ${agent}`);
|
|
15
|
+
}
|
|
16
|
+
return handler;
|
|
17
|
+
}
|
|
18
|
+
export function getAllAgents() {
|
|
19
|
+
return [...handlers.values()];
|
|
20
|
+
}
|
|
21
|
+
export function getSupportedAgents() {
|
|
22
|
+
return getAllAgents().filter((h) => h.supported);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,QAAQ,GAAqC,IAAI,GAAG,CAAC;IACzD,CAAC,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,CAAC;IACzC,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC;IACjC,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,CAAC;IACrC,CAAC,oBAAoB,CAAC,EAAE,EAAE,oBAAoB,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const Agent: {
|
|
2
|
+
readonly ClaudeCode: "claude-code";
|
|
3
|
+
readonly Cursor: "cursor";
|
|
4
|
+
readonly Windsurf: "windsurf";
|
|
5
|
+
readonly GithubCopilot: "github-copilot";
|
|
6
|
+
};
|
|
7
|
+
export type Agent = (typeof Agent)[keyof typeof Agent];
|
|
8
|
+
export declare const InstallLocation: {
|
|
9
|
+
readonly Local: "local";
|
|
10
|
+
readonly Global: "global";
|
|
11
|
+
};
|
|
12
|
+
export type InstallLocation = (typeof InstallLocation)[keyof typeof InstallLocation];
|
|
13
|
+
export interface InstallContext {
|
|
14
|
+
readonly method: string;
|
|
15
|
+
readonly content: string;
|
|
16
|
+
readonly agent: Agent;
|
|
17
|
+
readonly location: InstallLocation;
|
|
18
|
+
readonly targetDir: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AgentHandler {
|
|
21
|
+
readonly id: Agent;
|
|
22
|
+
readonly label: string;
|
|
23
|
+
readonly supported: boolean;
|
|
24
|
+
readonly hint?: string;
|
|
25
|
+
installMethod(ctx: InstallContext): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,gBAAgB;CACvB,CAAC;AAIX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Agent } from "./types.js";
|
|
2
|
+
export const windsurfHandler = {
|
|
3
|
+
id: Agent.Windsurf,
|
|
4
|
+
label: "Windsurf",
|
|
5
|
+
supported: false,
|
|
6
|
+
hint: "coming soon",
|
|
7
|
+
async installMethod(_ctx) {
|
|
8
|
+
throw new Error("Windsurf is not supported yet.");
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=windsurf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/agents/windsurf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,EAAE,EAAE,KAAK,CAAC,QAAQ;IAClB,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,aAAa,CAAC,IAAoB;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;CACF,CAAC"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command, CommanderError } from "commander";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { showBanner } from "./commands/index.js";
|
|
6
|
+
import { printLogo } from "./commands/index.js";
|
|
7
|
+
import { installSoftware } from "./commands/setup.js";
|
|
8
|
+
import { installMethod } from "./commands/install.js";
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
10
|
+
const pkg = require("../package.json");
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name("mthds")
|
|
14
|
+
.version(pkg.version)
|
|
15
|
+
.description("CLI bridge to the Pipelex runtime")
|
|
16
|
+
.exitOverride()
|
|
17
|
+
.configureOutput({
|
|
18
|
+
writeOut: () => { },
|
|
19
|
+
writeErr: () => { },
|
|
20
|
+
});
|
|
21
|
+
// mthds install <slug>
|
|
22
|
+
program
|
|
23
|
+
.command("install")
|
|
24
|
+
.argument("<slug>", "Method slug to install")
|
|
25
|
+
.description("Install a method")
|
|
26
|
+
.exitOverride()
|
|
27
|
+
.action(async (slug) => {
|
|
28
|
+
await installMethod(slug);
|
|
29
|
+
});
|
|
30
|
+
// mthds setup software <name>
|
|
31
|
+
const setup = program.command("setup").exitOverride();
|
|
32
|
+
setup
|
|
33
|
+
.command("software <name>")
|
|
34
|
+
.description("Install a software runtime (e.g. pipelex)")
|
|
35
|
+
.exitOverride()
|
|
36
|
+
.action(async (name) => {
|
|
37
|
+
await installSoftware(name);
|
|
38
|
+
});
|
|
39
|
+
// Default: show banner
|
|
40
|
+
program.action(() => {
|
|
41
|
+
showBanner();
|
|
42
|
+
});
|
|
43
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
44
|
+
if (err instanceof CommanderError) {
|
|
45
|
+
// --help and --version exit with code 0
|
|
46
|
+
if (err.exitCode === 0) {
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
printLogo();
|
|
50
|
+
p.intro("mthds");
|
|
51
|
+
const message = err.message
|
|
52
|
+
.replace(/^error: /, "")
|
|
53
|
+
.replace(/^Error: /, "");
|
|
54
|
+
p.log.error(message);
|
|
55
|
+
if (err.code === "commander.missingArgument") {
|
|
56
|
+
p.log.info("Run mthds --help to see usage.");
|
|
57
|
+
}
|
|
58
|
+
p.outro("");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
printLogo();
|
|
62
|
+
p.intro("mthds");
|
|
63
|
+
p.log.error(err.message);
|
|
64
|
+
p.outro("");
|
|
65
|
+
process.exit(1);
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
function getVersion() {
|
|
4
|
+
try {
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const pkg = require("../../package.json");
|
|
7
|
+
return pkg.version;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return "0.0.0";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const LOGO = [
|
|
14
|
+
" __ __ __",
|
|
15
|
+
" ____ ___ ___ / /_/ /_ ____ ____/ /____",
|
|
16
|
+
" / __ `__ \\/ _ \\/ __/ __ \\/ __ \\/ __ / ___/",
|
|
17
|
+
" / / / / / / __/ /_/ / / / /_/ / /_/ (__ )",
|
|
18
|
+
"/_/ /_/ /_/\\___/\\__/_/ /_/\\____/\\__,_/____/",
|
|
19
|
+
];
|
|
20
|
+
export function printLogo() {
|
|
21
|
+
console.log();
|
|
22
|
+
for (const line of LOGO) {
|
|
23
|
+
console.log(chalk.white(line));
|
|
24
|
+
}
|
|
25
|
+
console.log();
|
|
26
|
+
}
|
|
27
|
+
export function showBanner() {
|
|
28
|
+
const version = getVersion();
|
|
29
|
+
printLogo();
|
|
30
|
+
console.log(chalk.dim(` v${version}\n`));
|
|
31
|
+
console.log(chalk.bold(" Usage:"));
|
|
32
|
+
console.log(` ${chalk.green("mthds")} ${chalk.yellow("<command>")} [options]\n`);
|
|
33
|
+
console.log(chalk.bold(" Commands:"));
|
|
34
|
+
console.log(` ${chalk.yellow("install <slug>")} Install a method`);
|
|
35
|
+
console.log(` ${chalk.yellow("setup software <name>")} Install a software runtime`);
|
|
36
|
+
console.log(` ${chalk.yellow("--help")} Show this help message`);
|
|
37
|
+
console.log(` ${chalk.yellow("--version")} Show version\n`);
|
|
38
|
+
console.log(chalk.bold(" Examples:"));
|
|
39
|
+
console.log(` ${chalk.dim("$")} mthds install my-method-slug`);
|
|
40
|
+
console.log(` ${chalk.dim("$")} mthds setup software pipelex\n`);
|
|
41
|
+
console.log(chalk.dim(" Docs: https://pipelex.dev/docs\n"));
|
|
42
|
+
console.log(chalk.bold(" Telemetry:"));
|
|
43
|
+
console.log(chalk.dim(" Anonymous usage data (method slug + timestamp) is collected\n to help rank methods. No personal info is collected.\n Opt out: DISABLE_TELEMETRY=1\n"));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;QACjE,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;IACX,4CAA4C;IAC5C,+CAA+C;IAC/C,mDAAmD;IACnD,8CAA8C;IAC9C,iDAAiD;CAClD,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAEpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CACjE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,6BAA6B,CAC1E,CAAC;IACF,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,0CAA0C,CACxE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,+BAA+B,CAChE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAEpE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,yJAAyJ,CAC1J,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installMethod(slug: string): Promise<void>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { mkdirSync } from "node:fs";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { isPipelexInstalled } from "../runtime/check.js";
|
|
6
|
+
import { ensureRuntime } from "../runtime/installer.js";
|
|
7
|
+
import { trackMethodInstall, shutdown } from "../telemetry/posthog.js";
|
|
8
|
+
import { printLogo } from "./index.js";
|
|
9
|
+
import { InstallLocation as Loc } from "../agents/types.js";
|
|
10
|
+
import { getAllAgents, getAgentHandler } from "../agents/registry.js";
|
|
11
|
+
import { fetchMethodBySlug } from "../supabase/methods.js";
|
|
12
|
+
export async function installMethod(slug) {
|
|
13
|
+
printLogo();
|
|
14
|
+
p.intro("mthds install");
|
|
15
|
+
// Step 0: Check if the method exists
|
|
16
|
+
const s = p.spinner();
|
|
17
|
+
s.start(`Looking up method "${slug}"...`);
|
|
18
|
+
const method = await fetchMethodBySlug(slug);
|
|
19
|
+
if (!method) {
|
|
20
|
+
s.stop(`Method "${slug}" not found.`);
|
|
21
|
+
p.log.error(`No method with slug "${slug}" exists.`);
|
|
22
|
+
p.log.info("Check the slug and try again.");
|
|
23
|
+
p.outro("");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
if (!method.content) {
|
|
27
|
+
s.stop(`Method "${slug}" has no content.`);
|
|
28
|
+
p.log.error("This method is missing its content and cannot be installed.");
|
|
29
|
+
p.outro("");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
s.stop(`Found "${method.name}"${method.description ? ` — ${method.description}` : ""}`);
|
|
33
|
+
// Step 1: Which AI agent?
|
|
34
|
+
const agents = getAllAgents();
|
|
35
|
+
const agentOptions = agents.map((a) => ({
|
|
36
|
+
value: a.id,
|
|
37
|
+
label: a.label,
|
|
38
|
+
hint: a.supported ? undefined : (a.hint ?? "not supported"),
|
|
39
|
+
disabled: !a.supported,
|
|
40
|
+
}));
|
|
41
|
+
const selectedAgent = await p.select({
|
|
42
|
+
message: "Which AI agent do you want to install this method for?",
|
|
43
|
+
options: agentOptions,
|
|
44
|
+
});
|
|
45
|
+
if (p.isCancel(selectedAgent)) {
|
|
46
|
+
p.cancel("Installation cancelled.");
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Local or global?
|
|
50
|
+
const localDir = join(process.cwd(), ".claude", "methods");
|
|
51
|
+
const globalDir = join(homedir(), ".claude", "methods");
|
|
52
|
+
const selectedLocation = await p.select({
|
|
53
|
+
message: "Where do you want to install this method?",
|
|
54
|
+
options: [
|
|
55
|
+
{
|
|
56
|
+
value: Loc.Local,
|
|
57
|
+
label: "Local",
|
|
58
|
+
hint: localDir,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
value: Loc.Global,
|
|
62
|
+
label: "Global",
|
|
63
|
+
hint: globalDir,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
if (p.isCancel(selectedLocation)) {
|
|
68
|
+
p.cancel("Installation cancelled.");
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
// Step 3: Optional software install
|
|
72
|
+
const wantsSoftware = await p.confirm({
|
|
73
|
+
message: "Do you want to install software now? (optional)",
|
|
74
|
+
initialValue: false,
|
|
75
|
+
});
|
|
76
|
+
if (p.isCancel(wantsSoftware)) {
|
|
77
|
+
p.cancel("Installation cancelled.");
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
if (wantsSoftware) {
|
|
81
|
+
if (!isPipelexInstalled()) {
|
|
82
|
+
await ensureRuntime();
|
|
83
|
+
p.log.success("pipelex installed.");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
p.log.success("pipelex is already installed.");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Step 4: Install via the agent handler
|
|
90
|
+
const targetDir = selectedLocation === Loc.Global ? globalDir : localDir;
|
|
91
|
+
mkdirSync(targetDir, { recursive: true });
|
|
92
|
+
const handler = getAgentHandler(selectedAgent);
|
|
93
|
+
trackMethodInstall(slug);
|
|
94
|
+
await handler.installMethod({
|
|
95
|
+
method: slug,
|
|
96
|
+
content: method.content,
|
|
97
|
+
agent: selectedAgent,
|
|
98
|
+
location: selectedLocation,
|
|
99
|
+
targetDir,
|
|
100
|
+
});
|
|
101
|
+
p.outro("Done");
|
|
102
|
+
await shutdown();
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { spawnPipelex } from "../runtime/spawn.js";
|
|
2
|
+
import { trackEvent, shutdown } from "../telemetry/posthog.js";
|
|
3
|
+
export async function runCommand(args) {
|
|
4
|
+
trackEvent("command_run", { command: args[0] ?? "unknown" });
|
|
5
|
+
const exitCode = await spawnPipelex(args);
|
|
6
|
+
await shutdown();
|
|
7
|
+
process.exit(exitCode);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,QAAQ,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installSoftware(name: string): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { isPipelexInstalled } from "../runtime/check.js";
|
|
3
|
+
import { ensureRuntime } from "../runtime/installer.js";
|
|
4
|
+
import { shutdown } from "../telemetry/posthog.js";
|
|
5
|
+
import { printLogo } from "./index.js";
|
|
6
|
+
export async function installSoftware(name) {
|
|
7
|
+
printLogo();
|
|
8
|
+
p.intro("mthds setup");
|
|
9
|
+
if (name !== "pipelex") {
|
|
10
|
+
p.log.error(`Unknown software: ${name}`);
|
|
11
|
+
p.log.info("Available software: pipelex");
|
|
12
|
+
p.outro("Done");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (isPipelexInstalled()) {
|
|
16
|
+
p.log.success("pipelex is already installed.");
|
|
17
|
+
p.outro("Done");
|
|
18
|
+
await shutdown();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
await ensureRuntime();
|
|
22
|
+
p.log.success("pipelex installed successfully.");
|
|
23
|
+
p.outro("Done");
|
|
24
|
+
await shutdown();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,SAAS,EAAE,CAAC;IACZ,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACzB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IACtB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
const CONFIG_DIR = join(homedir(), ".pipelex");
|
|
6
|
+
const CONFIG_FILE = join(CONFIG_DIR, "mthds.json");
|
|
7
|
+
export function loadConfig() {
|
|
8
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
9
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
if (existsSync(CONFIG_FILE)) {
|
|
12
|
+
const raw = readFileSync(CONFIG_FILE, "utf-8");
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
const config = {
|
|
16
|
+
anonymousId: randomUUID(),
|
|
17
|
+
};
|
|
18
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAMnD,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,WAAW,EAAE,UAAU,EAAE;KAC1B,CAAC;IAEF,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE9D,UAAU,CAAC,WAAW,CAAC,CAAC;AACxB,MAAM,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
export function isUvInstalled() {
|
|
3
|
+
try {
|
|
4
|
+
execFileSync("uv", ["--version"], { stdio: "ignore" });
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function isPipelexInstalled() {
|
|
12
|
+
try {
|
|
13
|
+
const output = execFileSync("uv", ["tool", "list"], {
|
|
14
|
+
encoding: "utf-8",
|
|
15
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
16
|
+
});
|
|
17
|
+
return output.includes("pipelex");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/runtime/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YAClD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensureRuntime(): Promise<void>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { execSync, execFileSync } from "node:child_process";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { isUvInstalled, isPipelexInstalled } from "./check.js";
|
|
4
|
+
export async function ensureRuntime() {
|
|
5
|
+
if (!isUvInstalled()) {
|
|
6
|
+
await installUv();
|
|
7
|
+
}
|
|
8
|
+
if (!isPipelexInstalled()) {
|
|
9
|
+
await installPipelex();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function installUv() {
|
|
13
|
+
const spinner = ora("Installing uv runtime...").start();
|
|
14
|
+
try {
|
|
15
|
+
execSync("curl -LsSf https://astral.sh/uv/install.sh | sh", {
|
|
16
|
+
stdio: "ignore",
|
|
17
|
+
shell: "/bin/sh",
|
|
18
|
+
});
|
|
19
|
+
spinner.succeed("uv installed");
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
spinner.fail("Failed to install uv");
|
|
23
|
+
throw new Error("Could not install uv. Please install it manually: https://docs.astral.sh/uv/getting-started/installation/");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function installPipelex() {
|
|
27
|
+
const spinner = ora("Setting up pipelex runtime...").start();
|
|
28
|
+
try {
|
|
29
|
+
execFileSync("uv", ["tool", "install", "pipelex"], {
|
|
30
|
+
stdio: "ignore",
|
|
31
|
+
});
|
|
32
|
+
spinner.succeed("pipelex installed");
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
spinner.fail("Failed to install pipelex");
|
|
36
|
+
throw new Error("Could not install pipelex via uv. Try manually: uv tool install pipelex");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/runtime/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IACxD,IAAI,CAAC;QACH,QAAQ,CAAC,iDAAiD,EAAE;YAC1D,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;YACjD,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function spawnPipelex(args: string[]): Promise<number>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function spawnPipelex(args) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
const child = spawn("pipelex", args, {
|
|
5
|
+
stdio: "inherit",
|
|
6
|
+
shell: false,
|
|
7
|
+
});
|
|
8
|
+
child.on("error", (err) => {
|
|
9
|
+
reject(new Error(`Failed to start pipelex: ${err.message}`));
|
|
10
|
+
});
|
|
11
|
+
child.on("close", (code) => {
|
|
12
|
+
resolve(code ?? 1);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/runtime/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE;YACnC,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createClient } from "@supabase/supabase-js";
|
|
2
|
+
const SUPABASE_URL = "https://nnusulwfrelkuejkdgif.supabase.co";
|
|
3
|
+
const SUPABASE_KEY = "sb_publishable_7nx0iaNVuAQ7z1hZnuwKEQ_1L_xBZxn";
|
|
4
|
+
export const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
|
|
5
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/supabase/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,YAAY,GAChB,gDAAgD,CAAC;AAEnD,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAW,YAAY,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { supabase } from "./client.js";
|
|
2
|
+
export async function fetchMethodBySlug(slug) {
|
|
3
|
+
const { data, error } = await supabase
|
|
4
|
+
.from("methods")
|
|
5
|
+
.select("*")
|
|
6
|
+
.eq("name", slug)
|
|
7
|
+
.single();
|
|
8
|
+
if (error || !data)
|
|
9
|
+
return null;
|
|
10
|
+
return data;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/supabase/methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY;IAEZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ;SACnC,IAAI,CAAC,SAAS,CAAC;SACf,MAAM,CAAC,GAAG,CAAC;SACX,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;SAChB,MAAM,EAAE,CAAC;IAEZ,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Method {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string | null;
|
|
5
|
+
content: string | null;
|
|
6
|
+
version: string | null;
|
|
7
|
+
repository: string | null;
|
|
8
|
+
dependencies: string | null;
|
|
9
|
+
installs: number;
|
|
10
|
+
created_at: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Database {
|
|
13
|
+
public: {
|
|
14
|
+
Tables: {
|
|
15
|
+
methods: {
|
|
16
|
+
Row: Method;
|
|
17
|
+
Insert: Omit<Method, "id" | "created_at" | "installs">;
|
|
18
|
+
Update: Partial<Omit<Method, "id">>;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
Views: Record<string, never>;
|
|
22
|
+
Functions: Record<string, never>;
|
|
23
|
+
Enums: Record<string, never>;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/supabase/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { PostHog } from "posthog-node";
|
|
2
|
+
const POSTHOG_API_KEY = "phc_ylV9FzMiQDyGgtd5nJn0Cc2OkyHAobfj7xDhYloH5IA";
|
|
3
|
+
const POSTHOG_HOST = "https://eu.i.posthog.com";
|
|
4
|
+
let client = null;
|
|
5
|
+
function isDisabled() {
|
|
6
|
+
return process.env["DISABLE_TELEMETRY"] === "1";
|
|
7
|
+
}
|
|
8
|
+
function getClient() {
|
|
9
|
+
if (isDisabled())
|
|
10
|
+
return null;
|
|
11
|
+
if (!client) {
|
|
12
|
+
client = new PostHog(POSTHOG_API_KEY, { host: POSTHOG_HOST });
|
|
13
|
+
}
|
|
14
|
+
return client;
|
|
15
|
+
}
|
|
16
|
+
export function trackMethodInstall(methodId) {
|
|
17
|
+
const posthog = getClient();
|
|
18
|
+
if (!posthog)
|
|
19
|
+
return;
|
|
20
|
+
posthog.capture({
|
|
21
|
+
distinctId: "anonymous",
|
|
22
|
+
event: "method_installed",
|
|
23
|
+
properties: {
|
|
24
|
+
method: methodId,
|
|
25
|
+
timestamp: new Date().toISOString(),
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export async function shutdown() {
|
|
30
|
+
if (client) {
|
|
31
|
+
await client.shutdown();
|
|
32
|
+
client = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=posthog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../src/telemetry/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,eAAe,GAAG,iDAAiD,CAAC;AAC1E,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC;AAClD,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,UAAU,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,OAAO,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,OAAO,CAAC,OAAO,CAAC;QACd,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,kBAAkB;QACzB,UAAU,EAAE;YACV,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mthds",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "CLI for composable methods for AI agents. Turn your knowledge processes into executable methods.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mthds": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@clack/prompts": "^1.0.0",
|
|
21
|
+
"@supabase/supabase-js": "^2.95.3",
|
|
22
|
+
"chalk": "^5.4.1",
|
|
23
|
+
"commander": "^13.1.0",
|
|
24
|
+
"ora": "^8.2.0",
|
|
25
|
+
"posthog-node": "^4.4.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.12.0",
|
|
29
|
+
"typescript": "^5.7.3"
|
|
30
|
+
}
|
|
31
|
+
}
|