@nanopm/cli 0.1.2 → 0.1.3
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 +13 -40
- package/package.json +1 -1
- package/skills/onboard/SKILL.md +2 -2
package/dist/index.js
CHANGED
|
@@ -863,22 +863,14 @@ var CHAINED = {
|
|
|
863
863
|
// (`mapping_completion_hook`): the opportunity map follows the market read below, and
|
|
864
864
|
// the founder confirms what the scan proposed on the card while it is drawn.
|
|
865
865
|
//
|
|
866
|
-
//
|
|
867
|
-
//
|
|
868
|
-
//
|
|
869
|
-
//
|
|
870
|
-
//
|
|
871
|
-
//
|
|
872
|
-
// the
|
|
873
|
-
|
|
874
|
-
//
|
|
875
|
-
// It does not close the gap — nothing chained can, while the read itself takes 161s — which
|
|
876
|
-
// is why the mission is asked for on the way in and the vision is drawn as *coming*
|
|
877
|
-
// (docs/nanopm-56-the-required-set.md). This makes that wait honest rather than shorter
|
|
878
|
-
// than it looks.
|
|
879
|
-
// Since 2026-09-30 the direction is queued only when the onboarding left the mission or the
|
|
880
|
-
// vision empty (`WRITTEN_BY_PARENT`): with both written, it had nothing to fill.
|
|
881
|
-
onboard: ["market", "direction"],
|
|
866
|
+
// **The direction crew does not follow an onboarding** (Nicolas, 2026-10-01, docs/ACTIVATION.md
|
|
867
|
+
// row 27). It was queued here, in the background, whenever the read left the mission or the
|
|
868
|
+
// vision empty, and it landed 9 to 24 minutes later — after the market, the map and the
|
|
869
|
+
// solutions — while the card's Direction step, right after the pitch, promised *a few
|
|
870
|
+
// minutes*. Direction now works like the card's other sections: the read writes what the
|
|
871
|
+
// repository states, the card asks the founder for a mission it did not find (`missionAsk`),
|
|
872
|
+
// and the crew runs when the founder asks for it from the business card.
|
|
873
|
+
onboard: ["market"],
|
|
882
874
|
// A problem list is what solutions hang under, so a fresh list is followed by fresh
|
|
883
875
|
// solutions. **The problem crew itself is retired** (docs/nanopm-59-opportunity-map.md,
|
|
884
876
|
// Guillaume, 2026-09-25): the opportunity map replaced it, and nothing queues it any more —
|
|
@@ -891,10 +883,8 @@ var CHAINED = {
|
|
|
891
883
|
// proposes beside a confirmed pitch and never over it (docs/nanopm-52-pitch-crew.md).
|
|
892
884
|
//
|
|
893
885
|
// The direction crew **was** chained here too, for the same reason — a vision rests on who
|
|
894
|
-
// else exists —
|
|
895
|
-
//
|
|
896
|
-
// the onboarding starts only once the market, queued a hair before it, has finished. All
|
|
897
|
-
// it gave up was waiting behind the pitch, which it never read. See the note on `onboard`.
|
|
886
|
+
// else exists — then after `onboard`, and since 2026-10-01 after nothing: see the note on
|
|
887
|
+
// `onboard`.
|
|
898
888
|
//
|
|
899
889
|
// Neither follows a personas run the founder started: they pressed one button, for one
|
|
900
890
|
// crew, with a note meant for it (Guillaume, 2026-09-22). A founder who wants both runs asks
|
|
@@ -948,16 +938,6 @@ var ONLY_AFTER = {
|
|
|
948
938
|
var NEVER_AFTER = {
|
|
949
939
|
market: { pitch: ["onboard"] }
|
|
950
940
|
};
|
|
951
|
-
var WRITTEN_BY_PARENT = {
|
|
952
|
-
onboard: { direction: ["mission", "vision"] }
|
|
953
|
-
};
|
|
954
|
-
function stillOwed(skill, next2, written) {
|
|
955
|
-
const needs2 = WRITTEN_BY_PARENT[skill] ?? {};
|
|
956
|
-
return next2.filter((n) => !needs2[n] || needs2[n].some((topic) => !written.has(topic)));
|
|
957
|
-
}
|
|
958
|
-
var BACKGROUND_EDGES = {
|
|
959
|
-
onboard: ["direction"]
|
|
960
|
-
};
|
|
961
941
|
var AFTER_DEEP = {
|
|
962
942
|
needs: ["opportunities"]
|
|
963
943
|
};
|
|
@@ -10956,12 +10936,6 @@ async function runDaemon(options = {}) {
|
|
|
10956
10936
|
}
|
|
10957
10937
|
return { daemonId, processed };
|
|
10958
10938
|
}
|
|
10959
|
-
async function topicsWritten(auth, projectId, skill) {
|
|
10960
|
-
const topics = [...new Set(Object.values(WRITTEN_BY_PARENT[skill] ?? {}).flat())];
|
|
10961
|
-
if (!topics.length) return /* @__PURE__ */ new Set();
|
|
10962
|
-
const { data } = await auth.client.from("memory").select("topic").eq("project_id", projectId).in("topic", topics).is("superseded_by", null);
|
|
10963
|
-
return new Set((data ?? []).map((r) => r.topic));
|
|
10964
|
-
}
|
|
10965
10939
|
async function chainAfter(auth, job, outcome, log) {
|
|
10966
10940
|
if (NOT_CHAINED_BY_DAEMON.includes(job.skill)) return;
|
|
10967
10941
|
if (job.params?.chain === false) return;
|
|
@@ -10969,14 +10943,13 @@ async function chainAfter(auth, job, outcome, log) {
|
|
|
10969
10943
|
const parent = job.parent_job_id ? await parentOf(auth, job.parent_job_id) : null;
|
|
10970
10944
|
const own = job.params ?? {};
|
|
10971
10945
|
const deep = own.depth === "deep" && job.trigger === "hook";
|
|
10972
|
-
const next2 =
|
|
10946
|
+
const next2 = daemonQueues(job.skill, 0, parent?.skill ?? null, deep);
|
|
10973
10947
|
if (!next2.length) return;
|
|
10974
10948
|
if (await chainDepth(auth, job) >= CHAIN_DEPTH_MAX) return;
|
|
10975
10949
|
const from = deep ? own.repo_path : parent?.params?.repo_path;
|
|
10976
10950
|
const repo = typeof from === "string" ? { repo_path: from } : null;
|
|
10977
10951
|
for (const skill of next2) {
|
|
10978
|
-
const
|
|
10979
|
-
const params = { ...repo ?? {}, ...deep ? { depth: "deep" } : {}, ...background ? { background: true } : {} };
|
|
10952
|
+
const params = { ...repo ?? {}, ...deep ? { depth: "deep", background: true } : {} };
|
|
10980
10953
|
const { data, error } = await auth.client.from("jobs").insert({
|
|
10981
10954
|
project_id: job.project_id,
|
|
10982
10955
|
skill,
|
|
@@ -13909,7 +13882,7 @@ import { promisify as promisify7 } from "util";
|
|
|
13909
13882
|
// package.json
|
|
13910
13883
|
var package_default = {
|
|
13911
13884
|
name: "@nanopm/cli",
|
|
13912
|
-
version: "0.1.
|
|
13885
|
+
version: "0.1.3",
|
|
13913
13886
|
description: "An autonomous product manager for builders who run several small products. Runs on your machine, drives your own coding harness.",
|
|
13914
13887
|
type: "module",
|
|
13915
13888
|
license: "MIT",
|
package/package.json
CHANGED
package/skills/onboard/SKILL.md
CHANGED
|
@@ -171,8 +171,8 @@ product is.
|
|
|
171
171
|
code does is the pitch with a wider adjective, and it is exactly the row this rule exists
|
|
172
172
|
to stop (docs/nanopm-53-direction.md §3). If the product's own words do not say where the
|
|
173
173
|
company is going, write nothing under these two topics and say so in your final log: the
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
card asks the founder for the mission in their own words, and the business card drafts a
|
|
175
|
+
mission and a vision with them when they ask. Do not write a gap for it: the card asks.
|
|
176
176
|
Only when the repo states a stance in words (a README that says "maintenance mode",
|
|
177
177
|
a roadmap that says "growth"), call set_preferences with `stance_provenance:
|
|
178
178
|
"inferred"`; otherwise do not call it at all. The stance is `grow` until someone says
|