noskills 4.1.55 → 4.5.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/LICENSE +13 -0
- package/README.md +106 -58
- package/chunks/ajan-bridge-T5M4DPDT.js +1 -0
- package/chunks/anthropic-TS7EMQML.js +1 -0
- package/chunks/approve-HEW3VFYH.js +1 -0
- package/chunks/ask-AXHTCVD6.js +2 -0
- package/chunks/block-VN76CXZW.js +1 -0
- package/chunks/{browser-XLYVEO2J.js → browser-BGFD24RX.js} +1 -1
- package/chunks/bun-WZ7BVR7Y.js +1 -0
- package/chunks/cancel-7WRAST62.js +1 -0
- package/chunks/chunk-3ZJ3UGQL.js +48 -0
- package/chunks/chunk-4PF2MT7S.js +29 -0
- package/chunks/chunk-575Y3OEG.js +1 -0
- package/chunks/{chunk-DZTBXXB3.js → chunk-5DZHAHXW.js} +23 -23
- package/chunks/chunk-5PBNUBBY.js +3 -0
- package/chunks/{chunk-HNAHPI6V.js → chunk-5RLCKUIF.js} +1 -1
- package/chunks/chunk-6YSS6PEL.js +3 -0
- package/chunks/chunk-7GC46XEU.js +1 -0
- package/chunks/{chunk-LBPD4EIH.js → chunk-7PPUGTKL.js} +1 -1
- package/chunks/chunk-AUZWXMWA.js +27 -0
- package/chunks/chunk-CH6A3LES.js +91 -0
- package/chunks/{chunk-UG26APX2.js → chunk-CML74SNT.js} +1 -1
- package/chunks/chunk-CTTMQSHF.js +1 -0
- package/chunks/chunk-DBKXMYLF.js +4 -0
- package/chunks/chunk-DEHRWREM.js +1 -0
- package/chunks/chunk-EIGFDYGQ.js +1 -0
- package/chunks/chunk-EIMBEXUJ.js +1 -0
- package/chunks/chunk-EJYSOUEA.js +1 -0
- package/chunks/chunk-ENP4P2YH.js +0 -0
- package/chunks/{chunk-RJX4ZXQ4.js → chunk-EROZRDGT.js} +1 -1
- package/chunks/chunk-FE4MKOI4.js +1 -0
- package/chunks/chunk-GQTHILPL.js +5 -0
- package/chunks/chunk-HISXAZ4Y.js +1 -0
- package/chunks/chunk-I4Z2RF7L.js +31 -0
- package/chunks/chunk-IFE5SYGK.js +1 -0
- package/chunks/chunk-IGDFEGCH.js +2 -0
- package/chunks/chunk-JL3MAFYQ.js +1 -0
- package/chunks/chunk-JYVB6UAV.js +1 -0
- package/chunks/chunk-KJLEPI7T.js +1 -0
- package/chunks/chunk-KM64FL2X.js +1 -0
- package/chunks/chunk-KMLNG3EC.js +1 -0
- package/chunks/chunk-KRKOWSYW.js +148 -0
- package/chunks/chunk-KRRPOVQG.js +1 -0
- package/chunks/{chunk-CKETVOVQ.js → chunk-LJEWPIEI.js} +1 -1
- package/chunks/{chunk-VAP3TSYK.js → chunk-LN4NDYT6.js} +1 -1
- package/chunks/{chunk-Z3O5HAIO.js → chunk-NGCBWJML.js} +1 -1
- package/chunks/chunk-O4KKKYCH.js +1 -0
- package/chunks/chunk-OAWYVETM.js +1 -0
- package/chunks/chunk-PKEQKXZW.js +23 -0
- package/chunks/chunk-PRQ5CRIG.js +1 -0
- package/chunks/{chunk-SWYX6WYQ.js → chunk-PSX63TYP.js} +2 -2
- package/chunks/{chunk-5P46WSNG.js → chunk-Q4TI7EYT.js} +1 -1
- package/chunks/chunk-QKWJ72HI.js +3 -0
- package/chunks/chunk-RAQY37P6.js +1 -0
- package/chunks/{openai-QGEN33SU.js → chunk-S4MUTKHT.js} +3 -3
- package/chunks/chunk-SLO22P65.js +1 -0
- package/chunks/chunk-UE56BMAW.js +21 -0
- package/chunks/{chunk-O2NUECRA.js → chunk-VJRCTYGL.js} +1 -1
- package/chunks/chunk-VXU6XZ66.js +39 -0
- package/chunks/chunk-W4TQLLUK.js +7 -0
- package/chunks/{chunk-PKYW3S5P.js → chunk-XDRX4ZBJ.js} +1 -1
- package/chunks/{chunk-XNGHRJVK.js → chunk-Y5E7ZCCX.js} +1 -1
- package/chunks/chunk-Z7OYXH3J.js +1 -0
- package/chunks/claude-code-DIWRQKZA.js +1 -0
- package/chunks/cmd-46ZIHXLB.js +1 -0
- package/chunks/concern-QSENGU6C.js +1 -0
- package/chunks/{config-CZDLCSOC.js → config-S3UXTJN2.js} +1 -1
- package/chunks/decision-ledger-GY2W6VWL.js +1 -0
- package/chunks/delegate-WKXIER7E.js +1 -0
- package/chunks/deno-YM5PW6ZM.js +1 -0
- package/chunks/{diagrams-H7NLJF7W.js → diagrams-A7W2EBYV.js} +1 -1
- package/chunks/diagrams-CBCUA47B.js +1 -0
- package/chunks/{dist-UI3SRKS3.js → dist-3MH5UCQU.js} +3 -3
- package/chunks/done-WR3UFYJT.js +1 -0
- package/chunks/followup-5EGZEF5Q.js +1 -0
- package/chunks/free-KJQHRYZA.js +1 -0
- package/chunks/gemini-IWP24T63.js +1 -0
- package/chunks/init-437SU6XH.js +1 -0
- package/chunks/invoke-hook-LMCWNF65.js +13 -0
- package/chunks/kiro-THWCXS5L.js +1 -0
- package/chunks/{learn-KIZTV5OH.js → learn-ZTYKBZER.js} +1 -1
- package/chunks/ledger-FOOPJ2UO.js +1 -0
- package/chunks/list-HNGIOVBK.js +1 -0
- package/chunks/loader-command-3A5FK2RF.js +1 -0
- package/chunks/loader-reactor-YZM7HO4G.js +1 -0
- package/chunks/manager-2MOLEJ4Q.js +3 -0
- package/chunks/mod-6EZYRKWV.js +1 -0
- package/chunks/{mod-TYCXSLSH.js → mod-7VTKN6Q5.js} +1 -1
- package/chunks/mod-7X5TKHKC.js +1 -0
- package/chunks/mod-AJIRKRAH.js +1 -0
- package/chunks/mod-SFSUQWSB.js +8 -0
- package/chunks/mod-TGOMO3CJ.js +1 -0
- package/chunks/{multipart-parser-UVM6CEKF.js → multipart-parser-DKDFOZKD.js} +1 -1
- package/chunks/next-Y6FOPM4Z.js +15 -0
- package/chunks/node-AZK2C657.js +12 -0
- package/chunks/node-GQQ42DT2.js +68 -0
- package/chunks/node-J4GTOSL2.js +1 -0
- package/chunks/ollama-2KAMCXVL.js +1 -0
- package/chunks/openai-HHE35TAX.js +31 -0
- package/chunks/openai-YES2XJDU.js +1 -0
- package/chunks/opencode-S4M7WJTO.js +1 -0
- package/chunks/{pack-33LQ7SJT.js → pack-KUT53Z24.js} +4 -4
- package/chunks/plan-export-PG2BVRQZ.js +3 -0
- package/chunks/purge-JGNJNEET.js +4 -0
- package/chunks/reopen-RPDXN3CF.js +1 -0
- package/chunks/reset-RBCQO2RF.js +1 -0
- package/chunks/review-VMS5MYOV.js +1 -0
- package/chunks/{rule-XREVPB5P.js → rule-IB4VKSBC.js} +2 -2
- package/chunks/run-62PWXVII.js +3 -0
- package/chunks/sdk-FR7Z4YSC.js +1 -0
- package/chunks/{session-HBP5GGI2.js → session-Q43KMFL2.js} +1 -1
- package/chunks/spec-4RKLPOEM.js +1 -0
- package/chunks/{src-GLQPTDNR.js → src-HXQVVTGQ.js} +1 -1
- package/chunks/status-OGLFEFF7.js +1 -0
- package/chunks/sync-H35O5DN5.js +1 -0
- package/chunks/{unstable_chmod-RZ5DE3XZ.js → unstable_chmod-44MCKF3B.js} +1 -1
- package/chunks/validate-JX7UTAK5.js +1 -0
- package/chunks/vertexai-WF5CKMYI.js +1 -0
- package/chunks/watch-SOZDHLSC.js +8 -0
- package/chunks/web-3VGRM3W4.js +1 -0
- package/chunks/wontfix-RBOGLLWJ.js +1 -0
- package/chunks/workerd-I7MLRCLJ.js +1 -0
- package/noskills.js +1 -1
- package/package.json +2 -2
- package/chunks/anthropic-LDUWIUPL.js +0 -1
- package/chunks/approve-73ZFRV7E.js +0 -1
- package/chunks/ask-VGI3BFZW.js +0 -2
- package/chunks/block-5APPOQQK.js +0 -1
- package/chunks/bun-5VMFSLLY.js +0 -1
- package/chunks/cancel-ZYRZPFRH.js +0 -1
- package/chunks/chunk-2GF5IUQD.js +0 -39
- package/chunks/chunk-2N4GTHXQ.js +0 -1
- package/chunks/chunk-5CNPFLE6.js +0 -1
- package/chunks/chunk-5MN3MWQN.js +0 -1
- package/chunks/chunk-65A35QPF.js +0 -1
- package/chunks/chunk-7UX6WIXX.js +0 -1
- package/chunks/chunk-AGPCY6XP.js +0 -1
- package/chunks/chunk-AGWPQX43.js +0 -31
- package/chunks/chunk-AP3YBNPX.js +0 -1
- package/chunks/chunk-D3IKJ7FF.js +0 -1
- package/chunks/chunk-EKZXJCT7.js +0 -5
- package/chunks/chunk-H77MLIL5.js +0 -4
- package/chunks/chunk-JVCVWI3B.js +0 -3
- package/chunks/chunk-OLM5RTFK.js +0 -1
- package/chunks/chunk-OTRBRRIO.js +0 -1
- package/chunks/chunk-U5SHLIO4.js +0 -3
- package/chunks/chunk-UT6ZCLRA.js +0 -1
- package/chunks/chunk-XS5JHAC7.js +0 -1
- package/chunks/chunk-XXBSEOQR.js +0 -148
- package/chunks/chunk-YSLRAWBK.js +0 -1
- package/chunks/chunk-YSSDQJTT.js +0 -91
- package/chunks/chunk-YTNM7A5Y.js +0 -3
- package/chunks/claude-code-BWCSAVK2.js +0 -1
- package/chunks/cmd-ZXO6KFK6.js +0 -1
- package/chunks/concern-RB444PUE.js +0 -1
- package/chunks/delegate-QBPFR44C.js +0 -1
- package/chunks/deno-QOH6TCLQ.js +0 -1
- package/chunks/diagrams-I2QKL7WR.js +0 -1
- package/chunks/done-Z2MFKQ45.js +0 -1
- package/chunks/followup-JR63B3JS.js +0 -1
- package/chunks/free-R4ZTZ76O.js +0 -1
- package/chunks/gemini-YR5KT32S.js +0 -1
- package/chunks/init-F7JCAPQS.js +0 -1
- package/chunks/invoke-hook-CGV6UHU7.js +0 -13
- package/chunks/kiro-RGYUKJAX.js +0 -3
- package/chunks/list-6EQP6VUL.js +0 -1
- package/chunks/manager-R5KNPWLT.js +0 -6
- package/chunks/mod-A77UWGGG.js +0 -1
- package/chunks/next-J2YKXUKA.js +0 -7
- package/chunks/node-3FTYLC7H.js +0 -67
- package/chunks/node-BPWE6I45.js +0 -1
- package/chunks/ollama-LTZ43OHQ.js +0 -3
- package/chunks/openai-Y74OQTVB.js +0 -23
- package/chunks/opencode-PZDL7VDP.js +0 -1
- package/chunks/purge-G22VY6CI.js +0 -4
- package/chunks/reopen-JTFZBGHT.js +0 -1
- package/chunks/reset-AW2IS3F6.js +0 -1
- package/chunks/review-EESYDNMA.js +0 -1
- package/chunks/run-K7FAF7RR.js +0 -3
- package/chunks/sdk-6IMATOQ3.js +0 -40
- package/chunks/spec-5B3HC5PT.js +0 -1
- package/chunks/status-CQ4U3KBF.js +0 -1
- package/chunks/sync-TJLHMISX.js +0 -1
- package/chunks/vertexai-RUXZ24C2.js +0 -1
- package/chunks/watch-WCX4YBL5.js +0 -8
- package/chunks/web-PEDL6264.js +0 -1
- package/chunks/wontfix-7JMQAMWG.js +0 -1
- package/chunks/workerd-IIQRIOBX.js +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2023-present Eser Ozvataf and other contributors.
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
# [@
|
|
1
|
+
# [@eserstack/noskills](./)
|
|
2
|
+
|
|
3
|
+
> **eserstack Product** — AI development orchestrator ·
|
|
4
|
+
> [eser/stack](https://github.com/eser/stack) **Install:**
|
|
5
|
+
> `curl -fsSL https://raw.githubusercontent.com/eser/stack/main/etc/scripts/install.sh | sh -s noskills`
|
|
6
|
+
|
|
7
|
+
`noskills` is a command, so install it as a binary — the line above, or
|
|
8
|
+
`brew install eser/tap/noskills`, or `npm i -g @eserstack/noskills`. On Windows
|
|
9
|
+
use `install.ps1 -Product noskills`.
|
|
10
|
+
|
|
11
|
+
Adding this package as a dependency (`pnpm add jsr:@eserstack/noskills`) gets
|
|
12
|
+
you the modules, not the command: the source package declares no `bin`, which is
|
|
13
|
+
generated at publish time by `scripts/npm-build.ts`. Depend on it when embedding
|
|
14
|
+
the orchestrator in your own program; install the binary when you want to run
|
|
15
|
+
it.
|
|
2
16
|
|
|
3
17
|
AI agents are powerful. But left alone, they take shortcuts — they skip
|
|
4
18
|
requirements, rush past edge cases, declare "done" when it isn't, and forget
|
|
@@ -75,10 +89,11 @@ execute. Fresh context per task. No context rot, no forgotten requirements, no
|
|
|
75
89
|
The agent reports against specific acceptance criteria, not vibes. Unfinished
|
|
76
90
|
items carry forward as debt — they don't disappear.
|
|
77
91
|
|
|
78
|
-
**Your concerns shape everything.** "We're
|
|
79
|
-
lens. It
|
|
80
|
-
|
|
81
|
-
|
|
92
|
+
**Your concerns shape everything — without bloating context.** "We're
|
|
93
|
+
open-source" isn't a label — it's a lens. It adds a documentation check to the
|
|
94
|
+
current spec, a contributor question to the current discovery, a license
|
|
95
|
+
reminder to the current task. Only what's relevant to the current phase is
|
|
96
|
+
delivered. Stack multiple concerns to define your project's character.
|
|
82
97
|
|
|
83
98
|
**One source of truth for all tools.** Write rules once. noskills generates
|
|
84
99
|
CLAUDE.md, AGENTS.md, .cursorrules, Kiro steering files, and more. Your teammate
|
|
@@ -124,13 +139,19 @@ Agent: *implements task 2 in fresh context, tests pass, reports progress*
|
|
|
124
139
|
Every spec moves through phases:
|
|
125
140
|
|
|
126
141
|
```
|
|
127
|
-
IDLE → DISCOVERY →
|
|
142
|
+
IDLE → DISCOVERY → REFINEMENT → PROPOSAL → APPROVED → EXECUTING ↔ BLOCKED
|
|
143
|
+
^ ^ |
|
|
144
|
+
| +-------------- revisit -----------------+
|
|
145
|
+
| |
|
|
146
|
+
+------------------ COMPLETED ←------------------+
|
|
147
|
+
(done | cancelled | wontfix)
|
|
128
148
|
```
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
150
|
+
Any phase can exit via `cancel` or `wontfix`. Mid-execution, `revisit` returns
|
|
151
|
+
to DISCOVERY with progress preserved. At each phase, the agent gets exactly the
|
|
152
|
+
instructions it needs — nothing more. In DISCOVERY, it can't edit files
|
|
153
|
+
(mechanically blocked, not just asked nicely). In EXECUTING, it delegates to
|
|
154
|
+
sub-agents with fresh context per task. At every gate, you decide.
|
|
134
155
|
|
|
135
156
|
The agent calls `noskills next`, gets a JSON payload with its current task,
|
|
136
157
|
behavioral rules, and concern reminders. It does the work, calls `noskills next`
|
|
@@ -146,10 +167,10 @@ and "you can't."
|
|
|
146
167
|
**Discovery** — Adaptive questions that challenge your assumptions, surface edge
|
|
147
168
|
cases, and catch things you'd miss. Discovery modes shape the depth.
|
|
148
169
|
|
|
149
|
-
**Concerns** — your project's DNA. "open-source" adds documentation
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
170
|
+
**Concerns** — your project's DNA. "open-source" adds a documentation check.
|
|
171
|
+
"beautiful-product" demands every UI state is designed. "move-fast" accepts
|
|
172
|
+
good-enough. Concerns stack, but only the current phase's slice is delivered —
|
|
173
|
+
no upfront context dump.
|
|
153
174
|
|
|
154
175
|
**Specs** — living documents with tasks, acceptance criteria, and status
|
|
155
176
|
tracking. Not a plan the agent ignores — a contract it's held to.
|
|
@@ -184,6 +205,28 @@ Before the six questions, noskills asks which discovery mode to use:
|
|
|
184
205
|
|
|
185
206
|
The mode shapes how questions are asked and which concern extras appear.
|
|
186
207
|
|
|
208
|
+
### Listen-first merged entry
|
|
209
|
+
|
|
210
|
+
When you run `noskills spec <name> next` for the first time on a new spec,
|
|
211
|
+
noskills presents a single entry menu combining listen-first and mode selection:
|
|
212
|
+
|
|
213
|
+
- **(a)** Share context — write requirements, Linear tasks, meeting notes
|
|
214
|
+
(recursive; you can keep adding)
|
|
215
|
+
- **(b)** Technical depth mode — architecture, data flow, integration focus
|
|
216
|
+
- **(c)** Move fast mode — minimum viable scope
|
|
217
|
+
- **(d)** Validate mode — challenge assumptions, find gaps
|
|
218
|
+
|
|
219
|
+
Option (a) appends to `discovery.userContext[]` without advancing. Picking b/c/d
|
|
220
|
+
sets `entryComplete: true` and starts discovery.
|
|
221
|
+
|
|
222
|
+
### Auto-classification
|
|
223
|
+
|
|
224
|
+
At DISCOVERY_REFINEMENT, noskills automatically classifies your spec across five
|
|
225
|
+
categories (Web UI, CLI, Public API, Migration, Data Handling) by regex-scanning
|
|
226
|
+
your spec description, userContext entries, and discovery answers. The
|
|
227
|
+
classification is shown with keyword evidence for you to confirm or adjust — no
|
|
228
|
+
separate classification prompt step required.
|
|
229
|
+
|
|
187
230
|
## Who is this for
|
|
188
231
|
|
|
189
232
|
**Vibe coders** who are tired of babysitting agents — you want to describe what
|
|
@@ -334,11 +377,12 @@ and performance degrades. The Ralph loop solves this by restarting the agent
|
|
|
334
377
|
every iteration with fresh context while persisting state in files. noskills IS
|
|
335
378
|
the Ralph loop — no separate bash script needed.
|
|
336
379
|
|
|
337
|
-
State persists in `.eser/.state/state.json` between iterations. The
|
|
338
|
-
snapshots git state automatically. Verification backpressure prevents
|
|
339
|
-
past broken tests. When `autoCommit: true` in `manifest.yml`, the
|
|
340
|
-
CLI loop handles git commits between iterations — the agent never
|
|
341
|
-
Git write operations are the CLI's responsibility, never the
|
|
380
|
+
State persists in `.eser/.state/progresses/state.json` between iterations. The
|
|
381
|
+
Stop hook snapshots git state automatically. Verification backpressure prevents
|
|
382
|
+
advancing past broken tests. When `autoCommit: true` in `manifest.yml`, the
|
|
383
|
+
`noskills run` CLI loop handles git commits between iterations — the agent never
|
|
384
|
+
touches git. Git write operations are the CLI's responsibility, never the
|
|
385
|
+
agent's.
|
|
342
386
|
|
|
343
387
|
### Behavioral Guardrails
|
|
344
388
|
|
|
@@ -347,13 +391,14 @@ rules. These tell the agent HOW to behave, not just WHAT to do:
|
|
|
347
391
|
|
|
348
392
|
| Phase | Behavioral tone | Key rules |
|
|
349
393
|
| ---------- | -------------------------------- | ------------------------------------------------------------- |
|
|
350
|
-
| IDLE | "Welcoming. Present choices" | No file edits until
|
|
351
|
-
| FREE | "Quiet. No enforcement." | No restrictions — work freely |
|
|
394
|
+
| IDLE | "Welcoming. Present choices" | No file edits until spec approved |
|
|
352
395
|
| DISCOVERY | "Curious, has a stake" | Push back on shallow answers, probe for specifics, don't code |
|
|
353
|
-
|
|
|
396
|
+
| REFINEMENT | "Careful reviewer" | Present answers, user must confirm each one |
|
|
397
|
+
| PROPOSAL | "The user is reviewing" | Don't modify the spec, don't start coding |
|
|
398
|
+
| APPROVED | "Patient. Wait for go signal" | Don't start coding until user triggers execution |
|
|
354
399
|
| EXECUTING | "Orchestrate — spawn sub-agents" | Delegate to sub-agents, don't edit files directly |
|
|
355
400
|
| BLOCKED | "Brief. Decision time." | Present decision as-is, don't suggest preferences |
|
|
356
|
-
|
|
|
401
|
+
| COMPLETED | "Celebrate briefly, then stop" | Don't start new work (done, cancelled, or wontfix) |
|
|
357
402
|
|
|
358
403
|
**Git is read-only** for agents (configurable via `allowGit: true` in manifest).
|
|
359
404
|
Agents may read (`git log`, `git diff`, `git status`) but never write
|
|
@@ -370,23 +415,27 @@ Concerns define what your project IS. They stack on top of each other and affect
|
|
|
370
415
|
discovery questions, spec sections, execution reminders, and acceptance
|
|
371
416
|
criteria:
|
|
372
417
|
|
|
373
|
-
| Concern | Effect
|
|
374
|
-
| --------------------- |
|
|
375
|
-
| **open-source** | Prioritize contributor experience, default to permissive choices
|
|
376
|
-
| **beautiful-product** | Every UI state specified — empty, loading, error, success. No AI slop
|
|
377
|
-
| **long-lived** | Favor boring technology, every shortcut needs justification
|
|
378
|
-
| **move-fast** | Good enough is good enough, defer polish to v2
|
|
379
|
-
| **compliance** | Every state change must be traceable, verification is mandatory
|
|
380
|
-
| **learning-project** | Experimentation encouraged, document learnings over polish
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
- **
|
|
388
|
-
- **
|
|
389
|
-
|
|
418
|
+
| Concern | Effect |
|
|
419
|
+
| --------------------- | ------------------------------------------------------------------------------------ |
|
|
420
|
+
| **open-source** | Prioritize contributor experience, default to permissive choices |
|
|
421
|
+
| **beautiful-product** | Every UI state specified — empty, loading, error, success. No AI slop |
|
|
422
|
+
| **long-lived** | Favor boring technology, every shortcut needs justification |
|
|
423
|
+
| **move-fast** | Good enough is good enough, defer polish to v2 |
|
|
424
|
+
| **compliance** | Every state change must be traceable, verification is mandatory |
|
|
425
|
+
| **learning-project** | Experimentation encouraged, document learnings over polish |
|
|
426
|
+
| **well-engineered** | Performance measured, tests strategic, errors helpful, security built-in, observable |
|
|
427
|
+
|
|
428
|
+
Concerns inject at every phase (DISCOVERY, REFINEMENT, EXECUTING, etc.) — but
|
|
429
|
+
only the slice relevant to the current phase. The agent never sees all concern
|
|
430
|
+
data at once:
|
|
431
|
+
|
|
432
|
+
- **DISCOVERY** — extra sub-questions, dream state prompts
|
|
433
|
+
- **REFINEMENT** — review dimension checklist (scope-filtered by classification
|
|
434
|
+
— UI dimensions only appear for UI specs)
|
|
435
|
+
- **PROPOSAL** — spec sections, registry table skeletons
|
|
436
|
+
- **EXECUTING** — reminders (tier 1 at compile-time, tier 2 per-file via hooks),
|
|
437
|
+
acceptance criteria, tension gates
|
|
438
|
+
- **COMPLETED** — learning prompts (done, cancelled, or wontfix)
|
|
390
439
|
|
|
391
440
|
When concerns conflict (e.g., move-fast + compliance), noskills surfaces the
|
|
392
441
|
tension to the human rather than resolving it silently.
|
|
@@ -409,14 +458,14 @@ hook log), noskills adds those rules to the acceptance criteria during status
|
|
|
409
458
|
reports:
|
|
410
459
|
|
|
411
460
|
```
|
|
412
|
-
(folder: pkg/@
|
|
413
|
-
(folder: pkg/@
|
|
461
|
+
(folder: pkg/@eserstack/noskills/sync) Sync output must be idempotent
|
|
462
|
+
(folder: pkg/@eserstack/noskills/sync) Hook scripts must be self-contained
|
|
414
463
|
```
|
|
415
464
|
|
|
416
465
|
Rules stack upward — `.folder-rules.md` files in parent directories also apply,
|
|
417
466
|
like CSS specificity. A rule at `pkg/` applies to all files under `pkg/`, while
|
|
418
|
-
a rule at `pkg/@
|
|
419
|
-
derived from filesystem, not LLM.
|
|
467
|
+
a rule at `pkg/@eserstack/streams/` applies only to that package. Zero token
|
|
468
|
+
cost — derived from filesystem, not LLM.
|
|
420
469
|
|
|
421
470
|
## How noskills differs
|
|
422
471
|
|
|
@@ -446,18 +495,17 @@ Another distinction is that noskills owns the workflow — who does what, when,
|
|
|
446
495
|
and whether the result was verified — while the others own the thinking or the
|
|
447
496
|
persona.
|
|
448
497
|
|
|
449
|
-
**noskills vs gstack:** gstack
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
enforced by hooks.
|
|
498
|
+
**noskills vs gstack:** gstack achieves planning depth through persona
|
|
499
|
+
multiplication — 4 independent reviewers (CEO, Engineer, Designer, DX advocate)
|
|
500
|
+
each with a 2000+ line prompt. noskills achieves the same depth through concern
|
|
501
|
+
composition — each concern carries review dimensions (one-sentence prompts) that
|
|
502
|
+
push the agent to evaluate specific quality aspects at the right phase.
|
|
503
|
+
`well-engineered` pushes test strategy, performance, observability, threat
|
|
504
|
+
modeling, and error quality. `beautiful-product` pushes information hierarchy,
|
|
505
|
+
interaction states, accessibility, and design system alignment. `long-lived`
|
|
506
|
+
pushes architecture analysis, failure modes, and deployment safety. Same
|
|
507
|
+
planning power, fraction of the tokens: concerns are phase-scoped JSON, not
|
|
508
|
+
monolithic prompts. Enforced by hooks, not hoped for by the agent.
|
|
461
509
|
|
|
462
510
|
**noskills vs Superpowers:** Superpowers provides detailed execution playbooks —
|
|
463
511
|
step-by-step instructions for brainstorming, dispatching, executing, and
|
|
@@ -535,8 +583,8 @@ One key difference: in Scrum, a sprint is time-boxed. In noskills, execution
|
|
|
535
583
|
runs until the spec is complete — it is a single-story sprint. This is why
|
|
536
584
|
mid-execution checkpoints make no sense: a Scrum Master does not stop a sprint
|
|
537
585
|
halfway through the only story. If the story is too big, you split it _before_
|
|
538
|
-
the sprint starts — not during. That is exactly what noskills does at
|
|
539
|
-
|
|
586
|
+
the sprint starts — not during. That is exactly what noskills does at REFINEMENT
|
|
587
|
+
with the split proposal.
|
|
540
588
|
|
|
541
589
|
## Philosophy — A Scrum Master for Agents
|
|
542
590
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a,b,c,d,e}from"./chunk-PRQ5CRIG.js";import"./chunk-JYVB6UAV.js";import"./chunk-OAWYVETM.js";import"./chunk-HISXAZ4Y.js";export{a as AjanBridgeModel,b as AjanBridgeModelFactory,c as createBridgeFactories,e as getBridgeLoadError,d as tryLoadBridgeFactories};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a,b}from"./chunk-7GC46XEU.js";import"./chunk-EJYSOUEA.js";import"./chunk-JYVB6UAV.js";import"./chunk-OAWYVETM.js";import"./chunk-HISXAZ4Y.js";export{a as AnthropicModel,b as anthropicFactory};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as b}from"./chunk-6YSS6PEL.js";import"./chunk-EROZRDGT.js";import{a as k,d as x}from"./chunk-LN4NDYT6.js";import{h as S}from"./chunk-5RLCKUIF.js";import{J as $,j as _,m as I,y as f}from"./chunk-UE56BMAW.js";import"./chunk-XDRX4ZBJ.js";import{c}from"./chunk-IFE5SYGK.js";import{c as o,d as p,f as n,g as m,k as w,o as P,q as v,r as E}from"./chunk-VXU6XZ66.js";import"./chunk-VJRCTYGL.js";import"./chunk-PKEQKXZW.js";import"./chunk-O4KKKYCH.js";import{E as D,f as C,h as R,j as y,o as O,s as A,u}from"./chunk-KRKOWSYW.js";import{a as h,b as i}from"./chunk-OAWYVETM.js";import{i as g}from"./chunk-Y5E7ZCCX.js";import"./chunk-LJEWPIEI.js";import"./chunk-FE4MKOI4.js";import"./chunk-HISXAZ4Y.js";var J=async L=>{let e=P({renderer:E.ansi(),sink:v.stdout()}),{root:a}=await D(),l=y(L);if(!l.ok)return e.writeln(n(l.error)),await e.close(),i({exitCode:1});let t;try{t=await R(a,l.spec)}catch(s){let r=s instanceof Error?s.message:String(s);return e.writeln(n(r)),await e.close(),i({exitCode:1})}let N=await O(a);if(t.spec!==null){let s=`${a}/${C.specDir(t.spec)}`;try{await g.fs.stat(s)}catch{return e.writeln(n(`Active spec '${t.spec}' directory not found.`)),e.writeln(p("Run `noskills reset` to return to idle.")),await e.close(),i({exitCode:1})}}let d=$(t);if(d.length>0&&(t.phase==="SPEC_PROPOSAL"||t.phase==="DISCOVERY_REFINEMENT")){e.writeln(n(`Cannot approve \u2014 ${d.length} pending delegation(s):`)),e.writeln("");for(let s of d)e.writeln(` ${s.questionId}: delegated to `,o(s.delegatedTo),p(` (pending since ${s.delegatedAt.slice(0,10)})`));return e.writeln(""),e.writeln(p("All delegations must be answered before approval.")),await e.close(),i({exitCode:1})}if(t.phase==="SPEC_PROPOSAL"){if(t.classification===null&&t.spec!==null){let T=(await A(a)).filter(V=>N?.concerns.includes(V.id)??!1);try{await b(a,t,T)}catch{}}let s=await S(a),r=I(t);r=f(r,"SPEC_PROPOSAL","SPEC_APPROVED",s),await u(a,r),r.spec!==null&&(await k(a,r.spec,"approved"),await x(a,r.spec,"approved")),e.writeln(m("\u2714")," Spec approved. Phase: ",w("SPEC_APPROVED")),e.writeln("When ready, run ",o(`${c('next --answer="start"')}`)," to begin execution.")}else if(t.phase==="DISCOVERY_REFINEMENT"){let s=await S(a),r=_(t);r=f(r,"DISCOVERY_REFINEMENT","SPEC_PROPOSAL",s),await u(a,r),e.writeln(m("\u2714")," Discovery answers approved. Phase: ",w("SPEC_PROPOSAL")),e.writeln("Review the spec and run ",o(c("approve"))," again to approve.")}else t.phase==="DISCOVERY"&&t.discovery.completed?(e.writeln(p("Discovery complete. Spec draft already generated.")),e.writeln("Review the spec and run ",o(c("approve"))," again when in SPEC_PROPOSAL phase.")):e.writeln(n(`Cannot approve in phase: ${t.phase}`));return await e.close(),h(void 0)};export{J as main};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as Ke,f as We}from"./chunk-CTTMQSHF.js";import{c as me}from"./chunk-Z7OYXH3J.js";import{a as le,b as L,c as z,d as K,f as A,g as De,h as Ge,j as Me,k as ue,l as $e,o as fe,p as je,q as pe,r as Ve}from"./chunk-VXU6XZ66.js";import{a as ze}from"./chunk-EJYSOUEA.js";import"./chunk-JYVB6UAV.js";import{a as b,c as O}from"./chunk-575Y3OEG.js";import"./chunk-4PF2MT7S.js";import{a as Ne,b as N,c as Oe}from"./chunk-OAWYVETM.js";import{i as v}from"./chunk-Y5E7ZCCX.js";import"./chunk-LJEWPIEI.js";import"./chunk-FE4MKOI4.js";import{d as ce}from"./chunk-HISXAZ4Y.js";var d=e=>typeof e=="string"?e.split(".").filter(Boolean):e,R=(e,t=".")=>e.join(t),C=e=>e.join("\0");var He=(e,t)=>e.length<t.length?!1:t.every((r,n)=>e[n]===r);var Be=(e,t)=>{let r=[];for(let n of t.values()){let o=d(n.category);He(e,o)&&r.push(n)}return r.sort((n,o)=>{let i=d(n.category).length;return d(o.category).length-i}),r};var W=(e,t)=>{let r=typeof t=="string"?[t]:t;return[...e,...r]};var U={};ce(U,{configure:()=>It,getEffectiveConfig:()=>he,getFilterNames:()=>jt,getLoggerCategories:()=>Vt,getRegistryState:()=>Ft,getSinkNames:()=>$t,isConfigured:()=>_t,registerConfigureHook:()=>Se,registerFilter:()=>Dt,registerLogger:()=>Mt,registerLoggerCacheClear:()=>xe,registerSink:()=>Nt,reset:()=>rt,unregisterFilter:()=>Gt,unregisterSink:()=>Ot});var g={Trace:1,Debug:5,Info:9,Notice:10,Warning:13,Error:17,Critical:21,Alert:22,Emergency:23},Ue={[g.Trace]:"Trace",[g.Debug]:"Debug",[g.Info]:"Info",[g.Notice]:"Notice",[g.Warning]:"Warning",[g.Error]:"Error",[g.Critical]:"Critical",[g.Alert]:"Alert",[g.Emergency]:"Emergency"};var H,B,bt=()=>{if(H===void 0)try{let e=globalThis.AsyncLocalStorage??globalThis.require?.("async_hooks")?.AsyncLocalStorage;e&&(H=new e)}catch{}return H},kt=()=>{if(B===void 0)try{let e=globalThis.AsyncLocalStorage??globalThis.require?.("async_hooks")?.AsyncLocalStorage;e&&(B=new e)}catch{}return B},qe,Je,ye=e=>{qe=e},Ye=e=>{Je=e},Xe=()=>{H=void 0,B=void 0},At=()=>qe??bt(),Rt=()=>Je??kt();var Qe=()=>{let e=At();return e?e.getStore()??{}:{}};var Et=()=>{let e=Rt();return e?e.getStore()??[]:[]},Ze=e=>{let t=Et();return t.length===0?e:W(t,e)};var et=null,xe=e=>{et=e},tt=null,Se=e=>{tt=e},f=null,x=new Map,Ft=()=>f,_t=()=>f!==null,It=async e=>{(e.reset||f===null)&&await rt(),f={sinks:new Map(Object.entries(e.sinks)),filters:new Map(Object.entries(e.filters??{})),loggers:new Map,contextLocalStorage:e.contextLocalStorage};for(let t of e.loggers){let r=d(t.category),n=C(r);f.loggers.set(n,{...t,category:r})}e.contextLocalStorage&&ye(e.contextLocalStorage),x.clear(),await tt?.(e.loggers)},rt=async()=>{if(f)for(let e of f.sinks.values()){let t=e;typeof t.dispose=="function"?await t.dispose():typeof t[Symbol.asyncDispose]=="function"&&await t[Symbol.asyncDispose]()}f=null,x.clear(),et?.(),ye(void 0),Ye(void 0),Xe()},he=e=>{let t=C(e),r=x.get(t);if(r)return r;let n={sinks:[],filters:[],lowestLevel:g.Info};if(!f)return n;let o=Be(e,f.loggers),i=new Set,a=new Set,l=!1;for(let s of o){if(s.sinks&&s.sinks.length>0){s.parentSinks==="override"&&i.clear();for(let c of s.sinks)i.add(c)}if(s.filters)for(let c of s.filters)a.add(c);!l&&s.lowestLevel!==void 0&&(n.lowestLevel=s.lowestLevel,l=!0)}for(let s of i){let c=f.sinks.get(s);c&&n.sinks.push(c)}for(let s of a){let c=f.filters.get(s);c&&n.filters.push(c)}return x.set(t,n),n},Nt=(e,t)=>{if(!f)throw new Error("Logging not configured. Call configure() first.");f.sinks.set(e,t),x.clear()},Ot=e=>{f&&(f.sinks.delete(e),x.clear())},Dt=(e,t)=>{if(!f)throw new Error("Logging not configured. Call configure() first.");f.filters.set(e,t),x.clear()},Gt=e=>{f&&(f.filters.delete(e),x.clear())},Mt=e=>{if(!f)throw new Error("Logging not configured. Call configure() first.");let t=d(e.category),r=C(t);f.loggers.set(r,{...e,category:t}),x.clear()},$t=()=>f?Array.from(f.sinks.keys()):[],jt=()=>f?Array.from(f.filters.keys()):[],Vt=()=>f?Array.from(f.loggers.values()).map(e=>d(e.category)):[];var J={};ce(J,{DEFAULT_LEVEL:()=>zt,Logger:()=>D,clearLoggerCache:()=>at,current:()=>Ut,getLogger:()=>Bt});await b();var zt=g.Info,q=e=>e<=4?"TRACE":e<=8?"DEBUG":e<=12?"INFO":e<=16?"WARN":e<=20?"ERROR":e<=24?"FATAL":"PANIC",Kt='"error"',ot=e=>{try{return JSON.stringify(e)}catch{return null}},nt=e=>e instanceof Error?e.message:String(e),it=e=>{try{console.error(e)}catch{}},ve=!1,Wt=e=>{ve||(ve=!0,it(`[eserstack/logging] Go logging backend unavailable (${e}); log records now go to a local console sink on stderr. Reported once per process.`))},Ht=(e,t,r,n)=>{let o=Object.keys(n).length>0?` ${ot(n)??'{"attrs":"unserializable"}'}`:"";it(`${new Date().toISOString()} ${q(t)} ${R(e)}: ${r}${o}`)},st=new Map,D=class e{category;parent;#e;#r=null;#n=null;#o=!1;#i=!1;constructor(t,r=null,n={}){this.category=d(t),this.parent=r,this.#e=n}#s(){return this.#r===null&&(this.#r=he(this.category)),this.#r}#t(t){this.#i=!0,Wt(t)}async#a(){if(this.#o)return this.#n;this.#o=!0;try{await b();let t=O(),r=this.#s(),n=t.symbols.EserAjanLogCreate(JSON.stringify({scopeName:R(this.category),level:q(r.lowestLevel)})),o=JSON.parse(n);if(o.handle===void 0||o.handle==="")return this.#t(o.error??`EserAjanLogCreate returned ${n}`),null;this.#n=o.handle,st.set(C(this.category),o.handle)}catch(t){return this.#t(nt(t)),null}return this.#n}#g(t,r,n,o){let i=ot({handle:t,level:q(r),message:n,attrs:o});if(i===null)return!1;try{let a=O().symbols.EserAjanLogWrite(i);if(!a.includes(Kt))return!0;let l=JSON.parse(a);if(l.error===void 0||l.error==="")return!0;this.#t(l.error)}catch(a){this.#t(nt(a))}return!1}async#c(t,r,n){let o=this.#i?null:await this.#a();o!==null&&this.#g(o,t,r,n)||Ht(this.category,t,r,n)}getChild(t){let r=W(this.category,d(t));return new e(r,this,this.#e)}with(t){return new e(this.category,this.parent,{...this.#e,...t})}get loggerName(){return R(this.category)}asString(t,r=!1){return typeof t=="string"?r?`"${t}"`:t:t===null||typeof t=="number"||typeof t=="bigint"||typeof t=="boolean"||typeof t>"u"||typeof t=="symbol"?String(t):t instanceof Error?t.stack:t!==null&&typeof t=="object"?Array.isArray(t)?JSON.stringify(t):`{${Object.entries(t).map(([n,o])=>`"${n}":${this.asString(o,!0)}`).join(",")}}`:"undefined"}async log(t,r,...n){let o=this.#s();if(t<o.lowestLevel)return r instanceof Function?void 0:r;let i,a;r instanceof Function?(i=r(),a=this.asString(i)):a=this.asString(r);let l=Qe(),s={...this.#e,...l??{}};return n.length>0&&(s.args=n),await this.#c(t,a,s),r instanceof Function?i:r}debug(t,...r){return this.log(g.Debug,t,...r)}info(t,...r){return this.log(g.Info,t,...r)}warn(t,...r){return this.log(g.Warning,t,...r)}error(t,...r){return this.log(g.Error,t,...r)}critical(t,...r){return this.log(g.Critical,t,...r)}emergency(t,...r){return this.log(g.Emergency,t,...r)}alert(t,...r){return this.log(g.Alert,t,...r)}notice(t,...r){return this.log(g.Notice,t,...r)}trace(t,...r){return this.log(g.Trace,t,...r)}},Ce=new Map,Bt=e=>{let t=Ze(d(e)),r=C(t),n=Ce.get(r);return n||(n=new D(t),Ce.set(r,n)),b(),n},at=()=>{Ce.clear(),ve=!1};xe(at);Se(async e=>{await b();let t=O();for(let r of e){if(r.lowestLevel===void 0)continue;let n=d(r.category),o=C(n),i=st.get(o);i!==void 0&&t.symbols.EserAjanLogConfigure(JSON.stringify({handle:i,level:q(r.lowestLevel)}))}});var Ut=new D(["default"]);var Y={};ce(Y,{fingersCrossedSink:()=>nr,getBufferedSink:()=>rr,getOutputSink:()=>er,getRecordCollectorSink:()=>ct,getTestSink:()=>or,withFilter:()=>tr});var qt={[g.Trace]:"TRCE",[g.Debug]:"DBUG",[g.Info]:"INFO",[g.Notice]:"NOTC",[g.Warning]:"WARN",[g.Error]:"ERRO",[g.Critical]:"CRIT",[g.Alert]:"ALRT",[g.Emergency]:"EMRG"};var Jt=(e,t)=>{if(t==="none")return"";if(typeof t=="function")return t(e);let r=e.toISOString(),n=r.slice(0,10),o=r.slice(11,19),i=r.slice(19);switch(t){case"rfc3339":return r;case"date-time-timezone":case void 0:return`${n} ${o}${i}`;case"date-time":return`${n} ${o}`;case"time-timezone":return`${o}${i}`;case"time":return o;case"date":return n}},Yt=e=>{try{return JSON.stringify(e)}catch{return String(e)}},Xt=(e,t)=>{let r={...t,...e},n=Object.entries(r);return n.length===0?"":" "+n.map(([o,i])=>{let a=typeof i=="string"?i:Yt(i);return`${o}=${a}`}).join(" ")};var Qt=(e,t)=>{switch(e){case g.Trace:return K(Me(t));case g.Debug:return $e(t);case g.Info:return De(t);case g.Notice:return ue(t);case g.Warning:return Ge(t);case g.Error:return A(t);case g.Critical:return z(A(t));case g.Alert:return z(A(t));case g.Emergency:return z(A(t));default:return L(t)}},gt=e=>{let t=Jt(e.datetime,"date-time-timezone"),r=qt[e.severity]??"????",n=e.category.length>0?R(e.category):"",o=Xt(e.properties,e.context),i=[];return t&&i.push(K(t),L(" ")),i.push(Qt(e.severity,r),L(" ")),n&&i.push(ue(`[${n}]`),L(" ")),e.severity>=g.Error?i.push(A(e.message)):i.push(L(e.message)),o.trim()&&i.push(L(" "),K(o.trim())),i};var er=(e,t)=>{let r=t?.formatter??gt;return n=>{let o=r(n);e.writeln(...o)}},tr=(e,t)=>r=>{if(t(r))return e(r)},rr=(e,t={})=>{let{maxSize:r=100,flushIntervalMs:n=5e3}=t,o=[],i=null,a=async()=>{if(o.length===0)return;let c=o;o=[],i&&(clearTimeout(i),i=null),await Promise.all(c.map(p=>e(p)))},l=()=>{i===null&&(i=setTimeout(()=>{i=null,a().catch(()=>{})},n))},s=async c=>{o.push(c),o.length>=r?await a():l()};return s.flush=a,s},nr=(e,t={})=>{let{triggerLevel:r=17,maxBufferSize:n=1e3}=t,o=[],i=!1,a=async()=>{let c=o;o=[],i=!0,await Promise.all(c.map(p=>e(p)))},l=()=>{o=[],i=!1},s=async c=>{if(i){await e(c);return}if(c.severity>=r){o.push(c),await a();return}o.push(c),o.length>n&&o.shift()};return s.flush=a,s.clear=l,s},ct=()=>{let e=[];return{sink:r=>{e.push(r)},records:e}},or=ct;var S="1.9.1";var lt=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;function sr(e){let t=new Set([e]),r=new Set,n=e.match(lt);if(!n)return()=>!1;let o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(s){return s===e};function i(l){return r.add(l),!1}function a(l){return t.add(l),!0}return function(s){if(t.has(s))return!0;if(r.has(s))return!1;let c=s.match(lt);if(!c)return i(s);let p={major:+c[1],minor:+c[2],patch:+c[3],prerelease:c[4]};return p.prerelease!=null||o.major!==p.major?i(s):o.major===0?o.minor===p.minor&&o.patch<=p.patch?a(s):i(s):o.minor<=p.minor?a(s):i(s)}}var ut=sr(S);var ar=S.split(".")[0],G=Symbol.for(`opentelemetry.js.api.${ar}`),M=typeof globalThis=="object"?globalThis:typeof self=="object"?self:typeof window=="object"?window:typeof global=="object"?global:{};function E(e,t,r,n=!1){var o;let i=M[G]=(o=M[G])!==null&&o!==void 0?o:{version:S};if(!n&&i[e]){let a=new Error(`@opentelemetry/api: Attempted duplicate registration of API: ${e}`);return r.error(a.stack||a.message),!1}if(i.version!==S){let a=new Error(`@opentelemetry/api: Registration of version v${i.version} for ${e} does not match previously registered API v${S}`);return r.error(a.stack||a.message),!1}return i[e]=t,r.debug(`@opentelemetry/api: Registered a global for ${e} v${S}.`),!0}function h(e){var t,r;let n=(t=M[G])===null||t===void 0?void 0:t.version;if(!(!n||!ut(n)))return(r=M[G])===null||r===void 0?void 0:r[e]}function P(e,t){t.debug(`@opentelemetry/api: Unregistering a global for ${e} v${S}.`);let r=M[G];r&&delete r[e]}var X=class{constructor(t){this._namespace=t.namespace||"DiagComponentLogger"}debug(...t){return $("debug",this._namespace,t)}error(...t){return $("error",this._namespace,t)}info(...t){return $("info",this._namespace,t)}warn(...t){return $("warn",this._namespace,t)}verbose(...t){return $("verbose",this._namespace,t)}};function $(e,t,r){let n=h("diag");if(n)return n[e](t,...r)}var m;(function(e){e[e.NONE=0]="NONE",e[e.ERROR=30]="ERROR",e[e.WARN=50]="WARN",e[e.INFO=60]="INFO",e[e.DEBUG=70]="DEBUG",e[e.VERBOSE=80]="VERBOSE",e[e.ALL=9999]="ALL"})(m||(m={}));function ft(e,t){e<m.NONE?e=m.NONE:e>m.ALL&&(e=m.ALL),t=t||{};function r(n,o){let i=t[n];return typeof i=="function"&&e>=o?i.bind(t):function(){}}return{error:r("error",m.ERROR),warn:r("warn",m.WARN),info:r("info",m.INFO),debug:r("debug",m.DEBUG),verbose:r("verbose",m.VERBOSE)}}var gr="diag",T=class e{static instance(){return this._instance||(this._instance=new e),this._instance}constructor(){function t(o){return function(...i){let a=h("diag");if(a)return a[o](...i)}}let r=this,n=(o,i={logLevel:m.INFO})=>{var a,l,s;if(o===r){let u=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return r.error((a=u.stack)!==null&&a!==void 0?a:u.message),!1}typeof i=="number"&&(i={logLevel:i});let c=h("diag"),p=ft((l=i.logLevel)!==null&&l!==void 0?l:m.INFO,o);if(c&&!i.suppressOverrideMessage){let u=(s=new Error().stack)!==null&&s!==void 0?s:"<failed to generate stacktrace>";c.warn(`Current logger will be overwritten from ${u}`),p.warn(`Current logger will overwrite one already registered from ${u}`)}return E("diag",p,r,!0)};r.setLogger=n,r.disable=()=>{P(gr,r)},r.createComponentLogger=o=>new X(o),r.verbose=t("verbose"),r.debug=t("debug"),r.info=t("info"),r.warn=t("warn"),r.error=t("error")}};function pt(e){return Symbol.for(e)}var Te=class e{constructor(t){let r=this;r._currentContext=t?new Map(t):new Map,r.getValue=n=>r._currentContext.get(n),r.setValue=(n,o)=>{let i=new e(r._currentContext);return i._currentContext.set(n,o),i},r.deleteValue=n=>{let o=new e(r._currentContext);return o._currentContext.delete(n),o}}},mt=new Te;var Q=class{active(){return mt}with(t,r,n,...o){return r.call(n,...o)}bind(t,r){return r}enable(){return this}disable(){return this}};var we="context",cr=new Q,F=class e{constructor(){}static getInstance(){return this._instance||(this._instance=new e),this._instance}setGlobalContextManager(t){return E(we,t,T.instance())}active(){return this._getContextManager().active()}with(t,r,n,...o){return this._getContextManager().with(t,r,n,...o)}bind(t,r){return this._getContextManager().bind(t,r)}_getContextManager(){return h(we)||cr}disable(){this._getContextManager().disable(),P(we,T.instance())}};var Z;(function(e){e[e.NONE=0]="NONE",e[e.SAMPLED=1]="SAMPLED"})(Z||(Z={}));var Le="0000000000000000",be="00000000000000000000000000000000",dt={traceId:be,spanId:Le,traceFlags:Z.NONE};var y=class{constructor(t=dt){this._spanContext=t}spanContext(){return this._spanContext}setAttribute(t,r){return this}setAttributes(t){return this}addEvent(t,r){return this}addLink(t){return this}addLinks(t){return this}setStatus(t){return this}updateName(t){return this}end(t){}isRecording(){return!1}recordException(t,r){}};var ke=pt("OpenTelemetry Context Key SPAN");function ee(e){return e.getValue(ke)||void 0}function yt(){return ee(F.getInstance().active())}function j(e,t){return e.setValue(ke,t)}function xt(e){return e.deleteValue(ke)}function St(e,t){return j(e,new y(t))}function te(e){var t;return(t=ee(e))===null||t===void 0?void 0:t.spanContext()}var re=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1]);function ht(e,t){if(typeof e!="string"||e.length!==t)return!1;let r=0;for(let n=0;n<e.length;n+=4)r+=(re[e.charCodeAt(n)]|0)+(re[e.charCodeAt(n+1)]|0)+(re[e.charCodeAt(n+2)]|0)+(re[e.charCodeAt(n+3)]|0);return r===t}function lr(e){return ht(e,32)&&e!==be}function ur(e){return ht(e,16)&&e!==Le}function ne(e){return lr(e.traceId)&&ur(e.spanId)}function vt(e){return new y(e)}var Ae=F.getInstance(),_=class{startSpan(t,r,n=Ae.active()){if(!!r?.root)return new y;let i=n&&te(n);return fr(i)&&ne(i)?new y(i):new y}startActiveSpan(t,r,n,o){let i,a,l;if(arguments.length<2)return;arguments.length===2?l=r:arguments.length===3?(i=r,l=n):(i=r,a=n,l=o);let s=a??Ae.active(),c=this.startSpan(t,i,s),p=j(s,c);return Ae.with(p,l,void 0,c)}};function fr(e){return e!==null&&typeof e=="object"&&"spanId"in e&&typeof e.spanId=="string"&&"traceId"in e&&typeof e.traceId=="string"&&"traceFlags"in e&&typeof e.traceFlags=="number"}var pr=new _,oe=class{constructor(t,r,n,o){this._provider=t,this.name=r,this.version=n,this.options=o}startSpan(t,r,n){return this._getTracer().startSpan(t,r,n)}startActiveSpan(t,r,n,o){let i=this._getTracer();return Reflect.apply(i.startActiveSpan,i,arguments)}_getTracer(){if(this._delegate)return this._delegate;let t=this._provider.getDelegateTracer(this.name,this.version,this.options);return t?(this._delegate=t,this._delegate):pr}};var ie=class{getTracer(t,r,n){return new _}};var mr=new ie,V=class{getTracer(t,r,n){var o;return(o=this.getDelegateTracer(t,r,n))!==null&&o!==void 0?o:new oe(this,t,r,n)}getDelegate(){var t;return(t=this._delegate)!==null&&t!==void 0?t:mr}setDelegate(t){this._delegate=t}getDelegateTracer(t,r,n){var o;return(o=this._delegate)===null||o===void 0?void 0:o.getTracer(t,r,n)}};var Re="trace",se=class e{constructor(){this._proxyTracerProvider=new V,this.wrapSpanContext=vt,this.isSpanContextValid=ne,this.deleteSpan=xt,this.getSpan=ee,this.getActiveSpan=yt,this.getSpanContext=te,this.setSpan=j,this.setSpanContext=St}static getInstance(){return this._instance||(this._instance=new e),this._instance}setGlobalTracerProvider(t){let r=E(Re,this._proxyTracerProvider,T.instance());return r&&this._proxyTracerProvider.setDelegate(t),r}getTracerProvider(){return h(Re)||this._proxyTracerProvider}getTracer(t,r){return this.getTracerProvider().getTracer(t,r)}disable(){P(Re,T.instance()),this._proxyTracerProvider=new V}};var Ee=se.getInstance();var Zn=Ee.getTracer("@eserstack/logging");var Pe=(e,t,r)=>{let n=e.streamText(t,r);return{name:`ai-text/${e.provider}/${e.modelId}`,readable:new ReadableStream({async start(o){try{for await(let i of n)i.kind==="content_delta"&&o.enqueue(le(i.textDelta));o.close()}catch(i){o.error(i)}}})}};var Sr={cc:"claude-code",ol:"ollama",oc:"opencode",oai:"openai",ant:"anthropic",gem:"gemini",vtx:"vertexai",kr:"kiro"},hr={"claude-code":"Claude Code",ollama:"Ollama",opencode:"OpenCode",kiro:"Kiro",anthropic:"Anthropic API",openai:"OpenAI API",gemini:"Gemini API",vertexai:"Vertex AI"},vr=e=>Sr[e]??e,Cr=async e=>{if(e){let t=v.process.stderr.getWriter(),r=fe({renderer:Ve.ansi(),sink:pe.writable(new WritableStream({async write(n){await t.write(new TextEncoder().encode(String(n.data)))},close(){t.releaseLock()}}))});await U.configure({sinks:{stderr:Y.getOutputSink(r)},loggers:[{category:["ai"],lowestLevel:g.Debug,sinks:["stderr"]}]})}return J.getLogger(["ai","ask"])},Tr=async e=>{if(await e.info("Auto-detecting AI provider..."),await me("claude"))return await e.info("Claude Code detected."),"claude-code";try{if((await fetch("http://localhost:11434/api/version",{signal:AbortSignal.timeout(1e3)})).ok)return await e.info("Ollama detected at localhost:11434."),"ollama"}catch{}if(await me("opencode"))return await e.info("OpenCode detected."),"opencode";if(v.capabilities.env){if(v.env.has("ANTHROPIC_API_KEY")||v.env.has("ANTHROPIC_AUTH_TOKEN"))return await e.info("Anthropic API key detected."),"anthropic";if(v.env.has("OPENAI_API_KEY"))return await e.info("OpenAI API key detected."),"openai"}throw new Error("No AI provider detected. Install claude, ollama, or set ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN / OPENAI_API_KEY.")},wr=async e=>{let{factoryFor:t}=await import("./mod-6EZYRKWV.js"),r=await t(e);if(r===void 0)throw new Error(`Unknown provider: ${e}`);return r},xo=async e=>{let t=e??[],r=null,n=null,o=null,i=!1,a=!1,l=[],s=0;for(;s<t.length;){let u=t[s];if(u==="-p"||u==="--provider"){r=t[s+1]??null,s+=2;continue}if(u==="-m"||u==="--model"){n=t[s+1]??null,s+=2;continue}if(u==="--max-tokens"){let w=t[s+1];w!==void 0&&(o=Number(w)),s+=2;continue}if(u==="--json"){i=!0,s+=1;continue}if(u==="-v"||u==="--verbose"){a=!0,s+=1;continue}u.startsWith("-")||l.push(u),s+=1}let c=l.join(" ");if(c.length===0)return N({message:'Usage: ai ask "your prompt" [-p provider] [-m model] [--verbose]',exitCode:1});let p=await Cr(a);try{let u=r!==null?vr(r):await Tr(p),w=hr[u]??u,Fe=n??Ar(u);await p.info(`Using ${w} (${Fe})`);let Tt=await wr(u),ae=new We({factories:[Tt]});await ae.addModel("default",{provider:u,model:Fe});let ge=ae.getDefault();if(ge===null)return N({message:"Failed to initialize model",exitCode:1});let _e=[ze("user",c)];if(await p.info(`Sending prompt (${c.length} chars)...`),i){let k=await ge.generateText({messages:_e,maxTokens:o??void 0});if(Oe(k))return await p.error(k.error.message),N({message:k.error.message,exitCode:1});let I=k.value;await p.info(`Response received (${Ke(I).length} chars)`);let Ie=fe({sink:pe.stdout()});Ie.writeln(JSON.stringify(I,null,2)),await Ie.close()}else{let k=Pe(ge,{messages:_e,maxTokens:o??void 0});await je().from(k).to(kr()).run();let I=v.process.stdout.getWriter();await I.write(new TextEncoder().encode(`
|
|
2
|
+
`)),I.releaseLock()}return await ae.close(),Ne(void 0)}catch(u){let w=u instanceof Error?u.message:String(u);return await p.error(w),a&&u instanceof Error&&u.cause!==void 0&&await p.debug(`Cause: ${String(u.cause)}`),N({message:w,exitCode:1})}},Lr=12,br=e=>new Promise(t=>setTimeout(t,e)),kr=(e=Lr)=>{let t=new TextEncoder;return{name:"typewriter",writable:new WritableStream({async write(r){let n=String(r.data),o=v.process.stdout.getWriter();for(let i of n)await o.write(t.encode(i)),await br(e);o.releaseLock()}})}},Ar=e=>{switch(e){case"claude-code":return"claude-sonnet-5";case"ollama":return"llama3";case"opencode":return"default";case"kiro":return"default";case"anthropic":return"claude-sonnet-5";case"openai":return"gpt-5.6-terra";case"gemini":return"gemini-3.6-flash";case"vertexai":return"gemini-3.6-flash";default:return"default"}};export{xo as main};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{h as R}from"./chunk-5RLCKUIF.js";import{o as x,y as E}from"./chunk-UE56BMAW.js";import"./chunk-XDRX4ZBJ.js";import{c as A}from"./chunk-IFE5SYGK.js";import{c as u,d as c,f as i,h as f,o as w,q as h,r as g}from"./chunk-VXU6XZ66.js";import"./chunk-VJRCTYGL.js";import"./chunk-PKEQKXZW.js";import"./chunk-O4KKKYCH.js";import{E as v,f as k,h as y,j as C,u as S}from"./chunk-KRKOWSYW.js";import{a as m,b as r}from"./chunk-OAWYVETM.js";import{i as d}from"./chunk-Y5E7ZCCX.js";import"./chunk-LJEWPIEI.js";import"./chunk-FE4MKOI4.js";import"./chunk-HISXAZ4Y.js";var X=async p=>{let e=w({renderer:g.ansi(),sink:h.stdout()}),{root:o}=await v(),n=C(p);if(!n.ok)return e.writeln(i(n.error)),await e.close(),r({exitCode:1});let a=(p??[]).filter(s=>!s.startsWith("--spec=")).join(" ")||"No reason given",t;try{t=await y(o,n.spec)}catch(s){let b=s instanceof Error?s.message:String(s);return e.writeln(i(b)),await e.close(),r({exitCode:1})}if(t.spec!==null){let s=`${o}/${k.specDir(t.spec)}`;try{await d.fs.stat(s)}catch{return e.writeln(i(`Active spec '${t.spec}' directory not found.`)),e.writeln(c("Run `noskills reset` to return to idle.")),await e.close(),r({exitCode:1})}}if(t.phase!=="EXECUTING")return e.writeln(i(`Cannot block in phase: ${t.phase}`)),await e.close(),r({exitCode:1});let $=await R(o),l=x(t,a);return l=E(l,"EXECUTING","BLOCKED",$,a),await S(o,l),e.writeln(f("\u26A0")," Spec blocked: ",c(a)),e.writeln("Resolve with: ",u(`${A('next --answer="resolution"')}`)),await e.close(),m(void 0)};export{X as main};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as e,u as s,v as t,w as r,x as a}from"./chunk-
|
|
1
|
+
import{f as e,u as s,v as t,w as r,x as a}from"./chunk-FE4MKOI4.js";import"./chunk-HISXAZ4Y.js";var o={fs:!1,fsSync:!1,exec:!1,process:!1,env:!1,stdin:!1,stdout:!1,kv:!1},c=()=>({name:"browser",version:globalThis.navigator?.userAgent??"unknown",capabilities:o,fs:s("browser"),path:e,exec:t("browser"),env:a(),process:r("browser")});export{o as BROWSER_CAPABILITIES,c as createBrowserRuntime};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as m,b as h,c as g,d as S}from"./chunk-KRRPOVQG.js";import{s as l,t as p}from"./chunk-FE4MKOI4.js";import"./chunk-HISXAZ4Y.js";var y={fs:!0,fsSync:!0,exec:!0,process:!0,env:!0,stdin:!0,stdout:!0,kv:!1},u=async d=>{if(!d)return new Uint8Array(0);let n=[],t=d.getReader();try{for(;;){let{done:e,value:s}=await t.read();if(e)break;n.push(s)}}finally{t.releaseLock()}let a=n.reduce((e,s)=>e+s.length,0),i=new Uint8Array(a),o=0;for(let e of n)i.set(e,o),o+=e.length;return i},f=async(d,n=[],t)=>{let[a,i,o]=l(t),e=Bun.spawn([d,...n],{cwd:t?.cwd,env:t?.env,stdin:t?.stdinText===void 0?a:new TextEncoder().encode(t.stdinText),stdout:i,stderr:o}),[s,r,c]=await Promise.all([e.exited,u(e.stdout),u(e.stderr)]);return{success:s===0,code:s,stdout:r,stderr:c}},P=(d,n=[],t)=>{let[a,i,o]=l(t),e=Bun.spawn([d,...n],{cwd:t?.cwd,env:t?.env,stdin:a,stdout:i,stderr:o}),s=e.exited.then(r=>({success:r===0,code:r,signal:void 0}));return{pid:e.pid,stdin:e.stdin,stdout:e.stdout,stderr:e.stderr,status:s,output:async()=>{let[r,c,w]=await Promise.all([s,u(e.stdout),u(e.stderr)]);return{success:r.success,code:r.code,stdout:c,stderr:w}},kill:r=>{e.kill(r)}}},x=()=>({name:"bun",version:Bun.version,capabilities:y,fs:m(),path:h(),exec:p(f,P),env:g(),process:S()});export{y as BUN_CAPABILITIES,x as createBunRuntime};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as P}from"./chunk-DBKXMYLF.js";import{a as T,d as x}from"./chunk-LN4NDYT6.js";import{h as I}from"./chunk-5RLCKUIF.js";import{K as D,q as k,y as v}from"./chunk-UE56BMAW.js";import"./chunk-XDRX4ZBJ.js";import"./chunk-IFE5SYGK.js";import{d as m,f as i,g as d,o as u,q as f,r as w}from"./chunk-VXU6XZ66.js";import"./chunk-VJRCTYGL.js";import"./chunk-PKEQKXZW.js";import"./chunk-O4KKKYCH.js";import{E as C,f as h,h as S,j as g,k as E,m as y}from"./chunk-KRKOWSYW.js";import{a as p,b as n}from"./chunk-OAWYVETM.js";import{i as l}from"./chunk-Y5E7ZCCX.js";import"./chunk-LJEWPIEI.js";import"./chunk-FE4MKOI4.js";import"./chunk-HISXAZ4Y.js";var Z=async L=>{let t=u({renderer:w.ansi(),sink:f.stdout()}),{root:r}=await C(),o=g(L);if(!o.ok)return t.writeln(i(o.error)),await t.close(),n({exitCode:1});let e;try{e=await S(r,o.spec)}catch(a){let A=a instanceof Error?a.message:String(a);return t.writeln(i(A)),await t.close(),n({exitCode:1})}if(e.phase==="IDLE"||e.phase==="UNINITIALIZED"||e.phase==="COMPLETED")return t.writeln(i(`Cannot cancel in phase: ${e.phase}`)),await t.close(),n({exitCode:1});if(e.spec!==null){let a=`${r}/${h.specDir(e.spec)}`;try{await l.fs.stat(a)}catch{return t.writeln(i(`Active spec '${e.spec}' directory not found.`)),t.writeln(m("Run `noskills reset` to return to idle.")),await t.close(),n({exitCode:1})}}let c=await I(r),s=k(e,"cancelled");s=v(s,e.phase,"COMPLETED",c,"cancelled"),s.spec!==null&&await y(r,s.spec,s);let U=D(s);return await E(r,U),s.spec!==null&&(await T(r,s.spec,"cancelled"),await x(r,s.spec,"cancelled")),await P(r,{ts:new Date().toISOString(),type:"phase-change",spec:e.spec??"unknown",user:c.name,from:e.phase,to:"COMPLETED",reason:"cancelled"}),t.writeln(d("\u2714")," Spec cancelled."),await t.close(),p(void 0)};export{Z as main};
|