@pbhamri/quartermaster-mcp 0.3.0 → 0.4.0
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/bin/server.js
CHANGED
|
@@ -138,7 +138,7 @@ Seeded by quartermaster-mcp · profile **${profile.displayName}**.
|
|
|
138
138
|
- Score every artefact against the **TRANSFORMATIVE** PM behaviors (AI-driven innovation, outcome-centric, shared leverage, decision velocity).
|
|
139
139
|
- Close every response with a 2-line Transformative prompt-sharpening tip.
|
|
140
140
|
|
|
141
|
-
## CXE pillars (
|
|
141
|
+
## CXE pillars (EVP Security, FY26)
|
|
142
142
|
1. CXE = core priority
|
|
143
143
|
2. Customers get value fast (TTV)
|
|
144
144
|
3. Operate with confidence
|
|
@@ -300,6 +300,163 @@ function emitPr({ repoPath, profileId, branch = null, title = null, body = null,
|
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
|
|
303
|
+
// ---- Onboarding surface (since v0.4.0) ----
|
|
304
|
+
// First-time peer experience: welcome, personalize, skills tour. Designed
|
|
305
|
+
// after real customer feedback (a peer PM installed v0.3.1 and got 12
|
|
306
|
+
// tools with no guide, no personalization). All three tools return
|
|
307
|
+
// markdown the AI client renders inline; no auto-fill, no credentials
|
|
308
|
+
// inherited from the package author.
|
|
309
|
+
|
|
310
|
+
const QM_HOME = path.join(os.homedir(), ".quartermaster");
|
|
311
|
+
const QM_CONNECT_DB = process.env.QM_CONNECT_DB || path.join(QM_HOME, "connect-db.json");
|
|
312
|
+
|
|
313
|
+
function qmWelcome() {
|
|
314
|
+
const hasConnectDb = fs.existsSync(QM_CONNECT_DB);
|
|
315
|
+
const profiles = listProfiles();
|
|
316
|
+
return {
|
|
317
|
+
server: "quartermaster-mcp",
|
|
318
|
+
version: PKG.version,
|
|
319
|
+
welcome: "Welcome to Quartermaster MCP — a PM paved-path bundle for Microsoft PMs.",
|
|
320
|
+
what_this_is: "12 MCP tools that scaffold a PM operating model: Purview product profiles, /npf and /cxe prompts, NPF assessment, BATON-style frameworks, and read-only access to your repo content.",
|
|
321
|
+
next_three_steps: hasConnectDb ? [
|
|
322
|
+
`1. Run \`qm_personalize\` to refresh your Connect tracker if needed (current: ${QM_CONNECT_DB}).`,
|
|
323
|
+
"2. Run `qm_skills_for_pm` to see the daily-use catalog for product roadmap + strategy.",
|
|
324
|
+
"3. Run `qm_seed_repo` to scaffold a target repo with the Quartermaster kit.",
|
|
325
|
+
] : [
|
|
326
|
+
"1. Run `qm_personalize` — answers 5 questions, writes YOUR connect-db (uses ~/.quartermaster/connect-db.json by default; override via QM_CONNECT_DB env var). The package author's data is never used.",
|
|
327
|
+
`2. Run \`qm_apply_profile\` with one of the ${profiles.length} profiles: ${profiles.map(p => p.id).join(", ")}.`,
|
|
328
|
+
"3. Run `qm_skills_for_pm` to see the daily-use catalog for product roadmap + strategy.",
|
|
329
|
+
],
|
|
330
|
+
privacy_note: "Quartermaster ships templates only. Your Connect data, GitHub/Kusto/ADO credentials, and personal NPF history live on YOUR machine and are never committed to the package. The author's environment is not leaked to your install.",
|
|
331
|
+
troubleshooting: {
|
|
332
|
+
"Tools not visible after install": "Restart your MCP client (Copilot CLI: /restart; Claude Desktop: Cmd-Q + relaunch).",
|
|
333
|
+
"qm_personalize asks me questions but I want to skip": "Answer 'skip' to any question; you can re-run later. The template is also at <package>/resources/connect-db.template.json — copy and edit by hand.",
|
|
334
|
+
"I want to see what files this server can read": "Call repo_overview — it returns the repo_root and exclusion list.",
|
|
335
|
+
},
|
|
336
|
+
docs: "https://www.npmjs.com/package/@pbhamri/quartermaster-mcp",
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function qmPersonalize(args = {}) {
|
|
341
|
+
// Two modes: (1) returns a Q&A flow for the AI client to walk through;
|
|
342
|
+
// (2) if the client passes answers, generates the connect-db file from
|
|
343
|
+
// the template at resources/connect-db.template.json. NEVER inherits
|
|
344
|
+
// the package author's data.
|
|
345
|
+
const tplPath = path.join(RES, "connect-db.template.json");
|
|
346
|
+
if (!fs.existsSync(tplPath)) {
|
|
347
|
+
return { error: "Template not found", expected: tplPath };
|
|
348
|
+
}
|
|
349
|
+
const template = readJson(tplPath);
|
|
350
|
+
|
|
351
|
+
// Mode 1: no answers yet — return the question flow.
|
|
352
|
+
if (!args.answers) {
|
|
353
|
+
return {
|
|
354
|
+
mode: "interview",
|
|
355
|
+
target_path: QM_CONNECT_DB,
|
|
356
|
+
target_exists: fs.existsSync(QM_CONNECT_DB),
|
|
357
|
+
override_with_env: "Set QM_CONNECT_DB env var to use a different path.",
|
|
358
|
+
questions: [
|
|
359
|
+
{ id: "owner_role", q: "What's your role + product? (e.g. 'PM, Microsoft Intune Endpoint Management')", required: true },
|
|
360
|
+
{ id: "level", q: "What's your IC level? (L62 / L63 / L64 / L65 / L67) — drives /npf calibration", required: true },
|
|
361
|
+
{ id: "fy_period", q: "Current FY period? (e.g. 'FY26 H1')", required: true },
|
|
362
|
+
{ id: "goal_titles", q: "Your top 3-5 Connect goal titles (one per line). I'll scaffold them as drafts you can fill in baselines + targets later.", required: true },
|
|
363
|
+
{ id: "active_directive", q: "Top active directive from your manager / GPM (one line, free-form)", required: false },
|
|
364
|
+
],
|
|
365
|
+
instructions_for_ai_client: "Ask the user the questions above one at a time. When all answers collected, call qm_personalize again with answers={...} keyed by question id. The user — not the AI — answers each question.",
|
|
366
|
+
will_write_to: QM_CONNECT_DB,
|
|
367
|
+
will_overwrite: fs.existsSync(QM_CONNECT_DB) ? "YES — backup recommended before proceeding" : "NO — new file",
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Mode 2: answers provided — write the personalized connect-db.
|
|
372
|
+
const a = args.answers;
|
|
373
|
+
const personalized = {
|
|
374
|
+
...template,
|
|
375
|
+
meta: {
|
|
376
|
+
owner_role: a.owner_role || template.meta.owner_role,
|
|
377
|
+
level: a.level || template.meta.level,
|
|
378
|
+
fy_period: a.fy_period || template.meta.fy_period,
|
|
379
|
+
last_updated: new Date().toISOString().split("T")[0],
|
|
380
|
+
},
|
|
381
|
+
goals: (a.goal_titles ? a.goal_titles.split("\n") : [])
|
|
382
|
+
.map((t, i) => ({ id: i + 1, title: t.trim(), status: "draft", smart: false, baseline: null, target: null, due: null }))
|
|
383
|
+
.filter(g => g.title),
|
|
384
|
+
directives: a.active_directive ? [{ id: "d1", title: a.active_directive, status: "active" }] : [],
|
|
385
|
+
};
|
|
386
|
+
// Backup existing if present
|
|
387
|
+
if (fs.existsSync(QM_CONNECT_DB)) {
|
|
388
|
+
const backup = QM_CONNECT_DB.replace(/\.json$/, `.backup-${Date.now()}.json`);
|
|
389
|
+
fs.copyFileSync(QM_CONNECT_DB, backup);
|
|
390
|
+
personalized._backup_of_previous = backup;
|
|
391
|
+
}
|
|
392
|
+
fs.mkdirSync(path.dirname(QM_CONNECT_DB), { recursive: true });
|
|
393
|
+
fs.writeFileSync(QM_CONNECT_DB, JSON.stringify(personalized, null, 2));
|
|
394
|
+
emit("qm.personalize", { level: a.level, goal_count: personalized.goals.length });
|
|
395
|
+
return {
|
|
396
|
+
mode: "written",
|
|
397
|
+
path: QM_CONNECT_DB,
|
|
398
|
+
summary: `Wrote ${personalized.goals.length} draft goals + ${personalized.directives.length} directive at level ${personalized.meta.level}.`,
|
|
399
|
+
next_step: "Run /npf in your Copilot CLI / Chat to get your first NPF assessment calibrated to " + (personalized.meta.level || "your level") + ".",
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
function qmSkillsForPm() {
|
|
404
|
+
// Curated catalog: 12 MCP tools mapped to PM daily-use cases.
|
|
405
|
+
// Optimised for product roadmap + strategy work.
|
|
406
|
+
return {
|
|
407
|
+
title: "Quartermaster — daily PM skills for roadmap + strategy",
|
|
408
|
+
intro: "12 tools, organised by PM workflow. Each tool name in backticks is callable as `<tool_name>` from your MCP client.",
|
|
409
|
+
workflows: [
|
|
410
|
+
{
|
|
411
|
+
scenario: "Monday — Weekly self-assessment + planning",
|
|
412
|
+
tools: [
|
|
413
|
+
{ name: "/npf (prompt)", use: "30-second NPF score + biggest gap + next-move recommendation. Calibrated to your IC level." },
|
|
414
|
+
{ name: "qm_telemetry", use: "Read paved-path adoption events from the last 7 days; see whose installs landed." },
|
|
415
|
+
{ name: "repo_recent_sessions", use: "Read your cross-model session log to recall what shipped last week without re-explaining." },
|
|
416
|
+
],
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
scenario: "Tuesday-Thursday — PRD authoring + roadmap shaping",
|
|
420
|
+
tools: [
|
|
421
|
+
{ name: "qm_seed_repo", use: "Scaffold a new repo with the IGRM-style PRD format, /cxe + /npf prompts, command-center seed. Idempotent." },
|
|
422
|
+
{ name: "qm_apply_profile", use: "Lock in your product profile (DLM / Insider Risk / eDiscovery / Records / Compliance / Billing) so every PRD inherits your KPIs + directives." },
|
|
423
|
+
{ name: "qm_audit_repo", use: "Score any repo /6 against PM-readiness (AGENTS.md, copilot-instructions, profile, /npf, /cxe, verify.ps1). Fast peer review." },
|
|
424
|
+
{ name: "/cxe (prompt)", use: "Audit a PRD or work item against the 4 CXE pillars (Priority / TTV / Confidence / Support)." },
|
|
425
|
+
],
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
scenario: "Friday — Strategy + leadership prep",
|
|
429
|
+
tools: [
|
|
430
|
+
{ name: "repo_overview / repo_list_dir / repo_read_file / repo_search", use: "Pull artefacts into context for an exec readout without copy-pasting. Read-only, secrets denied at server." },
|
|
431
|
+
{ name: "qm_emit_pr", use: "Seed a repo with a profile AND open a labeled PR via gh CLI — closes the loop on cross-team commitments in one call." },
|
|
432
|
+
],
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
scenario: "Onboarding + sharing with peer PMs",
|
|
436
|
+
tools: [
|
|
437
|
+
{ name: "qm_welcome", use: "First-run guide. Surface this to any new peer." },
|
|
438
|
+
{ name: "qm_personalize", use: "Walk a peer through 5 questions, write THEIR connect-db. Their data, their machine, never the package author's." },
|
|
439
|
+
{ name: "qm_install_prompts", use: "Drop /npf + /cxe into a peer's ~/.github/prompts so the prompts work in Copilot Chat (IDE) too." },
|
|
440
|
+
{ name: "qm_skills_for_pm", use: "This catalog. Run any time you forget what's available." },
|
|
441
|
+
],
|
|
442
|
+
},
|
|
443
|
+
],
|
|
444
|
+
daily_loop: [
|
|
445
|
+
"1. Mon 09:00 — `/npf` for the week's score + gap.",
|
|
446
|
+
"2. Tue-Thu — `qm_seed_repo` / `qm_apply_profile` / `/cxe` while authoring PRDs.",
|
|
447
|
+
"3. Fri PM — `repo_search` + `repo_read_file` to assemble Friday's exec readout.",
|
|
448
|
+
"4. Monthly — `qm_telemetry` to check who's actually adopting your paved paths (Reach signal for next /npf).",
|
|
449
|
+
],
|
|
450
|
+
not_in_scope: [
|
|
451
|
+
"Real-time customer feedback ingestion — pair with WorkIQ MCP for that.",
|
|
452
|
+
"ADO work-item bulk operations — pair with Azure DevOps MCP.",
|
|
453
|
+
"Kusto KPI pulls — pair with the Kusto MCP server.",
|
|
454
|
+
"All three above have profile templates in resources/mcp-servers/ — paste into your MCP config, fill the {{PLACEHOLDERS}} with your own org/project/cluster.",
|
|
455
|
+
],
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
|
|
303
460
|
// ---- Repo-read surface (since v0.3.0) ----
|
|
304
461
|
// Lets a peer's MCP client read files in the repo where the server runs.
|
|
305
462
|
// Default REPO_ROOT = cwd at launch (overridable via QM_REPO_ROOT env).
|
|
@@ -403,7 +560,7 @@ function repoRecentSessions({ limit = 10 } = {}) {
|
|
|
403
560
|
|
|
404
561
|
// ---------------- MCP wiring ----------------
|
|
405
562
|
const server = new Server(
|
|
406
|
-
{ name: "quartermaster-mcp", version:
|
|
563
|
+
{ name: "quartermaster-mcp", version: PKG.version },
|
|
407
564
|
{ capabilities: { tools: {}, resources: {} } }
|
|
408
565
|
);
|
|
409
566
|
|
|
@@ -433,6 +590,13 @@ const TOOLS = [
|
|
|
433
590
|
title: { type:"string" }, body: { type:"string" },
|
|
434
591
|
base: { type:"string", default:"main" }, draft: { type:"boolean", default:false }
|
|
435
592
|
} } },
|
|
593
|
+
// ---- v0.4.0 onboarding surface ----
|
|
594
|
+
{ name: "qm_welcome", description: "First-run welcome + 3-step onboarding guide. Surface this to any new peer who installed quartermaster-mcp. No args.",
|
|
595
|
+
inputSchema: { type: "object", properties: {} } },
|
|
596
|
+
{ name: "qm_personalize", description: "Interactive setup. Returns a Q&A flow (mode='interview') for the AI client to walk the user through, OR if answers provided, writes a personalized connect-db at ~/.quartermaster/connect-db.json (override with QM_CONNECT_DB env var). Never inherits the package author's data.",
|
|
597
|
+
inputSchema: { type: "object", properties: { answers: { type: "object", description: "Key-value of question ids to user answers. Returned by interview mode." } } } },
|
|
598
|
+
{ name: "qm_skills_for_pm", description: "Curated catalog of the Quartermaster tools mapped to PM daily-use workflows (Monday self-assess, midweek PRDs + roadmap, Friday strategy prep, onboarding + sharing).",
|
|
599
|
+
inputSchema: { type: "object", properties: {} } },
|
|
436
600
|
// ---- v0.3.0 read-only repo surface ----
|
|
437
601
|
{ name: "repo_overview", description: "Returns server metadata: repo_root, framework_count (if a competitive-intel-agent/frameworks dir exists), exclusion rules. No args.",
|
|
438
602
|
inputSchema: { type: "object", properties: {} } },
|
|
@@ -460,6 +624,9 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
460
624
|
case "qm_apply_profile": result = await timed("qm.apply_profile", { profileId: args.profileId }, async () => applyProfile(args)); break;
|
|
461
625
|
case "qm_telemetry": result = readTelemetry(args); break;
|
|
462
626
|
case "qm_emit_pr": result = await timed("qm.emit_pr", { profileId: args.profileId }, async () => emitPr(args)); break;
|
|
627
|
+
case "qm_welcome": result = qmWelcome(); break;
|
|
628
|
+
case "qm_personalize": result = qmPersonalize(args); break;
|
|
629
|
+
case "qm_skills_for_pm": result = qmSkillsForPm(); break;
|
|
463
630
|
case "repo_overview": result = repoOverview(); break;
|
|
464
631
|
case "repo_list_dir": result = repoListDir(args); break;
|
|
465
632
|
case "repo_read_file": result = repoReadFile(args); break;
|
|
@@ -490,3 +657,4 @@ server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
|
|
|
490
657
|
|
|
491
658
|
await server.connect(new StdioServerTransport());
|
|
492
659
|
process.stderr.write(`quartermaster-mcp v${PKG.version} ready (stdio)\n`);
|
|
660
|
+
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pbhamri/quartermaster-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server that seeds any repo with the Quartermaster PM kit
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "MCP server that seeds any repo with the Quartermaster PM kit + provides read-only repo access + first-run onboarding (qm_welcome, qm_personalize, qm_skills_for_pm). Personalised per peer; never inherits the package author's Connect/credentials/personal data. One-command share with any MS PM peer: npx -y @pbhamri/quartermaster-mcp",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"quartermaster-mcp": "bin/server.js"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_template_for": "Quartermaster MCP — Connect goal tracker template",
|
|
3
|
+
"_instructions": "Replace TODO placeholders with your own goals/KPIs. Never commit your filled copy back to a public repo.",
|
|
4
|
+
"schemaVersion": 1,
|
|
5
|
+
"meta": {
|
|
6
|
+
"owner_role": "TODO: e.g. PM, Microsoft Purview DLM",
|
|
7
|
+
"level": "TODO: e.g. L62 / L63 / L64 / L65",
|
|
8
|
+
"fy_period": "TODO: e.g. FY26 H1",
|
|
9
|
+
"last_updated": "TODO: ISO date"
|
|
10
|
+
},
|
|
11
|
+
"goals": [
|
|
12
|
+
{ "id": 1, "title": "TODO: Customer outcome you own E2E", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
|
|
13
|
+
{ "id": 2, "title": "TODO: Adoption / funnel KPI", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
|
|
14
|
+
{ "id": 3, "title": "TODO: AI-leverage / paved-path goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
|
|
15
|
+
{ "id": 4, "title": "TODO: Cross-functional collaboration / mentor goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null },
|
|
16
|
+
{ "id": 5, "title": "TODO: Personal growth / level-up goal", "status": "draft", "smart": false, "baseline": null, "target": null, "due": null }
|
|
17
|
+
],
|
|
18
|
+
"kpis": {
|
|
19
|
+
"_examples": "Replace these with KPIs from your team's OKR doc. Each KPI has baseline + target + cadence.",
|
|
20
|
+
"kpi_1": { "name": "TODO", "baseline": null, "target": null, "cadence": "weekly" }
|
|
21
|
+
},
|
|
22
|
+
"directives": [
|
|
23
|
+
{ "id": "d1", "title": "TODO: Active directive from your manager / GPM", "status": "active" }
|
|
24
|
+
],
|
|
25
|
+
"todos": [],
|
|
26
|
+
"cxePillars": {
|
|
27
|
+
"_anchor": "EVP Security CXE pillars (FY26)",
|
|
28
|
+
"priority": { "evidence": [], "lagging_metric": null },
|
|
29
|
+
"ttv": { "evidence": [], "lagging_metric": null },
|
|
30
|
+
"confidence": { "evidence": [], "lagging_metric": null },
|
|
31
|
+
"support": { "evidence": [], "lagging_metric": null }
|
|
32
|
+
},
|
|
33
|
+
"npfHistory": [],
|
|
34
|
+
"cadenceSchedule": {
|
|
35
|
+
"weekly_self_assess": "Mon 09:00 local",
|
|
36
|
+
"monthly_exec_readout": "Last Friday of month",
|
|
37
|
+
"quarterly_connect_review": "Mid-quarter + close-quarter"
|
|
38
|
+
},
|
|
39
|
+
"mcpHealth": {
|
|
40
|
+
"_purpose": "Track which MCP surfaces you have configured. Quartermaster fills this when you accept the qm_install_mcp prompts.",
|
|
41
|
+
"ado": { "configured": false },
|
|
42
|
+
"kusto": { "configured": false },
|
|
43
|
+
"workiq": { "configured": false },
|
|
44
|
+
"playwright": { "configured": false }
|
|
45
|
+
},
|
|
46
|
+
"quickLinks": {
|
|
47
|
+
"_examples": "Replace with your team's actual links",
|
|
48
|
+
"team_okr_doc": "TODO",
|
|
49
|
+
"release_calendar": "TODO",
|
|
50
|
+
"exec_review_deck": "TODO"
|
|
51
|
+
},
|
|
52
|
+
"notes": [],
|
|
53
|
+
"recentReports": []
|
|
54
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: One-word trigger — audit any PRD, work-item, or shipped surface against
|
|
2
|
+
description: One-word trigger — audit any PRD, work-item, or shipped surface against EVP Security CXE pillars (CXE-first / Value-fast / Confidence / Support-when-it-matters).
|
|
3
3
|
---
|
|
4
|
-
# /cxe —
|
|
4
|
+
# /cxe — EVP Security CXE pillar audit
|
|
5
5
|
|
|
6
6
|
When the user types `/cxe` (alone, or `/cxe <id-or-path>`), run a 4-pillar audit.
|
|
7
7
|
|
|
@@ -10,7 +10,7 @@ When the user types `/cxe` (alone, or `/cxe <id-or-path>`), run a 4-pillar audit
|
|
|
10
10
|
- If `<id>`: audit that PRD id.
|
|
11
11
|
- If `<path>`: audit the file at that path (PRD .md / .docx / .html or ADO work-item .json export).
|
|
12
12
|
|
|
13
|
-
## Pillars (verbatim from
|
|
13
|
+
## Pillars (verbatim from EVP Security, FY26)
|
|
14
14
|
|
|
15
15
|
| # | Pillar | The lens |
|
|
16
16
|
|---|---|---|
|
|
@@ -48,9 +48,10 @@ Biggest gap: <one sentence>
|
|
|
48
48
|
Next move: <one specific edit + owner + by-when>
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
Then close with the standard 3-block (Transformative tip /
|
|
51
|
+
Then close with the standard 3-block (Transformative tip / EVP Security AMA / NPF Reach Expansion) — the **EVP Security AMA line must now reference whichever pillar the audit found weakest**, so the rubric drives the close, not generic alignment.
|
|
52
52
|
|
|
53
53
|
## Notes
|
|
54
54
|
- This is candid, not flattering. A 3/8 is a real signal that the artefact needs a CXE rewrite, not a re-edit.
|
|
55
55
|
- TTV (P2) cannot be scored 2 without a *measured* baseline number — "TTV is fast" doesn't count.
|
|
56
56
|
- Support (P4) must be **in-product**. A docs link is P4=1, not P4=2.
|
|
57
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: One-word trigger — assess current NPF (Net Productivity Factor) performance
|
|
2
|
+
description: One-word trigger — assess current NPF (Net Productivity Factor) performance, calibrated to your IC level (default L64 — Senior PM IC4). Reads connect-db.json + recent CI reports, scores against L3 Transformative band AND the band-specific expectation table, and recommends the single highest-leverage next move.
|
|
3
3
|
---
|
|
4
4
|
# /npf — Net Productivity Factor assessment
|
|
5
5
|
|
|
@@ -7,39 +7,47 @@ When the user types `/npf` (or just "npf"), run this assessment.
|
|
|
7
7
|
|
|
8
8
|
## Steps
|
|
9
9
|
|
|
10
|
-
1.
|
|
11
|
-
|
|
10
|
+
1. **Locate connect-db.** Order of preference:
|
|
11
|
+
- Env var `QM_CONNECT_DB` if set, OR
|
|
12
|
+
- `~/.quartermaster/connect-db.json` (default for new installs), OR
|
|
13
|
+
- `~/Documents/Connect/db/connect-db.json` (legacy location).
|
|
14
|
+
|
|
15
|
+
If none exist: tell the user to run `qm_personalize` (Quartermaster MCP tool) to scaffold one, then re-run /npf.
|
|
16
|
+
|
|
17
|
+
2. From connect-db, extract `npfHistory[]`, `kpis`, `goals`, `directives`, `todos`.
|
|
18
|
+
3. Compute:
|
|
12
19
|
- **Current NPF**: latest `npfHistory[].index` + band
|
|
13
20
|
- **Week-over-week delta**: latest − snapshot from 7 days ago
|
|
14
21
|
- **Trend**: rising / flat / falling
|
|
15
|
-
- **L3 band proof**: count of evidence in last 7 days (skills shipped,
|
|
16
|
-
|
|
17
|
-
- **Leverage** — shared assets
|
|
18
|
-
- **Reach** — peers / workloads
|
|
22
|
+
- **L3 band proof**: count of evidence in last 7 days (skills shipped, paved-path artefacts, npm packages published, ADO/PR telemetry-tagged work)
|
|
23
|
+
4. Score against the four TRANSFORMATIVE behaviors **AND apply the IC-band calibration table** (default L64: NPF 65-80, mentor footprint 1-3 peers, all 4 CXE pillars with lagging metric, telemetry-confirmed reach not just outreach):
|
|
24
|
+
- **Leverage** — shared assets (skills, agents, paved paths, npm packages)
|
|
25
|
+
- **Reach** — peers / workloads with telemetry-confirmed adoption (use paved-path-events.jsonl as ground truth)
|
|
19
26
|
- **Cycle-time collapse** — weeks→days or days→minutes proof
|
|
20
27
|
- **Outcome focus** — customer/business metric movement vs activity counts
|
|
21
|
-
|
|
22
|
-
5. Recommend **one move** that would lift NPF by ≥5 points before the next refresh.
|
|
28
|
+
5. Identify the **single biggest NPF leak** and recommend **one move** that would lift NPF by ≥5 points before the next refresh.
|
|
23
29
|
|
|
24
30
|
## Output format
|
|
25
31
|
|
|
26
32
|
```
|
|
27
|
-
NPF: <score>/100 · <band> · <trend arrow> <delta> wk/wk
|
|
33
|
+
NPF (calibrated to L<band>): <score>/100 · <band-name> · <trend arrow> <delta> wk/wk
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
Leverage
|
|
31
|
-
Reach
|
|
32
|
-
Cycle-time xx/
|
|
33
|
-
Outcome focus
|
|
35
|
+
Dimension IC-band read Mechanical Evidence
|
|
36
|
+
Leverage A/B/C/D xx/100 <1-line proof>
|
|
37
|
+
Reach A/B/C/D xx/100 <1-line proof>
|
|
38
|
+
Cycle-time A/B/C/D xx/100 <1-line proof>
|
|
39
|
+
Outcome focus A/B/C/D xx/100 <1-line proof>
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
Calibration verdict: <A-/B/B-/C+/C/D> (<one sentence summary>)
|
|
42
|
+
Biggest gap to bar: <one sentence>
|
|
43
|
+
Next move (≥+5 NPF): <one specific action with owner + by-when>
|
|
37
44
|
```
|
|
38
45
|
|
|
39
|
-
Then close with the standard 3-block (Transformative tip
|
|
46
|
+
Then close with the standard 3-block (Transformative tip · AMA Alignment · NPF Reach Expansion).
|
|
40
47
|
|
|
41
|
-
##
|
|
48
|
+
## Rules
|
|
42
49
|
|
|
43
|
-
- The carried-forward NPF (note contains "auto-carried") is a placeholder, not a real score — call it out and
|
|
44
|
-
- Never score above
|
|
50
|
+
- The carried-forward NPF (note contains "auto-carried") is a placeholder, not a real score — call it out and **overwrite** it with the real computed score.
|
|
51
|
+
- Never score above the band-ceiling on Reach or Mentor footprint without telemetry-confirmed peer adoption (≥1 entry in `~/.copilot/metrics/paved-path-events.jsonl` from a non-self machine). Outreach ≠ adoption.
|
|
52
|
+
- Refer to people by role/designation, never by name.
|
|
45
53
|
- This is a self-assessment for the user's growth — be candid, not flattering.
|