specweave 2.1.0 → 2.2.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.
Files changed (73) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/README.md +7 -6
  3. package/bin/specweave.js +28 -0
  4. package/dist/src/cli/commands/jev-helpers.d.ts +148 -0
  5. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -0
  6. package/dist/src/cli/commands/jev-helpers.js +582 -0
  7. package/dist/src/cli/commands/jev-helpers.js.map +1 -0
  8. package/dist/src/cli/commands/jev.d.ts +21 -0
  9. package/dist/src/cli/commands/jev.d.ts.map +1 -0
  10. package/dist/src/cli/commands/jev.js +350 -0
  11. package/dist/src/cli/commands/jev.js.map +1 -0
  12. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts +4 -0
  13. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts.map +1 -1
  14. package/dist/src/cli/helpers/init/instruction-file-writer.js +11 -6
  15. package/dist/src/cli/helpers/init/instruction-file-writer.js.map +1 -1
  16. package/dist/src/core/auto/completion-evaluator.d.ts +22 -1
  17. package/dist/src/core/auto/completion-evaluator.d.ts.map +1 -1
  18. package/dist/src/core/auto/completion-evaluator.js +99 -9
  19. package/dist/src/core/auto/completion-evaluator.js.map +1 -1
  20. package/dist/src/core/config/types.d.ts +39 -1
  21. package/dist/src/core/config/types.d.ts.map +1 -1
  22. package/dist/src/core/config/types.js +1 -0
  23. package/dist/src/core/config/types.js.map +1 -1
  24. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +28 -5
  25. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
  26. package/dist/src/core/hooks/handlers/pre-tool-use.js +162 -7
  27. package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
  28. package/dist/src/core/jev/browse.d.ts +56 -0
  29. package/dist/src/core/jev/browse.d.ts.map +1 -0
  30. package/dist/src/core/jev/browse.js +721 -0
  31. package/dist/src/core/jev/browse.js.map +1 -0
  32. package/dist/src/core/jev/client.d.ts +134 -0
  33. package/dist/src/core/jev/client.d.ts.map +1 -0
  34. package/dist/src/core/jev/client.js +329 -0
  35. package/dist/src/core/jev/client.js.map +1 -0
  36. package/dist/src/core/jev/config.d.ts +69 -0
  37. package/dist/src/core/jev/config.d.ts.map +1 -0
  38. package/dist/src/core/jev/config.js +181 -0
  39. package/dist/src/core/jev/config.js.map +1 -0
  40. package/dist/src/core/jev/decide.d.ts +162 -0
  41. package/dist/src/core/jev/decide.d.ts.map +1 -0
  42. package/dist/src/core/jev/decide.js +333 -0
  43. package/dist/src/core/jev/decide.js.map +1 -0
  44. package/dist/src/core/jev/index.d.ts +20 -0
  45. package/dist/src/core/jev/index.d.ts.map +1 -0
  46. package/dist/src/core/jev/index.js +20 -0
  47. package/dist/src/core/jev/index.js.map +1 -0
  48. package/dist/src/core/jev/questions.d.ts +56 -0
  49. package/dist/src/core/jev/questions.d.ts.map +1 -0
  50. package/dist/src/core/jev/questions.js +159 -0
  51. package/dist/src/core/jev/questions.js.map +1 -0
  52. package/dist/src/core/jev/redact.d.ts +44 -0
  53. package/dist/src/core/jev/redact.d.ts.map +1 -0
  54. package/dist/src/core/jev/redact.js +102 -0
  55. package/dist/src/core/jev/redact.js.map +1 -0
  56. package/dist/src/core/jev/usage.d.ts +38 -0
  57. package/dist/src/core/jev/usage.d.ts.map +1 -0
  58. package/dist/src/core/jev/usage.js +70 -0
  59. package/dist/src/core/jev/usage.js.map +1 -0
  60. package/dist/src/utils/model-selection.d.ts +49 -0
  61. package/dist/src/utils/model-selection.d.ts.map +1 -1
  62. package/dist/src/utils/model-selection.js +70 -0
  63. package/dist/src/utils/model-selection.js.map +1 -1
  64. package/package.json +1 -1
  65. package/plugins/PLUGINS-INDEX.md +14 -4
  66. package/plugins/specweave/.claude-plugin/plugin.json +5 -3
  67. package/plugins/specweave/PLUGIN.md +16 -4
  68. package/plugins/specweave/hooks/run-worker.mjs +37 -2
  69. package/plugins/specweave/hooks/run.mjs +30 -0
  70. package/plugins/specweave/marketplace.json +6 -0
  71. package/plugins/specweave/skills/jev/SKILL.md +203 -0
  72. package/src/templates/AGENTS.md.template +22 -0
  73. package/src/templates/CLAUDE.md.template +22 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Portable intent, specifications, task evidence, and handoffs across AI coding tools.",
5
5
  "owner": {
6
6
  "name": "Anton Abyzov",
@@ -12,7 +12,7 @@
12
12
  "description": "SpecWeave unified plugin — increment lifecycle (plan, work the ledger, verify, review, complete), cross-tool handoff, GitHub/Jira/ADO sync",
13
13
  "source": "./plugins/specweave",
14
14
  "category": "development",
15
- "version": "2.1.0",
15
+ "version": "2.2.1",
16
16
  "author": {
17
17
  "name": "Anton Abyzov",
18
18
  "email": "anton.abyzov@gmail.com"
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <p align="center">
9
9
  <a href="https://www.npmjs.com/package/specweave"><img src="https://img.shields.io/npm/v/specweave?color=brightgreen" alt="npm" /></a>
10
- <img src="https://img.shields.io/badge/skills-10-8B5CF6" alt="10 skills" />
10
+ <img src="https://img.shields.io/badge/skills-11-8B5CF6" alt="11 skills" />
11
11
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT" /></a>
12
12
  <a href="https://discord.gg/UYg4BGJ65V"><img src="https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white" alt="Discord" /></a>
13
13
  </p>
@@ -45,9 +45,9 @@ Start with a short intent, see what is in progress, and open the linked specific
45
45
 
46
46
  Everything lives in `.specweave/increments/NNNN-slug/`: `spec.md`, `tasks.md` (+ the rendered `SW:BOARD`), `ledger.jsonl`, `handoff.md`, `reports/`.
47
47
 
48
- ## The ten skills
48
+ ## The eleven skills
49
49
 
50
- The CLI is the product and it runs in any AI tool or in CI. These ten focused skills expose the workflow to compatible coding tools. Install domain expertise separately when it helps.
50
+ The CLI is the product and it runs in any AI tool or in CI. These eleven focused skills expose the workflow to compatible coding tools. Install domain expertise separately when it helps.
51
51
 
52
52
  | Skill | Use it for |
53
53
  |-------|------------|
@@ -61,6 +61,7 @@ The CLI is the product and it runs in any AI tool or in CI. These ten focused sk
61
61
  | `sw:done` | Verify, review check, `specweave complete`. |
62
62
  | `sw:sync` | GitHub, Jira and Azure DevOps: push, pull, status, setup. |
63
63
  | `sw:handoff` | A one-page, secret-scrubbed continuation doc. |
64
+ | `sw:jev` | Closed-set decisions in ~250 ms via Jev (TypeSafe System One). |
64
65
 
65
66
  Five longer procedures (tdd-cycle, e2e, debug, diagrams, release-expert) live in `skills-optional/` and install on demand with [vskill](https://www.npmjs.com/package/vskill).
66
67
 
@@ -78,7 +79,7 @@ specweave update
78
79
  There is no alias routing: a 1.x slug simply has no skill behind it. The old-to-new map —
79
80
  every removed skill, the skill or CLI command that replaced it, and the ones that moved to
80
81
  `skills-optional/` — is `removedIn2_0` in
81
- [`plugins/specweave/marketplace.json`](plugins/specweave/marketplace.json).
82
+ [`plugins/specweave/marketplace.json`](https://github.com/anton-abyzov/specweave/blob/develop/plugins/specweave/marketplace.json).
82
83
 
83
84
  <br/>
84
85
 
@@ -140,7 +141,7 @@ Cursor tells AI "use Tailwind." SpecWeave tells AI "build a checkout flow agains
140
141
 
141
142
  **LSP Code Intelligence** — 198x faster than grep, 0 false positives. Semantic references, definitions, and types.
142
143
 
143
- **10 skills, not 51** — see [The ten skills](#the-ten-skills) above. Plus five standalone skills for non-Claude tools.
144
+ **11 skills, not 51** — see [The eleven skills](#the-eleven-skills) above. Plus six standalone skills for non-Claude tools.
144
145
 
145
146
  **External Sync** — `specweave sync push|pull|status|setup`. GitHub is first-class; Jira and Azure DevOps are opt-in.
146
147
 
@@ -172,7 +173,7 @@ npx vskill eval run my-skill # Run eval suite
172
173
 
173
174
  ## Contributing
174
175
 
175
- Inside this repo dependency install scripts are disabled (`.npmrc`): run `npm ci`, then `npm run setup` (rebuilds the allowlisted native deps), and `npm run security:scan` before pushing — see [SECURITY.md](SECURITY.md).
176
+ Inside this repo dependency install scripts are disabled (`.npmrc`): run `npm ci`, then `npm run setup` (rebuilds the allowlisted native deps), and `npm run security:scan` before pushing — see [SECURITY.md](https://github.com/anton-abyzov/specweave/blob/develop/SECURITY.md).
176
177
 
177
178
  ## Community
178
179
 
package/bin/specweave.js CHANGED
@@ -448,6 +448,34 @@ program
448
448
  });
449
449
  });
450
450
 
451
+ // Jev command - TypeSafe System One: fast, cheap, calibrated closed-set decisions
452
+ program
453
+ .command('jev <action> [args...]')
454
+ .description('Jev (System One): doctor | setup | ask | route | task | guard | screen | failure | browse | usage')
455
+ .option('--json', 'Machine-readable JSON output')
456
+ .option('--provider <name>', 'setup: openrouter | typesafe')
457
+ .option('--model <model>', 'setup: model id (defaults to the provider default)')
458
+ .option('--guard-bash', 'setup: enable the opt-in PreToolUse Bash guard')
459
+ .option('--no-guard-bash', 'setup: disable the Bash guard')
460
+ .option('--disable', 'setup: turn Jev off for this project')
461
+ .option('--state <value>', 'ask: state as JSON, plain text, @file or - for stdin')
462
+ .option('--questions <value>', 'ask: questions as JSON or @file')
463
+ .option('--choice <instructions>', 'ask: shorthand for one choice question')
464
+ .option('--option <key=description>', 'ask: one --choice option (repeatable)', (val, acc) => { (acc || []).push(val); return acc || [val]; }, [])
465
+ .option('--noul <instructions>', 'ask: shorthand for one noul (true/false probability) question')
466
+ .option('--increment <id>', 'task: increment id (defaults to the active one)')
467
+ .option('--goal <goal>', 'browse: what to accomplish')
468
+ .option('--url <url>', 'browse: starting URL')
469
+ .option('--allow-domain <domain>', 'browse: allowed origin (repeatable)', (val, acc) => { (acc || []).push(val); return acc || [val]; }, [])
470
+ .option('--input <Label=value>', 'browse: text the loop may type (repeatable)', (val, acc) => { (acc || []).push(val); return acc || [val]; }, [])
471
+ .option('--max-steps <n>', 'browse: step limit')
472
+ .option('--screenshot-dir <path>', 'browse: where to write screenshots')
473
+ .option('--allow-sensitive', 'browse: allow clicking sensitive controls')
474
+ .action(async (action, args, options) => {
475
+ const { jevCommand } = await import('../dist/src/cli/commands/jev.js');
476
+ process.exitCode = await jevCommand(action, args, options);
477
+ });
478
+
451
479
  // Next ID command - Return the next available increment number
452
480
  program
453
481
  .command('next-id')
@@ -0,0 +1,148 @@
1
+ /**
2
+ * `specweave jev` — the local-environment half of the command.
3
+ *
4
+ * Argument parsing, the shipped-skill roster, `.specweave/config.json` writes, the
5
+ * shared exit codes and printers, and the two environment subcommands (`doctor`,
6
+ * `setup`). `jev.ts` keeps the dispatcher and the decision subcommands.
7
+ *
8
+ * Nothing here ever reads, prints or stores an API key VALUE — only env var NAMES.
9
+ *
10
+ * @module cli/commands/jev-helpers
11
+ */
12
+ import { JevClient, runBrowse, type Json, type Question } from '../../core/jev/index.js';
13
+ /** Exit codes shared by every `specweave jev` subcommand (documented in the skill). */
14
+ export declare const EXIT: {
15
+ readonly ok: 0;
16
+ readonly error: 1;
17
+ readonly warn: 2;
18
+ readonly deny: 3;
19
+ /** Jev is disabled or has no key — agents treat this as "continue without Jev". */
20
+ readonly unavailable: 4;
21
+ };
22
+ /** Where the opt-in PreToolUse Bash guard marker lives. */
23
+ export declare function guardMarkerPath(projectRoot: string): string;
24
+ /** Create or remove the Bash guard marker. Returns true when the marker exists after the call. */
25
+ export declare function setGuardMarker(projectRoot: string, on: boolean): boolean;
26
+ /**
27
+ * Merge a patch into the `jev` section of `.specweave/config.json`, keeping every
28
+ * other key (and every other jev key) untouched. Returns the config path written.
29
+ */
30
+ export declare function mergeJevConfig(projectRoot: string, patch: Record<string, unknown>): string;
31
+ /** The installed specweave package root (walks up from this module). */
32
+ export declare function packageRoot(): string;
33
+ export interface ProjectHookState {
34
+ /** Absolute path of `<projectRoot>/.claude/settings.json` (whether or not it exists). */
35
+ path: string;
36
+ present: boolean;
37
+ /** Set when the settings file could not be read or written; it was left untouched. */
38
+ error?: string;
39
+ }
40
+ /** `<projectRoot>/.claude/settings.json`. */
41
+ export declare function projectSettingsPath(projectRoot: string): string;
42
+ /**
43
+ * The exact command the hook entry runs.
44
+ *
45
+ * Absolute, because `CLAUDE_PLUGIN_ROOT` is NOT set for hooks declared in
46
+ * settings.json — `${CLAUDE_PLUGIN_ROOT}` would expand to nothing. `run.mjs`
47
+ * resolves its own plugin root from `import.meta.url`, so an absolute path is
48
+ * all it needs.
49
+ */
50
+ export declare function jevHookCommand(root?: string): string;
51
+ /** Is the Jev PreToolUse hook registered for this project right now? */
52
+ export declare function readProjectHook(projectRoot: string): ProjectHookState;
53
+ /**
54
+ * Register or remove the Jev Bash guard in `<projectRoot>/.claude/settings.json`.
55
+ *
56
+ * Idempotent: an entry already pointing at a `hooks/run.mjs pre-tool-use` is
57
+ * rewritten in place (so a moved or reinstalled package updates rather than
58
+ * duplicates) and never reordered. Removal takes out exactly our entries — other
59
+ * PreToolUse groups survive — and then deletes the empty array and keys it left
60
+ * behind. Every other key in the file is preserved byte-for-byte through the
61
+ * JSON round trip.
62
+ *
63
+ * A settings.json that is missing or malformed is never overwritten blind: a
64
+ * malformed file comes back as `{ error }` and is left exactly as it was.
65
+ */
66
+ export declare function setProjectHook(projectRoot: string, on: boolean, packageDir?: string): ProjectHookState;
67
+ export interface SkillEntry {
68
+ name: string;
69
+ description: string;
70
+ }
71
+ /**
72
+ * Roster used when the shipped `plugins/specweave/skills/` tree cannot be read
73
+ * (global install layouts differ). Keeps `jev route` useful everywhere.
74
+ */
75
+ export declare const FALLBACK_SKILLS: readonly SkillEntry[];
76
+ /**
77
+ * Shipped skill names + their frontmatter descriptions, for the SKILL_ROUTE question.
78
+ * Falls back to {@link FALLBACK_SKILLS} when the plugin tree is unreadable.
79
+ */
80
+ export declare function skillRoster(root?: string): SkillEntry[];
81
+ export interface ReadSources {
82
+ cwd: string;
83
+ /** Injected stdin (tests); when absent stdin is read from fd 0. */
84
+ stdin?: string;
85
+ }
86
+ /** Read stdin synchronously. Returns '' when there is nothing to read. */
87
+ export declare function readStdin(src: ReadSources): string;
88
+ /**
89
+ * Resolve a `--state` / `--questions` style argument:
90
+ * `-` → stdin, `@path` → file contents, anything else → the literal value.
91
+ */
92
+ export declare function readArgValue(value: string | undefined, src: ReadSources): string | undefined;
93
+ /** Resolve a `[file|-]` positional: missing or `-` → stdin, otherwise the file. */
94
+ export declare function readFileOrStdin(value: string | undefined, src: ReadSources): string;
95
+ /** JSON when the text parses as JSON, the plain string otherwise. */
96
+ export declare function parseJsonOrText(text: string): Json;
97
+ /** Parse a `--questions` payload into the client's question map. */
98
+ export declare function parseQuestions(text: string): Record<string, Question>;
99
+ /** Split repeatable `key=value` flags (`--option`, `--input`) into a record. */
100
+ export declare function parseKeyValues(list: string[] | undefined, flag: string): Record<string, string>;
101
+ /**
102
+ * Build questions from the `--choice` / `--option` / `--noul` shorthands.
103
+ * Returns an empty map when no shorthand was used.
104
+ */
105
+ export declare function shorthandQuestions(opts: {
106
+ choice?: string;
107
+ option?: string[];
108
+ noul?: string;
109
+ }): Record<string, Question>;
110
+ /** Body of a `## <heading>` section of a markdown doc, up to the next `## `. */
111
+ export declare function extractSection(markdown: string, heading: string): string;
112
+ /** `0.0000155` → `$0.0000155`; small enough that toFixed(2) would read as $0.00. */
113
+ export declare function formatCost(cost: number): string;
114
+ /** `{a: 0.91, b: 0.09}` → `a 0.91 · b 0.09`, highest first, top 5. */
115
+ export declare function formatProbabilities(probabilities: Record<string, number>): string;
116
+ export interface JevCommandOptions {
117
+ json?: boolean;
118
+ provider?: string;
119
+ model?: string;
120
+ guardBash?: boolean;
121
+ disable?: boolean;
122
+ state?: string;
123
+ questions?: string;
124
+ choice?: string;
125
+ option?: string[];
126
+ noul?: string;
127
+ increment?: string;
128
+ goal?: string;
129
+ url?: string;
130
+ allowDomain?: string[];
131
+ input?: string[];
132
+ maxSteps?: string | number;
133
+ screenshotDir?: string;
134
+ allowSensitive?: boolean;
135
+ cwd?: string;
136
+ env?: NodeJS.ProcessEnv;
137
+ fetch?: typeof fetch;
138
+ client?: JevClient;
139
+ stdin?: string;
140
+ browse?: typeof runBrowse;
141
+ }
142
+ export declare const out: (s: string) => void;
143
+ export declare const err: (s: string) => void;
144
+ export declare const json: (value: unknown) => void;
145
+ export declare function messageOf(error: unknown): string;
146
+ export declare function jevDoctor(root: string, env: NodeJS.ProcessEnv, opts: JevCommandOptions): Promise<number>;
147
+ export declare function jevSetup(root: string, env: NodeJS.ProcessEnv, opts: JevCommandOptions): Promise<number>;
148
+ //# sourceMappingURL=jev-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/jev-helpers.ts"],"names":[],"mappings":"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"}