plotcoder-board 0.1.0 → 0.1.5
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/package.json
CHANGED
|
@@ -179,9 +179,10 @@ let accountTried = false;
|
|
|
179
179
|
/** Why the door is shut when the writer's sign-in is set but failed. Every tool says this; none reads the file instead (round four, findings 5–7). */
|
|
180
180
|
let accountRefusal = null;
|
|
181
181
|
const NO_PROJECT_YET = "The account holds no project yet: new_project starts the writer's first.";
|
|
182
|
-
/** The same, with the folder named only when
|
|
182
|
+
/** The same, naming the account, with the folder named only when a wall in the folder was left alone (rounds eight and ten). */
|
|
183
183
|
function noProjectYet() {
|
|
184
|
-
|
|
184
|
+
const who = accountDoor?.email ? `The account, as ${accountDoor.email}, holds no project yet: new_project starts the writer's first.` : NO_PROJECT_YET;
|
|
185
|
+
return accountDoor?.skippedFolder ? `${who} The sample wall in this folder was not uploaded.` : who;
|
|
185
186
|
}
|
|
186
187
|
|
|
187
188
|
/** A door's answer — shut, or no project yet — thrown from a read and turned into a plain reply by every tool. Not an error. */
|
|
@@ -394,7 +395,8 @@ async function chooseProject(key) {
|
|
|
394
395
|
});
|
|
395
396
|
if (!work) {
|
|
396
397
|
accountDoor.projectId = null;
|
|
397
|
-
|
|
398
|
+
// Only a folder that actually held a wall is worth a word.
|
|
399
|
+
accountDoor.skippedFolder = Boolean(file) || fs.existsSync(BOARD_FILE);
|
|
398
400
|
return null;
|
|
399
401
|
}
|
|
400
402
|
record = { ...record, name: record.name || "From the agent" };
|
|
@@ -1122,7 +1124,7 @@ server.registerTool(
|
|
|
1122
1124
|
{
|
|
1123
1125
|
title: "Read the wall",
|
|
1124
1126
|
description:
|
|
1125
|
-
"Read the board back: the beats in wall order (rows top to bottom, cards left to right), the pages of scenes between consecutive beats, and the questions the wall raises — a run out of proportion with the others
|
|
1127
|
+
"Read the board back: the beats in wall order (rows top to bottom, cards left to right), the pages of scenes between consecutive beats with the cards in each, every setup with the distance to its payoff, and the questions the wall raises — no beat marked yet; a run out of proportion with the others; beats back to back with nothing between them (a chain of them is one question); a card with a placeholder headline or no change line; a card no arrow touches; two headlines that read like the same scene; a group too long to be one sequence; a person in the cast on no card; a person gone for more than a third of the story and ten pages; a payoff before its setup on the wall; a folded card no setup arrow pays off; cards that say no place once any card has one. These are questions, not fixes: put them to the writer and do not act on them unasked. It says nothing about how many beats there should be, and neither should you.",
|
|
1126
1128
|
inputSchema: {},
|
|
1127
1129
|
},
|
|
1128
1130
|
async () => {
|
|
@@ -1771,7 +1773,7 @@ server.registerTool(
|
|
|
1771
1773
|
{
|
|
1772
1774
|
title: "Fold the corner",
|
|
1773
1775
|
description:
|
|
1774
|
-
`Fold the corner of cards — mark them as planting something — or unfold them. ${wordSentence("corner")}
|
|
1776
|
+
`Fold the corner of cards — mark them as planting something — or unfold them. ${wordSentence("corner")} The setup arrow is create_arrow with kind 'setup'. Folding never moves a card.`,
|
|
1775
1777
|
inputSchema: {
|
|
1776
1778
|
ids: z.array(z.string()).min(1),
|
|
1777
1779
|
plants: z.boolean(),
|
|
@@ -2218,7 +2220,23 @@ server.registerTool(
|
|
|
2218
2220
|
inputSchema: {},
|
|
2219
2221
|
},
|
|
2220
2222
|
async () => {
|
|
2221
|
-
|
|
2223
|
+
let read;
|
|
2224
|
+
try {
|
|
2225
|
+
read = await readProject();
|
|
2226
|
+
} catch (error) {
|
|
2227
|
+
if (!(error instanceof DoorReply)) throw error;
|
|
2228
|
+
// No project on the account yet: the house principles still exist, and
|
|
2229
|
+
// an agent is told to read them before it changes anything (round ten).
|
|
2230
|
+
const house = currentReminders(null);
|
|
2231
|
+
return ok(
|
|
2232
|
+
[
|
|
2233
|
+
`reminders (${error.message.replace(/\.$/, "")}): ${house.length} — the house principles the app starts every project with; the writer's own will live on the project`,
|
|
2234
|
+
...house.map((item) => ` - ${item.id} (built in) — ${item.title}: ${item.body}`),
|
|
2235
|
+
].join("\n"),
|
|
2236
|
+
house,
|
|
2237
|
+
);
|
|
2238
|
+
}
|
|
2239
|
+
const { reminders, live, project, base } = read;
|
|
2222
2240
|
const list = currentReminders(reminders);
|
|
2223
2241
|
const own = list.filter((item) => !item.builtIn).length;
|
|
2224
2242
|
return ok(
|
package/src/board/agents.js
CHANGED
|
@@ -42,7 +42,7 @@ export const AGENTS = {
|
|
|
42
42
|
text: "Skip this when the account is the wall. Without an account, a wall is a folder: any folder, empty is fine — choose one that will outlive your session, never a scratch one. The app run from that folder shows the wall, and the server writes it there (PLOTCODER_ROOT, or the folder it is run from). A fresh folder holds the sample; new_board for the writer's wall, then rename_project. No app running? export_fountain is the wall in order, as text.",
|
|
43
43
|
},
|
|
44
44
|
],
|
|
45
|
-
firstNote: "
|
|
45
|
+
firstNote: "These four are about the wall you will work, so after open_project or open_board, read_wall again. On an account with no project yet, read_wall has nothing to read and says so, and list_reminders gives the house principles every project starts with; new_project, then the four again. No server in front of you, and no shell to take the shell door? Nothing gets you in from inside the session: say so, and ask the person to wire the server and start a new session.",
|
|
46
46
|
first: [
|
|
47
47
|
{ tool: "list_words", why: "the room's words, the app's meaning." },
|
|
48
48
|
{ tool: "read_wall", why: "what is here, and what it asks. A fresh folder holds a sample wall (Maya, Tom, the letter) and says so; it is not the writer's." },
|
|
@@ -69,8 +69,9 @@ export function agentsAsText() {
|
|
|
69
69
|
lines.push(`- ${door.name}: ${door.text}`);
|
|
70
70
|
if (door.code) lines.push("", "```", door.code, "```", "");
|
|
71
71
|
}
|
|
72
|
-
lines.push("## Call these first"
|
|
72
|
+
lines.push("## Call these first");
|
|
73
73
|
AGENTS.first.forEach((item, index) => lines.push(`${index + 1}. ${item.tool} — ${item.why}`));
|
|
74
|
+
lines.push("", AGENTS.firstNote);
|
|
74
75
|
lines.push("", "## Rules");
|
|
75
76
|
for (const rule of AGENTS.rules) lines.push(`- ${rule}`);
|
|
76
77
|
lines.push("", "## For the person", AGENTS.person, "", "## The guide", AGENTS.guide, "");
|
package/src/board/workflows.js
CHANGED
|
@@ -15,8 +15,8 @@ export const WORKFLOWS = [
|
|
|
15
15
|
id: "break-a-treatment",
|
|
16
16
|
name: "Break a treatment into a wall",
|
|
17
17
|
ask: "Here is a treatment. Break it into a wall: one card per scene with a headline and what changes, the cast on each card, the places, and the major turns marked as beats.",
|
|
18
|
-
tools: ["list_words", "read_wall", "list_reminders", "new_board", "rename_project", "set_target", "create_note", "list_board", "add_character", "cast", "update_character", "set_location", "set_rank", "set_length", "set_plant", "create_arrow", "create_group", "organize"],
|
|
19
|
-
then: "Read the wall (read_wall) and say what it asks. A treatment is cards, one create_note each, with characters, location, rank and plants on the call; import_fountain is the door for pages, not a treatment — a scene's text measures its card.",
|
|
18
|
+
tools: ["list_words", "read_wall", "list_reminders", "new_project", "new_board", "rename_project", "set_target", "create_note", "list_board", "add_character", "cast", "update_character", "set_location", "set_rank", "set_length", "set_plant", "create_arrow", "create_group", "organize"],
|
|
19
|
+
then: "Start where the wall will live: on the account, new_project names it; in a folder, new_board for the writer's wall, then rename_project. Read the wall (read_wall) and say what it asks. A treatment is cards, one create_note each, with characters, location, rank and plants on the call; import_fountain is the door for pages, not a treatment — a scene's text measures its card.",
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
id: "read-and-raise",
|