pi-para 0.8.3 → 0.8.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/CHANGELOG.md +17 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +4 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +22 -1
- package/dist/context.js.map +1 -1
- package/dist/lint.d.ts +6 -0
- package/dist/lint.d.ts.map +1 -1
- package/dist/lint.js +62 -0
- package/dist/lint.js.map +1 -1
- package/dist/questions.d.ts +99 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +200 -0
- package/dist/questions.js.map +1 -0
- package/dist/templates/prompts.d.ts +3 -3
- package/dist/templates/prompts.d.ts.map +1 -1
- package/dist/templates/prompts.js +8 -2
- package/dist/templates/prompts.js.map +1 -1
- package/dist/tools/edit-read.d.ts +2 -0
- package/dist/tools/edit-read.d.ts.map +1 -1
- package/dist/tools/edit-read.js +19 -4
- package/dist/tools/edit-read.js.map +1 -1
- package/dist/tools/lint.d.ts +1 -0
- package/dist/tools/lint.d.ts.map +1 -1
- package/dist/tools/lint.js +2 -0
- package/dist/tools/lint.js.map +1 -1
- package/dist/tools/query.d.ts +2 -2
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +12 -1
- package/dist/tools/query.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +10 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools.d.ts +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js.map +1 -1
- package/dist/wiki.d.ts.map +1 -1
- package/dist/wiki.js +4 -1
- package/dist/wiki.js.map +1 -1
- package/package.json +6 -2
- package/skills/para/SKILL.md +9 -0
- package/src/config.ts +3 -0
- package/src/context.ts +27 -1
- package/src/lint.ts +77 -0
- package/src/questions.ts +287 -0
- package/src/templates/prompts.ts +8 -2
- package/src/templates/schema.md +4 -1
- package/src/tools/edit-read.ts +23 -4
- package/src/tools/lint.ts +3 -1
- package/src/tools/query.ts +14 -2
- package/src/tools/write.ts +10 -1
- package/src/tools.ts +1 -1
- package/src/wiki.ts +4 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open questions: the "## Open Questions" section of a page, as tracked items.
|
|
3
|
+
*
|
|
4
|
+
* A question is one bullet line. Written by an agent it carries the date it was asked and, when the host has one, the
|
|
5
|
+
* session that asked it:
|
|
6
|
+
*
|
|
7
|
+
* - [ ] (2026-10-18, #993) Does the picker need a "key no longer works" state?
|
|
8
|
+
*
|
|
9
|
+
* When it is answered, the line moves to "## Resolved Questions", ticked, with the date and session that answered it,
|
|
10
|
+
* and the answer after an arrow:
|
|
11
|
+
*
|
|
12
|
+
* - [x] (2026-10-19, #1204) Does the picker need a "key no longer works" state? → yes: machine health (#72)
|
|
13
|
+
*
|
|
14
|
+
* Older pages hold plain bullets (`- question`); they count as open, asked when the page was last updated. A ticked or
|
|
15
|
+
* struck-through line left in the open section counts as resolved.
|
|
16
|
+
*
|
|
17
|
+
* The rest of pi-para uses this to show a page's open questions when it is read or found, to list the wiki's open
|
|
18
|
+
* questions for a session's prompt, to point out questions a page just written may answer, and to flag stale ones.
|
|
19
|
+
*/
|
|
20
|
+
import { matchesScope } from "./scope.js";
|
|
21
|
+
import { stat } from "node:fs/promises";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { listPages, readPage } from "./wiki.js";
|
|
24
|
+
export const OPEN_SECTION = "Open Questions";
|
|
25
|
+
export const RESOLVED_SECTION = "Resolved Questions";
|
|
26
|
+
const LINE = /^\s*[-*]\s+(?:\[( |x|X)\]\s+)?(?:\((\d{4}-\d{2}-\d{2})(?:,\s*(#?[\w.:/-]+))?\)\s+)?(.+?)\s*$/;
|
|
27
|
+
/** The lines of a `## <name>` section of a page's body, up to the next heading of level 1 or 2. */
|
|
28
|
+
export function sectionLines(body, name) {
|
|
29
|
+
const lines = body.split("\n");
|
|
30
|
+
const start = lines.findIndex((line) => line.trim().toLowerCase() === `## ${name.toLowerCase()}`);
|
|
31
|
+
if (start === -1) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const rest = lines.slice(start + 1);
|
|
35
|
+
const end = rest.findIndex((line) => /^#{1,2}\s/.test(line));
|
|
36
|
+
return end === -1 ? rest : rest.slice(0, end);
|
|
37
|
+
}
|
|
38
|
+
/** The question lines of a section: its bullets, each read as a question. Placeholder bullets ("none") are left out. */
|
|
39
|
+
export function parseQuestions(body, name = OPEN_SECTION) {
|
|
40
|
+
return sectionLines(body, name).flatMap((line) => {
|
|
41
|
+
const match = LINE.exec(line);
|
|
42
|
+
if (match === null) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const [, mark, date, session, words] = match;
|
|
46
|
+
const struck = /^~~.*~~$/.test(words.trim());
|
|
47
|
+
const text = words.replace(/^~~|~~$/g, "").trim();
|
|
48
|
+
if (/^(none|n\/a|-|—|\(none\)|nothing yet\.?)$/i.test(text) || /^\[.*gaps in knowledge.*\]$/i.test(text)) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
line,
|
|
54
|
+
text,
|
|
55
|
+
...(date === undefined ? {} : { date }),
|
|
56
|
+
...(session === undefined ? {} : { session: session.startsWith("#") ? session : `#${session}` }),
|
|
57
|
+
done: (mark !== undefined && mark !== " ") || struck,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** A page's open questions: the section's lines that are not ticked. */
|
|
63
|
+
export function openQuestionsOf(body) {
|
|
64
|
+
return parseQuestions(body).filter((question) => !question.done);
|
|
65
|
+
}
|
|
66
|
+
/** A question line as an agent writes it: `- [ ] (date, #session) text`. */
|
|
67
|
+
export function questionLine(text, { date, session }) {
|
|
68
|
+
return `- [ ] (${date}${session === undefined ? "" : `, ${session.startsWith("#") ? session : `#${session}`}`}) ${text.trim()}`;
|
|
69
|
+
}
|
|
70
|
+
/** A resolved line: `- [x] (date, #session) text → answer`. */
|
|
71
|
+
export function resolvedLine(text, answer, { date, session }) {
|
|
72
|
+
return `- [x] (${date}${session === undefined ? "" : `, ${session.startsWith("#") ? session : `#${session}`}`}) ${text.trim()} → ${answer.trim()}`;
|
|
73
|
+
}
|
|
74
|
+
/** Whole days from `date` (YYYY-MM-DD or ISO) to `now`. */
|
|
75
|
+
export function daysSince(date, now = Date.now()) {
|
|
76
|
+
const at = Date.parse(date.length === 10 ? `${date}T00:00:00Z` : date);
|
|
77
|
+
return Number.isNaN(at) ? 0 : Math.max(0, Math.floor((now - at) / 86_400_000));
|
|
78
|
+
}
|
|
79
|
+
/** Each page's open questions as last read, by file, with the file's mtime and size: a page reads again only when it changed. */
|
|
80
|
+
const pageCache = new Map();
|
|
81
|
+
/** A page's open questions, from the cache while its file is unchanged. */
|
|
82
|
+
async function pageQuestions(wikiDir, category, slug) {
|
|
83
|
+
const file = join(wikiDir, category, `${slug}.md`);
|
|
84
|
+
let info;
|
|
85
|
+
try {
|
|
86
|
+
info = await stat(file);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
pageCache.delete(file);
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
const cached = pageCache.get(file);
|
|
93
|
+
if (cached !== undefined && cached.mtimeMs === info.mtimeMs && cached.size === info.size) {
|
|
94
|
+
return cached.questions;
|
|
95
|
+
}
|
|
96
|
+
const page = await readPage(wikiDir, category, slug);
|
|
97
|
+
const updated = page === null ? "" : (page.frontmatter.updated || page.frontmatter.created || "").slice(0, 10);
|
|
98
|
+
const questions = page === null
|
|
99
|
+
? []
|
|
100
|
+
: openQuestionsOf(page.body).map((question) => ({
|
|
101
|
+
...question,
|
|
102
|
+
title: page.frontmatter.title,
|
|
103
|
+
scope: page.frontmatter.scope,
|
|
104
|
+
asked: question.date ?? updated,
|
|
105
|
+
}));
|
|
106
|
+
pageCache.set(file, { mtimeMs: info.mtimeMs, size: info.size, questions });
|
|
107
|
+
return questions;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Every open question in the wiki, oldest first. Archives are left out unless asked for: a finished project's
|
|
111
|
+
* questions are history. With `scope`, the ones on pages in that scope come first (`inScope`). Pages are read again
|
|
112
|
+
* only when their file changed.
|
|
113
|
+
*/
|
|
114
|
+
export async function collectOpenQuestions(wikiDir, { scope, includeArchives = false } = {}) {
|
|
115
|
+
const refs = await listPages(wikiDir);
|
|
116
|
+
const found = [];
|
|
117
|
+
for (const ref of refs) {
|
|
118
|
+
if (ref.category === "archives" && !includeArchives) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
for (const question of await pageQuestions(wikiDir, ref.category, ref.slug)) {
|
|
122
|
+
found.push({
|
|
123
|
+
...question,
|
|
124
|
+
page: `${ref.category}/${ref.slug}`,
|
|
125
|
+
inScope: scope === undefined ? true : matchesScope(question.scope, scope),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return found.sort((a, b) => Number(b.inScope) - Number(a.inScope) || a.asked.localeCompare(b.asked));
|
|
130
|
+
}
|
|
131
|
+
/** Open questions as short Markdown lines: `- «text» on [[slug]] (asked date, #session)`. */
|
|
132
|
+
export function formatOpenQuestions(questions, { max = 10, chars = 180 } = {}) {
|
|
133
|
+
const shown = questions.slice(0, max).map((question) => {
|
|
134
|
+
const text = question.text.length > chars ? `${question.text.slice(0, chars - 1)}…` : question.text;
|
|
135
|
+
const slug = question.page.split("/").pop();
|
|
136
|
+
return `- ${text} — on [[${slug}]] (${question.page}), asked ${question.asked}${question.session ? `, ${question.session}` : ""}`;
|
|
137
|
+
});
|
|
138
|
+
const more = questions.length - shown.length;
|
|
139
|
+
return [...shown, ...(more > 0 ? [`- …and ${more} more (wiki_lint lists them all)`] : [])].join("\n");
|
|
140
|
+
}
|
|
141
|
+
/** How to resolve one, in the words the tools and prompts use. */
|
|
142
|
+
export const RESOLVE_HOW = 'To resolve one, wiki_edit its page: remove its line from "## Open Questions" and add under "## Resolved Questions" `- [x] (YYYY-MM-DD, #session) <question> → <answer>` (today, and your session if you know it).';
|
|
143
|
+
// -- Questions a page just written may answer ---------------------------------
|
|
144
|
+
const STOP = new Set("a an and are as at be been but by can could did do does for from had has have how if in into is it its of on or should so than that the their then there these this those to was were what when where whether which who why will with would yet not no any all our we you your".split(" "));
|
|
145
|
+
/** The meaningful words of a text: lower case, without stop words or very short ones. */
|
|
146
|
+
function words(text) {
|
|
147
|
+
return new Set(text
|
|
148
|
+
.toLowerCase()
|
|
149
|
+
.replace(/[`*_[\]()<>"'“”‘’.,;:!?/\\|{}=+]/g, " ")
|
|
150
|
+
.split(/\s+/)
|
|
151
|
+
.filter((word) => word.length > 2 && !STOP.has(word)));
|
|
152
|
+
}
|
|
153
|
+
/** Of a question's meaningful words, how many the text has, and the share. */
|
|
154
|
+
function overlap(question, text) {
|
|
155
|
+
const own = [...words(question)];
|
|
156
|
+
const shared = own.filter((word) => text.has(word)).length;
|
|
157
|
+
return { shared, share: own.length === 0 ? 0 : shared / own.length };
|
|
158
|
+
}
|
|
159
|
+
/** A page's body without its open questions section: what it says, not what it asks. */
|
|
160
|
+
function withoutOpenSection(body) {
|
|
161
|
+
const lines = body.split("\n");
|
|
162
|
+
const start = lines.findIndex((line) => line.trim().toLowerCase() === `## ${OPEN_SECTION.toLowerCase()}`);
|
|
163
|
+
if (start === -1) {
|
|
164
|
+
return body;
|
|
165
|
+
}
|
|
166
|
+
const end = lines.findIndex((line, index) => index > start && /^#{1,2}\s/.test(line));
|
|
167
|
+
return [...lines.slice(0, start), ...(end === -1 ? [] : lines.slice(end))].join("\n");
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Open questions anywhere in the wiki that `written` (pages just written, by `category/slug`, with their new body) may
|
|
171
|
+
* answer, best first: the new text, without its own open questions, has at least half of a question's meaningful
|
|
172
|
+
* words, and two or more of them. Questions on the written pages count too: a page that answers its own question should
|
|
173
|
+
* resolve it. Fast and local, for every write; lint finds more by meaning once the search index has the new text.
|
|
174
|
+
*/
|
|
175
|
+
export async function questionsMaybeAnswered(wikiDir, written, { max = 5 } = {}) {
|
|
176
|
+
if (written.length === 0) {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
const open = await collectOpenQuestions(wikiDir);
|
|
180
|
+
const text = words(written.map((each) => withoutOpenSection(each.text)).join("\n"));
|
|
181
|
+
return open
|
|
182
|
+
.map((question) => ({ question, ...overlap(question.text, text) }))
|
|
183
|
+
.filter(({ shared, share }) => shared >= 2 && share >= 0.5)
|
|
184
|
+
.sort((a, b) => b.share - a.share || b.shared - a.shared)
|
|
185
|
+
.slice(0, max)
|
|
186
|
+
.map(({ question, shared }) => ({ ...question, why: `the new text has ${shared} of its key words` }));
|
|
187
|
+
}
|
|
188
|
+
/** The note a write's tool result ends with, when it may answer open questions; empty otherwise. */
|
|
189
|
+
export function answeredNote(candidates) {
|
|
190
|
+
if (candidates.length === 0) {
|
|
191
|
+
return "";
|
|
192
|
+
}
|
|
193
|
+
return [
|
|
194
|
+
"",
|
|
195
|
+
`This may answer ${candidates.length === 1 ? "an open question" : `${candidates.length} open questions`} in the wiki:`,
|
|
196
|
+
...candidates.map((question) => `- «${question.text}» on ${question.page}, asked ${question.asked}${question.session ? ` (${question.session})` : ""}: ${question.why}`),
|
|
197
|
+
`If it does, resolve it. ${RESOLVE_HOW}`,
|
|
198
|
+
].join("\n");
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,12 +19,12 @@ export declare const QUERY_PROMPT = "Read the retrieved wiki pages below and syn
|
|
|
19
19
|
* System prompt for summarization — produces structured wiki pages from content.
|
|
20
20
|
* Mirrors pi's SUMMARIZATION_SYSTEM_PROMPT but outputs wiki format.
|
|
21
21
|
*/
|
|
22
|
-
export declare const SUMMARIZE_SYSTEM_PROMPT = "You are a knowledge synthesis assistant. Read the content below and produce a structured wiki page following the EXACT format specified in the schema.\n\nDo NOT continue any conversation. Do NOT respond to any questions in the content. ONLY output the structured wiki page using the wiki summary format:\n\n## Topic\n[What this page covers]\n\n## Key Facts\n- [Established knowledge points]\n\n## Insights\n- [Non-obvious findings, patterns, implications]\n\n## Connections\n- [[related-page]] \u2014 how this relates\n\n## Open Questions\n- [
|
|
22
|
+
export declare const SUMMARIZE_SYSTEM_PROMPT = "You are a knowledge synthesis assistant. Read the content below and produce a structured wiki page following the EXACT format specified in the schema.\n\nDo NOT continue any conversation. Do NOT respond to any questions in the content. ONLY output the structured wiki page using the wiki summary format:\n\n## Topic\n[What this page covers]\n\n## Key Facts\n- [Established knowledge points]\n\n## Insights\n- [Non-obvious findings, patterns, implications]\n\n## Connections\n- [[related-page]] \u2014 how this relates\n\n## Open Questions\n- [ ] (YYYY-MM-DD, #session) [A gap in knowledge or an unresolved contradiction: one line each, with the date asked and the session if known]\n\n## Resolved Questions\n- [x] (YYYY-MM-DD, #session) [The question, as it was] \u2192 [its answer: the date and session that resolved it]\n\n## Sources\n- [Source URLs, file paths, session references]";
|
|
23
23
|
/**
|
|
24
24
|
* Prompt for iterative update — merging new info into an existing page.
|
|
25
25
|
* Mirrors pi's UPDATE_SUMMARIZATION_PROMPT approach.
|
|
26
26
|
*/
|
|
27
|
-
export declare const ITERATIVE_UPDATE_PROMPT = "The content below is NEW information to incorporate into the existing wiki page provided in <existing-page> tags.\n\nRULES:\n- PRESERVE all existing knowledge from the previous page\n- ADD new facts, insights, and connections from the new content\n- UPDATE sections where new info supersedes old\n- FLAG contradictions between old and new content in Open Questions\n- PRESERVE exact names, paths, and technical details\n- Maintain all existing [[wikilinks]] and add new ones as appropriate\n- Update the Sources section to include the new source";
|
|
27
|
+
export declare const ITERATIVE_UPDATE_PROMPT = "The content below is NEW information to incorporate into the existing wiki page provided in <existing-page> tags.\n\nRULES:\n- PRESERVE all existing knowledge from the previous page\n- ADD new facts, insights, and connections from the new content\n- UPDATE sections where new info supersedes old\n- FLAG contradictions between old and new content in Open Questions\n- RESOLVE open questions the new content answers: move each from Open Questions to Resolved Questions as `- [x] (date, #session) question \u2192 answer`; keep the rest as they are\n- PRESERVE exact names, paths, and technical details\n- Maintain all existing [[wikilinks]] and add new ones as appropriate\n- Update the Sources section to include the new source";
|
|
28
28
|
/**
|
|
29
29
|
* Prompt for overview generation from multiple pages.
|
|
30
30
|
*/
|
|
@@ -37,7 +37,7 @@ export declare const LINT_PROMPT = "Review the lint results below and fix all au
|
|
|
37
37
|
* System prompt for the standalone capture agent.
|
|
38
38
|
* Used as WIKI_SYSTEM_PROMPT for the capture agent instance.
|
|
39
39
|
*/
|
|
40
|
-
export declare const CAPTURE_SYSTEM_PROMPT = "You are a knowledge capture assistant. Your job is to extract persistent knowledge from coding sessions and write it to a PARA-structured wiki.\n\nCapture ANY of the following \u2014 even from short sessions:\n- Architecture decisions and rationale (\"we chose X because Y\")\n- Debugging solutions (root cause + fix)\n- Server/infrastructure details (IPs, paths, credentials locations, configs)\n- Build and deployment procedures (commands, steps, gotchas)\n- API keys, service endpoints, and where they are stored\n- Project conventions and coding patterns\n- Tool configurations and setup steps\n- Dependencies and version constraints\n- Environment-specific knowledge (dev vs prod differences)\n- Operational runbooks (how to restart, deploy, rollback)\n\nIndex is auto-rebuilt after every write \u2014 do not manage index.md manually. Do NOT pass indexContent to wiki_write.\n\nRules:\n- If the session was ONLY greetings or completely off-topic chitchat with zero project knowledge, respond with \"nothing to capture\"\n- Otherwise, always capture \u2014 even small facts are valuable (\"the deploy key is at /path/to/key\")\n- Classify each piece of knowledge by PARA category autonomously\n- When the user defines a specific goal with a completion condition, create a projects/ page. When identifying a repeating responsibility (monitoring, maintenance, quality), create an areas/ page.\n- Produce wiki pages in the standard wiki summary format (Topic, Key Facts, Insights, Connections, Open Questions, Sources)\n- Include the full session file path in the Sources section for traceability\n- ALWAYS search wiki_query BEFORE creating any page \u2014 update existing pages instead of creating duplicates\n- If wiki_query finds a page on the same topic (even with a different title/slug), update THAT page using its existing slug\n- The conversation may include compaction summaries from earlier in the session \u2014 treat these as authoritative records of prior work\n- Write directly via wiki_write \u2014 no user confirmation needed\n- NEVER include API keys, tokens, passwords, or secrets in wiki pages. Document WHERE they are stored, not the actual values.";
|
|
40
|
+
export declare const CAPTURE_SYSTEM_PROMPT = "You are a knowledge capture assistant. Your job is to extract persistent knowledge from coding sessions and write it to a PARA-structured wiki.\n\nCapture ANY of the following \u2014 even from short sessions:\n- Architecture decisions and rationale (\"we chose X because Y\")\n- Debugging solutions (root cause + fix)\n- Server/infrastructure details (IPs, paths, credentials locations, configs)\n- Build and deployment procedures (commands, steps, gotchas)\n- API keys, service endpoints, and where they are stored\n- Project conventions and coding patterns\n- Tool configurations and setup steps\n- Dependencies and version constraints\n- Environment-specific knowledge (dev vs prod differences)\n- Operational runbooks (how to restart, deploy, rollback)\n\nIndex is auto-rebuilt after every write \u2014 do not manage index.md manually. Do NOT pass indexContent to wiki_write.\n\nRules:\n- If the session was ONLY greetings or completely off-topic chitchat with zero project knowledge, respond with \"nothing to capture\"\n- Otherwise, always capture \u2014 even small facts are valuable (\"the deploy key is at /path/to/key\")\n- Classify each piece of knowledge by PARA category autonomously\n- When the user defines a specific goal with a completion condition, create a projects/ page. When identifying a repeating responsibility (monitoring, maintenance, quality), create an areas/ page.\n- Produce wiki pages in the standard wiki summary format (Topic, Key Facts, Insights, Connections, Open Questions, Sources)\n- Include the full session file path in the Sources section for traceability\n- ALWAYS search wiki_query BEFORE creating any page \u2014 update existing pages instead of creating duplicates\n- If wiki_query finds a page on the same topic (even with a different title/slug), update THAT page using its existing slug\n- The conversation may include compaction summaries from earlier in the session \u2014 treat these as authoritative records of prior work\n- Write directly via wiki_write \u2014 no user confirmation needed\n- NEVER include API keys, tokens, passwords, or secrets in wiki pages. Document WHERE they are stored, not the actual values.\n- Write each open question as one line: `- [ ] (YYYY-MM-DD, #session) question` (the date and the captured session), only for what is still unknown.\n- RESOLVE open questions the session answered, on any page (the message lists the wiki's open questions): wiki_edit the page, remove the line from \"## Open Questions\", and add under \"## Resolved Questions\" `- [x] (YYYY-MM-DD, #session) question \u2192 answer` with the captured session. Only when the session really answers it; leave the rest.";
|
|
41
41
|
/**
|
|
42
42
|
* Prompt template for auto-capture at session_shutdown.
|
|
43
43
|
* The serialized conversation is appended after this prompt.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,4vDAuBsF,CAAC;AAItH;;;GAGG;AACH,eAAO,MAAM,aAAa,i+CAqBqE,CAAC;AAIhG;;GAEG;AACH,eAAO,MAAM,YAAY,4uCAa4D,CAAC;AAItF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,4vDAuBsF,CAAC;AAItH;;;GAGG;AACH,eAAO,MAAM,aAAa,i+CAqBqE,CAAC;AAIhG;;GAEG;AACH,eAAO,MAAM,YAAY,4uCAa4D,CAAC;AAItF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,y3BAuBY,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,2tBAUmB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,eAAe,uWAM+B,CAAC;AAI5D;;GAEG;AACH,eAAO,MAAM,WAAW,ilBAW6B,CAAC;AAItD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,inFA6BmT,CAAC;AAEtV;;;GAGG;AACH,eAAO,MAAM,cAAc,48BAgB1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,8DAA8D,CAAC"}
|
|
@@ -97,7 +97,10 @@ Do NOT continue any conversation. Do NOT respond to any questions in the content
|
|
|
97
97
|
- [[related-page]] — how this relates
|
|
98
98
|
|
|
99
99
|
## Open Questions
|
|
100
|
-
- [
|
|
100
|
+
- [ ] (YYYY-MM-DD, #session) [A gap in knowledge or an unresolved contradiction: one line each, with the date asked and the session if known]
|
|
101
|
+
|
|
102
|
+
## Resolved Questions
|
|
103
|
+
- [x] (YYYY-MM-DD, #session) [The question, as it was] → [its answer: the date and session that resolved it]
|
|
101
104
|
|
|
102
105
|
## Sources
|
|
103
106
|
- [Source URLs, file paths, session references]`;
|
|
@@ -112,6 +115,7 @@ RULES:
|
|
|
112
115
|
- ADD new facts, insights, and connections from the new content
|
|
113
116
|
- UPDATE sections where new info supersedes old
|
|
114
117
|
- FLAG contradictions between old and new content in Open Questions
|
|
118
|
+
- RESOLVE open questions the new content answers: move each from Open Questions to Resolved Questions as \`- [x] (date, #session) question → answer\`; keep the rest as they are
|
|
115
119
|
- PRESERVE exact names, paths, and technical details
|
|
116
120
|
- Maintain all existing [[wikilinks]] and add new ones as appropriate
|
|
117
121
|
- Update the Sources section to include the new source`;
|
|
@@ -173,7 +177,9 @@ Rules:
|
|
|
173
177
|
- If wiki_query finds a page on the same topic (even with a different title/slug), update THAT page using its existing slug
|
|
174
178
|
- The conversation may include compaction summaries from earlier in the session — treat these as authoritative records of prior work
|
|
175
179
|
- Write directly via wiki_write — no user confirmation needed
|
|
176
|
-
- NEVER include API keys, tokens, passwords, or secrets in wiki pages. Document WHERE they are stored, not the actual values
|
|
180
|
+
- NEVER include API keys, tokens, passwords, or secrets in wiki pages. Document WHERE they are stored, not the actual values.
|
|
181
|
+
- Write each open question as one line: \`- [ ] (YYYY-MM-DD, #session) question\` (the date and the captured session), only for what is still unknown.
|
|
182
|
+
- RESOLVE open questions the session answered, on any page (the message lists the wiki's open questions): wiki_edit the page, remove the line from "## Open Questions", and add under "## Resolved Questions" \`- [x] (YYYY-MM-DD, #session) question → answer\` with the captured session. Only when the session really answers it; leave the rest.`;
|
|
177
183
|
/**
|
|
178
184
|
* Prompt template for auto-capture at session_shutdown.
|
|
179
185
|
* The serialized conversation is appended after this prompt.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;qHAuBmF,CAAC;AAEtH,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;+FAqBkE,CAAC;AAEhG,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;qFAayD,CAAC;AAEtF,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;qHAuBmF,CAAC;AAEtH,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;+FAqBkE,CAAC;AAEhG,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;qFAayD,CAAC;AAEtF,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;gDAuBS,CAAC;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;uDAUgB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;2DAM4B,CAAC;AAE5D,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;qDAW0B,CAAC;AAEtD,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qVA6BgT,CAAC;AAEtV;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;CAgB7B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,2DAA2D,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { QMDStore } from "qmd-engine";
|
|
3
3
|
import type { WikiReadDetails, WikiWriteDetails } from "./schemas.js";
|
|
4
|
+
/** A read page's open questions, first, so whoever reads it sees what is still unknown and can resolve what it knows. */
|
|
5
|
+
export declare function openQuestionsNote(body: string): string;
|
|
4
6
|
export declare function createEditExecute(wikiDir: string, store: QMDStore, markDirty: () => void): (params: {
|
|
5
7
|
path: string;
|
|
6
8
|
edits: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-read.d.ts","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"edit-read.d.ts","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAItE,yHAAyH;AACzH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYtD;AAID,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,IAGnB,QAAQ;IACN,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KACA,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAgG9C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,IAE7C,QAAQ;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KACvB,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAoE7C"}
|
package/dist/tools/edit-read.js
CHANGED
|
@@ -4,6 +4,19 @@ import { normalizeTags, normalizeScopes } from "../tag-registry.js";
|
|
|
4
4
|
import { redactSecrets } from "../redact.js";
|
|
5
5
|
import { appendLog, gitCommit, listPages, readIndex, readPage, writePage } from "../wiki.js";
|
|
6
6
|
import { parsePagePath, scheduleWikiMaintenance } from "./shared.js";
|
|
7
|
+
import { answeredNote, openQuestionsOf, questionsMaybeAnswered, RESOLVE_HOW } from "../questions.js";
|
|
8
|
+
/** A read page's open questions, first, so whoever reads it sees what is still unknown and can resolve what it knows. */
|
|
9
|
+
export function openQuestionsNote(body) {
|
|
10
|
+
const open = openQuestionsOf(body);
|
|
11
|
+
if (open.length === 0) {
|
|
12
|
+
return "";
|
|
13
|
+
}
|
|
14
|
+
return [
|
|
15
|
+
"",
|
|
16
|
+
`Open questions on this page (${open.length}): resolve any you can answer. ${RESOLVE_HOW}`,
|
|
17
|
+
...open.map((question) => `- ${question.text}${question.date ? ` (asked ${question.date}${question.session ? `, ${question.session}` : ""})` : ""}`),
|
|
18
|
+
].join("\n");
|
|
19
|
+
}
|
|
7
20
|
// -- Factory: wiki_read execute ----------------------------------------------
|
|
8
21
|
export function createEditExecute(wikiDir, store, markDirty) {
|
|
9
22
|
return async (params) => {
|
|
@@ -48,7 +61,8 @@ export function createEditExecute(wikiDir, store, markDirty) {
|
|
|
48
61
|
}
|
|
49
62
|
let editedBody = existing.body;
|
|
50
63
|
for (const edit of params.edits) {
|
|
51
|
-
|
|
64
|
+
// A function, so "$&", "$`", "$'" in the new text stay as written (a string replacement reads them as patterns).
|
|
65
|
+
editedBody = editedBody.replace(edit.oldText, () => edit.newText);
|
|
52
66
|
}
|
|
53
67
|
// Surgical edit path: do not scan/autolink/rebuild/reindex the whole wiki.
|
|
54
68
|
// wiki_edit is often called mid-task and must stay fast; broader maintenance
|
|
@@ -83,8 +97,9 @@ export function createEditExecute(wikiDir, store, markDirty) {
|
|
|
83
97
|
markDirty();
|
|
84
98
|
await gitCommit(wikiDir, params.logSummary ?? `wiki_edit: ${pagePath}`);
|
|
85
99
|
scheduleWikiMaintenance(wikiDir, store, markDirty);
|
|
100
|
+
const maybe = answeredNote(await questionsMaybeAnswered(wikiDir, [{ page: pagePath, text: linkedBody }]));
|
|
86
101
|
return {
|
|
87
|
-
content: [{ type: "text", text: `Edited ${pagePath}. Scheduled background index/search refresh
|
|
102
|
+
content: [{ type: "text", text: `Edited ${pagePath}. Scheduled background index/search refresh.${maybe}` }],
|
|
88
103
|
details: {
|
|
89
104
|
pagesWritten: [pagePath],
|
|
90
105
|
pagesSkipped: [],
|
|
@@ -122,7 +137,7 @@ export function createReadExecute(wikiDir) {
|
|
|
122
137
|
.filter(Boolean)
|
|
123
138
|
.join("\n");
|
|
124
139
|
return {
|
|
125
|
-
content: [{ type: "text", text: `${header}\n\n${page.body}` }],
|
|
140
|
+
content: [{ type: "text", text: `${header}${openQuestionsNote(page.body)}\n\n${page.body}` }],
|
|
126
141
|
details: { found: true, path: `${parsed.category}/${parsed.slug}` },
|
|
127
142
|
};
|
|
128
143
|
}
|
|
@@ -146,7 +161,7 @@ export function createReadExecute(wikiDir) {
|
|
|
146
161
|
.filter(Boolean)
|
|
147
162
|
.join("\n");
|
|
148
163
|
return {
|
|
149
|
-
content: [{ type: "text", text: `${header}\n\n${page.body}` }],
|
|
164
|
+
content: [{ type: "text", text: `${header}${openQuestionsNote(page.body)}\n\n${page.body}` }],
|
|
150
165
|
details: { found: true, path: `${ref.category}/${ref.slug}` },
|
|
151
166
|
};
|
|
152
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-read.js","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AAE5G,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"edit-read.js","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/lint.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { WikiLintDetails } from "./schemas.js";
|
|
|
4
4
|
export declare function createLintExecute(wikiDir: string, store: QMDStore, markDirty: () => void, getLintConfig?: () => {
|
|
5
5
|
autoFix: boolean;
|
|
6
6
|
staleDays: number;
|
|
7
|
+
questionDays?: number;
|
|
7
8
|
}): (params: {
|
|
8
9
|
autoFix?: boolean;
|
|
9
10
|
}) => Promise<AgentToolResult<WikiLintDetails>>;
|
package/dist/tools/lint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,EACrB,aAAa,CAAC,EAAE,MAAM;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,EACrB,aAAa,CAAC,EAAE,MAAM;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,IAGlF,QAAQ;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC5B,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAyD7C"}
|
package/dist/tools/lint.js
CHANGED
|
@@ -9,6 +9,8 @@ export function createLintExecute(wikiDir, store, markDirty, getLintConfig) {
|
|
|
9
9
|
const report = await lintWiki(wikiDir, {
|
|
10
10
|
autoFix: params.autoFix ?? configured?.autoFix ?? true,
|
|
11
11
|
staleDays: configured?.staleDays ?? 90,
|
|
12
|
+
questionDays: configured?.questionDays ?? 7,
|
|
13
|
+
store,
|
|
12
14
|
});
|
|
13
15
|
if (report.fixed.length > 0) {
|
|
14
16
|
scheduleWikiMaintenance(wikiDir, store, markDirty);
|
package/dist/tools/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,KAAe,EACf,SAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/query.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { QMDStore } from "qmd-engine";
|
|
3
3
|
import type { ProjectScope } from "../scope.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type ParaCategory } from "../wiki.js";
|
|
5
5
|
import type { WikiQueryDetails } from "./schemas.js";
|
|
6
|
-
export declare function createQueryExecute(
|
|
6
|
+
export declare function createQueryExecute(wikiDir: string, store: QMDStore, getScope: () => ProjectScope, getGraphBoost?: () => boolean): (params: {
|
|
7
7
|
query: string;
|
|
8
8
|
global?: boolean;
|
|
9
9
|
category?: ParaCategory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,MAAM,YAAY,EAC5B,aAAa,CAAC,EAAE,MAAM,OAAO,IAG3B,QAAQ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KACnF,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAuD9C"}
|
package/dist/tools/query.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { readPage } from "../wiki.js";
|
|
1
2
|
import { queryWiki as queryWikiLib, formatQueryResults } from "../query.js";
|
|
2
3
|
import { QUERY_PROMPT } from "../templates/prompts.js";
|
|
4
|
+
import { openQuestionsOf, RESOLVE_HOW } from "../questions.js";
|
|
3
5
|
// -- Factory: wiki_query execute ---------------------------------------------
|
|
4
|
-
export function createQueryExecute(
|
|
6
|
+
export function createQueryExecute(wikiDir, store, getScope, getGraphBoost) {
|
|
5
7
|
return async (params) => {
|
|
6
8
|
const scope = getScope();
|
|
7
9
|
const result = await queryWikiLib(store, {
|
|
@@ -26,6 +28,14 @@ export function createQueryExecute(_wikiDir, store, getScope, getGraphBoost) {
|
|
|
26
28
|
};
|
|
27
29
|
}
|
|
28
30
|
const formatted = formatQueryResults(result.results);
|
|
31
|
+
// The found pages' open questions: what is still unknown about this topic, and may be answered now.
|
|
32
|
+
const open = [];
|
|
33
|
+
for (const found of result.results) {
|
|
34
|
+
const page = await readPage(wikiDir, found.page.category, found.page.slug);
|
|
35
|
+
for (const question of page === null ? [] : openQuestionsOf(page.body)) {
|
|
36
|
+
open.push(`- ${question.text} — on ${found.page.category}/${found.page.slug}${question.date ? `, asked ${question.date}${question.session ? ` (${question.session})` : ""}` : ""}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
29
39
|
const toolResultText = [
|
|
30
40
|
QUERY_PROMPT,
|
|
31
41
|
"",
|
|
@@ -33,6 +43,7 @@ export function createQueryExecute(_wikiDir, store, getScope, getGraphBoost) {
|
|
|
33
43
|
`Scope: ${result.wasGlobal ? "global (all scopes)" : scope.name}`,
|
|
34
44
|
`Results: ${result.results.length}`,
|
|
35
45
|
"",
|
|
46
|
+
...(open.length === 0 ? [] : [`## Open questions on these pages (${open.length})`, "If what you know or find answers one, resolve it. " + RESOLVE_HOW, ...open, ""]),
|
|
36
47
|
formatted,
|
|
37
48
|
].join("\n");
|
|
38
49
|
return {
|
package/dist/tools/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,EAA0E,KAAK,YAAY,EAAiB,MAAM,YAAY,CAAC;AACtI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,MAAM,YAAY,EAC5B,SAAS,EAAE,MAAM,IAAI,IAGnB,QAAQ;IACN,KAAK,EAAE,KAAK,CAAC;QACX,QAAQ,EAAE,YAAY,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC/C,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KACA,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAiO9C"}
|
package/dist/tools/write.js
CHANGED
|
@@ -2,6 +2,7 @@ import { normalizeTags, normalizeScopes } from "../tag-registry.js";
|
|
|
2
2
|
import { redactSecrets } from "../redact.js";
|
|
3
3
|
import { autoLinkSlugs, syncFrontmatterLinks } from "../link-utils.js";
|
|
4
4
|
import { validateFrontmatter } from "../frontmatter.js";
|
|
5
|
+
import { answeredNote, questionsMaybeAnswered } from "../questions.js";
|
|
5
6
|
import { appendLog, gitCommit, listPageSlugs, readPage, rebuildIndex, writePage } from "../wiki.js";
|
|
6
7
|
import { scheduleWikiMaintenance } from "./shared.js";
|
|
7
8
|
// -- Factory: wiki_write execute ---------------------------------------------
|
|
@@ -9,6 +10,8 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
9
10
|
return async (params) => {
|
|
10
11
|
const pagesWritten = [];
|
|
11
12
|
const pagesSkipped = [];
|
|
13
|
+
/** What was written, for the open questions it may answer. */
|
|
14
|
+
const writtenBodies = [];
|
|
12
15
|
const now = new Date().toISOString();
|
|
13
16
|
const scope = getScope();
|
|
14
17
|
// Gather all existing slugs for auto-linking (slug-only readdir scan;
|
|
@@ -59,7 +62,8 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
59
62
|
}
|
|
60
63
|
let editedBody = existing.body;
|
|
61
64
|
for (const edit of edits) {
|
|
62
|
-
|
|
65
|
+
// A function, so "$&", "$`", "$'" in the new text stay as written (a string replacement reads them as patterns).
|
|
66
|
+
editedBody = editedBody.replace(edit.oldText, () => edit.newText);
|
|
63
67
|
}
|
|
64
68
|
const linkedBody = redactSecrets(autoLinkSlugs(editedBody, allSlugs, slug)).text;
|
|
65
69
|
const rawScope = pageSpec.scope.length > 0 ? pageSpec.scope : existing.frontmatter.scope;
|
|
@@ -79,6 +83,7 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
79
83
|
body: linkedBody,
|
|
80
84
|
};
|
|
81
85
|
await writePage(wikiDir, updatedPage);
|
|
86
|
+
writtenBodies.push({ page: pagePath, text: updatedPage.body });
|
|
82
87
|
pagesWritten.push(pagePath + (errors.length > 0 ? ` (${errors.length} edit(s) failed)` : ""));
|
|
83
88
|
}
|
|
84
89
|
else if (pageSpec.mode === "append" && existing) {
|
|
@@ -99,6 +104,7 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
99
104
|
},
|
|
100
105
|
};
|
|
101
106
|
await writePage(wikiDir, updatedPage);
|
|
107
|
+
writtenBodies.push({ page: pagePath, text: updatedPage.body });
|
|
102
108
|
pagesWritten.push(pagePath);
|
|
103
109
|
}
|
|
104
110
|
else if (pageSpec.mode === "replace" && existing) {
|
|
@@ -122,6 +128,7 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
122
128
|
body: linkedBody,
|
|
123
129
|
};
|
|
124
130
|
await writePage(wikiDir, updatedPage);
|
|
131
|
+
writtenBodies.push({ page: pagePath, text: updatedPage.body });
|
|
125
132
|
pagesWritten.push(pagePath);
|
|
126
133
|
}
|
|
127
134
|
else {
|
|
@@ -146,6 +153,7 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
146
153
|
body: linkedBody,
|
|
147
154
|
};
|
|
148
155
|
await writePage(wikiDir, newPage);
|
|
156
|
+
writtenBodies.push({ page: pagePath, text: newPage.body });
|
|
149
157
|
pagesWritten.push(pagePath);
|
|
150
158
|
}
|
|
151
159
|
}
|
|
@@ -198,6 +206,7 @@ export function createWriteExecute(wikiDir, store, getScope, markDirty) {
|
|
|
198
206
|
summary,
|
|
199
207
|
indexUpdated ? "Updated index.md." : "",
|
|
200
208
|
logAppended ? `Logged: ${params.logSummary}` : "",
|
|
209
|
+
answeredNote(await questionsMaybeAnswered(wikiDir, writtenBodies)).trim(),
|
|
201
210
|
]
|
|
202
211
|
.filter(Boolean)
|
|
203
212
|
.join("\n"),
|