paqad-ai 1.35.0 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # paqad-ai
2
2
 
3
+ ## 1.36.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 69ab154: Add a native `aiassistant` adapter for JetBrains AI Assistant (#219).
8
+
9
+ - Onboarding and `paqad-ai refresh --providers` now generate and keep in sync `.aiassistant/rules/guidelines.md`, the lean bootstrap-pointer entry file AI Assistant auto-applies from `.aiassistant/rules/`.
10
+ - Soft, rules-only adapter (advisory hook coverage), like `junie`: AI Assistant exposes no hook/lifecycle system, so the sentinel gate cannot bind. MCP is intentionally omitted — AI Assistant configures MCP servers in the IDE, not a project file, so no dead artifact is written.
11
+ - The adapter is selectable everywhere the other ten are (onboarding prompt, `--providers`, factory), carries its Decision Pause Contract UI note, and is covered by tests parallel to `junie`.
12
+ - Also synced the `onboarding-manifest` schema `adapter` enum to the full adapter list (it had silently drifted to five, so a `cursor`/`aider`-onboarded manifest failed health-check validation).
13
+
14
+ - 69ab154: Make the feature-development stage workflow **compel, not plead** (enforcement RCA, part 1 of the fix).
15
+
16
+ The stage-evidence recorder finally has a production caller, and a code edit is now blocked until the prior stages are recorded — closing the physics gaps that let every prior fix (#117–#261) regress.
17
+
18
+ - **Deterministic per-stage writer.** A new Claude PreToolUse hook (`stage-writer.mjs` → `src/stage-evidence/live-writer.ts`) script-mints a `live-mark` stage row on every Edit/Write/NotebookEdit, with real start/end times classified from the mutated file — no model involvement. The completion finalizer closes any stage left open at the turn boundary.
19
+ - **Block-forward deny.** A `stages` capability folded into the kernel evaluates at the pre-mutation seam and refuses an edit (exit 2, reason on stderr) until `planning` and `specification` each carry a recorded start+end pair. It reads the ledger, not a git delta, so a committed clean tree cannot bypass it. `se-mark` (a Bash script, ungated) is the escape hatch that clears the block.
20
+ - **Visible, non-vacuous verdict.** The Stop backstop now writes a failing verdict to **stderr** (the host surfaces only stderr to the model on exit 2), and the stage gate no longer skips on a zero-file working-tree diff — a committed-but-incomplete change still fails instead of passing silently.
21
+
22
+ Claude-only for the hard block (the only host with a pre-mutation seam); Codex/Gemini keep completion-time recording; other adapters are unchanged. Default `stages_mode` is strict.
23
+
24
+ - 69ab154: Wire the last three enforcement consumers so the framework is felt, not just recorded (enforcement RCA, part 2 of the fix).
25
+
26
+ Building on the stage writer and block-forward deny, three contracts that shipped with a policy but no live consumer now bind through the kernel:
27
+
28
+ - **Delivery policy is enforced.** A `delivery` capability at the completion (Stop) seam reads HEAD branch/commit and — when `gh` can answer — the PR/CI state, then **warns** on a convention deviation (on the base branch, an off-convention branch name, red CI under `wait_for_green`) and appends a `delivery-evidence` row. Warn-floor by design: delivery is `mandatory:false`, so it surfaces a bad push one turn late but never blocks. Degrades cleanly when `gh` is absent.
29
+ - **The stage is printed on entry.** The stage-writer PreToolUse hook now prints a plain-English `▸ paqad · <stage>` line (via Claude's user-visible `systemMessage` channel) the first time a change enters each stage, so the developer sees the workflow running even when the model forgets to say it. Claude-only (the sole pre-mutation host); idempotent per change.
30
+ - **The Decision Pause Contract self-arms.** An opt-in pre-mutation capability reads the recent prompt from the turn transcript and, on a high-confidence create-vs-reuse fork with no decision pending or already made, mints ONE pending decision packet so the existing decision-pause gate blocks the _next_ edit — closing the "nothing mints the packet" gap. **Off by default** (enable with `PAQAD_DECISION_SELFARM` or a local `.config` `decision_selfarm` line); it only mints, never blocks, so the current edit is never interrupted.
31
+
32
+ The kernel gate now threads an optional tool/turn payload (edit target, transcript path, session id) to each capability; every existing capability ignores it. Coverage stays at the 95% branch gate.
33
+
3
34
  ## 1.35.0
4
35
 
5
36
  ### Minor Changes
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
  [![Node](https://img.shields.io/node/v/paqad-ai.svg?style=flat-square)](https://nodejs.org)
21
21
  [![website](https://img.shields.io/badge/website-paqad.ai-0A7A5C?style=flat-square)](https://paqad.ai)
22
22
 
23
- Works with Claude Code, Cursor, GitHub Copilot, Gemini, Codex, Windsurf, Junie, Continue, Antigravity, and Aider.
23
+ Works with Claude Code, Cursor, GitHub Copilot, Gemini, Codex, Windsurf, Junie, Continue, Antigravity, Aider, and JetBrains AI Assistant.
24
24
 
25
25
  </div>
26
26
 
@@ -140,18 +140,19 @@ Three steps turn AI coding from a prompt you hope works into a pipeline you can
140
140
 
141
141
  Run `paqad-ai onboard` one time. It writes a thin, native config file for each tool you use, and they all point at the same shared instruction bundle. Change a rule in one place, and every agent sees it. Switch tools next month without losing anything.
142
142
 
143
- | Tool | What it creates |
144
- | ---------------------- | -------------------------------------------------------- |
145
- | **Claude Code** | `CLAUDE.md` and MCP config |
146
- | **Codex CLI** | `AGENTS.md` and MCP config |
147
- | **Google Antigravity** | `ANTIGRAVITY.md` and MCP config |
148
- | **Gemini CLI** | `GEMINI.md` and MCP config |
149
- | **Junie** | `.junie/AGENTS.md` and `.junie/mcp/mcp.json` |
150
- | **Cursor** | `.cursor/rules/paqad.mdc` plus MCP, skills, agents |
151
- | **GitHub Copilot** | `.github/copilot-instructions.md` and `.vscode/mcp.json` |
152
- | **Windsurf** | `.windsurfrules` plus MCP, skills, agents |
153
- | **Continue** | `.continue/rules/paqad.md` plus MCP, prompts |
154
- | **Aider** | `CONVENTIONS.md` |
143
+ | Tool | What it creates |
144
+ | -------------------------- | -------------------------------------------------------- |
145
+ | **Claude Code** | `CLAUDE.md` and MCP config |
146
+ | **Codex CLI** | `AGENTS.md` and MCP config |
147
+ | **Google Antigravity** | `ANTIGRAVITY.md` and MCP config |
148
+ | **Gemini CLI** | `GEMINI.md` and MCP config |
149
+ | **Junie** | `.junie/AGENTS.md` and `.junie/mcp/mcp.json` |
150
+ | **Cursor** | `.cursor/rules/paqad.mdc` plus MCP, skills, agents |
151
+ | **GitHub Copilot** | `.github/copilot-instructions.md` and `.vscode/mcp.json` |
152
+ | **Windsurf** | `.windsurfrules` plus MCP, skills, agents |
153
+ | **Continue** | `.continue/rules/paqad.md` plus MCP, prompts |
154
+ | **Aider** | `CONVENTIONS.md` |
155
+ | **JetBrains AI Assistant** | `.aiassistant/rules/guidelines.md` |
155
156
 
156
157
  Pick one or pick all. Onboarding is multi-select.
157
158
 
package/dist/cli/index.js CHANGED
@@ -2992,7 +2992,19 @@ var init_onboarding_manifest_schema = __esm({
2992
2992
  framework_version: { type: "string" },
2993
2993
  adapter: {
2994
2994
  type: "string",
2995
- enum: ["claude-code", "codex-cli", "antigravity", "gemini-cli", "junie"]
2995
+ enum: [
2996
+ "claude-code",
2997
+ "codex-cli",
2998
+ "antigravity",
2999
+ "gemini-cli",
3000
+ "junie",
3001
+ "cursor",
3002
+ "github-copilot",
3003
+ "windsurf",
3004
+ "continue",
3005
+ "aider",
3006
+ "aiassistant"
3007
+ ]
2996
3008
  },
2997
3009
  project_root: { type: "string" },
2998
3010
  profile: { $ref: "project-profile" },
@@ -9746,6 +9758,16 @@ function completionRecordCommand(env = process.env) {
9746
9758
  return hookCommand("verification-record.mjs", env);
9747
9759
  }
9748
9760
  var PAQAD_LIVE_HOOKS = [
9761
+ {
9762
+ id: "stage-writer",
9763
+ event: "pre-tool-mutation",
9764
+ hookFile: "stage-writer.mjs",
9765
+ mutatingToolMatcher: PAQAD_MUTATING_TOOL_MATCHER,
9766
+ // A non-blocking WRITER, not a gate. Ordered first so a live-mark stage row
9767
+ // exists on disk before the decision-pause / capability gates read the change
9768
+ // (RCA fix A — gives the stage-evidence recorder its production caller).
9769
+ description: "Script-mint per-stage live-mark rows on every mutating edit (RCA fix A)."
9770
+ },
9749
9771
  {
9750
9772
  id: "decision-pause-gate",
9751
9773
  event: "pre-tool-mutation",
@@ -9753,6 +9775,15 @@ var PAQAD_LIVE_HOOKS = [
9753
9775
  mutatingToolMatcher: PAQAD_MUTATING_TOOL_MATCHER,
9754
9776
  description: "Block mutating tools while a decision packet is unresolved (#117 C-3)."
9755
9777
  },
9778
+ {
9779
+ id: "stage-marker-parse",
9780
+ event: "completion",
9781
+ hookFile: "stage-marker-parse.mjs",
9782
+ // Ordered before verification-completion so the non-mutation stage markers
9783
+ // (planning/specification/review) are in the ledger when the completion
9784
+ // backstop folds the change (RCA fix, Step 3). Non-blocking, best-effort.
9785
+ description: "Record the agent\u2019s paqad:stage markers from the transcript on completion."
9786
+ },
9756
9787
  {
9757
9788
  id: "verification-completion",
9758
9789
  event: "completion",
@@ -9761,7 +9792,7 @@ var PAQAD_LIVE_HOOKS = [
9761
9792
  }
9762
9793
  ];
9763
9794
 
9764
- // src/adapters/aider/aider-adapter.ts
9795
+ // src/adapters/aiassistant/aiassistant-adapter.ts
9765
9796
  init_esm_shims();
9766
9797
 
9767
9798
  // src/adapters/shared/base-adapter.ts
@@ -10288,7 +10319,9 @@ var ADAPTER_OUTPUT_PATHS = {
10288
10319
  "github-copilot": ".vscode/mcp.json",
10289
10320
  windsurf: ".windsurf/mcp.json",
10290
10321
  continue: ".continue/mcp.json",
10291
- aider: "aider.mcp.json"
10322
+ aider: "aider.mcp.json",
10323
+ // unreachable; capabilities.mcp = false
10324
+ aiassistant: ".aiassistant/mcp.json"
10292
10325
  // unreachable; capabilities.mcp = false
10293
10326
  };
10294
10327
  var McpConfigManager = class {
@@ -10543,7 +10576,45 @@ function getSkillBundleRelativePath(skill) {
10543
10576
  return segments.slice(skillsIndex + 1).join("/");
10544
10577
  }
10545
10578
 
10579
+ // src/adapters/aiassistant/aiassistant-adapter.ts
10580
+ var AiAssistantAdapter = class extends BaseAdapter {
10581
+ type = "aiassistant";
10582
+ capabilities = {
10583
+ skills: false,
10584
+ agents: false,
10585
+ hooks: false,
10586
+ mcp: false,
10587
+ caching: false,
10588
+ memory: false
10589
+ };
10590
+ configTemplateName() {
10591
+ return "aiassistant.md.hbs";
10592
+ }
10593
+ configOutputPath() {
10594
+ return ".aiassistant/rules/guidelines.md";
10595
+ }
10596
+ skillsRoot() {
10597
+ return ".aiassistant/skills";
10598
+ }
10599
+ agentsRoot() {
10600
+ return ".aiassistant/agents";
10601
+ }
10602
+ hooksOutputPath() {
10603
+ return ".aiassistant/hooks.json";
10604
+ }
10605
+ mcpOutputPath() {
10606
+ return ".aiassistant/mcp.json";
10607
+ }
10608
+ cacheOutputPath() {
10609
+ return ".aiassistant/cache.json";
10610
+ }
10611
+ memoryOutputPath() {
10612
+ return ".aiassistant/memory.json";
10613
+ }
10614
+ };
10615
+
10546
10616
  // src/adapters/aider/aider-adapter.ts
10617
+ init_esm_shims();
10547
10618
  var AiderAdapter = class extends BaseAdapter {
10548
10619
  type = "aider";
10549
10620
  capabilities = {
@@ -11136,6 +11207,8 @@ var AdapterFactory = class {
11136
11207
  return new ContinueAdapter();
11137
11208
  case "aider":
11138
11209
  return new AiderAdapter();
11210
+ case "aiassistant":
11211
+ return new AiAssistantAdapter();
11139
11212
  default:
11140
11213
  return assertUnreachableAdapter(type);
11141
11214
  }
@@ -13560,7 +13633,8 @@ var ADAPTER_TYPES = [
13560
13633
  "github-copilot",
13561
13634
  "windsurf",
13562
13635
  "continue",
13563
- "aider"
13636
+ "aider",
13637
+ "aiassistant"
13564
13638
  ];
13565
13639
 
13566
13640
  // src/core/types/agent.ts
@@ -22514,6 +22588,11 @@ async function promptProviders(defaultProviders) {
22514
22588
  name: "Aider (paul-gauthier)",
22515
22589
  value: "aider",
22516
22590
  checked: defaultProviders?.includes("aider") ?? false
22591
+ },
22592
+ {
22593
+ name: "AI Assistant (JetBrains)",
22594
+ value: "aiassistant",
22595
+ checked: defaultProviders?.includes("aiassistant") ?? false
22517
22596
  }
22518
22597
  ],
22519
22598
  validate(choices) {
@@ -25561,7 +25640,7 @@ init_cancelled_error();
25561
25640
  init_events();
25562
25641
 
25563
25642
  // src/index.ts
25564
- var VERSION = "1.35.0";
25643
+ var VERSION = "1.36.0";
25565
25644
 
25566
25645
  // src/cli/commands/audit.ts
25567
25646
  init_esm_shims();
@@ -33187,7 +33266,7 @@ function printNextSteps() {
33187
33266
  function createOnboardCommand() {
33188
33267
  return new Command15("onboard").description("Full project onboarding").option("--project-root <path>", "Project root", process.cwd()).option("--stack <stack>", "Force the target stack").option("--capability <capability...>", "Add one or more capabilities").option(
33189
33268
  "--providers <provider...>",
33190
- "Select one or more providers (codex-cli, antigravity, claude-code, gemini-cli, junie, cursor, github-copilot, windsurf, continue, aider)"
33269
+ "Select one or more providers (codex-cli, antigravity, claude-code, gemini-cli, junie, cursor, github-copilot, windsurf, continue, aider, aiassistant)"
33191
33270
  ).action(
33192
33271
  async (options) => {
33193
33272
  printBanner();