@specmarket/cli 0.0.4 → 0.0.6

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 (39) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-MS2DYACY.js → chunk-OTXWWFAO.js} +42 -3
  3. package/dist/chunk-OTXWWFAO.js.map +1 -0
  4. package/dist/{config-R5KWZSJP.js → config-5JMI3YAR.js} +2 -2
  5. package/dist/index.js +1945 -252
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/commands/comment.test.ts +211 -0
  9. package/src/commands/comment.ts +176 -0
  10. package/src/commands/fork.test.ts +163 -0
  11. package/src/commands/info.test.ts +192 -0
  12. package/src/commands/info.ts +66 -2
  13. package/src/commands/init.test.ts +245 -0
  14. package/src/commands/init.ts +359 -25
  15. package/src/commands/issues.test.ts +382 -0
  16. package/src/commands/issues.ts +436 -0
  17. package/src/commands/login.test.ts +99 -0
  18. package/src/commands/login.ts +2 -6
  19. package/src/commands/logout.test.ts +54 -0
  20. package/src/commands/publish.test.ts +159 -0
  21. package/src/commands/publish.ts +1 -0
  22. package/src/commands/report.test.ts +181 -0
  23. package/src/commands/run.test.ts +419 -0
  24. package/src/commands/run.ts +71 -3
  25. package/src/commands/search.test.ts +147 -0
  26. package/src/commands/validate.test.ts +206 -2
  27. package/src/commands/validate.ts +315 -192
  28. package/src/commands/whoami.test.ts +106 -0
  29. package/src/index.ts +6 -0
  30. package/src/lib/convex-client.ts +6 -2
  31. package/src/lib/format-detection.test.ts +223 -0
  32. package/src/lib/format-detection.ts +172 -0
  33. package/src/lib/meta-instructions.test.ts +340 -0
  34. package/src/lib/meta-instructions.ts +562 -0
  35. package/src/lib/ralph-loop.test.ts +404 -0
  36. package/src/lib/ralph-loop.ts +501 -95
  37. package/src/lib/telemetry.ts +7 -1
  38. package/dist/chunk-MS2DYACY.js.map +0 -1
  39. /package/dist/{config-R5KWZSJP.js.map → config-5JMI3YAR.js.map} +0 -0
package/README.md CHANGED
@@ -91,7 +91,7 @@ specmarket run @user/docusign-replacement
91
91
  1. Validates the spec (`specmarket validate` internally)
92
92
  2. Creates a sandboxed working directory under `~/.specmarket/runs/<run-id>/`
93
93
  3. Copies spec files into the sandbox
94
- 4. Loops: feeds `PROMPT.md` to `claude-code --print`, captures tokens/duration/diffs per iteration
94
+ 4. Loops: feeds `PROMPT.md` to `claude --print`, captures tokens/duration/diffs per iteration
95
95
  5. Terminates on: **success** (all criteria met), **stall** (3 loops with no meaningful diff), **failure** (10 loops stuck on same test), or **budget exceeded**
96
96
  6. Generates `run-report.json` with full metadata
97
97
 
@@ -108,7 +108,7 @@ var specYamlSchema = z.object({
108
108
  output_type: outputTypeSchema,
109
109
  primary_stack: primaryStackSchema,
110
110
  version: z.string().regex(/^\d+\.\d+\.\d+$/, "version must be semver (e.g. 1.0.0)"),
111
- runner: z.literal("claude-code"),
111
+ runner: z.literal("claude"),
112
112
  min_model: z.string().min(1),
113
113
  estimated_tokens: z.number().int().positive(),
114
114
  estimated_cost_usd: z.number().positive(),
@@ -150,6 +150,20 @@ var bountySubmissionStatusSchema = z.enum([
150
150
  "accepted",
151
151
  "rejected"
152
152
  ]);
153
+ var specmarketSidecarSchema = z.object({
154
+ spec_format: z.string().min(1),
155
+ display_name: z.string().min(1),
156
+ description: z.string().min(10),
157
+ output_type: outputTypeSchema,
158
+ primary_stack: primaryStackSchema,
159
+ replaces_saas: z.string().optional(),
160
+ replaces_pricing: z.string().optional(),
161
+ tags: z.array(z.string()).default([]),
162
+ infrastructure: infrastructureSchemaYaml.optional(),
163
+ estimated_tokens: z.number().int().positive().optional(),
164
+ estimated_cost_usd: z.number().positive().optional(),
165
+ estimated_time_minutes: z.number().positive().optional()
166
+ });
153
167
  var successCriterionResultSchema = z.object({
154
168
  criterion: z.string().min(1),
155
169
  passed: z.boolean(),
@@ -215,9 +229,18 @@ var RUN_DEFAULTS = {
215
229
  /** Loops with no git diff before declaring stall */
216
230
  STALL_THRESHOLD: 3,
217
231
  /** Loops with the same failing test before declaring failure */
218
- FAILURE_THRESHOLD: 10
232
+ FAILURE_THRESHOLD: 10,
233
+ /**
234
+ * Maximum test→fix cycles in the post-task test phase.
235
+ * After all tasks are marked done, the runner runs tests and writes fix tasks
236
+ * if they fail. If this many cycles complete without the tests going green, the
237
+ * run is declared a failure.
238
+ */
239
+ TEST_PHASE_MAX_ITERATIONS: 5
219
240
  };
220
241
  var TOKEN_EXPIRY_MS = 30 * 24 * 60 * 60 * 1e3;
242
+ var KNOWN_HARNESSES = ["claude-code", "codex", "opencode"];
243
+ var DEFAULT_HARNESS = "claude-code";
221
244
  var DEFAULT_CONVEX_URL = process.env["CONVEX_URL"] ?? "https://clever-bird-665.convex.cloud";
222
245
  var REQUIRED_SPEC_FILES = [
223
246
  "spec.yaml",
@@ -226,6 +249,16 @@ var REQUIRED_SPEC_FILES = [
226
249
  "SUCCESS_CRITERIA.md"
227
250
  ];
228
251
  var REQUIRED_STDLIB_FILES = ["STACK.md"];
252
+ var SIDECAR_FILENAME = "specmarket.yaml";
253
+ var DEFAULT_WEB_URL = process.env["SPECMARKET_WEB_URL"] ?? "https://www.specmarket.dev";
254
+ var MODEL_COST_PER_TOKEN = {
255
+ /** Haiku: ($0.25*0.75 + $1.25*0.25) / 1_000_000 */
256
+ haiku: 5e-7,
257
+ /** Opus: ($15*0.75 + $75*0.25) / 1_000_000 */
258
+ opus: 3e-5,
259
+ /** Sonnet (default): ($3*0.75 + $15*0.25) / 1_000_000 */
260
+ default: 6e-6
261
+ };
229
262
 
230
263
  // src/lib/config.ts
231
264
  import createDebug from "debug";
@@ -265,17 +298,23 @@ async function setConfigValue(key, value) {
265
298
 
266
299
  export {
267
300
  specYamlSchema,
301
+ specmarketSidecarSchema,
268
302
  transformInfrastructure,
269
303
  EXIT_CODES,
270
304
  CONFIG_PATHS,
271
305
  RUN_DEFAULTS,
272
306
  TOKEN_EXPIRY_MS,
307
+ KNOWN_HARNESSES,
308
+ DEFAULT_HARNESS,
273
309
  DEFAULT_CONVEX_URL,
274
310
  REQUIRED_SPEC_FILES,
275
311
  REQUIRED_STDLIB_FILES,
312
+ SIDECAR_FILENAME,
313
+ DEFAULT_WEB_URL,
314
+ MODEL_COST_PER_TOKEN,
276
315
  loadConfig,
277
316
  saveConfig,
278
317
  getConfigValue,
279
318
  setConfigValue
280
319
  };
281
- //# sourceMappingURL=chunk-MS2DYACY.js.map
320
+ //# sourceMappingURL=chunk-OTXWWFAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/config.ts","../../shared/src/validators.ts","../../shared/src/constants.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { CliConfig } from '@specmarket/shared';\nimport { CONFIG_PATHS } from '@specmarket/shared';\nimport createDebug from 'debug';\n\nconst debug = createDebug('specmarket:cli');\n\nfunction getConfigDir(): string {\n return join(homedir(), CONFIG_PATHS.DIR);\n}\n\nfunction getConfigPath(): string {\n return join(homedir(), CONFIG_PATHS.CONFIG);\n}\n\n/**\n * Ensures the ~/.specmarket directory exists.\n */\nasync function ensureConfigDir(): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n}\n\n/**\n * Loads CLI configuration from ~/.specmarket/config.json.\n * Returns default config if the file doesn't exist.\n */\nexport async function loadConfig(): Promise<CliConfig> {\n try {\n const raw = await readFile(getConfigPath(), 'utf-8');\n return JSON.parse(raw) as CliConfig;\n } catch {\n debug('No config file found, using defaults');\n return {};\n }\n}\n\n/**\n * Saves CLI configuration to ~/.specmarket/config.json.\n */\nexport async function saveConfig(config: CliConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(getConfigPath(), JSON.stringify(config, null, 2), 'utf-8');\n debug('Config saved to %s', getConfigPath());\n}\n\n/**\n * Gets a specific config value by key.\n */\nexport async function getConfigValue<K extends keyof CliConfig>(\n key: K\n): Promise<CliConfig[K]> {\n const config = await loadConfig();\n return config[key];\n}\n\n/**\n * Sets a specific config value and persists.\n */\nexport async function setConfigValue<K extends keyof CliConfig>(\n key: K,\n value: CliConfig[K]\n): Promise<void> {\n const config = await loadConfig();\n config[key] = value;\n await saveConfig(config);\n}\n","import { z } from 'zod';\n\nexport const outputTypeSchema = z.enum([\n 'web-app',\n 'cli-tool',\n 'api-service',\n 'library',\n 'mobile-app',\n]);\n\nexport const primaryStackSchema = z.enum([\n 'nextjs-typescript',\n 'astro-typescript',\n 'python-fastapi',\n 'go',\n 'rust',\n 'other',\n]);\n\nexport const serviceCategorySchema = z.enum([\n 'database',\n 'auth',\n 'storage',\n 'cdn',\n 'dns',\n 'email',\n 'sms',\n 'payments',\n 'search',\n 'analytics',\n 'monitoring',\n 'queue',\n 'cache',\n 'compute',\n 'pdf',\n 'ai',\n 'other',\n]);\n\n/** Provider schema (camelCase) — for Convex DB */\nexport const providerSchema = z.object({\n name: z.string().min(1),\n freeTier: z.boolean(),\n paidStartsUsd: z.number().min(0).optional(),\n notes: z.string().optional(),\n});\n\n/** Provider schema (snake_case) — for spec.yaml parsing */\nexport const providerSchemaYaml = z.object({\n name: z.string().min(1),\n free_tier: z.boolean(),\n paid_starts_usd: z.number().min(0).optional(),\n notes: z.string().optional(),\n});\n\n// snake_case for spec.yaml parsing\nexport const serviceSchemaYaml = z.object({\n category: serviceCategorySchema,\n name: z.string().min(1),\n purpose: z.string().min(1),\n required: z.boolean(),\n user_provided: z.boolean().optional(),\n providers: z.array(providerSchemaYaml).min(1),\n default_provider: z.string().optional(),\n setup_notes: z.string().optional(),\n});\n\n// camelCase for Convex DB\nexport const serviceSchema = z.object({\n category: serviceCategorySchema,\n name: z.string().min(1),\n purpose: z.string().min(1),\n required: z.boolean(),\n userProvided: z.boolean().optional(),\n providers: z.array(providerSchema).min(1),\n defaultProvider: z.string().optional(),\n setupNotes: z.string().optional(),\n});\n\n// snake_case for spec.yaml parsing\nexport const infrastructureSchemaYaml = z.object({\n monthly_cost: z.object({\n free_tier_usd: z.number().min(0),\n production_usd: z.number().min(0),\n }),\n services: z.array(serviceSchemaYaml).default([]),\n user_provided: z.array(z.string()).default([]),\n setup_time_minutes: z.number().min(0).optional(),\n deployment_targets: z\n .array(\n z.object({\n name: z.string().min(1),\n notes: z.string().optional(),\n })\n )\n .optional(),\n});\n\n// camelCase for Convex DB\nexport const infrastructureSchema = z.object({\n monthlyCost: z.object({\n freeTierUsd: z.number().min(0),\n productionUsd: z.number().min(0),\n }),\n services: z.array(serviceSchema).default([]),\n userProvided: z.array(z.string()).default([]),\n setupTimeMinutes: z.number().min(0).optional(),\n deploymentTargets: z\n .array(\n z.object({\n name: z.string().min(1),\n notes: z.string().optional(),\n })\n )\n .optional(),\n});\n\n// Full spec.yaml schema (snake_case as written by users)\nexport const specYamlSchema = z.object({\n name: z\n .string()\n .min(1)\n .regex(/^[a-z0-9-]+$/, 'name must be lowercase alphanumeric with hyphens'),\n display_name: z.string().min(1),\n description: z.string().min(10),\n replaces_saas: z.string().optional(),\n replaces_pricing: z.string().optional(),\n output_type: outputTypeSchema,\n primary_stack: primaryStackSchema,\n version: z\n .string()\n .regex(\n /^\\d+\\.\\d+\\.\\d+$/,\n 'version must be semver (e.g. 1.0.0)'\n ),\n runner: z.literal('claude'),\n min_model: z.string().min(1),\n estimated_tokens: z.number().int().positive(),\n estimated_cost_usd: z.number().positive(),\n estimated_time_minutes: z.number().positive(),\n tags: z.array(z.string()).default([]),\n infrastructure: infrastructureSchemaYaml.optional(),\n // Fork metadata (added by CLI when forking)\n forked_from_id: z.string().optional(),\n forked_from_version: z.string().optional(),\n});\n\nexport const runStatusSchema = z.enum([\n 'success',\n 'failure',\n 'stall',\n 'budget_exceeded',\n 'user_cancelled',\n]);\n\nexport const specStatusSchema = z.enum([\n 'published',\n 'draft',\n 'flagged',\n 'removed',\n]);\n\nexport const userRoleSchema = z.enum(['user', 'creator', 'admin']);\n\nexport const bountyFundingTypeSchema = z.enum([\n 'company',\n 'crowdfund',\n 'mixed',\n]);\n\nexport const bountyStatusSchema = z.enum([\n 'open',\n 'claimed',\n 'awarded',\n 'expired',\n 'cancelled',\n]);\n\nexport const bountySubmissionStatusSchema = z.enum([\n 'submitted',\n 'accepted',\n 'rejected',\n]);\n\n/** Schema for specmarket.yaml (required for every spec). Snake_case to match spec convention. */\nexport const specmarketSidecarSchema = z.object({\n spec_format: z.string().min(1),\n display_name: z.string().min(1),\n description: z.string().min(10),\n output_type: outputTypeSchema,\n primary_stack: primaryStackSchema,\n replaces_saas: z.string().optional(),\n replaces_pricing: z.string().optional(),\n tags: z.array(z.string()).default([]),\n infrastructure: infrastructureSchemaYaml.optional(),\n estimated_tokens: z.number().int().positive().optional(),\n estimated_cost_usd: z.number().positive().optional(),\n estimated_time_minutes: z.number().positive().optional(),\n});\n\nexport const successCriterionResultSchema = z.object({\n criterion: z.string().min(1),\n passed: z.boolean(),\n details: z.string().optional(),\n});\n\n/** Transform spec.yaml (snake_case infra) to Convex-friendly camelCase */\nexport function transformInfrastructure(\n yaml: z.infer<typeof infrastructureSchemaYaml>\n): z.infer<typeof infrastructureSchema> {\n return {\n monthlyCost: {\n freeTierUsd: yaml.monthly_cost.free_tier_usd,\n productionUsd: yaml.monthly_cost.production_usd,\n },\n services: yaml.services.map((s) => ({\n category: s.category,\n name: s.name,\n purpose: s.purpose,\n required: s.required,\n userProvided: s.user_provided,\n providers: s.providers.map((p) => ({\n name: p.name,\n freeTier: p.free_tier,\n paidStartsUsd: p.paid_starts_usd,\n notes: p.notes,\n })),\n defaultProvider: s.default_provider,\n setupNotes: s.setup_notes,\n })),\n userProvided: yaml.user_provided,\n setupTimeMinutes: yaml.setup_time_minutes,\n deploymentTargets: yaml.deployment_targets,\n };\n}\n","/** CLI exit codes */\nexport const EXIT_CODES = {\n /** Success */\n SUCCESS: 0,\n /** Validation error (bad spec, invalid args) */\n VALIDATION_ERROR: 1,\n /** Runtime error (loop failed, crash) */\n RUNTIME_ERROR: 2,\n /** Budget exceeded */\n BUDGET_EXCEEDED: 3,\n /** Network error (Convex unreachable, upload failed) */\n NETWORK_ERROR: 4,\n /** Auth error (not logged in, token expired) */\n AUTH_ERROR: 5,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\n/** Default file paths (relative to $HOME) */\nexport const CONFIG_PATHS = {\n /** Directory for all SpecMarket CLI state */\n DIR: '.specmarket',\n /** Auth credentials file */\n CREDENTIALS: '.specmarket/credentials.json',\n /** CLI config file */\n CONFIG: '.specmarket/config.json',\n /** Run artifacts directory */\n RUNS_DIR: '.specmarket/runs',\n} as const;\n\n/** Default run behavior */\nexport const RUN_DEFAULTS = {\n /** Maximum loop iterations before forced stop */\n MAX_LOOPS: 50,\n /** Budget multiplier: stop if cost > estimated * this */\n BUDGET_MULTIPLIER: 2,\n /** Loops with no git diff before declaring stall */\n STALL_THRESHOLD: 3,\n /** Loops with the same failing test before declaring failure */\n FAILURE_THRESHOLD: 10,\n /**\n * Maximum test→fix cycles in the post-task test phase.\n * After all tasks are marked done, the runner runs tests and writes fix tasks\n * if they fail. If this many cycles complete without the tests going green, the\n * run is declared a failure.\n */\n TEST_PHASE_MAX_ITERATIONS: 5,\n} as const;\n\n/** Rate limits (client-side awareness, enforced server-side too) */\nexport const RATE_LIMITS = {\n /** Max telemetry submissions per hour */\n RUNS_PER_HOUR: 10,\n /** Max spec publishes per day */\n PUBLISHES_PER_DAY: 5,\n /** Max ratings per day */\n RATINGS_PER_DAY: 20,\n} as const;\n\n/** Credential expiry */\nexport const TOKEN_EXPIRY_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n/** Runner identifier (legacy — use KNOWN_HARNESSES instead) */\nexport const RUNNER_ID = 'claude' as const;\n\n/**\n * Supported agentic harnesses for spec execution.\n * Each harness has its own CLI invocation but receives the same meta-instructions.\n * - claude-code: Claude Code CLI (`claude --print --output-format json`)\n * - codex: OpenAI Codex CLI (`codex`)\n * - opencode: SWE-kit opencode CLI (`opencode`)\n */\nexport const KNOWN_HARNESSES = ['claude-code', 'codex', 'opencode'] as const;\n\n/** Default harness when --harness is not specified */\nexport const DEFAULT_HARNESS = 'claude-code' as const;\n\n/**\n * Convex deployment URL. Prefer CONVEX_URL env; otherwise use SpecMarket production.\n * CLI and coordinator use this when no env/config override is set.\n */\nexport const DEFAULT_CONVEX_URL: string =\n process.env['CONVEX_URL'] ?? 'https://clever-bird-665.convex.cloud';\n\n/** Required files in a valid spec directory */\nexport const REQUIRED_SPEC_FILES = [\n 'spec.yaml',\n 'PROMPT.md',\n 'SPEC.md',\n 'SUCCESS_CRITERIA.md',\n] as const;\n\n/** Required files in stdlib/ directory */\nexport const REQUIRED_STDLIB_FILES = ['STACK.md'] as const;\n\n/** Required metadata file for every spec (single source of truth for format and marketplace fields) */\nexport const SIDECAR_FILENAME = 'specmarket.yaml' as const;\n\n/** Known spec formats (value of spec_format in specmarket.yaml) */\nexport const KNOWN_SPEC_FORMATS = [\n 'specmarket',\n 'speckit',\n 'bmad',\n 'ralph',\n 'custom',\n] as const;\n\n/**\n * SpecMarket web app URL. Used by the CLI to generate device-code login links.\n * Override with SPECMARKET_WEB_URL env var for local development.\n */\nexport const DEFAULT_WEB_URL: string =\n process.env['SPECMARKET_WEB_URL'] ?? 'https://www.specmarket.dev';\n\n/**\n * Approximate cost per token for each Claude model family.\n * Used to estimate token counts when the CLI only reports cost_usd.\n *\n * Values are blended averages (75% input weight, 25% output weight) based on\n * published Anthropic pricing. These are estimates — actual token counts from\n * Claude CLI cost reporting may deviate ±30% depending on context ratio.\n *\n * Pattern matching (case-insensitive substring):\n * \"haiku\" → Haiku family (~$0.25/MTok input, ~$1.25/MTok output)\n * \"opus\" → Opus family (~$15/MTok input, ~$75/MTok output)\n * default → Sonnet family (~$3/MTok input, ~$15/MTok output)\n */\nexport const MODEL_COST_PER_TOKEN: {\n haiku: number;\n opus: number;\n default: number;\n} = {\n /** Haiku: ($0.25*0.75 + $1.25*0.25) / 1_000_000 */\n haiku: 0.0000005,\n /** Opus: ($15*0.75 + $75*0.25) / 1_000_000 */\n opus: 0.00003,\n /** Sonnet (default): ($3*0.75 + $15*0.25) / 1_000_000 */\n default: 0.000006,\n} as const;\n\n/** Debug log namespaces */\nexport const DEBUG_NAMESPACES = {\n CLI: 'specmarket:cli',\n CONVEX: 'specmarket:convex',\n RUNNER: 'specmarket:runner',\n AUTH: 'specmarket:auth',\n TELEMETRY: 'specmarket:telemetry',\n} as const;\n"],"mappings":"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","names":[]}
@@ -4,11 +4,11 @@ import {
4
4
  loadConfig,
5
5
  saveConfig,
6
6
  setConfigValue
7
- } from "./chunk-MS2DYACY.js";
7
+ } from "./chunk-OTXWWFAO.js";
8
8
  export {
9
9
  getConfigValue,
10
10
  loadConfig,
11
11
  saveConfig,
12
12
  setConfigValue
13
13
  };
14
- //# sourceMappingURL=config-R5KWZSJP.js.map
14
+ //# sourceMappingURL=config-5JMI3YAR.js.map