noskills 4.1.41 → 4.1.43

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 (47) hide show
  1. package/README.md +44 -16
  2. package/chunks/approve-NPG6X7O6.js +1 -0
  3. package/chunks/block-LSEXCK45.js +1 -0
  4. package/chunks/cancel-7NGO246Z.js +1 -0
  5. package/chunks/{chunk-CIYGCZTM.js → chunk-3SLKOP72.js} +1 -1
  6. package/chunks/{chunk-RIME26D6.js → chunk-LWCWPXCS.js} +41 -41
  7. package/chunks/chunk-MRZT23BL.js +1 -0
  8. package/chunks/{chunk-GBSAQ2FM.js → chunk-SNHYXBHM.js} +1 -1
  9. package/chunks/chunk-TMC5H2A5.js +1 -0
  10. package/chunks/chunk-YYCDBPWA.js +16 -0
  11. package/chunks/chunk-ZMVD5IU4.js +109 -0
  12. package/chunks/{concern-E56E2MFL.js → concern-3K3QUYG4.js} +1 -1
  13. package/chunks/done-OMGLEA32.js +1 -0
  14. package/chunks/free-BO5UA5V2.js +1 -0
  15. package/chunks/init-UQLVVP2M.js +1 -0
  16. package/chunks/invoke-hook-THWB24OS.js +10 -0
  17. package/chunks/next-4IJJBQBE.js +8 -0
  18. package/chunks/{purge-6T4L2FXI.js → purge-MDSEQLDQ.js} +1 -1
  19. package/chunks/reopen-EKSLLO54.js +1 -0
  20. package/chunks/reset-WRTVX7TT.js +1 -0
  21. package/chunks/{rule-UDTLRXFA.js → rule-QP5BSH27.js} +1 -1
  22. package/chunks/run-ROKOTYPH.js +3 -0
  23. package/chunks/spec-ZLE74TVR.js +1 -0
  24. package/chunks/status-S2X4ADGF.js +1 -0
  25. package/chunks/{sync-QYUBOAMK.js → sync-VS4HROEX.js} +1 -1
  26. package/chunks/watch-4HJMGNF4.js +8 -0
  27. package/chunks/wontfix-CDPG2GUG.js +1 -0
  28. package/noskills.js +1 -1
  29. package/package.json +1 -1
  30. package/chunks/approve-R5UDYN3P.js +0 -1
  31. package/chunks/block-P7TM5EPZ.js +0 -1
  32. package/chunks/cancel-TU3C6MKE.js +0 -1
  33. package/chunks/chunk-2WH262CW.js +0 -1
  34. package/chunks/chunk-KDWUWWE5.js +0 -81
  35. package/chunks/chunk-M7KSO4EF.js +0 -1
  36. package/chunks/chunk-U2T4X5EN.js +0 -11
  37. package/chunks/done-NQMUXJYO.js +0 -1
  38. package/chunks/init-3O7FXLIZ.js +0 -1
  39. package/chunks/invoke-hook-MPDIOIHR.js +0 -10
  40. package/chunks/next-5LH223G2.js +0 -8
  41. package/chunks/reopen-JIHLM3KX.js +0 -1
  42. package/chunks/reset-4RHO7MSF.js +0 -1
  43. package/chunks/run-77R3ANIQ.js +0 -3
  44. package/chunks/spec-DPDGDRW2.js +0 -1
  45. package/chunks/status-4YV2X73D.js +0 -1
  46. package/chunks/watch-XVGIYX6X.js +0 -8
  47. package/chunks/wontfix-VCV45TPJ.js +0 -1
package/README.md CHANGED
@@ -110,8 +110,9 @@ reminders into every task. Stack concerns to define your project's character.
110
110
 
111
111
  **One source of truth for every tool.** Write rules once in `.eser/rules/`.
112
112
  noskills generates CLAUDE.md, .cursorrules, Kiro steering files, Copilot
113
- instructions, and Windsurf rules. Your teammate on Cursor and your teammate on
114
- Claude Code both get the same conventions, automatically.
113
+ instructions, Windsurf rules, OpenCode AGENTS.md + plugins, Codex CLI hooks +
114
+ TOML agents, and Copilot CLI hooks + MCP config. Your teammate on Cursor and
115
+ your teammate on Claude Code both get the same conventions, automatically.
115
116
 
116
117
  **A human who's always in charge.** noskills never makes decisions silently.
117
118
  Discovery questions -> you answer. Spec approval -> you decide. Architectural
@@ -261,6 +262,11 @@ eser noskills concern add open-source # Activate concerns
261
262
  eser noskills spec new "photo upload" # Start spec -> DISCOVERY
262
263
  # Agent takes over: calls noskills next, answers questions,
263
264
  # builds to spec, reports progress. You approve transitions.
265
+
266
+ # Or skip structure entirely:
267
+ eser noskills free # FREE mode — no enforcement
268
+ # Work freely, then exit when you want structure back:
269
+ eser noskills free --exit # Back to IDLE
264
270
  ```
265
271
 
266
272
  After `init`, your CLAUDE.md (or .cursorrules, etc.) tells the agent to call
@@ -349,13 +355,15 @@ Every spec follows a deterministic phase flow:
349
355
 
350
356
  ```
351
357
  IDLE -> DISCOVERY -> DISCOVERY_REVIEW -> SPEC_DRAFT -> SPEC_APPROVED -> EXECUTING <-> BLOCKED
352
- ^ |
358
+ ^ \ |
359
+ | <-> FREE |
353
360
  +--------------------------------- DONE <---------------------------------+
354
361
  ```
355
362
 
356
363
  | Phase | What happens |
357
364
  | -------------------- | ---------------------------------------------------------------------- |
358
365
  | **IDLE** | No active spec. Start one with `noskills spec new "..."` |
366
+ | **FREE** | No enforcement. Work freely. Agent has no restrictions from noskills |
359
367
  | **DISCOVERY** | 6 blended questions probe product, engineering, and QA simultaneously |
360
368
  | **DISCOVERY_REVIEW** | User reviews and confirms all discovery answers before spec generation |
361
369
  | **SPEC_DRAFT** | Spec generated from discovery answers. Human reviews |
@@ -411,7 +419,7 @@ Every `noskills next` call returns a structured JSON payload:
411
419
  "Do not refactor, improve, or modify code outside this task's scope.",
412
420
  "Complete the task, then report progress. The user handles git."
413
421
  ],
414
- "tone": "Direct. No preamble. Start coding immediately."
422
+ "tone": "Direct. Orchestrate immediately spawn sub-agents."
415
423
  },
416
424
  "context": {
417
425
  "rules": ["Use Deno for all TypeScript"],
@@ -462,13 +470,15 @@ noskills status -o json # Structured status for scripts
462
470
  Every `noskills next` output includes a `behavioral` block with phase-specific
463
471
  rules. These tell the agent HOW to behave, not just WHAT to do:
464
472
 
465
- | Phase | Behavioral tone | Key rules |
466
- | ---------- | ------------------------------ | ------------------------------------------------------------- |
467
- | DISCOVERY | "Curious, has a stake" | Push back on shallow answers, probe for specifics, don't code |
468
- | SPEC_DRAFT | "The user is reviewing" | Don't modify the spec, don't start coding |
469
- | EXECUTING | "Start coding immediately" | Don't explore beyond scope, don't refactor, timebox reading |
470
- | BLOCKED | "Brief. Decision time." | Present decision as-is, don't suggest preferences |
471
- | DONE | "Celebrate briefly, then stop" | Don't start new work |
473
+ | Phase | Behavioral tone | Key rules |
474
+ | ---------- | -------------------------------- | ------------------------------------------------------------- |
475
+ | IDLE | "Welcoming. Present choices" | No file edits until free mode or spec approved |
476
+ | FREE | "Quiet. No enforcement." | No restrictions work freely |
477
+ | DISCOVERY | "Curious, has a stake" | Push back on shallow answers, probe for specifics, don't code |
478
+ | SPEC_DRAFT | "The user is reviewing" | Don't modify the spec, don't start coding |
479
+ | EXECUTING | "Orchestrate spawn sub-agents" | Delegate to sub-agents, don't edit files directly |
480
+ | BLOCKED | "Brief. Decision time." | Present decision as-is, don't suggest preferences |
481
+ | DONE | "Celebrate briefly, then stop" | Don't start new work |
472
482
 
473
483
  **Git is read-only** for agents (configurable via `allowGit: true` in manifest).
474
484
  Agents may read (`git log`, `git diff`, `git status`) but never write
@@ -634,9 +644,10 @@ noskills next --answer='{"involvesWebUI":true,"involvesCLI":false,"involvesPubli
634
644
 
635
645
  ### Hooks — Zero-Token Bookkeeping
636
646
 
637
- noskills installs hooks for Claude Code (`.claude/settings.json`) and Kiro
638
- (`.kiro/settings/hooks.json`) that handle state bookkeeping without spending LLM
639
- tokens. Claude Code hooks:
647
+ noskills installs hooks for Claude Code (`.claude/settings.json`), Kiro
648
+ (`.kiro/settings/hooks.json`), OpenCode (`.opencode/plugins/noskills.ts`), Codex
649
+ CLI (`.codex/hooks.json`), and Copilot CLI (`.github/hooks/noskills.json`) that
650
+ handle state bookkeeping without spending LLM tokens. Claude Code hooks:
640
651
 
641
652
  | Hook | Event | What it does |
642
653
  | ------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -648,6 +659,11 @@ tokens. Claude Code hooks:
648
659
 
649
660
  Kiro hooks map the same behavioral guarantees to Kiro-native triggers (Pre Tool
650
661
  Use, Post Tool Use, Agent Stop, Prompt Submit) using Run Command actions.
662
+ OpenCode hooks use the plugin system (`.opencode/plugins/`) with event handlers
663
+ for session.created, tool.execute.before/after, and session.deleted. Codex CLI
664
+ hooks use `.codex/hooks.json` with PascalCase events (SessionStart, PreToolUse,
665
+ PostToolUse, Stop). Copilot CLI hooks use `.github/hooks/noskills.json` with a
666
+ versioned schema (`{"version": 1, "hooks": {...}}`) and array-format commands.
651
667
 
652
668
  Hooks are CLI subcommands (`noskills invoke-hook <name>`), not generated script
653
669
  files. This avoids ESM/CJS issues — the same Deno entry point handles
@@ -674,7 +690,18 @@ noskills generates instruction files for every AI tool your team uses:
674
690
  |-- -> .kiro/agents/*.json (Kiro custom agents)
675
691
  |-- -> .kiro/specs/ (Kiro spec projection)
676
692
  |-- -> .github/copilot-instructions.md (GitHub Copilot)
677
- +-- -> .windsurfrules (Windsurf)
693
+ |-- -> .windsurfrules (Windsurf)
694
+ |-- -> AGENTS.md (OpenCode / Codex / Copilot CLI)
695
+ |-- -> .opencode/plugins/noskills.ts (OpenCode hooks)
696
+ |-- -> .opencode/agents/*.md (OpenCode agents)
697
+ |-- -> .opencode/skills/*.md (OpenCode spec projection)
698
+ |-- -> opencode.json (OpenCode MCP registration)
699
+ |-- -> .codex/hooks.json (Codex CLI hooks)
700
+ |-- -> .codex/agents/*.toml (Codex CLI agents)
701
+ |-- -> .codex/config.toml (Codex CLI MCP registration)
702
+ |-- -> .github/hooks/noskills.json (Copilot CLI hooks)
703
+ |-- -> .github/agents/*.agent.md (Copilot CLI agents)
704
+ +-- -> .copilot/mcp.json (Copilot CLI MCP registration)
678
705
  ```
679
706
 
680
707
  Write your rules once in `.eser/rules/`, run `noskills sync`, and every tool
@@ -843,7 +870,8 @@ install all get correct command references.
843
870
  **Tools vs Providers:**
844
871
 
845
872
  - **Tools** = the IDE or agent environment (`claude-code`, `cursor`, `kiro`,
846
- `copilot`, `windsurf`). Affects which sync output files are generated.
873
+ `copilot`, `windsurf`, `opencode`, `codex`, `copilot-cli`). Affects which sync
874
+ output files are generated.
847
875
  - **Providers** = AI model access methods (`anthropic`, `openai`, `ollama`,
848
876
  `claude-code` CLI). Used by the Agent Bridge for validation and
849
877
  `noskills run`.
@@ -0,0 +1 @@
1
+ import{a as k}from"./chunk-SNHYXBHM.js";import{a as x,d as F}from"./chunk-3SLKOP72.js";import"./chunk-VPXOI7CR.js";import{c as p}from"./chunk-YK6UG66R.js";import{g as P,i as A}from"./chunk-TMC5H2A5.js";import{d as y,f as C,h as R,i as w,j as u,l as D,p as E}from"./chunk-LWCWPXCS.js";import{c as i,d as l,f as a,g as d,k as m,o as S,q as v,r as g}from"./chunk-Y6AFIAJP.js";import{a as h,b as n}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var M=async _=>{let s=S({renderer:g.ansi(),sink:v.stdout()}),r=c.process.cwd(),o=R(_);if(!o.ok)return s.writeln(a(o.error)),await s.close(),n({exitCode:1});let t;try{t=await C(r,o.spec)}catch(e){let f=e instanceof Error?e.message:String(e);return s.writeln(a(f)),await s.close(),n({exitCode:1})}let $=await D(r);if(t.spec!==null){let e=`${r}/${y.specDir(t.spec)}`;try{await c.fs.stat(e)}catch{return s.writeln(a(`Active spec '${t.spec}' directory not found.`)),s.writeln(l("Run `noskills reset` to return to IDLE.")),await s.close(),n({exitCode:1})}}if(t.phase==="SPEC_DRAFT"){if(t.classification===null&&t.spec!==null){let b=(await E(r)).filter(I=>$?.concerns.includes(I.id)??!1);try{await k(r,t,b)}catch{}}let e=A(t);await w(r,e),e.spec!==null&&await u(r,e.spec,e),e.spec!==null&&(await x(r,e.spec,"approved"),await F(r,e.spec,"approved")),s.writeln(d("\u2714")," Spec approved. Phase: ",m("SPEC_APPROVED")),s.writeln("When ready, run ",i(`${p('next --answer="start"')}`)," to begin execution.")}else if(t.phase==="DISCOVERY_REVIEW"){let e=P(t);await w(r,e),e.spec!==null&&await u(r,e.spec,e),s.writeln(d("\u2714")," Discovery answers approved. Phase: ",m("SPEC_DRAFT")),s.writeln("Review the spec and run ",i(p("approve"))," again to approve.")}else t.phase==="DISCOVERY"&&t.discovery.completed?(s.writeln(l("Discovery complete. Spec draft already generated.")),s.writeln("Review the spec and run ",i(p("approve"))," again when in SPEC_DRAFT phase.")):s.writeln(a(`Cannot approve in phase: ${t.phase}`));return await s.close(),h(void 0)};export{M as main};
@@ -0,0 +1 @@
1
+ import{c as v}from"./chunk-YK6UG66R.js";import{k as A}from"./chunk-TMC5H2A5.js";import{d as k,f as S,h as y,i as x,j as C}from"./chunk-LWCWPXCS.js";import{c as d,d as l,f as i,h as f,o as w,q as h,r as g}from"./chunk-Y6AFIAJP.js";import{a as u,b as r}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async p=>{let e=w({renderer:g.ansi(),sink:h.stdout()}),n=c.process.cwd(),o=y(p);if(!o.ok)return e.writeln(i(o.error)),await e.close(),r({exitCode:1});let m=(p??[]).filter(t=>!t.startsWith("--spec=")).join(" ")||"No reason given",s;try{s=await S(n,o.spec)}catch(t){let E=t instanceof Error?t.message:String(t);return e.writeln(i(E)),await e.close(),r({exitCode:1})}if(s.spec!==null){let t=`${n}/${k.specDir(s.spec)}`;try{await c.fs.stat(t)}catch{return e.writeln(i(`Active spec '${s.spec}' directory not found.`)),e.writeln(l("Run `noskills reset` to return to IDLE.")),await e.close(),r({exitCode:1})}}if(s.phase!=="EXECUTING")return e.writeln(i(`Cannot block in phase: ${s.phase}`)),await e.close(),r({exitCode:1});let a=A(s,m);return await x(n,a),a.spec!==null&&await C(n,a.spec,a),e.writeln(f("\u26A0")," Spec blocked: ",l(m)),e.writeln("Resolve with: ",d(`${v('next --answer="resolution"')}`)),await e.close(),u(void 0)};export{q as main};
@@ -0,0 +1 @@
1
+ import{a as k,d as D}from"./chunk-3SLKOP72.js";import{m as C}from"./chunk-TMC5H2A5.js";import{d as w,f as h,h as S,i as g,j as y}from"./chunk-LWCWPXCS.js";import{d as l,f as n,g as m,o as u,q as d,r as f}from"./chunk-Y6AFIAJP.js";import{a as p,b as i}from"./chunk-2N4GTHXQ.js";import{b as o}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var R=async E=>{let e=u({renderer:f.ansi(),sink:d.stdout()}),r=o.process.cwd(),c=S(E);if(!c.ok)return e.writeln(n(c.error)),await e.close(),i({exitCode:1});let s;try{s=await h(r,c.spec)}catch(a){let I=a instanceof Error?a.message:String(a);return e.writeln(n(I)),await e.close(),i({exitCode:1})}if(s.phase==="IDLE"||s.phase==="UNINITIALIZED"||s.phase==="COMPLETED")return e.writeln(n(`Cannot cancel in phase: ${s.phase}`)),await e.close(),i({exitCode:1});if(s.spec!==null){let a=`${r}/${w.specDir(s.spec)}`;try{await o.fs.stat(a)}catch{return e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(l("Run `noskills reset` to return to IDLE.")),await e.close(),i({exitCode:1})}}let t=C(s,"cancelled");return await g(r,t),t.spec!==null&&await y(r,t.spec,t),t.spec!==null&&(await k(r,t.spec,"cancelled"),await D(r,t.spec,"cancelled")),e.writeln(m("\u2714")," Spec cancelled."),await e.close(),p(void 0)};export{R as main};
@@ -1,3 +1,3 @@
1
- import{d as o}from"./chunk-RIME26D6.js";import{b as e}from"./chunk-MNEZ5QGX.js";var d=async(r,i,n)=>{let s=`${r}/${o.specFile(i)}`;try{let t=await e.fs.readTextFile(s);t=t.replace(/^## Status: .+$/m,`## Status: ${n}`),await e.fs.writeTextFile(s,t)}catch{}},u=async(r,i,n)=>{let s=`${r}/${o.specFile(i)}`;try{let t=await e.fs.readTextFile(s),a=new RegExp(`^(- )\\[ \\]( ${n}:.*)$`,"m");t=t.replace(a,"$1[x]$2"),await e.fs.writeTextFile(s,t)}catch{}},w=async(r,i,n,s)=>{let t=`${r}/${o.specDir(i)}/progress.json`;try{let a=await e.fs.readTextFile(t),c=JSON.parse(a);for(let p of c.tasks)p.id===n&&(p.status=s);c.updatedAt=new Date().toISOString(),await e.fs.writeTextFile(t,JSON.stringify(c,null,2)+`
1
+ import{d as o}from"./chunk-LWCWPXCS.js";import{b as e}from"./chunk-MNEZ5QGX.js";var d=async(r,i,n)=>{let s=`${r}/${o.specFile(i)}`;try{let t=await e.fs.readTextFile(s);t=t.replace(/^## Status: .+$/m,`## Status: ${n}`),await e.fs.writeTextFile(s,t)}catch{}},u=async(r,i,n)=>{let s=`${r}/${o.specFile(i)}`;try{let t=await e.fs.readTextFile(s),a=new RegExp(`^(- )\\[ \\]( ${n}:.*)$`,"m");t=t.replace(a,"$1[x]$2"),await e.fs.writeTextFile(s,t)}catch{}},w=async(r,i,n,s)=>{let t=`${r}/${o.specDir(i)}/progress.json`;try{let a=await e.fs.readTextFile(t),c=JSON.parse(a);for(let p of c.tasks)p.id===n&&(p.status=s);c.updatedAt=new Date().toISOString(),await e.fs.writeTextFile(t,JSON.stringify(c,null,2)+`
2
2
  `)}catch{}},f=async(r,i,n)=>{let s=`${r}/${o.specDir(i)}/progress.json`;try{let t=await e.fs.readTextFile(s),a=JSON.parse(t);a.status=n,a.updatedAt=new Date().toISOString(),await e.fs.writeTextFile(s,JSON.stringify(a,null,2)+`
3
3
  `)}catch{}};export{d as a,u as b,w as c,f as d};