@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 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/nanopm-60-onboarding-end-to-end.md §6).
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/nanopm-68-talk-to-nano.md): read the opportunity map and the
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/nanopm-63-quick-first.md §4).
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/nanopm-59-opportunity-map.md,
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/nanopm-52-pitch-crew.md).
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/nanopm-54-personas-by-the-crew.md; docs/nanopm-63-quick-first.md §2). A start writes a
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/nanopm-59-opportunity-map.md §8). `ONLY_AFTER` below holds it there: a market run from
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/nanopm-64-solutions-from-
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/nanopm-55-market-crew.md
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/nanopm-57-needs-map.md §10).
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/nanopm-63-quick-first.md). The deep map after the deep needs map carries it.
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/nanopm-71-deep-dive-lenses.md).
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/nanopm-68-talk-to-nano.md): the map read, and changed as the founder asked.
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.6",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanopm/cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "An autonomous product manager for builders who run several small products. Runs on your machine, drives your own coding harness.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -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/nanopm-53-direction.md, and docs/reference/mission-vision.md for the rules the three
19
+ See docs/✅nanopm-53-direction.md, and docs/reference/mission-vision.md for the rules the three
20
20
  roles judge by.
@@ -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/nanopm-55-market-crew.md §9).
19
+ (docs/✅nanopm-55-market-crew.md §9).
@@ -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/nanopm-57-needs-map.md §4):
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.
@@ -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` only where the
85
- product's own words already say one** — see step 4.
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
- Two things you **do not** propose, and this is the one place the rule is different: a
167
- **mission** (topic `mission`, key `mission`) and a **vision** (topic `vision`, key
168
- `vision`). Write one only where the product's own words already say it — the first lines
169
- of a README, a MANIFESTO, the hero of a landing page, an About page — and then it is
170
- `observed`, with those files as its sources, in their words and not yours. The vision has
171
- its own cap of 280 characters; the mission is a fact's 200.
172
- **Never infer either from the routes and the feature set.** A mission read off what the
173
- code does is the pitch with a wider adjective, and it is exactly the row this rule exists
174
- to stop (docs/nanopm-53-direction.md §3). If the product's own words do not say where the
175
- company is going, write nothing under these two topics and say so in your final log: the
176
- card asks the founder for the mission in their own words, and the business card drafts a
177
- mission and a vision with them when they ask. Do not write a gap for it: the card asks.
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/nanopm-61-opportunity-tree-whole.md §29):
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
 
@@ -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/nanopm-50-personas.md.
16
+ See docs/✅nanopm-50-personas.md.
@@ -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/nanopm-52-pitch-crew.md.
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/nanopm-55-market-crew.md §5), the competitors it saw named in a
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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "talk",
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.",
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,