@orderful/droid 0.50.0 → 0.52.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.
Files changed (50) hide show
  1. package/.claude-plugin/plugin.json +1 -0
  2. package/CHANGELOG.md +20 -0
  3. package/dist/bin/droid.js +72 -4
  4. package/dist/commands/pack.d.ts +1 -0
  5. package/dist/commands/pack.d.ts.map +1 -1
  6. package/dist/lib/pack.d.ts +8 -0
  7. package/dist/lib/pack.d.ts.map +1 -1
  8. package/dist/tools/brain/.claude-plugin/plugin.json +1 -1
  9. package/dist/tools/brain/TOOL.yaml +1 -1
  10. package/dist/tools/brain/skills/brain/SKILL.md +4 -0
  11. package/dist/tools/brain/skills/brain/references/workflows.md +21 -7
  12. package/dist/tools/plan/.claude-plugin/plugin.json +1 -1
  13. package/dist/tools/plan/TOOL.yaml +1 -1
  14. package/dist/tools/plan/commands/plan.md +3 -2
  15. package/dist/tools/plan/skills/plan/SKILL.md +31 -10
  16. package/dist/tools/plan/skills/plan/references/workflows.md +44 -14
  17. package/dist/tools/project/.claude-plugin/plugin.json +1 -1
  18. package/dist/tools/project/TOOL.yaml +5 -1
  19. package/dist/tools/project/skills/project/SKILL.md +32 -1
  20. package/dist/tools/project/skills/project/references/loading.md +1 -0
  21. package/dist/tools/project/skills/project/references/pulling.md +57 -0
  22. package/dist/tools/project/skills/project/references/pushing.md +79 -0
  23. package/dist/tools/propose-plan/.claude-plugin/plugin.json +19 -0
  24. package/dist/tools/propose-plan/TOOL.yaml +17 -0
  25. package/dist/tools/propose-plan/skills/propose-plan/SKILL.md +190 -0
  26. package/dist/tools/propose-plan/skills/propose-plan/references/output-schema.json +85 -0
  27. package/package.json +1 -1
  28. package/src/bin/droid.ts +2 -1
  29. package/src/commands/pack.ts +32 -2
  30. package/src/lib/pack.test.ts +26 -1
  31. package/src/lib/pack.ts +66 -3
  32. package/src/tools/brain/.claude-plugin/plugin.json +1 -1
  33. package/src/tools/brain/TOOL.yaml +1 -1
  34. package/src/tools/brain/skills/brain/SKILL.md +4 -0
  35. package/src/tools/brain/skills/brain/references/workflows.md +21 -7
  36. package/src/tools/plan/.claude-plugin/plugin.json +1 -1
  37. package/src/tools/plan/TOOL.yaml +1 -1
  38. package/src/tools/plan/commands/plan.md +3 -2
  39. package/src/tools/plan/skills/plan/SKILL.md +31 -10
  40. package/src/tools/plan/skills/plan/references/workflows.md +44 -14
  41. package/src/tools/project/.claude-plugin/plugin.json +1 -1
  42. package/src/tools/project/TOOL.yaml +5 -1
  43. package/src/tools/project/skills/project/SKILL.md +32 -1
  44. package/src/tools/project/skills/project/references/loading.md +1 -0
  45. package/src/tools/project/skills/project/references/pulling.md +57 -0
  46. package/src/tools/project/skills/project/references/pushing.md +79 -0
  47. package/src/tools/propose-plan/.claude-plugin/plugin.json +19 -0
  48. package/src/tools/propose-plan/TOOL.yaml +17 -0
  49. package/src/tools/propose-plan/skills/propose-plan/SKILL.md +190 -0
  50. package/src/tools/propose-plan/skills/propose-plan/references/output-schema.json +85 -0
@@ -28,6 +28,7 @@
28
28
  "./src/tools/pii/skills/pii/SKILL.md",
29
29
  "./src/tools/plan/skills/plan/SKILL.md",
30
30
  "./src/tools/project/skills/project/SKILL.md",
31
+ "./src/tools/propose-plan/skills/propose-plan/SKILL.md",
31
32
  "./src/tools/release/skills/release/SKILL.md",
32
33
  "./src/tools/share/skills/share/SKILL.md",
33
34
  "./src/tools/status-update/skills/status-update/SKILL.md",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @orderful/droid
2
2
 
3
+ ## 0.52.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#320](https://github.com/Orderful/droid/pull/320) [`89e37e0`](https://github.com/Orderful/droid/commit/89e37e03899ce34d01de09ed43ad2fff2c171af8) Thanks [@frytyler](https://github.com/frytyler)! - Add `propose-plan` tool — structured plans with evidence and actions for human-in-the-loop approval
8
+
9
+ ### Patch Changes
10
+
11
+ - [#318](https://github.com/Orderful/droid/pull/318) [`87bb797`](https://github.com/Orderful/droid/commit/87bb797bb1cd53d89c4a946401abdb9210542eab) Thanks [@frytyler](https://github.com/frytyler)! - Add `--tool` flag to `droid pack` for single-tool downloads
12
+
13
+ ## 0.51.0
14
+
15
+ ### Minor Changes
16
+
17
+ - [#315](https://github.com/Orderful/droid/pull/315) [`71ea142`](https://github.com/Orderful/droid/commit/71ea14245f3a2339a3b0e1fb3bf816df669405af) Thanks [@frytyler](https://github.com/frytyler)! - Project tool improvements: project-aware routing for plan/brain skills, `/project pull` and `/project push` for bidirectional codex sync
18
+
19
+ ### Patch Changes
20
+
21
+ - [#313](https://github.com/Orderful/droid/pull/313) [`82d14c3`](https://github.com/Orderful/droid/commit/82d14c3a60f5935829d5a3cfbaf583d9a1f4329d) Thanks [@frytyler](https://github.com/frytyler)! - Plan tool improvements: plan mode review in `/plan implement` (with `--no-review` escape hatch), cleanup folded into `/plan ready`, plan mode integration guidance
22
+
3
23
  ## 0.50.0
4
24
 
5
25
  ### Minor Changes
package/dist/bin/droid.js CHANGED
@@ -5215,7 +5215,7 @@ function collectToolArtifacts(tool) {
5215
5215
  }
5216
5216
  const refsDir = join14(skillDir, "references");
5217
5217
  if (existsSync12(refsDir)) {
5218
- const refFiles = readdirSync7(refsDir).filter((f) => f.endsWith(".md"));
5218
+ const refFiles = readdirSync7(refsDir).filter((f) => !f.startsWith("."));
5219
5219
  for (const file of refFiles) {
5220
5220
  artifacts.push({
5221
5221
  sourcePath: join14(refsDir, file),
@@ -5269,9 +5269,9 @@ function generateClaudeMd(tools) {
5269
5269
  lines.push("");
5270
5270
  return lines.join("\n");
5271
5271
  }
5272
- function generateReadme(audience, tools) {
5272
+ function generateReadme(label, tools) {
5273
5273
  const lines = [
5274
- `# Droid Pack: ${audience}`,
5274
+ `# Droid Pack: ${label}`,
5275
5275
  "",
5276
5276
  "This pack contains AI skills, commands, and agents for Claude Desktop.",
5277
5277
  "",
@@ -5317,6 +5317,49 @@ function checkDependencies(tools) {
5317
5317
  }
5318
5318
  return warnings;
5319
5319
  }
5320
+ async function buildToolPack(options) {
5321
+ const { toolName, outputDir } = options;
5322
+ const allTools = getBundledTools();
5323
+ const tool = allTools.find((t) => t.name === toolName);
5324
+ if (!tool) {
5325
+ return {
5326
+ success: false,
5327
+ message: `Tool '${toolName}' not found`
5328
+ };
5329
+ }
5330
+ const tools = [tool];
5331
+ const warnings = checkDependencies(tools);
5332
+ const filename = `droid-${toolName}.zip`;
5333
+ const outputPath = join14(outputDir, filename);
5334
+ return new Promise((resolve) => {
5335
+ const output = createWriteStream(outputPath);
5336
+ const archive = archiver("zip", { zlib: { level: 9 } });
5337
+ output.on("close", () => {
5338
+ resolve({
5339
+ success: true,
5340
+ message: `Pack created: ${filename}`,
5341
+ outputPath,
5342
+ toolCount: 1,
5343
+ warnings: warnings.length > 0 ? warnings : void 0
5344
+ });
5345
+ });
5346
+ archive.on("error", (err) => {
5347
+ resolve({
5348
+ success: false,
5349
+ message: `Failed to create pack: ${err.message}`
5350
+ });
5351
+ });
5352
+ archive.pipe(output);
5353
+ const artifacts = collectToolArtifacts(tool);
5354
+ for (const artifact of artifacts) {
5355
+ const content = readFileSync11(artifact.sourcePath, "utf-8");
5356
+ archive.append(content, { name: artifact.zipPath });
5357
+ }
5358
+ archive.append(generateClaudeMd(tools), { name: "CLAUDE.md" });
5359
+ archive.append(generateReadme(toolName, tools), { name: "README.md" });
5360
+ archive.finalize();
5361
+ });
5362
+ }
5320
5363
  async function buildPack(options) {
5321
5364
  const { audience, outputDir } = options;
5322
5365
  const tools = getToolsForAudience(audience);
@@ -5381,9 +5424,34 @@ async function packCommand(audience, options) {
5381
5424
  console.log("");
5382
5425
  return;
5383
5426
  }
5427
+ if (options.tool) {
5428
+ const outputDir2 = options.output || process.cwd();
5429
+ console.log(
5430
+ chalk10.bold(`
5431
+ Packing tool ${chalk10.cyan(options.tool)}...`)
5432
+ );
5433
+ const result2 = await buildToolPack({ toolName: options.tool, outputDir: outputDir2 });
5434
+ if (!result2.success) {
5435
+ console.error(chalk10.red(`
5436
+ ${result2.message}`));
5437
+ process.exit(1);
5438
+ }
5439
+ console.log(chalk10.green(`
5440
+ ${result2.message}`));
5441
+ console.log(chalk10.gray(` Output: ${result2.outputPath}`));
5442
+ if (result2.warnings && result2.warnings.length > 0) {
5443
+ console.log(chalk10.yellow("\nWarnings:"));
5444
+ for (const warning of result2.warnings) {
5445
+ console.log(chalk10.yellow(` - ${warning}`));
5446
+ }
5447
+ }
5448
+ console.log("");
5449
+ return;
5450
+ }
5384
5451
  if (!audience) {
5385
5452
  console.error(chalk10.red("\nError: audience argument required"));
5386
5453
  console.log(chalk10.gray("Usage: droid pack <audience>"));
5454
+ console.log(chalk10.gray(" droid pack --tool <name>"));
5387
5455
  console.log(chalk10.gray(" droid pack --list"));
5388
5456
  process.exit(1);
5389
5457
  }
@@ -6051,7 +6119,7 @@ program.command("install <tool>").description("Install a tool and run its setup
6051
6119
  program.command("uninstall <tool>").description("Uninstall a tool").action(uninstallCommand);
6052
6120
  program.command("update").description("Update droid and installed tools").option("--tools", "Only update tools").option("--cli", "Only update the CLI").argument("[tool]", "Update a specific tool").action(updateCommand);
6053
6121
  program.command("tui").description("Launch interactive TUI dashboard").action(tuiCommand);
6054
- program.command("pack").description("Create audience-filtered zip packs for distribution").argument("[audience]", "Target audience (e.g., engineering, customer-support)").option("-l, --list", "List available audiences and tool counts").option("-o, --output <dir>", "Output directory (default: cwd)").action(packCommand);
6122
+ program.command("pack").description("Create zip packs for distribution").argument("[audience]", "Target audience (e.g., engineering, customer-support)").option("-l, --list", "List available audiences and tool counts").option("-t, --tool <name>", "Pack a single tool by name").option("-o, --output <dir>", "Output directory (default: cwd)").action(packCommand);
6055
6123
  program.command("exec <tool> <script>").description("Execute a tool script").argument("[args...]", "Arguments to pass to the script").allowUnknownOption().action(execCommand);
6056
6124
  var integrations = program.command("integrations").description("Manage external service integrations");
6057
6125
  var integrationsSetup = integrations.command("setup").description("Set up an integration");
@@ -1,5 +1,6 @@
1
1
  export declare function packCommand(audience: string | undefined, options: {
2
2
  list?: boolean;
3
3
  output?: string;
4
+ tool?: string;
4
5
  }): Promise<void>;
5
6
  //# sourceMappingURL=pack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiEf"}
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,IAAI,CAAC,CA+Ff"}
@@ -8,6 +8,10 @@ export interface PackOptions {
8
8
  audience: ToolAudience;
9
9
  outputDir: string;
10
10
  }
11
+ export interface ToolPackOptions {
12
+ toolName: string;
13
+ outputDir: string;
14
+ }
11
15
  export interface PackResult {
12
16
  success: boolean;
13
17
  message: string;
@@ -24,6 +28,10 @@ export declare function getToolsForAudience(audience: ToolAudience): ToolManifes
24
28
  * Get audience info for all audiences that have tools
25
29
  */
26
30
  export declare function getAudienceInfo(): AudienceInfo[];
31
+ /**
32
+ * Build a zip pack for a single tool
33
+ */
34
+ export declare function buildToolPack(options: ToolPackOptions): Promise<PackResult>;
27
35
  /**
28
36
  * Build a zip pack for the given audience
29
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/lib/pack.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,GACrB,YAAY,EAAE,CAehB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAsBhD;AA4JD;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA4DzE"}
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/lib/pack.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,GACrB,YAAY,EAAE,CAehB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAsBhD;AA4JD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAqDjF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA4DzE"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-brain",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: brain
2
2
  description: "Your scratchpad (or brain) - a collaborative space for planning and research. Create docs with /brain plan, /brain research, or /brain review. Use @mentions for async discussion. Docs persist across sessions."
3
- version: 0.4.2
3
+ version: 0.4.3
4
4
  status: beta
5
5
  audience:
6
6
  - all
@@ -34,6 +34,8 @@ Your **scratchpad** (or **brain**) - a collaborative space for planning, researc
34
34
  | `inbox_folder` | (empty) | Root folder for new docs (e.g., `0-Inbox`) |
35
35
  | `override` | (none) | User-defined behaviour overrides |
36
36
 
37
+ **Optional dependency:** `droid config --get tools.project` → `save_related_in_project` (for project-aware routing)
38
+
37
39
  **If not configured:** Ask the user:
38
40
  > "Where would you like to store brain docs? Common choices:
39
41
  > - `~/Documents/brain` - Easy to find in Finder
@@ -107,6 +109,8 @@ Full procedure: `references/workflows.md` § Opening
107
109
 
108
110
  Templates vary by category (see `references/templates.md`), but all follow the same creation flow.
109
111
 
112
+ **Project-aware routing:** When a `/project` is active and `save_related_in_project` is true (check `droid config --get tools.project`), ALL new docs route to `{project_folder}/{category}s/` instead of the brain inbox — no category filtering. Plans, research, ideas, thoughts, spikes, whatever the user creates. If it's related to the project, it lives with the project. Disable with `save_related_in_project: false` in project config.
113
+
110
114
  **Note:** `idea` category docs do NOT become active (fire-and-forget capture).
111
115
 
112
116
  Full procedure: `references/workflows.md` § Creating
@@ -62,13 +62,27 @@ Detailed procedures for each brain operation.
62
62
  - Example: `auth-refactor.md` or `caching-strategies.md`
63
63
 
64
64
  3. **Determine target path based on category:**
65
- - Base: `{brain_dir}/{inbox_folder}` (or just `{brain_dir}` if no inbox_folder)
66
- - Category becomes plural folder: `{base}/{category}s/{filename}`
67
- - Examples:
68
- - `plan` `{base}/plans/{filename}`
69
- - `research` `{base}/research/{filename}`
70
- - `spike` `{base}/spikes/{filename}`
71
- - `meeting` `{base}/meetings/{filename}`
65
+
66
+ a. **Check for active project:**
67
+ - If `/project` is active in session AND `save_related_in_project` is true
68
+ (run `droid config --get tools.project` to check):
69
+ - Route ALL categories to project folder: `{projects_dir}/{project}/{category}s/{filename}`
70
+ - No category filtering — plans, research, ideas, thoughts, spikes, anything goes
71
+ - Example: `/brain research caching` with project "droid" active
72
+ → `{projects_dir}/droid/research/caching.md`
73
+ - Example: `/brain idea wild-thought` with project "droid" active
74
+ → `{projects_dir}/droid/ideas/wild-thought.md`
75
+ - If `/project` active but `save_related_in_project` is false (default), OR no project active:
76
+ - Fall through to default routing below
77
+
78
+ b. **Default routing (no active project or opt-out):**
79
+ - Base: `{brain_dir}/{inbox_folder}` (or just `{brain_dir}` if no inbox_folder)
80
+ - Category becomes plural folder: `{base}/{category}s/{filename}`
81
+ - Examples:
82
+ - `plan` → `{base}/plans/{filename}`
83
+ - `research` → `{base}/research/{filename}`
84
+ - `spike` → `{base}/spikes/{filename}`
85
+ - `meeting` → `{base}/meetings/{filename}`
72
86
 
73
87
  4. **Create directory** if needed (category folder may not exist yet)
74
88
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-plan",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Task-scoped planning with portable, structured plans. Use when planning implementation for a PR, ticket, or small feature. User prompts like 'let's plan this', 'can we start a plan', 'think through the implementation'.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: plan
2
2
  description: "Task-scoped planning with portable, structured plans. Use when planning implementation for a PR, ticket, or small feature. User prompts like 'let's plan this', 'can we start a plan', 'think through the implementation'."
3
- version: 0.1.6
3
+ version: 0.1.8
4
4
  status: alpha
5
5
  audience:
6
6
  - engineering
@@ -19,7 +19,7 @@ argument-hint: "new|search|check|cleanup|ready|implement [topic]"
19
19
  | `/plan check` | Address @droid comments |
20
20
  | `/plan cleanup` | Resolve threads, log decisions |
21
21
  | `/plan ready` | Finalize and validate |
22
- | `/plan implement` | Execute the plan |
22
+ | `/plan implement` | Review plan, then execute |
23
23
 
24
24
  ## Examples
25
25
 
@@ -29,7 +29,8 @@ argument-hint: "new|search|check|cleanup|ready|implement [topic]"
29
29
  /plan check # Address open comments
30
30
  /plan cleanup # Resolve threads, log decisions
31
31
  /plan ready # Mark plan as ready
32
- /plan implement # Execute the plan
32
+ /plan implement # Review plan, then execute
33
+ /plan implement --no-review # Skip review, execute directly
33
34
  ```
34
35
 
35
36
  See the **plan skill** for complete documentation.
@@ -27,6 +27,7 @@ Task-scoped planning for PRs, tickets, and small features. Lighter than `/tech-d
27
27
  Uses config from dependencies:
28
28
  - `droid config --get tools.brain` → `brain_dir`, `inbox_folder`
29
29
  - `droid config --get user_mention` → `user_mention` (global config)
30
+ - `droid config --get tools.project` → `save_related_in_project` (optional, for project-aware routing)
30
31
 
31
32
  **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
32
33
 
@@ -45,7 +46,7 @@ Example: `/plan new auth-refactor -- we must stay backward compatible with v1 cl
45
46
  | `/plan check` | Address `@droid` comments, respond to questions |
46
47
  | `/plan cleanup` | Resolve threads, apply changes, log decisions |
47
48
  | `/plan ready` | Finalize: validate and update status |
48
- | `/plan implement` | Execute tasks, optionally convert to XML |
49
+ | `/plan implement` | Review plan, then execute tasks |
49
50
 
50
51
  ## `/plan new {topic}`
51
52
 
@@ -54,7 +55,8 @@ Example: `/plan new auth-refactor -- we must stay backward compatible with v1 cl
54
55
  - Run `droid config --get user_mention` for user's mention tag
55
56
  - If `brain_dir` not configured, ask user where to store plans
56
57
  2. Determine location:
57
- - If `/project` active → offer: `{projects_dir}/{project}/plans/`
58
+ - If `/project` active AND `save_related_in_project` is true (check `droid config --get tools.project`) use `{projects_dir}/{project}/plans/` (no prompt)
59
+ - If `/project` active AND `save_related_in_project` is false (default) → offer choice between project folder and inbox
58
60
  - Otherwise → `{brain_dir}/{inbox_folder}/plans/`
59
61
  3. Offer context loading (`/project`, `/codex` search)
60
62
  4. Ask clarifying questions (goal, scope, constraints)
@@ -90,21 +92,26 @@ See `references/workflows.md` § Cleanup for the full graduation pattern.
90
92
 
91
93
  ## `/plan ready`
92
94
 
93
- 1. Check for unresolved discussions (warn if any)
94
- 2. Validate required sections (Context, at least one Task)
95
- 3. Update status to `ready`
96
- 4. Offer: stay in brain, copy to PR description, link in project
95
+ 1. **Run cleanup pass** graduate resolved threads to decisions, archive (same as `/plan cleanup`)
96
+ 2. Check for unresolved discussions (warn if any)
97
+ 3. Validate required sections (Context, at least one Task)
98
+ 4. Update status to `ready`
99
+ 5. Offer: stay in brain, copy to PR description, link in project
97
100
 
98
101
  ## `/plan implement`
99
102
 
100
- 1. Parse tasks from `### Task N:` sections
101
- 2. Optionally convert to XML (see `references/xml-conversion.md`)
102
- 3. For each task:
103
+ 1. Load plan (warn if status is not `ready`)
104
+ 2. **Review plan** validate tasks against codebase, identify gaps (uses platform plan mode if available, otherwise structured self-review)
105
+ 3. Parse tasks from `### Task N:` sections
106
+ 4. Optionally convert to XML (see `references/xml-conversion.md`)
107
+ 5. For each task:
103
108
  - Execute per `**Files:**` section
104
109
  - Run `**Verify:**` command
105
110
  - Check `**Done:**` criteria
106
111
  - Mark complete in plan doc
107
- 4. Update status to `done`
112
+ 6. Update status to `done`
113
+
114
+ Use `--no-review` to skip the review step (e.g., re-running after partial implementation).
108
115
 
109
116
  ## Comment Conventions
110
117
 
@@ -122,6 +129,20 @@ Recognise planning intent and offer `/plan new`:
122
129
  - "Let's think through the implementation"
123
130
  - "Before we start coding..."
124
131
 
132
+ ## Plan Review Integration
133
+
134
+ Plan docs and the review step in `/plan implement` are complementary:
135
+
136
+ | Plan doc (persistent) | Review step (ephemeral) |
137
+ |-----------------------|-------------------------|
138
+ | Captures decisions and intent (*why*) | Validates against codebase (*how*) |
139
+ | Shareable, auditable trail | Private to the session |
140
+ | Survives across sessions | Scoped to current session |
141
+
142
+ **The workflow:** Write the plan doc to capture decisions. The review step validates and refines before implementing — it enriches, not duplicates.
143
+
144
+ **Platform-adaptive:** Some platforms offer a dedicated plan/review mode (e.g., Claude Code). Others get a structured self-review. The behaviour is the same — validate the plan against the codebase before executing.
145
+
125
146
  ## References
126
147
 
127
148
  - `references/templates.md` - Plan doc template with examples
@@ -15,9 +15,15 @@ If brain not configured, ask user for `brain_dir` location.
15
15
 
16
16
  ### Step 2: Determine Location
17
17
 
18
- Check if `/project` is active (check `{projects_dir}/{project}/PROJECT.md` exists):
18
+ Check if `/project` is active (check `{projects_dir}/{project}/PROJECT.md` exists) and read `save_related_in_project` from `droid config --get tools.project`:
19
19
 
20
- **If project active:**
20
+ **If project active AND `save_related_in_project` is true:**
21
+ ```
22
+ Use: {projects_dir}/{project}/plans/plan-{topic}.md
23
+ (No prompt — project folder is the default when opted in)
24
+ ```
25
+
26
+ **If project active AND `save_related_in_project` is false (default):**
21
27
  ```
22
28
  Offer choice via AskUserQuestion:
23
29
  - "Project folder" → {projects_dir}/{project}/plans/plan-{topic}.md
@@ -221,13 +227,18 @@ Report what was cleaned up:
221
227
 
222
228
  If no active plan, prompt to search for one.
223
229
 
224
- ### Step 2: Check Unresolved Discussions
230
+ ### Step 2: Run Cleanup Pass
225
231
 
226
- Search for `### Open:` sections:
232
+ Run the same logic as `/plan cleanup`:
233
+ - Find resolved `@droid` / `@{user_mention}` threads
234
+ - Graduate decisions to the Locked-In Decisions table
235
+ - Archive resolved threads to Discussion Log
227
236
 
228
- ```bash
229
- grep -c "### Open:" {plan_path}
230
- ```
237
+ If nothing to clean up, this is a no-op. `/plan cleanup` still exists as a standalone command for mid-iteration use.
238
+
239
+ ### Step 3: Check Unresolved Discussions
240
+
241
+ Search for remaining `@droid` / `@{user_mention}` threads that weren't resolved:
231
242
 
232
243
  If any found, warn:
233
244
  ```
@@ -236,7 +247,7 @@ If any found, warn:
236
247
  - "Mark ready anyway" → Continue
237
248
  ```
238
249
 
239
- ### Step 3: Validate Required Sections
250
+ ### Step 4: Validate Required Sections
240
251
 
241
252
  Check for:
242
253
  - `## Context` section with content
@@ -244,11 +255,11 @@ Check for:
244
255
 
245
256
  If missing, warn and list what's needed.
246
257
 
247
- ### Step 4: Update Status
258
+ ### Step 5: Update Status
248
259
 
249
260
  Change `**Status:** draft` or `**Status:** in-progress` to `**Status:** ready`
250
261
 
251
- ### Step 5: Offer Distribution
262
+ ### Step 6: Offer Distribution
252
263
 
253
264
  Ask via AskUserQuestion:
254
265
  ```
@@ -271,7 +282,26 @@ Check status - warn if not `ready`:
271
282
  "This plan is still '{status}'. Implement anyway?"
272
283
  ```
273
284
 
274
- ### Step 2: Parse Tasks
285
+ ### Step 2: Plan Review
286
+
287
+ **Default behaviour.** Skip if user passes `--no-review` (or says "skip review", "just implement").
288
+
289
+ Review the plan against the codebase before executing:
290
+
291
+ 1. **Read each task's `**Files:**` section** — verify referenced files and patterns exist in the codebase
292
+ 2. **Check for gaps** — missing files, outdated patterns, unaccounted dependencies between tasks
293
+ 3. **Validate `**Verify:**` commands** — confirm they're runnable
294
+ 4. **Note concerns or refinements** — anything that needs adjusting before execution
295
+
296
+ If the platform supports a dedicated plan/review mode, use it for this step. Otherwise, perform the review inline as a structured self-review before proceeding.
297
+
298
+ **Plan preservation:** If the review produces material refinements, save the revised plan as `{original-name}-implementation.md` alongside the original. The original plan is **never modified** during review — it's the decision record. The implementation variant includes `Parent plan: [[{original-name}]]` at the top.
299
+
300
+ After review, implementation executes from whichever plan came out of this step:
301
+ - No material changes → execute from the original
302
+ - Revised plan produced → execute from the `-implementation` variant
303
+
304
+ ### Step 3: Parse Tasks
275
305
 
276
306
  Find all `### Task N:` sections. For each, extract:
277
307
  - **Name** from header
@@ -280,7 +310,7 @@ Find all `### Task N:` sections. For each, extract:
280
310
  - **Verify** from `**Verify:**` line
281
311
  - **Done** from `**Done:**` line
282
312
 
283
- ### Step 3: Optional XML Conversion
313
+ ### Step 4: Optional XML Conversion
284
314
 
285
315
  For complex multi-task plans, offer:
286
316
  ```
@@ -289,7 +319,7 @@ For complex multi-task plans, offer:
289
319
  - "No" → Use markdown as-is
290
320
  ```
291
321
 
292
- ### Step 4: Execute Tasks
322
+ ### Step 5: Execute Tasks
293
323
 
294
324
  For each task in order:
295
325
 
@@ -308,7 +338,7 @@ If verification fails:
308
338
  - "Stop implementation"
309
339
  ```
310
340
 
311
- ### Step 5: Update Status
341
+ ### Step 6: Update Status
312
342
 
313
343
  When all tasks complete, change `**Status:** ready` to `**Status:** done`
314
344
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-project",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Manage project context files for persistent AI memory across sessions. Load, update, or create project context before working on multi-session features.",
5
5
  "author": {
6
6
  "name": "Orderful",
@@ -1,6 +1,6 @@
1
1
  name: project
2
2
  description: "Manage project context files for persistent AI memory across sessions. Load, update, or create project context before working on multi-session features."
3
- version: 0.4.0
3
+ version: 0.5.0
4
4
  status: beta
5
5
  audience:
6
6
  - all
@@ -21,6 +21,10 @@ config_schema:
21
21
  type: string
22
22
  description: Path to projects directory (required - no default)
23
23
  required: true
24
+ save_related_in_project:
25
+ type: boolean
26
+ description: "When true, plan/brain skills default to saving artifacts under the active project folder"
27
+ default: false
24
28
  preset:
25
29
  type: select
26
30
  description: "Link style: obsidian uses [[wikilinks]], markdown uses [standard](links)"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: project
3
3
  description: "Persistent project context for AI memory across sessions. Use when working on multi-session features, refactors, or any work that benefits from accumulated context. User prompts like 'load the project', 'update project context', 'what's the current project?'."
4
- argument-hint: "[{keywords} | update | create {name}]"
4
+ argument-hint: "[search {keywords} | update | create {name} | pull [codex:{name}] | push [codex:{name}]]"
5
5
  allowed-tools: [Read, Write, Glob, Grep, Bash]
6
6
  ---
7
7
 
@@ -32,6 +32,7 @@ Chat history disappears. Projects persist.
32
32
  | -------------- | ------------ | -------------------------------------------------- |
33
33
  | `projects_dir` | **required** | Where projects are stored (must be configured) |
34
34
  | `preset` | `markdown` | Link style: `obsidian` uses `[[wikilinks]]`, `markdown` uses `[standard](links)` |
35
+ | `save_related_in_project` | `false` | When true, plan/brain skills default to saving artifacts under the active project folder instead of the brain inbox |
35
36
  | `override` | (none) | User-defined behaviour overrides |
36
37
 
37
38
  **Overrides:** This skill supports user-defined overrides. See `/droid` skill § Skill Overrides.
@@ -58,9 +59,17 @@ echo "projects_dir: /path/to/projects" >> ~/.droid/skills/project/overrides.yaml
58
59
  | `/project create {name}` | Create new project (requires `create` keyword) |
59
60
  | `/project create --from codex:{name}` | Create project seeded with codex context |
60
61
  | `/project update` | Update from conversation context |
62
+ | `/project pull [codex:{name}]` | Pull codex updates into existing project |
63
+ | `/project push [codex:{name}]` | Push team-relevant content to codex via PR |
61
64
 
62
65
  **IMPORTANT:** Use `/project search {keywords}` to find and load existing projects. Only use `/project create {name}` when the user explicitly wants to create a new project.
63
66
 
67
+ ## PROJECT.md Frontmatter
68
+
69
+ | Field | Purpose |
70
+ | ---------------- | -------------------------------------------------------------------- |
71
+ | `codex_project` | Codex project name for pull/push (set on first use, remembered) |
72
+
64
73
  ## Loading a Project
65
74
 
66
75
  **Trigger:** `/project search {keywords}` or user asks to load/open a project
@@ -86,6 +95,28 @@ Full procedure: `references/updating.md`
86
95
  Version rules: `references/versioning.md`
87
96
  Changelog format: `references/changelog.md`
88
97
 
98
+ ## Pulling from Codex
99
+
100
+ **Trigger:** `/project pull [codex:{name}]`
101
+
102
+ **TLDR:** Read codex project docs, diff against current PROJECT.md, propose only critical updates that fit within context limits, apply with changelog entry.
103
+
104
+ First use: `/project pull codex:transaction-templates` — saves `codex_project` to frontmatter.
105
+ Subsequent: `/project pull` — reads from frontmatter.
106
+
107
+ Full procedure: `references/pulling.md`
108
+
109
+ ## Pushing to Codex
110
+
111
+ **Trigger:** `/project push` or user asks to push learnings to codex
112
+
113
+ **TLDR:** Extract team-relevant decisions, patterns, and architecture updates from PROJECT.md. Propose codex updates via PR.
114
+
115
+ First use: `/project push codex:transaction-templates` — saves `codex_project` to frontmatter.
116
+ Subsequent: `/project push` — reads from frontmatter. Either push or pull can set it first.
117
+
118
+ Full procedure: `references/pushing.md`
119
+
89
120
  ## Creating a Project
90
121
 
91
122
  **Trigger:** `/project create {name?}` or user asks to start a new project
@@ -34,6 +34,7 @@
34
34
  - Use project contents for all subsequent work in the session
35
35
  - **Do NOT read companion docs by default** — CHANGELOG.md, DECISIONS.md, and WORKLOG.md exist for on-demand lookup only. PROJECT.md already references them; that is enough context.
36
36
  - If the user asks about decisions, past work, or history, THEN read the relevant companion doc.
37
+ - **Cross-skill routing:** When `save_related_in_project` is true (check `droid config --get tools.project`), signal to the session that related artifacts (plans, research, ideas) should default to `{project_folder}/plans/`, `{project_folder}/research/`, etc. Other skills (plan, brain) check for an active project and route accordingly.
37
38
 
38
39
  7. **If `-- {instruction}` provided:** Execute the follow-up instruction against the loaded project
39
40