mthds 0.0.6 → 0.0.8

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 (239) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +51 -11
  3. package/dist/agent/commands/build.d.ts +35 -0
  4. package/dist/agent/commands/build.js +334 -0
  5. package/dist/agent/commands/build.js.map +1 -0
  6. package/dist/agent/commands/config.d.ts +6 -0
  7. package/dist/agent/commands/config.js +50 -0
  8. package/dist/agent/commands/config.js.map +1 -0
  9. package/dist/agent/commands/install.d.ts +14 -0
  10. package/dist/agent/commands/install.js +178 -0
  11. package/dist/agent/commands/install.js.map +1 -0
  12. package/dist/agent/commands/pipelex.d.ts +7 -0
  13. package/dist/agent/commands/pipelex.js +56 -0
  14. package/dist/agent/commands/pipelex.js.map +1 -0
  15. package/dist/agent/commands/plxt.d.ts +7 -0
  16. package/dist/agent/commands/plxt.js +27 -0
  17. package/dist/agent/commands/plxt.js.map +1 -0
  18. package/dist/agent/commands/validate.d.ts +15 -0
  19. package/dist/agent/commands/validate.js +118 -0
  20. package/dist/agent/commands/validate.js.map +1 -0
  21. package/dist/agent/output.d.ts +25 -0
  22. package/dist/agent/output.js +51 -0
  23. package/dist/agent/output.js.map +1 -0
  24. package/dist/agent/passthrough.d.ts +5 -0
  25. package/dist/agent/passthrough.js +19 -0
  26. package/dist/agent/passthrough.js.map +1 -0
  27. package/dist/agent-cli.d.ts +8 -0
  28. package/dist/agent-cli.js +237 -0
  29. package/dist/agent-cli.js.map +1 -0
  30. package/dist/cli/commands/build.d.ts +31 -0
  31. package/dist/cli/commands/build.js +305 -0
  32. package/dist/cli/commands/build.js.map +1 -0
  33. package/dist/{commands → cli/commands}/config.js +4 -4
  34. package/dist/cli/commands/config.js.map +1 -0
  35. package/dist/{commands → cli/commands}/index.js +20 -18
  36. package/dist/cli/commands/index.js.map +1 -0
  37. package/dist/cli/commands/install.js +275 -0
  38. package/dist/cli/commands/install.js.map +1 -0
  39. package/dist/cli/commands/package/add.d.ts +6 -0
  40. package/dist/cli/commands/package/add.js +9 -0
  41. package/dist/cli/commands/package/add.js.map +1 -0
  42. package/dist/cli/commands/package/init.d.ts +3 -0
  43. package/dist/cli/commands/package/init.js +108 -0
  44. package/dist/cli/commands/package/init.js.map +1 -0
  45. package/dist/cli/commands/package/install.d.ts +3 -0
  46. package/dist/cli/commands/package/install.js +97 -0
  47. package/dist/cli/commands/package/install.js.map +1 -0
  48. package/dist/cli/commands/package/list.d.ts +3 -0
  49. package/dist/cli/commands/package/list.js +58 -0
  50. package/dist/cli/commands/package/list.js.map +1 -0
  51. package/dist/cli/commands/package/lock.d.ts +3 -0
  52. package/dist/cli/commands/package/lock.js +37 -0
  53. package/dist/cli/commands/package/lock.js.map +1 -0
  54. package/dist/cli/commands/package/update.d.ts +3 -0
  55. package/dist/cli/commands/package/update.js +35 -0
  56. package/dist/cli/commands/package/update.js.map +1 -0
  57. package/dist/cli/commands/package/validate.d.ts +3 -0
  58. package/dist/cli/commands/package/validate.js +76 -0
  59. package/dist/cli/commands/package/validate.js.map +1 -0
  60. package/dist/cli/commands/run.d.ts +12 -0
  61. package/dist/cli/commands/run.js +95 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/setup.d.ts +3 -0
  64. package/dist/cli/commands/setup.js +168 -0
  65. package/dist/cli/commands/setup.js.map +1 -0
  66. package/dist/cli/commands/utils.d.ts +9 -0
  67. package/dist/cli/commands/utils.js +34 -0
  68. package/dist/cli/commands/utils.js.map +1 -0
  69. package/dist/cli/commands/validate.d.ts +10 -0
  70. package/dist/cli/commands/validate.js +93 -0
  71. package/dist/cli/commands/validate.js.map +1 -0
  72. package/dist/cli.js +276 -99
  73. package/dist/cli.js.map +1 -1
  74. package/dist/client/client.js +2 -2
  75. package/dist/client/client.js.map +1 -1
  76. package/dist/config/config.d.ts +5 -20
  77. package/dist/config/config.js +5 -78
  78. package/dist/config/config.js.map +1 -1
  79. package/dist/config/credentials.d.ts +25 -0
  80. package/dist/config/credentials.js +230 -0
  81. package/dist/config/credentials.js.map +1 -0
  82. package/dist/installer/agents/registry.d.ts +12 -0
  83. package/dist/installer/agents/registry.js +78 -0
  84. package/dist/installer/agents/registry.js.map +1 -0
  85. package/dist/installer/agents/types.d.ts +16 -0
  86. package/dist/installer/agents/types.js +6 -0
  87. package/dist/installer/agents/types.js.map +1 -0
  88. package/dist/installer/resolver/address.d.ts +2 -0
  89. package/dist/installer/resolver/address.js.map +1 -0
  90. package/dist/{resolver → installer/resolver}/github.d.ts +1 -1
  91. package/dist/{resolver → installer/resolver}/github.js +2 -2
  92. package/dist/installer/resolver/github.js.map +1 -0
  93. package/dist/installer/resolver/index.d.ts +6 -0
  94. package/dist/{resolver → installer/resolver}/index.js +1 -1
  95. package/dist/installer/resolver/index.js.map +1 -0
  96. package/dist/{resolver → installer/resolver}/local.d.ts +1 -1
  97. package/dist/{resolver → installer/resolver}/local.js +2 -2
  98. package/dist/installer/resolver/local.js.map +1 -0
  99. package/dist/installer/runtime/check.js.map +1 -0
  100. package/dist/installer/runtime/installer.js.map +1 -0
  101. package/dist/installer/runtime/spawn.js.map +1 -0
  102. package/dist/{telemetry → installer/telemetry}/posthog.d.ts +2 -5
  103. package/dist/installer/telemetry/posthog.js +55 -0
  104. package/dist/installer/telemetry/posthog.js.map +1 -0
  105. package/dist/package/bundle-metadata.d.ts +8 -0
  106. package/dist/package/bundle-metadata.js +2 -0
  107. package/dist/package/bundle-metadata.js.map +1 -0
  108. package/dist/package/bundle-scanner.d.ts +18 -0
  109. package/dist/package/bundle-scanner.js +77 -0
  110. package/dist/package/bundle-scanner.js.map +1 -0
  111. package/dist/package/dependency-resolver.d.ts +32 -0
  112. package/dist/package/dependency-resolver.js +298 -0
  113. package/dist/package/dependency-resolver.js.map +1 -0
  114. package/dist/package/discovery.d.ts +9 -0
  115. package/dist/package/discovery.js +32 -0
  116. package/dist/package/discovery.js.map +1 -0
  117. package/dist/package/exceptions.d.ts +36 -0
  118. package/dist/package/exceptions.js +73 -0
  119. package/dist/package/exceptions.js.map +1 -0
  120. package/dist/package/lock-file.d.ts +27 -0
  121. package/dist/package/lock-file.js +137 -0
  122. package/dist/package/lock-file.js.map +1 -0
  123. package/dist/package/manifest/convert.d.ts +14 -0
  124. package/dist/package/manifest/convert.js +83 -0
  125. package/dist/package/manifest/convert.js.map +1 -0
  126. package/dist/package/manifest/parser.d.ts +9 -0
  127. package/dist/package/manifest/parser.js +261 -0
  128. package/dist/package/manifest/parser.js.map +1 -0
  129. package/dist/package/manifest/schema.d.ts +71 -0
  130. package/dist/package/manifest/schema.js +73 -0
  131. package/dist/package/manifest/schema.js.map +1 -0
  132. package/dist/{resolver → package/manifest}/types.d.ts +2 -5
  133. package/dist/{resolver → package/manifest}/types.js.map +1 -1
  134. package/dist/{resolver → package/manifest}/validate.js +25 -20
  135. package/dist/package/manifest/validate.js.map +1 -0
  136. package/dist/package/manifest/validation.d.ts +10 -0
  137. package/dist/package/manifest/validation.js +34 -0
  138. package/dist/package/manifest/validation.js.map +1 -0
  139. package/dist/package/package-cache.d.ts +24 -0
  140. package/dist/package/package-cache.js +92 -0
  141. package/dist/package/package-cache.js.map +1 -0
  142. package/dist/package/qualified-ref.d.ts +41 -0
  143. package/dist/package/qualified-ref.js +105 -0
  144. package/dist/package/qualified-ref.js.map +1 -0
  145. package/dist/package/semver.d.ts +33 -0
  146. package/dist/package/semver.js +77 -0
  147. package/dist/package/semver.js.map +1 -0
  148. package/dist/package/vcs-resolver.d.ts +19 -0
  149. package/dist/package/vcs-resolver.js +115 -0
  150. package/dist/package/vcs-resolver.js.map +1 -0
  151. package/dist/package/visibility.d.ts +25 -0
  152. package/dist/package/visibility.js +132 -0
  153. package/dist/package/visibility.js.map +1 -0
  154. package/dist/runners/api-runner.d.ts +3 -0
  155. package/dist/runners/api-runner.js +9 -1
  156. package/dist/runners/api-runner.js.map +1 -1
  157. package/dist/runners/pipelex-runner.d.ts +16 -2
  158. package/dist/runners/pipelex-runner.js +155 -41
  159. package/dist/runners/pipelex-runner.js.map +1 -1
  160. package/dist/runners/registry.d.ts +1 -1
  161. package/dist/runners/registry.js +5 -4
  162. package/dist/runners/registry.js.map +1 -1
  163. package/dist/runners/types.d.ts +17 -10
  164. package/dist/runners/types.js +6 -1
  165. package/dist/runners/types.js.map +1 -1
  166. package/package.json +7 -4
  167. package/dist/agents/claude-code.d.ts +0 -2
  168. package/dist/agents/claude-code.js +0 -36
  169. package/dist/agents/claude-code.js.map +0 -1
  170. package/dist/agents/cursor.d.ts +0 -2
  171. package/dist/agents/cursor.js +0 -11
  172. package/dist/agents/cursor.js.map +0 -1
  173. package/dist/agents/github-copilot.d.ts +0 -2
  174. package/dist/agents/github-copilot.js +0 -11
  175. package/dist/agents/github-copilot.js.map +0 -1
  176. package/dist/agents/registry.d.ts +0 -4
  177. package/dist/agents/registry.js +0 -24
  178. package/dist/agents/registry.js.map +0 -1
  179. package/dist/agents/types.d.ts +0 -25
  180. package/dist/agents/types.js +0 -11
  181. package/dist/agents/types.js.map +0 -1
  182. package/dist/agents/windsurf.d.ts +0 -2
  183. package/dist/agents/windsurf.js +0 -11
  184. package/dist/agents/windsurf.js.map +0 -1
  185. package/dist/commands/build.d.ts +0 -19
  186. package/dist/commands/build.js +0 -128
  187. package/dist/commands/build.js.map +0 -1
  188. package/dist/commands/config.js.map +0 -1
  189. package/dist/commands/index.js.map +0 -1
  190. package/dist/commands/install.js +0 -252
  191. package/dist/commands/install.js.map +0 -1
  192. package/dist/commands/run.d.ts +0 -11
  193. package/dist/commands/run.js +0 -44
  194. package/dist/commands/run.js.map +0 -1
  195. package/dist/commands/runner.d.ts +0 -2
  196. package/dist/commands/runner.js +0 -59
  197. package/dist/commands/runner.js.map +0 -1
  198. package/dist/commands/setup.d.ts +0 -1
  199. package/dist/commands/setup.js +0 -45
  200. package/dist/commands/setup.js.map +0 -1
  201. package/dist/commands/telemetry.d.ts +0 -3
  202. package/dist/commands/telemetry.js +0 -49
  203. package/dist/commands/telemetry.js.map +0 -1
  204. package/dist/commands/validate.d.ts +0 -6
  205. package/dist/commands/validate.js +0 -41
  206. package/dist/commands/validate.js.map +0 -1
  207. package/dist/resolver/address.d.ts +0 -2
  208. package/dist/resolver/address.js.map +0 -1
  209. package/dist/resolver/github.js.map +0 -1
  210. package/dist/resolver/index.d.ts +0 -6
  211. package/dist/resolver/index.js.map +0 -1
  212. package/dist/resolver/local.js.map +0 -1
  213. package/dist/resolver/validate.js.map +0 -1
  214. package/dist/runtime/check.js.map +0 -1
  215. package/dist/runtime/installer.js.map +0 -1
  216. package/dist/runtime/spawn.js.map +0 -1
  217. package/dist/supabase/client.d.ts +0 -4
  218. package/dist/supabase/client.js +0 -5
  219. package/dist/supabase/client.js.map +0 -1
  220. package/dist/supabase/methods.d.ts +0 -2
  221. package/dist/supabase/methods.js +0 -13
  222. package/dist/supabase/methods.js.map +0 -1
  223. package/dist/supabase/types.d.ts +0 -30
  224. package/dist/supabase/types.js +0 -2
  225. package/dist/supabase/types.js.map +0 -1
  226. package/dist/telemetry/posthog.js +0 -117
  227. package/dist/telemetry/posthog.js.map +0 -1
  228. /package/dist/{commands → cli/commands}/config.d.ts +0 -0
  229. /package/dist/{commands → cli/commands}/index.d.ts +0 -0
  230. /package/dist/{commands → cli/commands}/install.d.ts +0 -0
  231. /package/dist/{resolver → installer/resolver}/address.js +0 -0
  232. /package/dist/{runtime → installer/runtime}/check.d.ts +0 -0
  233. /package/dist/{runtime → installer/runtime}/check.js +0 -0
  234. /package/dist/{runtime → installer/runtime}/installer.d.ts +0 -0
  235. /package/dist/{runtime → installer/runtime}/installer.js +0 -0
  236. /package/dist/{runtime → installer/runtime}/spawn.d.ts +0 -0
  237. /package/dist/{runtime → installer/runtime}/spawn.js +0 -0
  238. /package/dist/{resolver → package/manifest}/types.js +0 -0
  239. /package/dist/{resolver → package/manifest}/validate.d.ts +0 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Flat parsed manifest types and Zod schemas for the package manager.
3
+ *
4
+ * Zod schemas are the **source of truth** for which keys are allowed in
5
+ * METHODS.toml. `.strict()` rejects unknown keys (equivalent to Pydantic's
6
+ * `extra="forbid"`).
7
+ *
8
+ * This is separate from the nested MethodsManifest in types.ts which is used
9
+ * by the installer. A conversion bridge (convert.ts) maps between the two.
10
+ */
11
+ import { z } from "zod";
12
+ export declare const RESERVED_DOMAINS: ReadonlySet<string>;
13
+ export declare const MTHDS_STANDARD_VERSION = "1.0.0";
14
+ export declare function isReservedDomainPath(domainPath: string): boolean;
15
+ export declare function isValidSemver(version: string): boolean;
16
+ export declare function isValidVersionConstraint(constraint: string): boolean;
17
+ export declare function isValidAddress(address: string): boolean;
18
+ /** Method name: lowercase alphanumeric + hyphens/underscores, 2-25 chars, starts with a letter */
19
+ export declare const METHOD_NAME_RE: RegExp;
20
+ export declare function isValidMethodName(name: string): boolean;
21
+ /** Raw [package] section in METHODS.toml */
22
+ export declare const PackageSectionSchema: z.ZodObject<{
23
+ name: z.ZodOptional<z.ZodString>;
24
+ address: z.ZodString;
25
+ version: z.ZodString;
26
+ description: z.ZodString;
27
+ display_name: z.ZodOptional<z.ZodString>;
28
+ authors: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ license: z.ZodOptional<z.ZodString>;
30
+ mthds_version: z.ZodOptional<z.ZodString>;
31
+ main_pipe: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strict>;
33
+ /** Flattened domain exports (after walkExportsTable) */
34
+ export declare const DomainExportsSchema: z.ZodObject<{
35
+ pipes: z.ZodArray<z.ZodString>;
36
+ }, z.core.$strict>;
37
+ /** Top-level METHODS.toml structure */
38
+ export declare const MethodsTomlSchema: z.ZodObject<{
39
+ package: z.ZodObject<{
40
+ name: z.ZodOptional<z.ZodString>;
41
+ address: z.ZodString;
42
+ version: z.ZodString;
43
+ description: z.ZodString;
44
+ display_name: z.ZodOptional<z.ZodString>;
45
+ authors: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ license: z.ZodOptional<z.ZodString>;
47
+ mthds_version: z.ZodOptional<z.ZodString>;
48
+ main_pipe: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strict>;
50
+ exports: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
51
+ }, z.core.$strict>;
52
+ export interface DomainExports {
53
+ readonly pipes: string[];
54
+ }
55
+ /**
56
+ * Flat parsed manifest — the primary model for the package manager.
57
+ *
58
+ * All export domains are flattened to dotted paths (e.g. "legal.contracts").
59
+ */
60
+ export interface ParsedManifest {
61
+ readonly name?: string;
62
+ readonly address: string;
63
+ readonly displayName?: string;
64
+ readonly version: string;
65
+ readonly description: string;
66
+ readonly authors: string[];
67
+ readonly license?: string;
68
+ readonly mthdsVersion?: string;
69
+ readonly mainPipe?: string;
70
+ readonly exports: Record<string, DomainExports>;
71
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Flat parsed manifest types and Zod schemas for the package manager.
3
+ *
4
+ * Zod schemas are the **source of truth** for which keys are allowed in
5
+ * METHODS.toml. `.strict()` rejects unknown keys (equivalent to Pydantic's
6
+ * `extra="forbid"`).
7
+ *
8
+ * This is separate from the nested MethodsManifest in types.ts which is used
9
+ * by the installer. A conversion bridge (convert.ts) maps between the two.
10
+ */
11
+ import { z } from "zod";
12
+ // ---------------------------------------------------------------------------
13
+ // Regex patterns
14
+ // ---------------------------------------------------------------------------
15
+ 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-]+)*))?$/;
16
+ const _SINGLE_CONSTRAINT = "(?:" +
17
+ "\\*" +
18
+ "|(?:(?:\\^|~|>=?|<=?|==|!=)?(?:0|[1-9]\\d*)(?:\\.(?:0|[1-9]\\d*|\\*))?(?:\\.(?:0|[1-9]\\d*|\\*))?)" +
19
+ "(?:-(?:(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" +
20
+ ")";
21
+ const VERSION_CONSTRAINT_RE = new RegExp(`^${_SINGLE_CONSTRAINT}(?:\\s*,\\s*${_SINGLE_CONSTRAINT})*$`);
22
+ const ADDRESS_RE = /^[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+\/[a-zA-Z0-9._/-]+$/;
23
+ // ---------------------------------------------------------------------------
24
+ // Constants
25
+ // ---------------------------------------------------------------------------
26
+ export const RESERVED_DOMAINS = new Set(["native", "mthds", "pipelex"]);
27
+ export const MTHDS_STANDARD_VERSION = "1.0.0";
28
+ // ---------------------------------------------------------------------------
29
+ // Standalone validation helpers (used outside the parser too)
30
+ // ---------------------------------------------------------------------------
31
+ export function isReservedDomainPath(domainPath) {
32
+ const firstSegment = domainPath.split(".")[0];
33
+ return RESERVED_DOMAINS.has(firstSegment);
34
+ }
35
+ export function isValidSemver(version) {
36
+ return SEMVER_RE.test(version);
37
+ }
38
+ export function isValidVersionConstraint(constraint) {
39
+ return VERSION_CONSTRAINT_RE.test(constraint.trim());
40
+ }
41
+ export function isValidAddress(address) {
42
+ return ADDRESS_RE.test(address);
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Zod schemas — source of truth for allowed TOML keys
46
+ // ---------------------------------------------------------------------------
47
+ /** Method name: lowercase alphanumeric + hyphens/underscores, 2-25 chars, starts with a letter */
48
+ export const METHOD_NAME_RE = /^[a-z][a-z0-9_-]{1,24}$/;
49
+ export function isValidMethodName(name) {
50
+ return METHOD_NAME_RE.test(name);
51
+ }
52
+ /** Raw [package] section in METHODS.toml */
53
+ export const PackageSectionSchema = z.object({
54
+ name: z.string().optional(),
55
+ address: z.string(),
56
+ version: z.string(),
57
+ description: z.string(),
58
+ display_name: z.string().optional(),
59
+ authors: z.array(z.string()).optional(),
60
+ license: z.string().optional(),
61
+ mthds_version: z.string().optional(),
62
+ main_pipe: z.string().optional(),
63
+ }).strict();
64
+ /** Flattened domain exports (after walkExportsTable) */
65
+ export const DomainExportsSchema = z.object({
66
+ pipes: z.array(z.string()),
67
+ }).strict();
68
+ /** Top-level METHODS.toml structure */
69
+ export const MethodsTomlSchema = z.object({
70
+ package: PackageSectionSchema,
71
+ exports: z.record(z.string(), z.unknown()).optional(),
72
+ }).strict();
73
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/package/manifest/schema.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export interface ParsedAddress {
4
4
  readonly subpath: string | null;
5
5
  }
6
6
  export interface PackageSection {
7
+ readonly name?: string;
7
8
  readonly address: string;
8
9
  readonly version: string;
9
10
  readonly description: string;
@@ -11,20 +12,16 @@ export interface PackageSection {
11
12
  readonly authors?: string[];
12
13
  readonly license?: string;
13
14
  readonly mthds_version?: string;
15
+ readonly main_pipe?: string;
14
16
  }
15
17
  export interface ExportNode {
16
18
  readonly pipes?: string[];
17
19
  readonly [subdomain: string]: ExportNode | string[] | undefined;
18
20
  }
19
21
  export type Exports = Record<string, ExportNode>;
20
- export interface DependencySpec {
21
- readonly address: string;
22
- readonly version: string;
23
- }
24
22
  export interface MethodsManifest {
25
23
  readonly package: PackageSection;
26
24
  readonly exports?: Exports;
27
- readonly dependencies?: Record<string, DependencySpec>;
28
25
  }
29
26
  export interface MethodsFile {
30
27
  readonly relativePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/resolver/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/package/manifest/types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,6 @@
1
1
  import { parse } from "smol-toml";
2
+ import { METHOD_NAME_RE } from "./schema.js";
3
+ import { isPipeCodeValid } from "./validation.js";
2
4
  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
5
  const SNAKE_CASE_RE = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/;
4
6
  const SLUG_RE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
@@ -122,6 +124,24 @@ export function validateManifest(raw) {
122
124
  errors.push('[package.mthds_version] must be a string.');
123
125
  }
124
126
  }
127
+ // package.name (optional)
128
+ if (pkg["name"] !== undefined) {
129
+ if (typeof pkg["name"] !== "string") {
130
+ errors.push('[package.name] must be a string.');
131
+ }
132
+ else if (!METHOD_NAME_RE.test(pkg["name"])) {
133
+ errors.push(`[package.name] "${pkg["name"]}" is invalid: must be 2-25 lowercase chars (letters, digits, hyphens, underscores), starting with a letter.`);
134
+ }
135
+ }
136
+ // package.main_pipe (optional)
137
+ if (pkg["main_pipe"] !== undefined) {
138
+ if (typeof pkg["main_pipe"] !== "string") {
139
+ errors.push('[package.main_pipe] must be a string.');
140
+ }
141
+ else if (!isPipeCodeValid(pkg["main_pipe"])) {
142
+ errors.push(`[package.main_pipe] "${pkg["main_pipe"]}" must be a valid snake_case pipe code.`);
143
+ }
144
+ }
125
145
  // --- [exports] section (optional, hierarchical) ---
126
146
  const exports = parsed["exports"];
127
147
  if (exports && typeof exports === "object") {
@@ -134,25 +154,9 @@ export function validateManifest(raw) {
134
154
  validateExportNode(node, domain, errors);
135
155
  }
136
156
  }
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
- }
157
+ // --- [dependencies] section not allowed ---
158
+ if (parsed["dependencies"] !== undefined) {
159
+ errors.push('[dependencies] section is not supported. Dependencies have been removed from the MTHDS standard.');
156
160
  }
157
161
  if (errors.length > 0) {
158
162
  return { valid: false, errors };
@@ -162,15 +166,16 @@ export function validateManifest(raw) {
162
166
  address: pkg["address"],
163
167
  version: pkg["version"],
164
168
  description: pkg["description"],
169
+ ...(pkg["name"] !== undefined ? { name: pkg["name"] } : {}),
165
170
  ...(pkg["display_name"] !== undefined ? { display_name: pkg["display_name"] } : {}),
166
171
  ...(pkg["authors"] !== undefined ? { authors: pkg["authors"] } : {}),
167
172
  ...(pkg["license"] !== undefined ? { license: pkg["license"] } : {}),
168
173
  ...(pkg["mthds_version"] !== undefined ? { mthds_version: pkg["mthds_version"] } : {}),
174
+ ...(pkg["main_pipe"] !== undefined ? { main_pipe: pkg["main_pipe"] } : {}),
169
175
  };
170
176
  const manifest = {
171
177
  package: manifestPkg,
172
178
  ...(exports ? { exports: exports } : {}),
173
- ...(deps ? { dependencies: deps } : {}),
174
179
  };
175
180
  return { valid: true, errors: [], manifest };
176
181
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/package/manifest/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function isSnakeCase(word: string): boolean;
2
+ export declare function isPascalCase(word: string): boolean;
3
+ /**
4
+ * Check if a domain code is valid.
5
+ * Accepts single-segment (e.g. "legal") and hierarchical dotted paths
6
+ * (e.g. "legal.contracts"). Each segment must be snake_case.
7
+ * Supports cross-package domain codes (e.g. "alias->scoring").
8
+ */
9
+ export declare function isDomainCodeValid(code: string): boolean;
10
+ export declare function isPipeCodeValid(pipeCode: string): boolean;
@@ -0,0 +1,34 @@
1
+ const SNAKE_CASE_RE = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/;
2
+ const PASCAL_CASE_RE = /^[A-Z][a-zA-Z0-9]*$/;
3
+ export function isSnakeCase(word) {
4
+ return SNAKE_CASE_RE.test(word);
5
+ }
6
+ export function isPascalCase(word) {
7
+ return PASCAL_CASE_RE.test(word);
8
+ }
9
+ /**
10
+ * Check if a domain code is valid.
11
+ * Accepts single-segment (e.g. "legal") and hierarchical dotted paths
12
+ * (e.g. "legal.contracts"). Each segment must be snake_case.
13
+ * Supports cross-package domain codes (e.g. "alias->scoring").
14
+ */
15
+ export function isDomainCodeValid(code) {
16
+ if (!code)
17
+ return false;
18
+ if (code.includes("->")) {
19
+ const arrowIdx = code.indexOf("->");
20
+ const alias = code.slice(0, arrowIdx);
21
+ const remainder = code.slice(arrowIdx + 2);
22
+ if (!isSnakeCase(alias))
23
+ return false;
24
+ return isDomainCodeValid(remainder);
25
+ }
26
+ if (code.startsWith(".") || code.endsWith(".") || code.includes("..")) {
27
+ return false;
28
+ }
29
+ return code.split(".").every((segment) => isSnakeCase(segment));
30
+ }
31
+ export function isPipeCodeValid(pipeCode) {
32
+ return isSnakeCase(pipeCode);
33
+ }
34
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/package/manifest/validation.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,iCAAiC,CAAC;AACxD,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Return the default cache root directory: ~/.mthds/packages
3
+ */
4
+ export declare function getDefaultCacheRoot(): string;
5
+ /**
6
+ * Compute the cache path for a package version.
7
+ * Includes path traversal protection.
8
+ */
9
+ export declare function getCachedPackagePath(address: string, version: string, cacheRoot?: string): string;
10
+ /**
11
+ * Check whether a package version exists in the cache.
12
+ * A directory is considered cached if it exists and is non-empty.
13
+ */
14
+ export declare function isCached(address: string, version: string, cacheRoot?: string): boolean;
15
+ /**
16
+ * Copy a package directory into the cache.
17
+ * Uses a staging directory + rename for safe writes. Removes .git/ from the cached copy.
18
+ */
19
+ export declare function storeInCache(sourceDir: string, address: string, version: string, cacheRoot?: string): string;
20
+ /**
21
+ * Remove a cached package version.
22
+ * Returns true if the directory existed and was removed.
23
+ */
24
+ export declare function removeCachedPackage(address: string, version: string, cacheRoot?: string): boolean;
@@ -0,0 +1,92 @@
1
+ import { existsSync, mkdirSync, readdirSync, renameSync, rmSync, cpSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve, sep } from "node:path";
4
+ import { PackageCacheError } from "./exceptions.js";
5
+ /**
6
+ * Return the default cache root directory: ~/.mthds/packages
7
+ */
8
+ export function getDefaultCacheRoot() {
9
+ return join(homedir(), ".mthds", "packages");
10
+ }
11
+ /**
12
+ * Compute the cache path for a package version.
13
+ * Includes path traversal protection.
14
+ */
15
+ export function getCachedPackagePath(address, version, cacheRoot) {
16
+ const root = resolve(cacheRoot ?? getDefaultCacheRoot());
17
+ const resolved = resolve(root, address, version);
18
+ if (!resolved.startsWith(root + sep)) {
19
+ throw new PackageCacheError(`Path traversal detected: address '${address}' and version '${version}' resolve outside cache root`);
20
+ }
21
+ return resolved;
22
+ }
23
+ /**
24
+ * Check whether a package version exists in the cache.
25
+ * A directory is considered cached if it exists and is non-empty.
26
+ */
27
+ export function isCached(address, version, cacheRoot) {
28
+ const pkgPath = getCachedPackagePath(address, version, cacheRoot);
29
+ if (!existsSync(pkgPath))
30
+ return false;
31
+ try {
32
+ const entries = readdirSync(pkgPath);
33
+ return entries.length > 0;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * Copy a package directory into the cache.
41
+ * Uses a staging directory + rename for safe writes. Removes .git/ from the cached copy.
42
+ */
43
+ export function storeInCache(sourceDir, address, version, cacheRoot) {
44
+ const finalPath = getCachedPackagePath(address, version, cacheRoot);
45
+ const stagingPath = `${finalPath}.staging`;
46
+ try {
47
+ // Ensure parent directory exists before any file operations
48
+ const parentDir = resolve(finalPath, "..");
49
+ mkdirSync(parentDir, { recursive: true });
50
+ // Clean up any leftover staging dir
51
+ if (existsSync(stagingPath)) {
52
+ rmSync(stagingPath, { recursive: true, force: true });
53
+ }
54
+ // Copy source into staging
55
+ cpSync(sourceDir, stagingPath, { recursive: true });
56
+ // Remove .git/ from the staged copy
57
+ const gitDir = join(stagingPath, ".git");
58
+ if (existsSync(gitDir)) {
59
+ rmSync(gitDir, { recursive: true, force: true });
60
+ }
61
+ // Atomic rename into final location
62
+ if (existsSync(finalPath)) {
63
+ rmSync(finalPath, { recursive: true, force: true });
64
+ }
65
+ renameSync(stagingPath, finalPath);
66
+ }
67
+ catch (err) {
68
+ // Clean up staging on failure
69
+ if (existsSync(stagingPath)) {
70
+ rmSync(stagingPath, { recursive: true, force: true });
71
+ }
72
+ throw new PackageCacheError(`Failed to store package '${address}@${version}' in cache: ${err.message}`);
73
+ }
74
+ return finalPath;
75
+ }
76
+ /**
77
+ * Remove a cached package version.
78
+ * Returns true if the directory existed and was removed.
79
+ */
80
+ export function removeCachedPackage(address, version, cacheRoot) {
81
+ const pkgPath = getCachedPackagePath(address, version, cacheRoot);
82
+ if (!existsSync(pkgPath))
83
+ return false;
84
+ try {
85
+ rmSync(pkgPath, { recursive: true, force: true });
86
+ }
87
+ catch (err) {
88
+ throw new PackageCacheError(`Failed to remove cached package '${address}@${version}' at '${pkgPath}': ${err.message}`);
89
+ }
90
+ return true;
91
+ }
92
+ //# sourceMappingURL=package-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-cache.js","sourceRoot":"","sources":["../../src/package/package-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface QualifiedRef {
2
+ readonly domainPath: string | null;
3
+ readonly localCode: string;
4
+ }
5
+ /**
6
+ * Check if a ref is domain-qualified (has a domain path).
7
+ */
8
+ export declare function isQualified(ref: QualifiedRef): boolean;
9
+ /**
10
+ * Get the full reference string.
11
+ */
12
+ export declare function fullRef(ref: QualifiedRef): string;
13
+ /**
14
+ * Parse a reference string by splitting on the last dot.
15
+ * No naming-convention check on localCode.
16
+ */
17
+ export declare function parseRef(raw: string): QualifiedRef;
18
+ /**
19
+ * Parse a concept ref. Validates domain_path segments are snake_case, localCode is PascalCase.
20
+ */
21
+ export declare function parseConceptRef(raw: string): QualifiedRef;
22
+ /**
23
+ * Parse a pipe ref. Validates domain_path segments are snake_case, localCode is snake_case.
24
+ */
25
+ export declare function parsePipeRef(raw: string): QualifiedRef;
26
+ /**
27
+ * True if this ref belongs to the given domain (same domain or bare).
28
+ */
29
+ export declare function isLocalTo(ref: QualifiedRef, domain: string): boolean;
30
+ /**
31
+ * True if this ref belongs to a different domain.
32
+ */
33
+ export declare function isExternalTo(ref: QualifiedRef, domain: string): boolean;
34
+ /**
35
+ * Check if a raw reference string contains the cross-package '->' prefix.
36
+ */
37
+ export declare function hasCrossPackagePrefix(raw: string): boolean;
38
+ /**
39
+ * Split a cross-package reference into [alias, remainder].
40
+ */
41
+ export declare function splitCrossPackageRef(raw: string): [string, string];
@@ -0,0 +1,105 @@
1
+ import { QualifiedRefError } from "./exceptions.js";
2
+ import { isSnakeCase, isPascalCase } from "./manifest/validation.js";
3
+ /**
4
+ * Check if a ref is domain-qualified (has a domain path).
5
+ */
6
+ export function isQualified(ref) {
7
+ return ref.domainPath !== null;
8
+ }
9
+ /**
10
+ * Get the full reference string.
11
+ */
12
+ export function fullRef(ref) {
13
+ if (ref.domainPath !== null) {
14
+ return `${ref.domainPath}.${ref.localCode}`;
15
+ }
16
+ return ref.localCode;
17
+ }
18
+ /**
19
+ * Parse a reference string by splitting on the last dot.
20
+ * No naming-convention check on localCode.
21
+ */
22
+ export function parseRef(raw) {
23
+ if (!raw) {
24
+ throw new QualifiedRefError("Qualified reference cannot be empty");
25
+ }
26
+ if (raw.startsWith(".") || raw.endsWith(".")) {
27
+ throw new QualifiedRefError(`Qualified reference '${raw}' must not start or end with a dot`);
28
+ }
29
+ if (raw.includes("..")) {
30
+ throw new QualifiedRefError(`Qualified reference '${raw}' must not contain consecutive dots`);
31
+ }
32
+ if (!raw.includes(".")) {
33
+ return { domainPath: null, localCode: raw };
34
+ }
35
+ const lastDot = raw.lastIndexOf(".");
36
+ const domainPath = raw.slice(0, lastDot);
37
+ const localCode = raw.slice(lastDot + 1);
38
+ return { domainPath, localCode };
39
+ }
40
+ function validateDomainPath(domainPath, raw) {
41
+ for (const segment of domainPath.split(".")) {
42
+ if (!isSnakeCase(segment)) {
43
+ throw new QualifiedRefError(`Domain segment '${segment}' in reference '${raw}' must be snake_case`);
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Parse a concept ref. Validates domain_path segments are snake_case, localCode is PascalCase.
49
+ */
50
+ export function parseConceptRef(raw) {
51
+ const ref = parseRef(raw);
52
+ if (!isPascalCase(ref.localCode)) {
53
+ throw new QualifiedRefError(`Concept code '${ref.localCode}' in reference '${raw}' must be PascalCase`);
54
+ }
55
+ if (ref.domainPath !== null) {
56
+ validateDomainPath(ref.domainPath, raw);
57
+ }
58
+ return ref;
59
+ }
60
+ /**
61
+ * Parse a pipe ref. Validates domain_path segments are snake_case, localCode is snake_case.
62
+ */
63
+ export function parsePipeRef(raw) {
64
+ const ref = parseRef(raw);
65
+ if (!isSnakeCase(ref.localCode)) {
66
+ throw new QualifiedRefError(`Pipe code '${ref.localCode}' in reference '${raw}' must be snake_case`);
67
+ }
68
+ if (ref.domainPath !== null) {
69
+ validateDomainPath(ref.domainPath, raw);
70
+ }
71
+ return ref;
72
+ }
73
+ /**
74
+ * True if this ref belongs to the given domain (same domain or bare).
75
+ */
76
+ export function isLocalTo(ref, domain) {
77
+ if (ref.domainPath === null)
78
+ return true;
79
+ return ref.domainPath === domain;
80
+ }
81
+ /**
82
+ * True if this ref belongs to a different domain.
83
+ */
84
+ export function isExternalTo(ref, domain) {
85
+ if (ref.domainPath === null)
86
+ return false;
87
+ return ref.domainPath !== domain;
88
+ }
89
+ /**
90
+ * Check if a raw reference string contains the cross-package '->' prefix.
91
+ */
92
+ export function hasCrossPackagePrefix(raw) {
93
+ return raw.includes("->");
94
+ }
95
+ /**
96
+ * Split a cross-package reference into [alias, remainder].
97
+ */
98
+ export function splitCrossPackageRef(raw) {
99
+ if (!raw.includes("->")) {
100
+ throw new QualifiedRefError(`Reference '${raw}' is not a cross-package reference (no '->' found)`);
101
+ }
102
+ const idx = raw.indexOf("->");
103
+ return [raw.slice(0, idx), raw.slice(idx + 2)];
104
+ }
105
+ //# sourceMappingURL=qualified-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualified-ref.js","sourceRoot":"","sources":["../../src/package/qualified-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import semver from "semver";
2
+ export declare class SemVerError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * Parse a version string into a semver SemVer object.
7
+ * Strips a leading 'v' prefix if present (common in git tags like v1.2.3).
8
+ */
9
+ export declare function parseVersion(versionStr: string): semver.SemVer;
10
+ /**
11
+ * Parse a constraint string into a semver Range.
12
+ * Supports: "^1.0.0", "~1.0.0", ">=1.0.0 <2.0.0", "*", "1.*", etc.
13
+ */
14
+ export declare function parseConstraint(constraintStr: string): semver.Range;
15
+ /**
16
+ * Check whether a version satisfies a constraint.
17
+ */
18
+ export declare function versionSatisfies(version: semver.SemVer, constraint: semver.Range): boolean;
19
+ /**
20
+ * Select the minimum version that satisfies a constraint (MVS).
21
+ * Sorts versions ascending and returns the first match.
22
+ */
23
+ export declare function selectMinimumVersion(availableVersions: semver.SemVer[], constraint: semver.Range): semver.SemVer | null;
24
+ /**
25
+ * Select the minimum version that satisfies ALL constraints simultaneously.
26
+ * Used for diamond dependency resolution.
27
+ */
28
+ export declare function selectMinimumVersionForMultipleConstraints(availableVersions: semver.SemVer[], constraints: semver.Range[]): semver.SemVer | null;
29
+ /**
30
+ * Parse a git tag into a SemVer, returning null if not a valid semver tag.
31
+ * Handles tags like "v1.2.3" and "1.2.3", gracefully ignores non-semver tags.
32
+ */
33
+ export declare function parseVersionTag(tag: string): semver.SemVer | null;