mthds 0.0.5 → 0.0.7

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.
Files changed (40) hide show
  1. package/README.md +74 -8
  2. package/dist/agents/claude-code.js +24 -9
  3. package/dist/agents/claude-code.js.map +1 -1
  4. package/dist/agents/types.d.ts +1 -2
  5. package/dist/cli.js +48 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/index.js +7 -3
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/install.d.ts +5 -1
  10. package/dist/commands/install.js +123 -24
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/telemetry.d.ts +3 -0
  13. package/dist/commands/telemetry.js +49 -0
  14. package/dist/commands/telemetry.js.map +1 -0
  15. package/dist/resolver/address.d.ts +2 -0
  16. package/dist/resolver/address.js +27 -0
  17. package/dist/resolver/address.js.map +1 -0
  18. package/dist/resolver/github.d.ts +2 -0
  19. package/dist/resolver/github.js +179 -0
  20. package/dist/resolver/github.js.map +1 -0
  21. package/dist/resolver/index.d.ts +6 -0
  22. package/dist/resolver/index.js +5 -0
  23. package/dist/resolver/index.js.map +1 -0
  24. package/dist/resolver/local.d.ts +2 -0
  25. package/dist/resolver/local.js +123 -0
  26. package/dist/resolver/local.js.map +1 -0
  27. package/dist/resolver/types.d.ts +50 -0
  28. package/dist/resolver/types.js +2 -0
  29. package/dist/resolver/types.js.map +1 -0
  30. package/dist/resolver/validate.d.ts +12 -0
  31. package/dist/resolver/validate.js +177 -0
  32. package/dist/resolver/validate.js.map +1 -0
  33. package/dist/supabase/methods.d.ts +2 -2
  34. package/dist/supabase/methods.js +4 -3
  35. package/dist/supabase/methods.js.map +1 -1
  36. package/dist/supabase/types.d.ts +15 -10
  37. package/dist/telemetry/posthog.d.ts +23 -1
  38. package/dist/telemetry/posthog.js +86 -4
  39. package/dist/telemetry/posthog.js.map +1 -1
  40. package/package.json +6 -3
@@ -0,0 +1,177 @@
1
+ import { parse } from "smol-toml";
2
+ const SEMVER_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
3
+ const SNAKE_CASE_RE = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/;
4
+ const SLUG_RE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
5
+ const RESERVED_PREFIXES = ["native", "mthds", "pipelex"];
6
+ export function validateSlug(name) {
7
+ if (!name) {
8
+ return { valid: false, error: "Slug cannot be empty." };
9
+ }
10
+ if (name.length > 64) {
11
+ return { valid: false, error: `Slug must be at most 64 characters (got ${name.length}).` };
12
+ }
13
+ if (!SLUG_RE.test(name)) {
14
+ return {
15
+ valid: false,
16
+ error: `Slug "${name}" is invalid: must be lowercase alphanumeric with hyphens, starting with a letter.`,
17
+ };
18
+ }
19
+ return { valid: true };
20
+ }
21
+ function validateExportNode(node, path, errors) {
22
+ if (!node || typeof node !== "object" || Array.isArray(node)) {
23
+ errors.push(`[exports.${path}] must be a table.`);
24
+ return;
25
+ }
26
+ const obj = node;
27
+ for (const [key, value] of Object.entries(obj)) {
28
+ if (key === "pipes") {
29
+ if (!Array.isArray(value)) {
30
+ errors.push(`[exports.${path}.pipes] must be an array of strings.`);
31
+ continue;
32
+ }
33
+ for (const pipe of value) {
34
+ if (typeof pipe !== "string") {
35
+ errors.push(`[exports.${path}.pipes] must contain only strings.`);
36
+ break;
37
+ }
38
+ if (!SNAKE_CASE_RE.test(pipe)) {
39
+ errors.push(`[exports.${path}.pipes] "${pipe}" must be snake_case.`);
40
+ }
41
+ }
42
+ }
43
+ else {
44
+ // Nested sub-domain
45
+ validateExportNode(value, `${path}.${key}`, errors);
46
+ }
47
+ }
48
+ }
49
+ export function validateManifest(raw) {
50
+ const errors = [];
51
+ let parsed;
52
+ try {
53
+ parsed = parse(raw);
54
+ }
55
+ catch (err) {
56
+ return {
57
+ valid: false,
58
+ errors: [`TOML parse error: ${err.message}`],
59
+ };
60
+ }
61
+ // --- [package] section ---
62
+ const pkg = parsed["package"];
63
+ if (!pkg || typeof pkg !== "object") {
64
+ errors.push('[package] section is required.');
65
+ return { valid: false, errors };
66
+ }
67
+ // package.address
68
+ if (typeof pkg["address"] !== "string" || !pkg["address"]) {
69
+ errors.push('[package.address] is required and must be a non-empty string.');
70
+ }
71
+ else {
72
+ const addr = pkg["address"];
73
+ const slashIdx = addr.indexOf("/");
74
+ const hostname = slashIdx > 0 ? addr.slice(0, slashIdx) : addr;
75
+ if (!hostname.includes(".")) {
76
+ errors.push(`[package.address] hostname must contain a dot (got "${hostname}"). Example: github.com/org/repo`);
77
+ }
78
+ }
79
+ // package.version
80
+ if (typeof pkg["version"] !== "string" || !pkg["version"]) {
81
+ errors.push('[package.version] is required and must be a non-empty string.');
82
+ }
83
+ else if (!SEMVER_RE.test(pkg["version"])) {
84
+ errors.push(`[package.version] must be valid semver (got "${pkg["version"]}").`);
85
+ }
86
+ // package.description
87
+ if (typeof pkg["description"] !== "string" || !pkg["description"]) {
88
+ errors.push('[package.description] is required and must be a non-empty string.');
89
+ }
90
+ // package.display_name (optional)
91
+ if (pkg["display_name"] !== undefined) {
92
+ if (typeof pkg["display_name"] !== "string") {
93
+ errors.push('[package.display_name] must be a string.');
94
+ }
95
+ else if (pkg["display_name"].length > 128) {
96
+ errors.push('[package.display_name] must be at most 128 characters.');
97
+ }
98
+ }
99
+ // package.authors (optional)
100
+ if (pkg["authors"] !== undefined) {
101
+ if (!Array.isArray(pkg["authors"])) {
102
+ errors.push('[package.authors] must be an array of strings.');
103
+ }
104
+ else {
105
+ for (const a of pkg["authors"]) {
106
+ if (typeof a !== "string") {
107
+ errors.push('[package.authors] must contain only strings.');
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ }
113
+ // package.license (optional)
114
+ if (pkg["license"] !== undefined) {
115
+ if (typeof pkg["license"] !== "string") {
116
+ errors.push('[package.license] must be a string.');
117
+ }
118
+ }
119
+ // package.mthds_version (optional)
120
+ if (pkg["mthds_version"] !== undefined) {
121
+ if (typeof pkg["mthds_version"] !== "string") {
122
+ errors.push('[package.mthds_version] must be a string.');
123
+ }
124
+ }
125
+ // --- [exports] section (optional, hierarchical) ---
126
+ const exports = parsed["exports"];
127
+ if (exports && typeof exports === "object") {
128
+ for (const [domain, node] of Object.entries(exports)) {
129
+ const domainLower = domain.toLowerCase();
130
+ const matchedPrefix = RESERVED_PREFIXES.find((prefix) => domainLower.startsWith(prefix));
131
+ if (matchedPrefix) {
132
+ errors.push(`[exports."${domain}"] domain cannot start with reserved prefix "${matchedPrefix}".`);
133
+ }
134
+ validateExportNode(node, domain, errors);
135
+ }
136
+ }
137
+ // --- [dependencies] section (optional) ---
138
+ const deps = parsed["dependencies"];
139
+ if (deps && typeof deps === "object") {
140
+ for (const [alias, dep] of Object.entries(deps)) {
141
+ if (!SNAKE_CASE_RE.test(alias)) {
142
+ errors.push(`[dependencies."${alias}"] alias must be snake_case.`);
143
+ }
144
+ const d = dep;
145
+ if (!d || typeof d !== "object") {
146
+ errors.push(`[dependencies."${alias}"] must be a table with address and version.`);
147
+ continue;
148
+ }
149
+ if (typeof d["address"] !== "string" || !d["address"]) {
150
+ errors.push(`[dependencies."${alias}".address] is required.`);
151
+ }
152
+ if (typeof d["version"] !== "string" || !d["version"]) {
153
+ errors.push(`[dependencies."${alias}".version] is required.`);
154
+ }
155
+ }
156
+ }
157
+ if (errors.length > 0) {
158
+ return { valid: false, errors };
159
+ }
160
+ // Build typed manifest
161
+ const manifestPkg = {
162
+ address: pkg["address"],
163
+ version: pkg["version"],
164
+ description: pkg["description"],
165
+ ...(pkg["display_name"] !== undefined ? { display_name: pkg["display_name"] } : {}),
166
+ ...(pkg["authors"] !== undefined ? { authors: pkg["authors"] } : {}),
167
+ ...(pkg["license"] !== undefined ? { license: pkg["license"] } : {}),
168
+ ...(pkg["mthds_version"] !== undefined ? { mthds_version: pkg["mthds_version"] } : {}),
169
+ };
170
+ const manifest = {
171
+ package: manifestPkg,
172
+ ...(exports ? { exports: exports } : {}),
173
+ ...(deps ? { dependencies: deps } : {}),
174
+ };
175
+ return { valid: true, errors: [], manifest };
176
+ }
177
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/resolver/validate.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import type { Method } from "./types.js";
2
- export declare function fetchMethodBySlug(slug: string): Promise<Method | null>;
1
+ import type { Package } from "./types.js";
2
+ export declare function fetchPackageByAddressAndSlug(address: string, slug: string): Promise<Package | null>;
@@ -1,9 +1,10 @@
1
1
  import { supabase } from "./client.js";
2
- export async function fetchMethodBySlug(slug) {
2
+ export async function fetchPackageByAddressAndSlug(address, slug) {
3
3
  const { data, error } = await supabase
4
- .from("methods")
4
+ .from("packages")
5
5
  .select("*")
6
- .eq("name", slug)
6
+ .eq("address", address)
7
+ .eq("slug", slug)
7
8
  .single();
8
9
  if (error || !data)
9
10
  return null;
@@ -1 +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"}
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,4BAA4B,CAChD,OAAe,EACf,IAAY;IAEZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ;SACnC,IAAI,CAAC,UAAU,CAAC;SAChB,MAAM,CAAC,GAAG,CAAC;SACX,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;SACtB,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"}
@@ -1,21 +1,26 @@
1
- export interface Method {
1
+ export interface Package {
2
2
  id: string;
3
- name: string;
4
- description: string | null;
5
- content: string | null;
3
+ address: string;
4
+ slug: string;
6
5
  version: string | null;
7
- repository: string | null;
8
- dependencies: string | null;
6
+ description: string | null;
7
+ display_name: string | null;
8
+ authors: string[] | null;
9
+ license: string | null;
10
+ mthds_version: string | null;
11
+ exports: Record<string, unknown> | null;
12
+ dependencies: Record<string, unknown> | null;
13
+ manifest_raw: string | null;
9
14
  installs: number;
10
15
  created_at: string;
11
16
  }
12
17
  export interface Database {
13
18
  public: {
14
19
  Tables: {
15
- methods: {
16
- Row: Method;
17
- Insert: Omit<Method, "id" | "created_at" | "installs">;
18
- Update: Partial<Omit<Method, "id">>;
20
+ packages: {
21
+ Row: Package;
22
+ Insert: Omit<Package, "id" | "created_at" | "installs">;
23
+ Update: Partial<Omit<Package, "id">>;
19
24
  };
20
25
  };
21
26
  Views: Record<string, never>;
@@ -1,2 +1,24 @@
1
- export declare function trackMethodInstall(methodId: string): void;
1
+ export type TelemetrySource = "env" | "env.local" | "config" | "default";
2
+ export declare function getTelemetryStatus(): {
3
+ enabled: boolean;
4
+ source: TelemetrySource;
5
+ };
6
+ export declare function setTelemetryEnabled(enabled: boolean): void;
7
+ export interface InstallEvent {
8
+ address: string;
9
+ slug: string;
10
+ version: string;
11
+ description: string;
12
+ display_name?: string;
13
+ authors?: string[];
14
+ license?: string;
15
+ mthds_version?: string;
16
+ exports?: Record<string, unknown>;
17
+ dependencies?: Record<string, {
18
+ address: string;
19
+ version: string;
20
+ }>;
21
+ manifest_raw: string;
22
+ }
23
+ export declare function trackInstall(data: InstallEvent): void;
2
24
  export declare function shutdown(): Promise<void>;
@@ -1,9 +1,81 @@
1
1
  import { PostHog } from "posthog-node";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "node:fs";
2
5
  const POSTHOG_API_KEY = "phc_ylV9FzMiQDyGgtd5nJn0Cc2OkyHAobfj7xDhYloH5IA";
3
6
  const POSTHOG_HOST = "https://eu.i.posthog.com";
7
+ const CONFIG_DIR = join(homedir(), ".mthds");
8
+ const CONFIG_PATH = join(CONFIG_DIR, "config.json");
9
+ const ENV_LOCAL_PATH = join(CONFIG_DIR, ".env.local");
4
10
  let client = null;
11
+ function readEnvLocal() {
12
+ if (!existsSync(ENV_LOCAL_PATH))
13
+ return false;
14
+ try {
15
+ const content = readFileSync(ENV_LOCAL_PATH, "utf-8");
16
+ return content.split("\n").some((line) => {
17
+ const trimmed = line.trim();
18
+ if (trimmed.startsWith("#"))
19
+ return false;
20
+ const [key, ...rest] = trimmed.split("=");
21
+ if (key?.trim() !== "DISABLE_TELEMETRY")
22
+ return false;
23
+ const val = rest.join("=").trim().replace(/^["']|["']$/g, "").trim();
24
+ return val === "1";
25
+ });
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ function readConfigTelemetry() {
32
+ if (!existsSync(CONFIG_PATH))
33
+ return undefined;
34
+ try {
35
+ const raw = readFileSync(CONFIG_PATH, "utf-8");
36
+ const config = JSON.parse(raw);
37
+ if ("telemetry" in config && typeof config.telemetry === "boolean") {
38
+ return config.telemetry;
39
+ }
40
+ return undefined;
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ }
46
+ export function getTelemetryStatus() {
47
+ // 1. Env var (highest priority)
48
+ if (process.env["DISABLE_TELEMETRY"] === "1") {
49
+ return { enabled: false, source: "env" };
50
+ }
51
+ // 2. ~/.mthds/.env.local
52
+ if (readEnvLocal()) {
53
+ return { enabled: false, source: "env.local" };
54
+ }
55
+ // 3. ~/.mthds/config.json
56
+ const configVal = readConfigTelemetry();
57
+ if (configVal !== undefined) {
58
+ return { enabled: configVal, source: "config" };
59
+ }
60
+ // Default: enabled
61
+ return { enabled: true, source: "default" };
62
+ }
63
+ export function setTelemetryEnabled(enabled) {
64
+ mkdirSync(CONFIG_DIR, { recursive: true });
65
+ let config = {};
66
+ if (existsSync(CONFIG_PATH)) {
67
+ try {
68
+ config = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
69
+ }
70
+ catch {
71
+ // ignore parse errors, overwrite
72
+ }
73
+ }
74
+ config.telemetry = enabled;
75
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
76
+ }
5
77
  function isDisabled() {
6
- return process.env["DISABLE_TELEMETRY"] === "1";
78
+ return !getTelemetryStatus().enabled;
7
79
  }
8
80
  function getClient() {
9
81
  if (isDisabled())
@@ -13,15 +85,25 @@ function getClient() {
13
85
  }
14
86
  return client;
15
87
  }
16
- export function trackMethodInstall(methodId) {
88
+ export function trackInstall(data) {
17
89
  const posthog = getClient();
18
90
  if (!posthog)
19
91
  return;
20
92
  posthog.capture({
21
93
  distinctId: "anonymous",
22
- event: "method_installed",
94
+ event: "install",
23
95
  properties: {
24
- method: methodId,
96
+ address: data.address,
97
+ slug: data.slug,
98
+ version: data.version,
99
+ description: data.description,
100
+ display_name: data.display_name,
101
+ authors: data.authors ? JSON.stringify(data.authors) : undefined,
102
+ license: data.license,
103
+ mthds_version: data.mthds_version,
104
+ exports: data.exports ? JSON.stringify(data.exports) : undefined,
105
+ dependencies: data.dependencies ? JSON.stringify(data.dependencies) : undefined,
106
+ manifest_raw: data.manifest_raw,
25
107
  timestamp: new Date().toISOString(),
26
108
  },
27
109
  });
@@ -1 +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,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,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"}
1
+ {"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../src/telemetry/posthog.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mthds",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "CLI and SDK for MTHDS — the open standard for reusable AI agent methods. Install, execute, and manage methods.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,6 +21,7 @@
21
21
  },
22
22
  "scripts": {
23
23
  "build": "tsc",
24
+ "test": "vitest run",
24
25
  "example": "npx tsx examples/call_api.ts"
25
26
  },
26
27
  "files": [
@@ -35,11 +36,13 @@
35
36
  "chalk": "^5.4.1",
36
37
  "commander": "^13.1.0",
37
38
  "ora": "^8.2.0",
38
- "posthog-node": "^4.4.0"
39
+ "posthog-node": "^4.4.0",
40
+ "smol-toml": "^1.6.0"
39
41
  },
40
42
  "devDependencies": {
41
43
  "@types/node": "^22.12.0",
42
44
  "tsx": "^4.19.0",
43
- "typescript": "^5.7.3"
45
+ "typescript": "^5.7.3",
46
+ "vitest": "^4.0.18"
44
47
  }
45
48
  }