@nanopm/cli 0.1.6 → 0.1.7
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/dist/index.js +14 -14
- package/package.json +1 -1
- package/skills/direction/SKILL.md +1 -1
- package/skills/market/SKILL.md +1 -1
- package/skills/needs/SKILL.md +1 -1
- package/skills/onboard/SKILL.md +26 -14
- package/skills/opportunities/SKILL.md +1 -1
- package/skills/personas/SKILL.md +1 -1
- package/skills/pitch/SKILL.md +1 -1
- package/skills/problem-mapper/SKILL.md +1 -1
- package/skills/talk/skill.json +1 -1
package/dist/index.js
CHANGED
|
@@ -105,7 +105,7 @@ var CAPABILITIES = [
|
|
|
105
105
|
* `projects.website_url`, never a model's choice, and only that host and three fixed
|
|
106
106
|
* paths are fetched. That is what lets a skill holding the founder's repository read
|
|
107
107
|
* their landing page without an outbound socket sitting next to private code, which is
|
|
108
|
-
* the combination the taint rule exists to prevent (docs
|
|
108
|
+
* the combination the taint rule exists to prevent (docs/✅nanopm-60-onboarding-end-to-end.md §6).
|
|
109
109
|
*
|
|
110
110
|
* Capped nowhere, and it does not taint: there is no tool here to misuse.
|
|
111
111
|
*/
|
|
@@ -139,7 +139,7 @@ var CAPABILITIES = [
|
|
|
139
139
|
/** Maintain the market view: write_market, and list_market under `memory`. */
|
|
140
140
|
"market",
|
|
141
141
|
/**
|
|
142
|
-
* A conversation with Nano (docs
|
|
142
|
+
* A conversation with Nano (docs/✅nanopm-68-talk-to-nano.md): read the opportunity map and the
|
|
143
143
|
* board and change them as the founder asked — the tools in `TALK_TOOLS`. Nothing else: no
|
|
144
144
|
* repository, no web, no data. Capped nowhere: every change is one the founder can make from a
|
|
145
145
|
* sheet, and only what they asked for is done.
|
|
@@ -374,7 +374,7 @@ var SkillManifestSchema = z2.object({
|
|
|
374
374
|
),
|
|
375
375
|
/**
|
|
376
376
|
* The cap for a run with `params.depth: 'deep'`, when the skill has one: the deep needs map
|
|
377
|
-
* runs ten sessions and never fit the quick map's forty minutes (docs
|
|
377
|
+
* runs ten sessions and never fit the quick map's forty minutes (docs/✅nanopm-63-quick-first.md §4).
|
|
378
378
|
*/
|
|
379
379
|
timeout_deep: z2.string().refine(
|
|
380
380
|
(t) => {
|
|
@@ -872,7 +872,7 @@ var CHAINED = {
|
|
|
872
872
|
// and the crew runs when the founder asks for it from the business card.
|
|
873
873
|
onboard: ["market"],
|
|
874
874
|
// A problem list is what solutions hang under, so a fresh list is followed by fresh
|
|
875
|
-
// solutions. **The problem crew itself is retired** (docs
|
|
875
|
+
// solutions. **The problem crew itself is retired** (docs/✅nanopm-59-opportunity-map.md,
|
|
876
876
|
// Guillaume, 2026-09-25): the opportunity map replaced it, and nothing queues it any more —
|
|
877
877
|
// not the market read, not a review, not a watch, not the founder leaving Voices. A map
|
|
878
878
|
// someone still runs by hand keeps this edge, because every bet still hangs off a problem
|
|
@@ -880,7 +880,7 @@ var CHAINED = {
|
|
|
880
880
|
problems: ["solutions"],
|
|
881
881
|
// The pitch crew runs after the market read, which is the one automatic run that changes
|
|
882
882
|
// what the pitch can say without anyone asking: an "unlike" clause needs competitors. It
|
|
883
|
-
// proposes beside a confirmed pitch and never over it (docs
|
|
883
|
+
// proposes beside a confirmed pitch and never over it (docs/✅nanopm-52-pitch-crew.md).
|
|
884
884
|
//
|
|
885
885
|
// The direction crew **was** chained here too, for the same reason — a vision rests on who
|
|
886
886
|
// else exists — then after `onboard`, and since 2026-10-01 after nothing: see the note on
|
|
@@ -891,7 +891,7 @@ var CHAINED = {
|
|
|
891
891
|
// for both, and gets to say something different to each.
|
|
892
892
|
//
|
|
893
893
|
// **The persona crew follows a from-scratch start's market run, and no other**
|
|
894
|
-
// (docs
|
|
894
|
+
// (docs/✅nanopm-54-personas-by-the-crew.md; docs/✅nanopm-63-quick-first.md §2). A start writes a
|
|
895
895
|
// sentence per person, and the crew draws the profile. It followed a scan's market run too
|
|
896
896
|
// until 2026-09-28, to put a critic over the scan's one pass — and the redo, with the pitch
|
|
897
897
|
// behind it, stood between the founder and the first opportunities while redrawing what the
|
|
@@ -900,7 +900,7 @@ var CHAINED = {
|
|
|
900
900
|
// start: the daemon claims in queue order, and the pitch and the map read what it wrote.
|
|
901
901
|
//
|
|
902
902
|
// **The first opportunity map follows the onboarding's own market run, and no other**
|
|
903
|
-
// (docs
|
|
903
|
+
// (docs/✅nanopm-59-opportunity-map.md §8). `ONLY_AFTER` below holds it there: a market run from
|
|
904
904
|
// the card or the terminal queues no map, so a founder's refresh of the landscape never
|
|
905
905
|
// redraws it. It reads the card, the personas and their needs the onboarding wrote, and the
|
|
906
906
|
// market just read; a needs map is one source among the others, never a constraint
|
|
@@ -914,7 +914,7 @@ var CHAINED = {
|
|
|
914
914
|
// draw, on the founder's word; drawn there, it queues nothing and the page offers *Rank
|
|
915
915
|
// again*. The deep map still follows a deep needs map queued after a start (`AFTER_DEEP`).
|
|
916
916
|
market: ["personas", "pitch", "opportunities"],
|
|
917
|
-
// **Solutions follow the map, but not through this table** (docs
|
|
917
|
+
// **Solutions follow the map, but not through this table** (docs/✅nanopm-64-solutions-from-
|
|
918
918
|
// opportunities.md §3): the store queues a Flash the moment a branch ranked high enough has
|
|
919
919
|
// leaves with no solution — when the map is recorded, and when the founder moves, confirms or
|
|
920
920
|
// sets one aside (`queue_solutions_due`). Only some maps call for one, and a map is not the only
|
|
@@ -964,7 +964,7 @@ var SKILL_SENTENCE = {
|
|
|
964
964
|
problems: "working out the problems",
|
|
965
965
|
market: "reading the market",
|
|
966
966
|
// Kept: `research` is no longer chained or run from anywhere a founder can see, but the
|
|
967
|
-
// problem crew still calls it inline for its look outside (docs
|
|
967
|
+
// problem crew still calls it inline for its look outside (docs/✅nanopm-55-market-crew.md
|
|
968
968
|
// §9), and a job of it in the journal should still read as a sentence.
|
|
969
969
|
research: "reading the market",
|
|
970
970
|
personas: "working out who it is for",
|
|
@@ -6892,7 +6892,7 @@ async function attempt4({ adapter, spec, onEvent, role: which, prompt, say }) {
|
|
|
6892
6892
|
harnessWeb: which === "scout" ? spec.harnessWeb : false,
|
|
6893
6893
|
// A role runs on its own model when its manifest names one: the scout on Sonnet, as spec 55
|
|
6894
6894
|
// wanted and as it never did, because every role inherited the coordinator's — the user's
|
|
6895
|
-
// default (docs
|
|
6895
|
+
// default (docs/✅nanopm-57-needs-map.md §10).
|
|
6896
6896
|
model: skill.manifest.model ?? spec.model,
|
|
6897
6897
|
outputSchema: schema,
|
|
6898
6898
|
maxTurns: skill.manifest.maxTurns,
|
|
@@ -7601,7 +7601,7 @@ var OpportunitiesParams = z13.object({
|
|
|
7601
7601
|
chain: z13.boolean().optional(),
|
|
7602
7602
|
repo_path: z13.string().optional(),
|
|
7603
7603
|
// The daemon's: a run chained as background work is claimed once no quick job is queued
|
|
7604
|
-
// (docs
|
|
7604
|
+
// (docs/✅nanopm-63-quick-first.md). The deep map after the deep needs map carries it.
|
|
7605
7605
|
background: z13.boolean().optional()
|
|
7606
7606
|
}).strict();
|
|
7607
7607
|
function opportunitiesAsk(params) {
|
|
@@ -7793,7 +7793,7 @@ async function attempt6({ adapter, spec, onEvent, skill: skillName, name, schema
|
|
|
7793
7793
|
await onEvent({ type: "text", text: say });
|
|
7794
7794
|
for await (const event of adapter.run({
|
|
7795
7795
|
...spec,
|
|
7796
|
-
// A role that may not read the code does not stand in it (docs
|
|
7796
|
+
// A role that may not read the code does not stand in it (docs/✅nanopm-71-deep-dive-lenses.md).
|
|
7797
7797
|
cwd: grant.includes("read_repo") ? spec.cwd : runDir,
|
|
7798
7798
|
runDir,
|
|
7799
7799
|
sessionId: randomUUID8(),
|
|
@@ -13234,7 +13234,7 @@ var MEMORY_TOOL_NAMES = [
|
|
|
13234
13234
|
"list_market",
|
|
13235
13235
|
"write_market",
|
|
13236
13236
|
"remove_files",
|
|
13237
|
-
// Talk to Nano (docs
|
|
13237
|
+
// Talk to Nano (docs/✅nanopm-68-talk-to-nano.md): the map read, and changed as the founder asked.
|
|
13238
13238
|
...TALK_TOOLS
|
|
13239
13239
|
];
|
|
13240
13240
|
async function startMemoryServer(env = process.env) {
|
|
@@ -13969,7 +13969,7 @@ import { promisify as promisify8 } from "util";
|
|
|
13969
13969
|
// package.json
|
|
13970
13970
|
var package_default = {
|
|
13971
13971
|
name: "@nanopm/cli",
|
|
13972
|
-
version: "0.1.
|
|
13972
|
+
version: "0.1.7",
|
|
13973
13973
|
description: "An autonomous product manager for builders who run several small products. Runs on your machine, drives your own coding harness.",
|
|
13974
13974
|
type: "module",
|
|
13975
13975
|
license: "MIT",
|
package/package.json
CHANGED
|
@@ -16,5 +16,5 @@ A mission or a vision the founder has said yes to is theirs. When one exists, th
|
|
|
16
16
|
winner is written beside it as a proposal (`mission-next`, `vision-next`) and the founder
|
|
17
17
|
decides on the business card; the run never replaces a stated row.
|
|
18
18
|
|
|
19
|
-
See docs
|
|
19
|
+
See docs/✅nanopm-53-direction.md, and docs/reference/mission-vision.md for the rules the three
|
|
20
20
|
roles judge by.
|
package/skills/market/SKILL.md
CHANGED
|
@@ -16,4 +16,4 @@ what was learned *about* a company attached to that company rather than beside i
|
|
|
16
16
|
|
|
17
17
|
It replaces `research` everywhere a founder can see. `research` stays in the bundle for one
|
|
18
18
|
caller — the problem crew's inline look outside — and is chained from nowhere
|
|
19
|
-
(docs
|
|
19
|
+
(docs/✅nanopm-55-market-crew.md §9).
|
package/skills/needs/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
The needs crew's coordinator is **code**, not a model: `packages/daemon/src/needs-job.ts`.
|
|
2
2
|
This file exists because a job names a skill and a skill has a manifest.
|
|
3
3
|
|
|
4
|
-
Nothing reads this as a prompt. The run is five roles and a gate (docs
|
|
4
|
+
Nothing reads this as a prompt. The run is five roles and a gate (docs/✅nanopm-57-needs-map.md §4):
|
|
5
5
|
|
|
6
6
|
1. **`needs-listener`** — the product's own users: the signals, the repository's notes about
|
|
7
7
|
people, and on a deep run the connected services (`read_data`). No web, no write.
|
package/skills/onboard/SKILL.md
CHANGED
|
@@ -81,8 +81,9 @@ product is.
|
|
|
81
81
|
it does from the line alone? These three are the pitch the founder reads first on the
|
|
82
82
|
web and says yes to; the pitch crew may propose better ones later, beside theirs.
|
|
83
83
|
- Batch 1, who it is for: `segments` up to 3 — **personas**, see step 4 — and `needs` up
|
|
84
|
-
to 5, each keyed to the persona it belongs to; **`mission` and `vision
|
|
85
|
-
|
|
84
|
+
to 5, each keyed to the persona it belongs to; then **`mission` and `vision`, always** —
|
|
85
|
+
see step 4. They are climbed from the personas and needs, so they come right after them,
|
|
86
|
+
and Direction is the first section the founder reads after the pitch.
|
|
86
87
|
- Batch 2, the rest of what it is and the money: `identity` `what-it-is-for` and at
|
|
87
88
|
most one more, and `revenue` up to 4 (who pays, for what, how much).
|
|
88
89
|
- Batch 3, the product: `products` — the `areas` item, the `not-doing` item, plus up
|
|
@@ -163,18 +164,29 @@ product is.
|
|
|
163
164
|
roadmap, a milestone, a phase or a commit: those are things to build, not outcomes.
|
|
164
165
|
- a principle the code states in words ("no human in the loop", "never email
|
|
165
166
|
without consent") as `preferences`, one line each.
|
|
166
|
-
|
|
167
|
-
**
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
`observed`, with
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
167
|
+
A **mission** (topic `mission`, key `mission`) and a **vision** (topic `vision`, key
|
|
168
|
+
`vision`), **always**: Direction on the card is these two, Yes or Edit (Nicolas,
|
|
169
|
+
2026-10-02). Where the product's own words already say one — the first lines of a README,
|
|
170
|
+
a MANIFESTO, a landing page's hero, an About page, the founder's wiki — write those words,
|
|
171
|
+
`observed`, with the files as sources. Otherwise draft them, `inferred`:
|
|
172
|
+
- **Mission**: the long-term change the founder is making in a business situation, the
|
|
173
|
+
lasting problem they solve, for whom. For whom → what fundamental value → why it
|
|
174
|
+
matters, one sentence under 200 characters a person could repeat from memory.
|
|
175
|
+
- **Vision**: what becomes true for the world, or the industry, once the mission
|
|
176
|
+
succeeds — and a person still living in it, doing something. One or two sentences,
|
|
177
|
+
under 280.
|
|
178
|
+
**Climb to them from the personas and needs, never from the routes and the feature
|
|
179
|
+
set**: a mission read off what the code does is the pitch with a wider adjective
|
|
180
|
+
(docs/✅nanopm-53-direction.md §3). In your head, in order: what the primary persona does
|
|
181
|
+
today *instead* (usually not a product: the time goes and leaves nothing); why they
|
|
182
|
+
struggle, the cause and not the pain; the progress they need, true even if the product
|
|
183
|
+
were rebuilt in another form; their world once it worked. Then compress: the mission from
|
|
184
|
+
the progress, the vision from that world. Before writing, check both against the direction
|
|
185
|
+
crew's must-pass tests (docs/reference/mission-vision.md): neither is the product back —
|
|
186
|
+
no feature, area name, platform, metric or date; no competitor could sign either
|
|
187
|
+
unchanged; the vision is more than today slightly improved, an outcome rather than one
|
|
188
|
+
solution, and adds a picture the mission does not already hold. A stated mission or
|
|
189
|
+
vision is the founder's: propose nothing under its key.
|
|
178
190
|
Only when the repo states a stance in words (a README that says "maintenance mode",
|
|
179
191
|
a roadmap that says "growth"), call set_preferences with `stance_provenance:
|
|
180
192
|
"inferred"`; otherwise do not call it at all. The stance is `grow` until someone says
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
The opportunity crew's coordinator is **code**, not a model: `packages/daemon/src/opportunity-job.ts`.
|
|
2
2
|
This file exists because a job names a skill and a skill has a manifest.
|
|
3
3
|
|
|
4
|
-
Nothing reads this as a prompt. The run (docs
|
|
4
|
+
Nothing reads this as a prompt. The run (docs/✅nanopm-61-opportunity-tree-whole.md §29):
|
|
5
5
|
|
|
6
6
|
**Quick** — the onboarding's run, and a quick *Update the map*:
|
|
7
7
|
|
package/skills/personas/SKILL.md
CHANGED
|
@@ -13,4 +13,4 @@ not write where decisions are made. The crew reads the market view instead — w
|
|
|
13
13
|
already brought back — which is how a competitor's own words about their buyer reach the
|
|
14
14
|
personas without that boundary moving.
|
|
15
15
|
|
|
16
|
-
See docs
|
|
16
|
+
See docs/✅nanopm-50-personas.md.
|
package/skills/pitch/SKILL.md
CHANGED
|
@@ -13,4 +13,4 @@ A pitch the founder has said yes to is theirs. When one exists, the crew's winne
|
|
|
13
13
|
beside it as a proposal (`pitch-<line>-next`) and the founder decides on the business card;
|
|
14
14
|
the run never replaces a stated line.
|
|
15
15
|
|
|
16
|
-
See docs
|
|
16
|
+
See docs/✅nanopm-52-pitch-crew.md.
|
|
@@ -48,7 +48,7 @@ source merely to fill the sources array. Expert hypotheses may have an empty arr
|
|
|
48
48
|
A source whose `provenance` is `inferred` may be marked context or contradicts, never
|
|
49
49
|
supports: the store refuses it, and the refusal aborts the whole publication, so one
|
|
50
50
|
wrong mark costs the entire run. Since the market crew began keeping what it found but
|
|
51
|
-
could not read (docs
|
|
51
|
+
could not read (docs/✅nanopm-55-market-crew.md §5), the competitors it saw named in a
|
|
52
52
|
search and never opened arrive here as `inferred` — they are real names worth reasoning
|
|
53
53
|
from and they are not proof of anything.
|
|
54
54
|
|
package/skills/talk/skill.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "talk",
|
|
3
|
-
"description": "A conversation with Nano about one opportunity (docs
|
|
3
|
+
"description": "A conversation with Nano about one opportunity (docs/✅nanopm-68-talk-to-nano.md): one round per message, on the daemon's quick lane. Nano answers like a CPO on the founder's side — the objective first, one push back, then their call — and changes the map with his tools: what the founder asked for at once, his own ideas only as suggestions.",
|
|
4
4
|
"capabilities": ["talk"],
|
|
5
5
|
"model": "claude-sonnet-5-5",
|
|
6
6
|
"maxTurns": 12,
|