@infinitedusky/indusk-mcp 1.9.1 → 1.9.4
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.
|
@@ -17,18 +17,21 @@ function run(cmd, options) {
|
|
|
17
17
|
return "";
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
function
|
|
20
|
+
function ensureGitignore(projectRoot) {
|
|
21
21
|
const gitignorePath = join(projectRoot, ".gitignore");
|
|
22
|
+
const entries = ["# MCP config (contains auth tokens)", ".mcp.json"];
|
|
22
23
|
if (existsSync(gitignorePath)) {
|
|
23
24
|
const content = readFileSync(gitignorePath, "utf-8");
|
|
24
|
-
if (content.includes(".mcp.json"))
|
|
25
|
+
if (content.includes(".mcp.json")) {
|
|
26
|
+
console.info(" skip: .gitignore (.mcp.json already ignored)");
|
|
25
27
|
return;
|
|
26
|
-
|
|
28
|
+
}
|
|
29
|
+
writeFileSync(gitignorePath, `${content.trimEnd()}\n\n${entries.join("\n")}\n`);
|
|
27
30
|
console.info(" updated: .gitignore (added .mcp.json)");
|
|
28
31
|
}
|
|
29
32
|
else {
|
|
30
|
-
writeFileSync(gitignorePath, "
|
|
31
|
-
console.info("
|
|
33
|
+
writeFileSync(gitignorePath, `${entries.join("\n")}\n`);
|
|
34
|
+
console.info(" create: .gitignore (with .mcp.json)");
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
function createCgcIgnore(projectRoot) {
|
|
@@ -43,6 +46,9 @@ function createCgcIgnore(projectRoot) {
|
|
|
43
46
|
"dist/",
|
|
44
47
|
"build/",
|
|
45
48
|
".git/",
|
|
49
|
+
".jj/",
|
|
50
|
+
".indusk/",
|
|
51
|
+
".claude/",
|
|
46
52
|
"*.png",
|
|
47
53
|
"*.jpg",
|
|
48
54
|
"*.svg",
|
|
@@ -664,13 +670,12 @@ export async function init(projectRoot, options = {}) {
|
|
|
664
670
|
}
|
|
665
671
|
// 8. Create .cgcignore and manage git excludes
|
|
666
672
|
createCgcIgnore(projectRoot);
|
|
673
|
+
// .mcp.json contains auth tokens — always gitignore it regardless of mode
|
|
674
|
+
ensureGitignore(projectRoot);
|
|
667
675
|
if (local) {
|
|
668
676
|
console.info("\n[Git Excludes]");
|
|
669
677
|
writeGitInfoExclude(projectRoot);
|
|
670
678
|
}
|
|
671
|
-
else {
|
|
672
|
-
ensureGitignoreMcpJson(projectRoot);
|
|
673
|
-
}
|
|
674
679
|
// 9. Run on_init hooks from enabled extensions
|
|
675
680
|
console.info("\n[Extension Hooks]");
|
|
676
681
|
const { getEnabledExtensions } = await import("../../lib/extension-loader.js");
|
|
@@ -753,12 +758,52 @@ export async function init(projectRoot, options = {}) {
|
|
|
753
758
|
writeConfig(projectRoot, config);
|
|
754
759
|
console.info(`\n[Config]`);
|
|
755
760
|
console.info(` create: .indusk/config.json (mode: ${config.mode})`);
|
|
761
|
+
// Create initial handoff so /catchup runs full orientation on first session
|
|
762
|
+
const handoffPath = join(projectRoot, ".claude/handoff.md");
|
|
763
|
+
if (!existsSync(handoffPath) || force) {
|
|
764
|
+
const today = new Date().toISOString().split("T")[0];
|
|
765
|
+
const handoffContent = [
|
|
766
|
+
"# Handoff",
|
|
767
|
+
"",
|
|
768
|
+
`**Date:** ${today}`,
|
|
769
|
+
"**Session:** Fresh init — first session orientation needed",
|
|
770
|
+
"",
|
|
771
|
+
"## Catchup Status",
|
|
772
|
+
"- [ ] mcp-ready",
|
|
773
|
+
"- [ ] handoff",
|
|
774
|
+
"- [ ] lessons",
|
|
775
|
+
"- [ ] health",
|
|
776
|
+
"- [ ] context",
|
|
777
|
+
"- [ ] plans",
|
|
778
|
+
"- [ ] skills",
|
|
779
|
+
"- [ ] extensions",
|
|
780
|
+
"- [ ] graph",
|
|
781
|
+
"",
|
|
782
|
+
"## What Was Being Worked On",
|
|
783
|
+
"`indusk init` just set up this project. No prior session.",
|
|
784
|
+
"",
|
|
785
|
+
"## Where It Stopped",
|
|
786
|
+
"Init complete. Agent needs full orientation (lessons, context, skills, extensions, graph).",
|
|
787
|
+
"",
|
|
788
|
+
"## What's Next",
|
|
789
|
+
"1. Run `/catchup` to orient the agent (reads lessons, context, skills, extensions, graph)",
|
|
790
|
+
"2. Edit CLAUDE.md with project details",
|
|
791
|
+
"3. Start planning: `/planner your-first-feature`",
|
|
792
|
+
"",
|
|
793
|
+
"## Open Issues",
|
|
794
|
+
"None — fresh project.",
|
|
795
|
+
"",
|
|
796
|
+
].join("\n");
|
|
797
|
+
writeFileSync(handoffPath, handoffContent);
|
|
798
|
+
console.info("\n[Handoff]");
|
|
799
|
+
console.info(" create: .claude/handoff.md (first-session orientation)");
|
|
800
|
+
}
|
|
756
801
|
// Summary
|
|
757
802
|
console.info("\nDone!");
|
|
758
803
|
console.info("\n⚠ Restart Claude Code to load the updated MCP server and skills.");
|
|
759
804
|
console.info("\nNext steps:");
|
|
760
805
|
console.info(" 1. Set up infrastructure (if not done): indusk infra start");
|
|
761
|
-
console.info(" 2. Restart Claude Code");
|
|
806
|
+
console.info(" 2. Restart Claude Code — /catchup will auto-orient the agent");
|
|
762
807
|
console.info(" 3. Edit CLAUDE.md with your project details");
|
|
763
|
-
console.info(" 4. Start planning: /
|
|
808
|
+
console.info(" 4. Start planning: /planner your-first-feature");
|
|
764
809
|
}
|
|
@@ -41,7 +41,7 @@ That's it. No tokens, no config files, no environment variables.
|
|
|
41
41
|
|
|
42
42
|
## When to Create Diagrams
|
|
43
43
|
|
|
44
|
-
- **During `/
|
|
44
|
+
- **During `/planner` research or brief**: sketch the proposed architecture to make it concrete
|
|
45
45
|
- **During `/work` teach mode**: visualize what a phase is building before and after
|
|
46
46
|
- **During debugging**: draw the request flow to identify where things break
|
|
47
47
|
- **During retrospective**: before/after architecture comparison
|
package/package.json
CHANGED
package/skills/catchup.md
CHANGED
|
@@ -78,7 +78,7 @@ Call `extensions_status` to see what extensions are enabled and their capabiliti
|
|
|
78
78
|
Call `get_skill_summaries` to load the name, description, and type of every installed skill. This returns a compact summary — you do NOT need to read each skill file individually. The full skill content loads automatically when the user invokes a slash command.
|
|
79
79
|
|
|
80
80
|
Skill types:
|
|
81
|
-
- **process** — workflow skills with slash commands (
|
|
81
|
+
- **process** — workflow skills with slash commands (planner, work, verify, context, document, retrospective)
|
|
82
82
|
- **extension** — tool integrations (cgc, composable-env, excalidraw, etc.)
|
|
83
83
|
- **domain** — technology-specific best practices (typescript, testing, etc.)
|
|
84
84
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: planner
|
|
3
3
|
description: Create and advance plans. Every plan follows the same document lifecycle — research, brief, ADR, impl, retrospective. Knows how to write each one, what order they go in, and how to pick up where things left off.
|
|
4
4
|
argument-hint: "[workflow] [plan name] — workflow: feature (default), bugfix, refactor, spike"
|
|
5
5
|
---
|
|
@@ -29,15 +29,15 @@ General-purpose research (insights useful across plans) also lives in `research/
|
|
|
29
29
|
|
|
30
30
|
## Workflow Types
|
|
31
31
|
|
|
32
|
-
The first argument to `/
|
|
32
|
+
The first argument to `/planner` can optionally be a workflow type that controls which documents are created:
|
|
33
33
|
|
|
34
34
|
| Command | Workflow | Documents |
|
|
35
35
|
|---------|----------|-----------|
|
|
36
|
-
| `/
|
|
37
|
-
| `/
|
|
38
|
-
| `/
|
|
39
|
-
| `/
|
|
40
|
-
| `/
|
|
36
|
+
| `/planner bugfix auth-expiry` | bugfix | brief + impl only |
|
|
37
|
+
| `/planner refactor extract-auth` | refactor | brief + impl (with boundary map) |
|
|
38
|
+
| `/planner spike redis-options` | spike | research only |
|
|
39
|
+
| `/planner feature payment-flow` | feature | full lifecycle (default) |
|
|
40
|
+
| `/planner payment-flow` | feature | same — no type defaults to feature |
|
|
41
41
|
|
|
42
42
|
Parse the input: if the first word is `bugfix`, `refactor`, `spike`, or `feature`, use that workflow. Otherwise, default to `feature`. The remaining words become the plan name (kebab-cased).
|
|
43
43
|
|
package/skills/retrospective.md
CHANGED
|
@@ -21,7 +21,7 @@ The retrospective skill replaces the freeform "write a retrospective" step with
|
|
|
21
21
|
## When to Use
|
|
22
22
|
|
|
23
23
|
- After `/work` completes all impl phases and the status is `completed`
|
|
24
|
-
- When `/
|
|
24
|
+
- When `/planner {name}` detects the impl is completed and the next step is retrospective
|
|
25
25
|
- Directly via `/retrospective {plan-name}`
|
|
26
26
|
|
|
27
27
|
## The Audit Checklist
|
package/skills/toolbelt.md
CHANGED
|
@@ -17,7 +17,7 @@ To see which MCP servers and extensions are active, call `extensions_status`.
|
|
|
17
17
|
## How the Skills Work Together
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
/
|
|
20
|
+
/planner → creates planning docs (research, brief, ADR, impl)
|
|
21
21
|
↓
|
|
22
22
|
/work → executes impl checklist, phase by phase
|
|
23
23
|
each phase has four gates:
|
|
@@ -139,7 +139,7 @@ While executing impl items:
|
|
|
139
139
|
|
|
140
140
|
Gates prevent skipping important work. Three enforcement levels, set via `gate_policy` in impl frontmatter or `.claude/settings.json`:
|
|
141
141
|
|
|
142
|
-
| Mode | Writing the impl (`/
|
|
142
|
+
| Mode | Writing the impl (`/planner`) | Executing the impl (`/work`) |
|
|
143
143
|
|------|---------------------------|------------------------------|
|
|
144
144
|
| **`strict`** | Every gate must have a real item. No `(none needed)`. | Every item must be completed. No skipping. |
|
|
145
145
|
| **`ask`** (default) | Every gate must have a real item. No `(none needed)`. | Skip only with conversation proof: `(none needed — asked: "..." — user: "...")` |
|
package/skills/work.md
CHANGED
|
@@ -70,7 +70,7 @@ Three modes, configured via `gate_policy` in the impl frontmatter or `.claude/se
|
|
|
70
70
|
|
|
71
71
|
| Mode | Behavior |
|
|
72
72
|
|------|----------|
|
|
73
|
-
| **`strict`** | No overrides at any stage. Every gate must have a real item when the impl is written (`/
|
|
73
|
+
| **`strict`** | No overrides at any stage. Every gate must have a real item when the impl is written (`/planner`), and every item must be completed during `/work`. No `(none needed)`, no `skip-reason:`, no conversation proof. |
|
|
74
74
|
| **`ask`** (default) | Every gate must have a real item when the impl is written. During `/work`, the agent must ask the user before skipping, and include proof of the conversation in the skip format. Hooks enforce both stages. |
|
|
75
75
|
| **`auto`** | Gates can be pre-filled with `(none needed)` or `skip-reason:` at write time. During `/work`, the agent can skip without asking. Use when running autonomously. |
|
|
76
76
|
|
|
@@ -118,7 +118,7 @@ In `ask` mode, skipped gates MUST include proof that the conversation happened:
|
|
|
118
118
|
|
|
119
119
|
The hook validates that both `asked:` and `user:` are present with non-empty quoted content. Bare `(none needed)` or `skip-reason:` without conversation proof will be **blocked by the hook**.
|
|
120
120
|
|
|
121
|
-
| Mode | At write time (`/
|
|
121
|
+
| Mode | At write time (`/planner`) | At execution time (`/work`) |
|
|
122
122
|
|------|------------------------|---------------------------|
|
|
123
123
|
| `strict` | No opt-outs — real items required | No skipping — everything completed |
|
|
124
124
|
| `ask` | No opt-outs — real items required | Skip only with conversation proof |
|
|
@@ -148,7 +148,7 @@ The hook validates that both `asked:` and `user:` are present with non-empty quo
|
|
|
148
148
|
- Update impl status to `completed`
|
|
149
149
|
- Summarize what was done
|
|
150
150
|
- If this plan included an ADR, confirm CLAUDE.md's Key Decisions was updated
|
|
151
|
-
- Let the user know the plan is ready for a retrospective if they want one (`/
|
|
151
|
+
- Let the user know the plan is ready for a retrospective if they want one (`/planner {name}` will pick up at the retrospective stage)
|
|
152
152
|
|
|
153
153
|
## Teach Mode
|
|
154
154
|
|