@nestr/mcp 0.1.73 → 0.1.90
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/build/api/client.d.ts +39 -3
- package/build/api/client.d.ts.map +1 -1
- package/build/api/client.js +57 -5
- package/build/api/client.js.map +1 -1
- package/build/help/articles.d.ts +146 -0
- package/build/help/articles.d.ts.map +1 -0
- package/build/help/articles.js +574 -0
- package/build/help/articles.js.map +1 -0
- package/build/help/cross-links.d.ts +21 -0
- package/build/help/cross-links.d.ts.map +1 -0
- package/build/help/cross-links.js +61 -0
- package/build/help/cross-links.js.map +1 -0
- package/build/help/topics.d.ts.map +1 -1
- package/build/help/topics.js +315 -15
- package/build/help/topics.js.map +1 -1
- package/build/http.d.ts +4 -13
- package/build/http.d.ts.map +1 -1
- package/build/http.js +341 -89
- package/build/http.js.map +1 -1
- package/build/oauth/client-info.d.ts +58 -0
- package/build/oauth/client-info.d.ts.map +1 -0
- package/build/oauth/client-info.js +68 -0
- package/build/oauth/client-info.js.map +1 -0
- package/build/oauth/config.d.ts +19 -0
- package/build/oauth/config.d.ts.map +1 -1
- package/build/oauth/config.js +12 -0
- package/build/oauth/config.js.map +1 -1
- package/build/server.d.ts +7 -0
- package/build/server.d.ts.map +1 -1
- package/build/server.js +23 -4
- package/build/server.js.map +1 -1
- package/build/skills/tension-processing.d.ts.map +1 -1
- package/build/skills/tension-processing.js +11 -1
- package/build/skills/tension-processing.js.map +1 -1
- package/build/tools/index.d.ts +612 -68
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +592 -63
- package/build/tools/index.js.map +1 -1
- package/build/tools/validation.d.ts +42 -0
- package/build/tools/validation.d.ts.map +1 -0
- package/build/tools/validation.js +97 -0
- package/build/tools/validation.js.map +1 -0
- package/package.json +2 -1
- package/web/index.html +25 -0
- package/web/styles.css +62 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-links between the curated internal `nestr_help` topics and the public
|
|
3
|
+
* help-article corpus (nestr.io/help/articles/<slug>).
|
|
4
|
+
*
|
|
5
|
+
* Two directions, two small hand-curated tables:
|
|
6
|
+
* - TOPIC_TO_ARTICLES: an internal topic points to deeper end-user articles
|
|
7
|
+
* (an internal topic may suggest several).
|
|
8
|
+
* - ARTICLE_TO_TOPIC: an article points back to the single most relevant
|
|
9
|
+
* internal topic (agent-flavoured tool-call guidance).
|
|
10
|
+
*
|
|
11
|
+
* Slugs are validated by hand against https://nestr.io/sitemap.xml; topic keys
|
|
12
|
+
* must exist in HELP_TOPICS (asserted in tests). When a topic and an article
|
|
13
|
+
* cover the same ground, add the pair to BOTH tables.
|
|
14
|
+
*/
|
|
15
|
+
export const TOPIC_TO_ARTICLES = {
|
|
16
|
+
"core-concepts": ["nestr-the-basic-building-blocks", "structure-and-governance-in-nestr"],
|
|
17
|
+
"nest-model": ["nestr-the-basic-building-blocks"],
|
|
18
|
+
"labels": ["nestr-the-power-of-labels"],
|
|
19
|
+
"search": ["nestr-search"],
|
|
20
|
+
"operating-modes": ["structure-and-governance-in-nestr"],
|
|
21
|
+
"workspace-types": ["structure-and-governance-in-nestr", "building-your-org-structure-roles-circles"],
|
|
22
|
+
"matching-work-to-roles": ["building-your-org-structure-roles-circles"],
|
|
23
|
+
"tension-processing": ["tensions-and-governance-proposals"],
|
|
24
|
+
"scrum": ["scrum-agile-app"],
|
|
25
|
+
"inbox": ["projects-and-todos-creating-tracking-managing-work"],
|
|
26
|
+
"daily-plan": ["projects-and-todos-creating-tracking-managing-work"],
|
|
27
|
+
"doing-work": ["projects-and-todos-creating-tracking-managing-work"],
|
|
28
|
+
"notifications": ["chat-channels-and-communication-in-nestr"],
|
|
29
|
+
"authentication": ["nestr-mcp-connect-ai-assistants-to-your-workspace", "using-the-nestr-api"],
|
|
30
|
+
"mcp-apps": ["nestr-mcp-connect-ai-assistants-to-your-workspace"],
|
|
31
|
+
"linking": ["navigating-nestr"],
|
|
32
|
+
"web-app-links": ["navigating-nestr"],
|
|
33
|
+
"workspace-setup": ["setting-up-a-new-collaborative-workspace"],
|
|
34
|
+
"best-practices": ["getting-started-with-nestr"],
|
|
35
|
+
};
|
|
36
|
+
export const ARTICLE_TO_TOPIC = {
|
|
37
|
+
"nestr-the-basic-building-blocks": "nest-model",
|
|
38
|
+
"structure-and-governance-in-nestr": "core-concepts",
|
|
39
|
+
"nestr-the-power-of-labels": "labels",
|
|
40
|
+
"nestr-search": "search",
|
|
41
|
+
"building-your-org-structure-roles-circles": "matching-work-to-roles",
|
|
42
|
+
"tensions-and-governance-proposals": "tension-processing",
|
|
43
|
+
"running-meetings-in-nestr": "tension-processing",
|
|
44
|
+
"scrum-agile-app": "scrum",
|
|
45
|
+
"projects-and-todos-creating-tracking-managing-work": "doing-work",
|
|
46
|
+
"chat-channels-and-communication-in-nestr": "notifications",
|
|
47
|
+
"nestr-mcp-connect-ai-assistants-to-your-workspace": "mcp-apps",
|
|
48
|
+
"using-the-nestr-api": "authentication",
|
|
49
|
+
"navigating-nestr": "web-app-links",
|
|
50
|
+
"setting-up-a-new-collaborative-workspace": "workspace-setup",
|
|
51
|
+
"getting-started-with-nestr": "best-practices",
|
|
52
|
+
};
|
|
53
|
+
/** Public help articles that go deeper on a curated internal topic. */
|
|
54
|
+
export function relatedArticlesForTopic(topicKey) {
|
|
55
|
+
return TOPIC_TO_ARTICLES[topicKey] ?? [];
|
|
56
|
+
}
|
|
57
|
+
/** The internal topic (if any) that gives agent-flavoured guidance for an article. */
|
|
58
|
+
export function relatedTopicForArticle(slug) {
|
|
59
|
+
return ARTICLE_TO_TOPIC[slug.replace(/^\/+|\/+$/g, "")];
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=cross-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-links.js","sourceRoot":"","sources":["../../src/help/cross-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,eAAe,EAAE,CAAC,iCAAiC,EAAE,mCAAmC,CAAC;IACzF,YAAY,EAAE,CAAC,iCAAiC,CAAC;IACjD,QAAQ,EAAE,CAAC,2BAA2B,CAAC;IACvC,QAAQ,EAAE,CAAC,cAAc,CAAC;IAC1B,iBAAiB,EAAE,CAAC,mCAAmC,CAAC;IACxD,iBAAiB,EAAE,CAAC,mCAAmC,EAAE,2CAA2C,CAAC;IACrG,wBAAwB,EAAE,CAAC,2CAA2C,CAAC;IACvE,oBAAoB,EAAE,CAAC,mCAAmC,CAAC;IAC3D,OAAO,EAAE,CAAC,iBAAiB,CAAC;IAC5B,OAAO,EAAE,CAAC,oDAAoD,CAAC;IAC/D,YAAY,EAAE,CAAC,oDAAoD,CAAC;IACpE,YAAY,EAAE,CAAC,oDAAoD,CAAC;IACpE,eAAe,EAAE,CAAC,0CAA0C,CAAC;IAC7D,gBAAgB,EAAE,CAAC,mDAAmD,EAAE,qBAAqB,CAAC;IAC9F,UAAU,EAAE,CAAC,mDAAmD,CAAC;IACjE,SAAS,EAAE,CAAC,kBAAkB,CAAC;IAC/B,eAAe,EAAE,CAAC,kBAAkB,CAAC;IACrC,iBAAiB,EAAE,CAAC,0CAA0C,CAAC;IAC/D,gBAAgB,EAAE,CAAC,4BAA4B,CAAC;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,iCAAiC,EAAE,YAAY;IAC/C,mCAAmC,EAAE,eAAe;IACpD,2BAA2B,EAAE,QAAQ;IACrC,cAAc,EAAE,QAAQ;IACxB,2CAA2C,EAAE,wBAAwB;IACrE,mCAAmC,EAAE,oBAAoB;IACzD,2BAA2B,EAAE,oBAAoB;IACjD,iBAAiB,EAAE,OAAO;IAC1B,oDAAoD,EAAE,YAAY;IAClE,0CAA0C,EAAE,eAAe;IAC3D,mDAAmD,EAAE,UAAU;IAC/D,qBAAqB,EAAE,gBAAgB;IACvC,kBAAkB,EAAE,eAAe;IACnC,0CAA0C,EAAE,iBAAiB;IAC7D,4BAA4B,EAAE,gBAAgB;CAC/C,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/help/topics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../src/help/topics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAy+C9C,CAAC"}
|
package/build/help/topics.js
CHANGED
|
@@ -10,6 +10,8 @@ import { WORKSPACE_SETUP_INSTRUCTIONS } from "../skills/workspace-setup.js";
|
|
|
10
10
|
export const HELP_TOPICS = {
|
|
11
11
|
"topics": `Available nestr_help topics (call with any topic key):
|
|
12
12
|
|
|
13
|
+
The internal topics below are curated MCP-flavoured guidance — tool call patterns, mode behaviour, and conventions. For end-user UI walkthroughs and feature how-tos, call \`nestr_help({ search: "<query>" })\` to search the public help-article corpus at nestr.io/help/articles, or pass an article slug directly as \`topic\` (e.g. \`topic: "getting-started-with-nestr"\`).
|
|
14
|
+
|
|
13
15
|
- topics: This list
|
|
14
16
|
- operating-modes: Detailed assistant/role-filler/workspace mode behaviors
|
|
15
17
|
- matching-work-to-roles: How to determine which role owns work
|
|
@@ -30,7 +32,9 @@ export const HELP_TOPICS = {
|
|
|
30
32
|
- best-practices: Recommended patterns for working with Nestr
|
|
31
33
|
- doing-work: How work flows from purpose through strategy to execution
|
|
32
34
|
- tension-processing: Listening for, creating, and processing tensions
|
|
33
|
-
- workspace-setup: Guided setup wizard for new workspaces and circles
|
|
35
|
+
- workspace-setup: Guided setup wizard for new workspaces and circles
|
|
36
|
+
- scrum: Scrum/Agile workspace app — user stories, sprints, epics, burndown
|
|
37
|
+
- okr: Objectives & Key Results workspace app — goals, key results, contributions`,
|
|
34
38
|
"operating-modes": `### Mode-Specific Behavior Summary
|
|
35
39
|
|
|
36
40
|
**Role-filler agents should:**
|
|
@@ -102,22 +106,26 @@ When determining work assignments, consider:
|
|
|
102
106
|
3. Are there multiple roles whose accountabilities overlap? Surface this for clarification.`,
|
|
103
107
|
"linking": `## Linking to Nests
|
|
104
108
|
|
|
105
|
-
**
|
|
109
|
+
**When generating clickable links to nests in chat output, comments, or descriptions, always use the canonical pattern:** \`https://app.nestr.io/n/{nestId}\` (NOT \`/nests/{nestId}\`, \`/nest/\`, or any other variation — only \`/n/\`).
|
|
106
110
|
|
|
107
|
-
\`
|
|
111
|
+
Every nest returned by this MCP server includes a precomputed \`url\` field — **prefer that field over constructing the URL yourself**. The server already applies the context rules below.
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
### URL construction rules (when you must build a URL yourself)
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
1. If you know the nest's parent (circle, project, role, etc.), include it as the context prefix:
|
|
116
|
+
\`https://app.nestr.io/n/{parentId}/{nestId}\`
|
|
117
|
+
2. If the nest has no parent, or its parent is \`inbox\`, fall back to the bare form:
|
|
118
|
+
\`https://app.nestr.io/n/{nestId}\`
|
|
112
119
|
|
|
113
|
-
|
|
120
|
+
The parent context (when present) opens the nest in its detail pane on desktop. The bare form always works.
|
|
114
121
|
|
|
115
|
-
|
|
122
|
+
### Examples
|
|
116
123
|
|
|
117
|
-
Examples:
|
|
118
124
|
- Role in a circle: \`[Developer](https://app.nestr.io/n/circleId/roleId)\`
|
|
125
|
+
- Task in a project: \`[Fix bug](https://app.nestr.io/n/projectId/taskId)\`
|
|
119
126
|
- Top-level workspace: \`[My Workspace](https://app.nestr.io/n/workspaceId)\`
|
|
120
|
-
-
|
|
127
|
+
- Inbox item: \`[Quick capture](https://app.nestr.io/n/itemId)\` (parent is 'inbox' — drop the context)
|
|
128
|
+
- Nest of unknown context: \`[Fix bug](https://app.nestr.io/n/taskId)\``,
|
|
121
129
|
"workspace-types": `## Workspace Types
|
|
122
130
|
|
|
123
131
|
Most workspaces are organizational, representing a self-organized team. Check the workspace's labels to determine the type:
|
|
@@ -172,7 +180,7 @@ Nestr uses different formats for different fields:
|
|
|
172
180
|
- **\`purpose\`**: The aspirational future state this nest is working towards. **Most important for workspaces, circles, and roles** — it defines the north star and context boundary for the organization, circle, or role. Everything within that container should serve its purpose. For other nests (tasks, projects, etc.), prefer \`description\` or \`fields\` for detailed information — but purpose can be set if it serves the user. Supports HTML.
|
|
173
181
|
- **\`description\`**: The primary field for detailed information about a nest. Use for project details, task context, acceptance criteria, Definition of Done, and any persistent information about the nest. Supports HTML.
|
|
174
182
|
- **\`fields\`**: Structured data defined by labels (e.g., \`fields['project.status']\`, \`fields['metric.frequency']\`). Use for structured, label-specific information.
|
|
175
|
-
- **Comment \`body\`**: HTML supported (same tags as above, including base64 images). Supports @mentions
|
|
183
|
+
- **Comment \`body\`**: HTML supported (same tags as above, including base64 images). Supports @mentions — **mentions MUST be wrapped in literal curly braces**: write \`@{aBcD1234eFgH5678i:roleNestId}\`, NOT \`@aBcD1234eFgH5678i\`. Without the braces the platform does not parse the mention, the user is not notified, and no link is rendered. Forms: **\`@{userId:roleId}\` is the preferred form when mentioning a user** — it addresses them in the context of a specific role (or a circle, for "individual action on a circle"), so they know which hat they're being addressed in. \`@{userId}\` mentions by user ID without role context (legacy — avoid when a role is known), \`@{email}\` mentions by any email the user is registered with in Nestr, \`@{circle}\` notifies all role fillers in the nearest ancestor circle, \`@{everyone}\` is available in the UI but not yet via the API. **Use comments for progress updates**, status changes, and conversation — not purpose or description.
|
|
176
184
|
- **\`data\`**: Generic key-value store. Also used internally by Nestr and other integrations — **never overwrite or remove existing keys**. When adding your own data, namespace it under \`mcp.\` (e.g., \`{ "mcp.lastSync": "2025-01-01" }\`) to avoid conflicts. Not rendered in UI.
|
|
177
185
|
|
|
178
186
|
**Where to put information:**
|
|
@@ -378,7 +386,7 @@ Labels define what type a nest is. The API strips the "circleplus-" prefix, so u
|
|
|
378
386
|
|
|
379
387
|
**Meetings & Operations:**
|
|
380
388
|
- \`metric\` - A metric tracked by a role/circle
|
|
381
|
-
- \`checklist\` - A recurring checklist item
|
|
389
|
+
- \`checklist\` - A **recurring** check processed during the Checklist Review section of a tactical meeting (Holacracy semantic): a regular yes/no/n-a confirmation that a role-filler is performing an ongoing activity. Must live under a role or circle. **NOT a general checklist item** — do not use for one-off tasks, todos, or generic "things to check off" (those are plain nests with no system label; see Work Tracking below).
|
|
382
390
|
- \`governance\` - Combined with \`meeting\` label to create a governance meeting (processes governance tensions/proposals)
|
|
383
391
|
- \`circle-meeting\` - Combined with \`meeting\` label to create a circle/tactical meeting (processes operational tensions — projects, todos, inter-role requests)
|
|
384
392
|
|
|
@@ -395,12 +403,20 @@ Labels define what type a nest is. The API strips the "circleplus-" prefix, so u
|
|
|
395
403
|
**AI Knowledge:**
|
|
396
404
|
- \`skill\` - A process, piece of knowledge, or learned pattern that a role or circle holds. Lives directly under a role or circle. Used by AI agents to persist and retrieve operational knowledge across sessions. When doing work that is likely to be repeated, capture it as a skill for future reference.
|
|
397
405
|
|
|
406
|
+
**Workspace App labels** (only present when the corresponding app is enabled — check with \`nestr_get_workspace_apps\`):
|
|
407
|
+
- \`userstory\`, \`sprint\`, \`epic\`, \`milestone\` — Scrum/Agile app. See \`nestr_help({ topic: "scrum" })\` for the data model, fields, and graph relations.
|
|
408
|
+
- \`goal\`, \`result\`, \`resultwork\` — OKR app. See \`nestr_help({ topic: "okr" })\` for the Objective / Key Result / contribution pattern.
|
|
409
|
+
|
|
398
410
|
**System Labels** (define structure, not categorization):
|
|
399
411
|
\`circle\`, \`anchor-circle\`, \`role\`, \`policy\`, \`domain\`, \`accountability\`, \`project\`, \`tension\`, \`skill\`, \`goal\`, \`result\`, \`contact\`, \`deal\`, \`organisation\`, \`metric\`, \`checklist\`, \`meeting\`, \`feedback\`
|
|
400
412
|
- \`note\` - A simple note
|
|
401
413
|
- \`meeting\` - A calendar meeting
|
|
402
414
|
- \`tension\` - The fundamental unit of organizational communication — a gap between current reality and potential. Used for inter-role communication, meeting agenda items, governance proposals, and general tension processing. Supports \`fields['tension.feeling']\` and \`fields['tension.needs']\` for separating personal context from organizational response. Use the dedicated tension tools (\`nestr_create_tension\`, \`nestr_list_my_tensions\`, etc.) to create and manage tensions.
|
|
403
415
|
|
|
416
|
+
### Prime Labels (one per nest)
|
|
417
|
+
|
|
418
|
+
These labels define a nest's core identity and are mutually exclusive — a nest can have at most one of them: \`project\`, \`tension\`, \`role\`, \`circle\`, \`anchor-circle\`, \`meeting\`, \`metric\`, \`goal\`, \`result\`, \`checklist\`, \`feedback\`, \`userstory\`, \`sprint\`, \`epic\`, \`milestone\`. A project is not also a tension, a role is not also a metric, a sprint is not also an epic. The MCP layer will reject calls to \`nestr_create_nest\`, \`nestr_update_nest\`, or \`nestr_add_label\` that would put two prime labels on the same nest. **Sole exception:** \`userstory\` + \`project\` may coexist — \`userstory\` implies \`project\` in Nestr's data model, so every story is also a project. \`sprint\`, \`epic\`, and \`milestone\` must NOT be combined with \`project\` (or with each other); stories relate to those containers via graph links (\`userstory_sprint\` / \`userstory_epic\` / \`userstory_milestone\`), never by sharing labels. If you need to express a relationship between two such entities, create separate nests and link them with \`nestr_add_graph_link\`. Modifier labels like \`governance\` and \`circle-meeting\` (which pair with \`meeting\`) are not prime and can coexist.
|
|
419
|
+
|
|
404
420
|
## Label Architecture
|
|
405
421
|
|
|
406
422
|
Labels give nests meaning and define their behavior. There are three types of labels:
|
|
@@ -460,6 +476,8 @@ Use this when you need to know what values are valid for a field, especially bef
|
|
|
460
476
|
|
|
461
477
|
The \`nestr_search\` tool supports powerful query operators. Combine multiple operators with spaces (AND logic) or use commas within an operator (OR logic).
|
|
462
478
|
|
|
479
|
+
**Linking search results:** Every returned nest includes a precomputed \`url\` field — use it directly when generating clickable links to results. The canonical pattern is \`https://app.nestr.io/n/{nestId}\` (NOT \`/nests/{nestId}\`). See \`nestr_help('linking')\` for full URL construction rules.
|
|
480
|
+
|
|
463
481
|
### Common Search Operators
|
|
464
482
|
|
|
465
483
|
| Operator | Example | Description |
|
|
@@ -501,6 +519,25 @@ Search by label-specific field values using \`label->field:value\`:
|
|
|
501
519
|
- \`project->status:Current,Future\` - Status is Current OR Future
|
|
502
520
|
- \`project->status:!Done\` - Status is NOT Done
|
|
503
521
|
|
|
522
|
+
### Term-field Search
|
|
523
|
+
|
|
524
|
+
For fields of type \`term\` (date ranges stored as \`{from, to}\` ISO date strings — e.g. \`sprint_term\`, \`goal_term\`), the standard \`{labelId}->{fieldCode}:value\` operator accepts date / range / named-range values and produces an **overlap** query: "the term overlaps this point or range".
|
|
525
|
+
|
|
526
|
+
| Query | Means |
|
|
527
|
+
|---|---|
|
|
528
|
+
| \`sprint->term:now\` | Sprints active today |
|
|
529
|
+
| \`sprint->term:2026-03-15\` | Sprints active on that date |
|
|
530
|
+
| \`sprint->term:2026-01-01_2026-03-31\` | Sprints overlapping Q1 2026 |
|
|
531
|
+
| \`sprint->term:2026-01-01_now\` | Sprints overlapping the range up to today |
|
|
532
|
+
| \`goal->term:this_quarter\` | Objectives running any portion of this quarter |
|
|
533
|
+
| \`sprint->term:!now\` | Sprints NOT currently active |
|
|
534
|
+
|
|
535
|
+
Accepted value forms: \`now\`, ISO \`YYYY-MM-DD\`, \`DATE_DATE\` range (same \`_\`-separated convention as \`completed:DATE_DATE\`), or named ranges (\`past_7_days\`, \`this_month\`, \`last_month\`, \`this_quarter\`, \`last_quarter\`, \`this_year\`, \`last_year\`, etc. — the same set as \`completed:\` and \`updated-date:\`).
|
|
536
|
+
|
|
537
|
+
Prefix the value with \`!\` to invert (no overlap).
|
|
538
|
+
|
|
539
|
+
**Endpoint-specific queries** (e.g. "sprints that ended last week" vs. "sprints that overlapped last week") are not yet supported as a single operator — the overlap form is the supported primitive. For "is field set / unset" use the existing \`fieldValues.X:exists\` / \`fieldValues.X:!exists\`.
|
|
540
|
+
|
|
504
541
|
### Search Examples
|
|
505
542
|
|
|
506
543
|
\`\`\`
|
|
@@ -581,9 +618,9 @@ Use \`sort:\` to specify the sort field and \`sort-order:\` to set direction.
|
|
|
581
618
|
- \`sort-order:asc\` - Ascending (default)
|
|
582
619
|
- \`sort-order:desc\` - Descending
|
|
583
620
|
|
|
584
|
-
**
|
|
585
|
-
|
|
586
|
-
|
|
621
|
+
**Default:** without an explicit sort, results come back in the API's natural order — always pass a sort when ordering matters.
|
|
622
|
+
|
|
623
|
+
**Same sorting on fetch tools:** the list/fetch tools (\`nestr_get_projects\`, \`nestr_get_nest_children\`, \`nestr_list_circles\`, \`nestr_list_roles\`, \`nestr_get_circle_roles\`, \`nestr_list_workspaces\`, \`nestr_list_tensions\`) accept the same fields via their \`sort\` parameter — prefix with \`-\` for descending (e.g. \`sort: '-updatedAt'\`). No need to switch to search just to order results.
|
|
587
624
|
|
|
588
625
|
**Examples:**
|
|
589
626
|
\`\`\`
|
|
@@ -639,9 +676,12 @@ in:roleId label:project project->status:Current
|
|
|
639
676
|
The \`completed:\` operator accepts:
|
|
640
677
|
- \`completed:false\` - Only uncompleted items (recommended default for work queries)
|
|
641
678
|
- \`completed:true\` - Only completed items
|
|
679
|
+
- \`completed:any\` - Both completed AND uncompleted (skips the default 1-week-old filter). Use when you need full history.
|
|
642
680
|
- Presets: \`completed:past_7_days\`, \`completed:this_month\`, \`completed:last_quarter\`, etc.
|
|
643
681
|
- Custom date range: \`completed:2024-01-01_2024-03-31\` (format: \`YYYY-MM-DD_YYYY-MM-DD\`)
|
|
644
682
|
|
|
683
|
+
**Strict variant** (\`completed-strict:false\` / \`completed-strict:true\`): drops the \`_p.completable || _p.eventable\` guard that \`completed:false\` adds. Use when the rest of the search already restricts to labels declared \`completable: false\` at the label level but whose status field has \`completed: true\` options — e.g. \`label:sprint completed-strict:false\` returns planned + active sprints (hiding closed/cancelled). Without the strict variant the sprint label's \`completable: false\` would filter out every sprint.
|
|
684
|
+
|
|
645
685
|
**Examples:**
|
|
646
686
|
\`\`\`
|
|
647
687
|
assignee:me completed:false
|
|
@@ -1188,13 +1228,273 @@ All work in Nestr — projects, tasks, comments, tensions, and skills — forms
|
|
|
1188
1228
|
1. **Start by listing workspaces** to get the workspace ID and check if it has the "anchor-circle" label
|
|
1189
1229
|
2. **Use search** to find specific items rather than browsing through hierarchies
|
|
1190
1230
|
3. **Check labels** to understand what type of nest you're working with
|
|
1191
|
-
4. **Use @mentions** in comments to notify team members: \`@{userId}
|
|
1231
|
+
4. **Use @mentions** in comments to notify team members. **The literal \`{\` and \`}\` braces are required** — \`@aBcD1234eFgH5678i\` does NOT mention anyone; \`@{aBcD1234eFgH5678i:roleNestId}\` does. Prefer \`@{userId:roleId}\` so the user knows which role they're being addressed in (the second part can be a role nest or a circle nest for "individual action on a circle"). Fall back to \`@{userId}\` only when no role context applies, or use \`@{email}\` / \`@{circle}\` (notifies all role fillers in the nearest ancestor circle)
|
|
1192
1232
|
5. **Respect the hierarchy**: nests live under parents (workspace → circle → role/project → task)
|
|
1193
1233
|
6. **Maintain skills on roles and circles** for AI knowledge persistence:
|
|
1194
1234
|
- Before doing work from a role, check for existing skills under that role or its circle — they contain processes, patterns, and domain knowledge from prior sessions
|
|
1195
1235
|
- When completing work that is likely repeatable, capture it as a skill under the appropriate role or circle
|
|
1196
1236
|
- Skills are the primary mechanism for AI context persistence — they're visible, searchable, and transfer with the role when it's reassigned
|
|
1197
1237
|
- The \`data\` field is shared with Nestr internals and other integrations — never overwrite or remove existing keys. If you must store custom data, namespace under \`mcp.\` (e.g., \`data: { "mcp.lastSync": "..." }\`)`,
|
|
1238
|
+
"scrum": `## Scrum / Agile App
|
|
1239
|
+
|
|
1240
|
+
The Scrum app adds four label types (\`userstory\`, \`sprint\`, \`epic\`, \`milestone\`) plus the graph relations and field rollups that make a real Scrum board work. It is a **workspace app** — the labels and tools below only behave correctly when the app is enabled.
|
|
1241
|
+
|
|
1242
|
+
### Detect whether Scrum is enabled
|
|
1243
|
+
|
|
1244
|
+
Call \`nestr_get_workspace_apps({ workspaceId })\` and look for \`id: 'scrum'\`. If it's absent, the labels won't exist in the workspace and any \`label:userstory\` / \`label:sprint\` / \`label:epic\` / \`label:milestone\` queries will return empty.
|
|
1245
|
+
|
|
1246
|
+
Sprints, epics, and milestones can each be individually disabled at the workspace level even when the app is on — check \`workspace.data['appfield-scrum-sprints-enabled']\` (and the \`-epics-\` / \`-milestones-\` variants). When a sub-feature is set to \`false\`, the corresponding graph-field on user stories is hidden in the UI; the labels still resolve, so search and graph-link tools keep working.
|
|
1247
|
+
|
|
1248
|
+
### The four labels
|
|
1249
|
+
|
|
1250
|
+
| Label | Role | Lives under |
|
|
1251
|
+
|---|---|---|
|
|
1252
|
+
| \`userstory\` | A unit of Scrum work. **Always carries the \`project\` label** (\`implies: ['project']\`), so every story is also a project — \`nestr_get_projects\` finds them, \`project.status\` drives Done, and workspace-wide project reporting includes them. | role, circle, anchor-circle |
|
|
1253
|
+
| \`sprint\` | A time-boxed iteration. Holds active work via the \`userstory_sprint\` graph relation. Sprint goal is stored in the \`purpose\` field. | circle, anchor-circle |
|
|
1254
|
+
| \`epic\` | A scope axis (feature / initiative) grouping stories across sprints. **Termless** — scope-boxed, not time-boxed. Can nest under another epic. | role, circle, anchor-circle, epic |
|
|
1255
|
+
| \`milestone\` | A time-boxed delivery target — release, version, or phase. Time-boxed (has a \`term\`). Conceptually larger in scope than a sprint (typically spans several), but in the data model it is a peer container alongside the sprint, not its parent: both live directly under the circle. | circle, anchor-circle |
|
|
1256
|
+
|
|
1257
|
+
All four are **prime labels** — a nest is a story OR a sprint OR an epic OR a milestone, never several at once, and the MCP rejects label combinations among them. The sole allowed pairing is \`userstory\` + \`project\` (automatic via the implication above); \`sprint\`, \`epic\`, and \`milestone\` must never carry the \`project\` label. Relationships between stories and containers are expressed exclusively through graph links, not by stacking labels.
|
|
1258
|
+
|
|
1259
|
+
The three "container" labels (\`sprint\`, \`epic\`, \`milestone\`) are independent grouping axes: a single user story can be linked to any combination of one sprint, one epic, and one milestone via three separate graph relations. There is no hierarchy between the containers themselves — milestones do not contain sprints, epics do not contain sprints. Each carries the same shape: a status field, derived points totals/burned (summed via \`sum_reverse_graphselect\` across linked stories), and a burndown dataseries. Sprint and milestone are term-bound; epic burndown tracks calendar time.
|
|
1260
|
+
|
|
1261
|
+
### Story fields (\`userstory\`)
|
|
1262
|
+
|
|
1263
|
+
Discover the live schema with \`nestr_get_label({ workspaceId, labelId: 'userstory' })\` or by fetching any story with \`fieldsMetaData=true\`.
|
|
1264
|
+
|
|
1265
|
+
| Field code | Field id | Type | Notes |
|
|
1266
|
+
|---|---|---|---|
|
|
1267
|
+
| \`sprint\` | \`userstory_sprint\` | graphselect → sprint | Outgoing graph link. Read/write via \`nestr_get_graph_links({ relation: 'userstory_sprint' })\` / \`nestr_add_graph_link\` / \`nestr_remove_graph_link\`. Hidden when sprints are disabled at the workspace. |
|
|
1268
|
+
| \`epic\` | \`userstory_epic\` | graphselect → epic | Same pattern with relation \`userstory_epic\`. Hidden when epics are disabled. |
|
|
1269
|
+
| \`milestone\` | \`userstory_milestone\` | graphselect → milestone | Same pattern with relation \`userstory_milestone\`. Hidden when milestones are disabled. |
|
|
1270
|
+
| \`points\` | \`userstory_points\` | select | Fibonacci values: 1, 2, 3, 5, 8, 13. A leading \`__unset__\` "Not estimated" sentinel is the unset state — \`points_burned\` stays hidden until the story is estimated. |
|
|
1271
|
+
| \`points_burned\` | \`userstory_points_burned\` | range (0 → points) | Max equals the story's \`userstory_points\`. Server auto-snaps to full points when the story flips to Done (via \`project.status\`), to 0 when undone. |
|
|
1272
|
+
| \`change_request_url\` | \`userstory_change_request_url\` | text | URL of a linked PR / merge request. Always visible so it can be set from the UI. |
|
|
1273
|
+
|
|
1274
|
+
A story uses \`project.status\` for Done (via the \`project\` implication). There is no \`userstory_type\` field — feature/bug/chore/spike was dropped in V1.
|
|
1275
|
+
|
|
1276
|
+
### Sprint fields (\`sprint\`)
|
|
1277
|
+
|
|
1278
|
+
| Field code | Field id | Type | Notes |
|
|
1279
|
+
|---|---|---|---|
|
|
1280
|
+
| \`status\` | \`sprint_status\` | select | \`planned\` / \`active\` / \`closed\` (completed) / \`cancelled\` (completed). Terminal options carry \`completed: true\` so the nest's \`completed\` flag flips when the sprint closes. **Canonical "active sprint" signal — prefer this over term-overlap.** Default: \`planned\`. |
|
|
1281
|
+
| \`term\` | \`sprint_term\` | term ({from, to}) | Server mirrors \`term.to\` into the sprint's \`due\` field so overdue rendering works. |
|
|
1282
|
+
| \`capacity\` | \`sprint_capacity\` | number | Team capacity in points. |
|
|
1283
|
+
| \`points_total\` | \`sprint_points_total\` | number (derived) | Sum of \`userstory_points\` across linked stories. Read-only. |
|
|
1284
|
+
| \`points_burned\` | \`sprint_points_burned\` | number (derived) | Sum of \`userstory_points_burned\` across linked stories. Read-only. |
|
|
1285
|
+
| \`sprint_burndown\` | \`sprint_burndown\` | dataseries | Two-series chart: \`remaining\` (primary, descends from total → 0 via \`invertAgainst\`) and \`total\` (grey step-line). Window-bounded by \`sprint_term\`. |
|
|
1286
|
+
|
|
1287
|
+
Sprint goal lives in the standard \`purpose\` field (relabeled "Sprint goal" in the UI).
|
|
1288
|
+
|
|
1289
|
+
### Milestone fields (\`milestone\`)
|
|
1290
|
+
|
|
1291
|
+
| Field code | Field id | Type | Notes |
|
|
1292
|
+
|---|---|---|---|
|
|
1293
|
+
| \`status\` | \`milestone_status\` | select | \`planned\` / \`in_progress\` / \`released\` (completed) / \`cancelled\`. Only \`released\` marks the milestone completed — shipped milestones are "done", cancelled ones stay uncompleted. |
|
|
1294
|
+
| \`term\` | \`milestone_term\` | term ({from, to}) | The release window. |
|
|
1295
|
+
| \`points_total\` / \`points_burned\` / \`milestone_burndown\` | — | derived | Same shape as the sprint trio, summing across \`userstory_milestone\` instead of \`userstory_sprint\`. |
|
|
1296
|
+
|
|
1297
|
+
### Epic fields (\`epic\`)
|
|
1298
|
+
|
|
1299
|
+
| Field code | Field id | Type | Notes |
|
|
1300
|
+
|---|---|---|---|
|
|
1301
|
+
| \`status\` | \`epic_status\` | select | \`proposed\` / \`in_progress\` / \`done\` (completed). |
|
|
1302
|
+
| \`points_total\` / \`points_burned\` / \`epic_burndown\` | — | derived | Same shape as sprint/milestone, summing across \`userstory_epic\`. **Termless burndown** — tracks on every value change (no \`trackTerm\`), so the chart shows calendar-time trajectory regardless of sprint cadence. |
|
|
1303
|
+
|
|
1304
|
+
### Common workflows
|
|
1305
|
+
|
|
1306
|
+
**Find the active sprint**
|
|
1307
|
+
|
|
1308
|
+
The canonical signal is the lifecycle field:
|
|
1309
|
+
|
|
1310
|
+
\`\`\`
|
|
1311
|
+
nestr_search({ workspaceId, query: "label:sprint fieldValues.sprint_status:active in:<circleId>" })
|
|
1312
|
+
\`\`\`
|
|
1313
|
+
|
|
1314
|
+
Drop \`in:\` for workspace-wide. To find sprints whose term overlaps today (regardless of status — e.g. a \`planned\` sprint that should have started but hasn't been activated):
|
|
1315
|
+
|
|
1316
|
+
\`\`\`
|
|
1317
|
+
nestr_search({ workspaceId, query: "label:sprint sprint->term:now" })
|
|
1318
|
+
\`\`\`
|
|
1319
|
+
|
|
1320
|
+
To list all sprints including closed/cancelled ones (the default search hides completed work), add \`completed:any\` or \`completed-strict:false\`:
|
|
1321
|
+
|
|
1322
|
+
\`\`\`
|
|
1323
|
+
nestr_search({ workspaceId, query: "label:sprint completed:any sort:fieldValues.sprint_term.to sort-order:desc" })
|
|
1324
|
+
\`\`\`
|
|
1325
|
+
|
|
1326
|
+
See \`nestr_help({ topic: "search" })\` for the term-field operator and the \`completed-strict\` / \`completed:any\` DSLs.
|
|
1327
|
+
|
|
1328
|
+
**List the stories in a sprint, epic, or milestone**
|
|
1329
|
+
|
|
1330
|
+
All three use the same pattern — \`incoming\` because the graph edge is stored on the story:
|
|
1331
|
+
|
|
1332
|
+
\`\`\`
|
|
1333
|
+
nestr_get_graph_links({ nestId: <sprintId>, relation: "userstory_sprint", direction: "incoming" })
|
|
1334
|
+
nestr_get_graph_links({ nestId: <epicId>, relation: "userstory_epic", direction: "incoming" })
|
|
1335
|
+
nestr_get_graph_links({ nestId: <milestoneId>, relation: "userstory_milestone", direction: "incoming" })
|
|
1336
|
+
\`\`\`
|
|
1337
|
+
|
|
1338
|
+
**List the backlog (stories with no sprint)**
|
|
1339
|
+
|
|
1340
|
+
\`\`\`
|
|
1341
|
+
nestr_search({ workspaceId, query: "label:userstory completed:false fieldValues.userstory_sprint:!exists in:<circleId>" })
|
|
1342
|
+
\`\`\`
|
|
1343
|
+
|
|
1344
|
+
The \`:!exists\` check on \`fieldValues.userstory_sprint\` selects stories not linked to any sprint. Swap the field id for \`userstory_epic\` / \`userstory_milestone\` to find stories without an epic or milestone instead.
|
|
1345
|
+
|
|
1346
|
+
**Read progress on a sprint / epic / milestone**
|
|
1347
|
+
|
|
1348
|
+
Fetch with \`nestr_get_nest({ nestId, fieldsMetaData: true })\`. The derived rollups land in \`fields['sprint.points_total']\` / \`fields['sprint.points_burned']\` (and the equivalents for epic / milestone). The burndown history lives in the metrics collection — surface it through the regular insights / metric tools rather than recomputing.
|
|
1349
|
+
|
|
1350
|
+
**Create a sprint**
|
|
1351
|
+
|
|
1352
|
+
\`\`\`
|
|
1353
|
+
nestr_create_nest({
|
|
1354
|
+
workspaceId,
|
|
1355
|
+
parentId: <circleId>,
|
|
1356
|
+
labels: ["sprint"],
|
|
1357
|
+
purpose: "Ship the search filter to beta users",
|
|
1358
|
+
fields: { "sprint.term": { from: "2026-06-01", to: "2026-06-14" }, "sprint.capacity": 40 }
|
|
1359
|
+
})
|
|
1360
|
+
\`\`\`
|
|
1361
|
+
|
|
1362
|
+
\`sprint_status\` defaults to \`planned\` — set it to \`active\` when the sprint starts, \`closed\` when it ends.
|
|
1363
|
+
|
|
1364
|
+
**Create a user story**
|
|
1365
|
+
|
|
1366
|
+
\`\`\`
|
|
1367
|
+
nestr_create_nest({
|
|
1368
|
+
workspaceId,
|
|
1369
|
+
parentId: <roleOrCircleId>,
|
|
1370
|
+
labels: ["userstory"],
|
|
1371
|
+
title: "Search filter respects archived items",
|
|
1372
|
+
fields: { "userstory.points": "5" }
|
|
1373
|
+
})
|
|
1374
|
+
\`\`\`
|
|
1375
|
+
|
|
1376
|
+
Leave \`userstory.points\` unset for unestimated stories. Link to sprint / epic / milestone after creation with \`nestr_add_graph_link({ relation: "userstory_sprint" | "userstory_epic" | "userstory_milestone", targetId })\`.
|
|
1377
|
+
|
|
1378
|
+
**Move a story between sprints**
|
|
1379
|
+
|
|
1380
|
+
Remove the old link, add the new one. The sprint-level rollups update automatically through the \`sum_reverse_graphselect\` derivation.
|
|
1381
|
+
|
|
1382
|
+
### Mode-specific guidance
|
|
1383
|
+
|
|
1384
|
+
**Assistant mode** — Defer planning decisions to the user. Surface candidate stories (e.g., "Here are unsprinted high-priority stories in your backlog"), draft \`nestr_create_nest\` payloads, but let the human commit. Show the active sprint's burndown when asked about progress; don't editorialise it.
|
|
1385
|
+
|
|
1386
|
+
**Role-filler mode** — If you energise a role that owns work in a sprint, treat \`fieldValues.sprint_status:active\` as your current operating context. Auto-link stories you create to that sprint when the role's accountabilities match the work. Update \`userstory_points_burned\` as you complete work; do not wait for the human to mark the story Done if the work objectively wraps an accountability. Capture repeatable scrum patterns as skill nests under the role.
|
|
1387
|
+
|
|
1388
|
+
**Workspace mode** — Use for sprint / milestone setup, capacity tracking, and reporting across circles. Avoid user-scoped flows.`,
|
|
1389
|
+
"okr": `## OKR App (Objectives & Key Results)
|
|
1390
|
+
|
|
1391
|
+
The OKR app adds three labels — \`goal\` (Objective), \`result\` (Key Result), and \`resultwork\` (work that contributes to a result). It works the same in any workspace where the app is enabled; the goal/result labels are part of \`nestr:core\`, but the surfacing UI and the conventions below assume the OKR pattern.
|
|
1392
|
+
|
|
1393
|
+
### The three labels
|
|
1394
|
+
|
|
1395
|
+
| Label | Role | Lives under |
|
|
1396
|
+
|---|---|---|
|
|
1397
|
+
| \`goal\` | An Objective. Can nest under another goal to express hierarchy. | anchor-circle, circle, role, goal |
|
|
1398
|
+
| \`result\` | A Key Result. Always lives under a \`goal\`. | goal (only) |
|
|
1399
|
+
| \`resultwork\` | A completable nest that contributes to a key result. Links to its result via a graph relation. | anywhere (typically under a role or project) |
|
|
1400
|
+
|
|
1401
|
+
### Objective fields (\`goal\`)
|
|
1402
|
+
|
|
1403
|
+
| Field code | Field id | Type | Notes |
|
|
1404
|
+
|---|---|---|---|
|
|
1405
|
+
| \`term\` | \`goal_term\` | term ({from, to}) | The period the Objective runs in (quarter, year, custom). Follows the ancestor goal when set on a parent. |
|
|
1406
|
+
| \`goal_complete\` | \`goal_complete\` | percentage (derived) | Average progress of the Objective's Key Results. Read-only. |
|
|
1407
|
+
| \`goal-data\` | \`goal-data\` | dataseries | Progress history. Tracks \`goal_complete\` over \`goal_term\`. |
|
|
1408
|
+
|
|
1409
|
+
### Key Result fields (\`result\`)
|
|
1410
|
+
|
|
1411
|
+
| Field code | Field id | Type | Notes |
|
|
1412
|
+
|---|---|---|---|
|
|
1413
|
+
| \`term\` | \`goal_term\` | term ({from, to}) | Inherits from the parent goal by default. |
|
|
1414
|
+
| \`target_complete\` | \`goal_complete\` | range (0 → 100) | The user's progress slider. Aggregates upward into the parent Objective's \`goal_complete\`. |
|
|
1415
|
+
| \`goal-data\` | \`goal-data\` | dataseries | Same history pattern as goals. |
|
|
1416
|
+
|
|
1417
|
+
### Work contribution (\`resultwork\`)
|
|
1418
|
+
|
|
1419
|
+
| Field code | Field id | Type | Notes |
|
|
1420
|
+
|---|---|---|---|
|
|
1421
|
+
| \`result\` | \`completable_result\` | graphselect → goal/result | Links the completable to the Key Result (or Objective) it contributes to. |
|
|
1422
|
+
|
|
1423
|
+
### Common workflows
|
|
1424
|
+
|
|
1425
|
+
**Find the current Objectives for a circle**
|
|
1426
|
+
|
|
1427
|
+
\`\`\`
|
|
1428
|
+
nestr_search({ workspaceId, query: "label:goal goal->term:now in:<circleId>" })
|
|
1429
|
+
\`\`\`
|
|
1430
|
+
|
|
1431
|
+
For all Objectives running this quarter:
|
|
1432
|
+
|
|
1433
|
+
\`\`\`
|
|
1434
|
+
nestr_search({ workspaceId, query: "label:goal goal->term:this_quarter" })
|
|
1435
|
+
\`\`\`
|
|
1436
|
+
|
|
1437
|
+
See \`nestr_help({ topic: "search" })\` → "Term-field Search" for the full value forms.
|
|
1438
|
+
|
|
1439
|
+
**List Key Results under an Objective**
|
|
1440
|
+
|
|
1441
|
+
\`\`\`
|
|
1442
|
+
nestr_get_nest_children({ nestId: <goalId> })
|
|
1443
|
+
\`\`\`
|
|
1444
|
+
|
|
1445
|
+
Key Results are always direct children of their goal.
|
|
1446
|
+
|
|
1447
|
+
**Find work contributing to a Key Result**
|
|
1448
|
+
|
|
1449
|
+
\`\`\`
|
|
1450
|
+
nestr_get_graph_links({ nestId: <resultId>, relation: "completable_result", direction: "incoming" })
|
|
1451
|
+
\`\`\`
|
|
1452
|
+
|
|
1453
|
+
**Read Objective progress**
|
|
1454
|
+
|
|
1455
|
+
Fetch with \`nestr_get_nest({ nestId, fieldsMetaData: true })\`. \`fields['goal.goal_complete']\` holds the averaged percentage; \`fields['goal.goal-data']\` exposes the history series.
|
|
1456
|
+
|
|
1457
|
+
**Create an Objective**
|
|
1458
|
+
|
|
1459
|
+
\`\`\`
|
|
1460
|
+
nestr_create_nest({
|
|
1461
|
+
workspaceId,
|
|
1462
|
+
parentId: <circleId | roleId | anchorId>,
|
|
1463
|
+
labels: ["goal"],
|
|
1464
|
+
title: "Trial conversion above 30%",
|
|
1465
|
+
purpose: "Lift sustainable revenue without raising acquisition spend",
|
|
1466
|
+
fields: { "goal.term": { from: "2026-04-01", to: "2026-06-30" } }
|
|
1467
|
+
})
|
|
1468
|
+
\`\`\`
|
|
1469
|
+
|
|
1470
|
+
**Create a Key Result**
|
|
1471
|
+
|
|
1472
|
+
\`\`\`
|
|
1473
|
+
nestr_create_nest({
|
|
1474
|
+
workspaceId,
|
|
1475
|
+
parentId: <goalId>,
|
|
1476
|
+
labels: ["result"],
|
|
1477
|
+
title: "Convert 35% of new trials within 14 days"
|
|
1478
|
+
})
|
|
1479
|
+
\`\`\`
|
|
1480
|
+
|
|
1481
|
+
The KR inherits \`goal_term\` from the parent automatically.
|
|
1482
|
+
|
|
1483
|
+
**Mark progress on a Key Result**
|
|
1484
|
+
|
|
1485
|
+
\`\`\`
|
|
1486
|
+
nestr_update_nest({ nestId: <resultId>, fields: { "result.target_complete": 60 } })
|
|
1487
|
+
\`\`\`
|
|
1488
|
+
|
|
1489
|
+
The parent Objective's \`goal_complete\` updates from the average of its KRs.
|
|
1490
|
+
|
|
1491
|
+
### Mode-specific guidance
|
|
1492
|
+
|
|
1493
|
+
**Assistant mode** — Help the user articulate Objectives that are aspirational, time-bound, and outcome-shaped (past-tense or measurable). Coach them to keep KRs measurable; resist the urge to fill in numbers without their input. When asked "how are we doing on OKRs?", read the period (\`goal.term=this_quarter\` is the usual frame) and report progress objectively.
|
|
1494
|
+
|
|
1495
|
+
**Role-filler mode** — If your role owns an Objective or contributes \`resultwork\` to a Key Result, update your contribution as part of your operational rhythm. Reading the parent goal's \`term\` tells you the window you're working in. Capture repeatable measurement patterns as skill nests.
|
|
1496
|
+
|
|
1497
|
+
**Workspace mode** — Use for cross-circle reporting and period-level rollups. Pair \`goal.term=this_quarter\` queries with insights tools to build dashboards.`,
|
|
1198
1498
|
"doing-work": DOING_WORK_INSTRUCTIONS,
|
|
1199
1499
|
"tension-processing": TENSION_PROCESSING_INSTRUCTIONS,
|
|
1200
1500
|
"workspace-setup": WORKSPACE_SETUP_INSTRUCTIONS,
|
package/build/help/topics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/help/topics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,QAAQ,EAAE
|
|
1
|
+
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/help/topics.ts"],"names":[],"mappings":"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"}
|
package/build/http.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ export interface SessionData {
|
|
|
42
42
|
mcpClient?: string;
|
|
43
43
|
mcpClientVersion?: string;
|
|
44
44
|
isApiKey: boolean;
|
|
45
|
+
isPublic?: boolean;
|
|
45
46
|
wantsJsonOnly: boolean;
|
|
46
47
|
hasStoredOAuthSession: boolean;
|
|
47
48
|
userId?: string;
|
|
@@ -76,19 +77,9 @@ export interface SessionData {
|
|
|
76
77
|
sessionCorrelationId?: string;
|
|
77
78
|
}
|
|
78
79
|
export declare const sessions: Record<string, SessionData>;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
* Matches on (authToken, mcpClient) within a 10-minute window. The POST /mcp
|
|
83
|
-
* init path closes and drops the match so the client gets a fresh, clean
|
|
84
|
-
* session — this prevents "Server already initialized" 400s when a client
|
|
85
|
-
* reconnects after an SSE drop (the transport can only be initialized once).
|
|
86
|
-
*/
|
|
87
|
-
export declare const SESSION_COALESCE_WINDOW_MS: number;
|
|
88
|
-
export declare function findCoalescableSession(authToken: string, mcpClient: string | undefined): {
|
|
89
|
-
sessionId: string;
|
|
90
|
-
session: SessionData;
|
|
91
|
-
} | undefined;
|
|
80
|
+
export declare const publicSessions: Record<string, SessionData>;
|
|
81
|
+
export declare const SSE_DEAD_IDLE_TIMEOUT_MS: number;
|
|
82
|
+
export declare function sweepStaleSessions(map: Record<string, SessionData>, now: number): void;
|
|
92
83
|
/**
|
|
93
84
|
* Extract authentication token from request headers
|
|
94
85
|
*
|
package/build/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAgB,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAgB,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AA+BnG,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,oBAAoB,CAAC;AAmB5B,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,IAAI,MAAM,CAEjE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,eAAO,MAAM,GAAG,6CAAY,CAAC;AA86B7B,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,6BAA6B,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,6FAA6F;IAC7F,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAMD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,CAAC;AAKxD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,CAAC;AAS9D,eAAO,MAAM,wBAAwB,QAAiB,CAAC;AAcvD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAgBtF;AAgYD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAcxD"}
|