@starlein/paperclip-plugin-company-wizard 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,29 @@ All notable changes to the Company Wizard plugin are documented here.
4
4
 
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ---
8
+ ## [0.4.3] - 2026-06-16
9
+
10
+ ### Fixed
11
+
12
+ - **Worker agents are no longer provisioned with `high` thinking.** Non-CEO agents were built with `buildCeoAdapterConfig`, which defaulted `thinkingLevel`/`modelReasoningEffort` to the CEO default (`high`) for every role — expensive and unnecessary for routine work. A new `buildWorkerAdapterConfig` (with `DEFAULT_WORKER_THINKING_LEVEL = 'medium'`) builds worker adapter config: workers default to `medium`, do not inherit a user-configured CEO thinking level, and a role can still raise its level via its `role.meta.json` adapter override. The CEO is unchanged (`high`).
13
+ - **Board Operations and Hiring Plan issues are no longer orphaned.** They are created before the CEO exists, so they could not be assigned at creation time. `start-provision` now assigns both governance issues to the CEO right after the CEO agent is available (best-effort), so they are actionable instead of unassigned.
14
+
15
+ ### Changed
16
+
17
+ - **The Hiring Plan issue is now a review checkpoint, not a re-hiring task.** `buildHiringPlanBody` was rewritten to state explicitly that the initial team was already submitted as governed `/agent-hires` (pending approval where the board requires it, never auto-approved) and to give the CEO concrete tasks: review each provisioned agent against the `paperclip-create-agent` draft-review checklist, approve/reject the pending hires, and only hire for genuine remaining gaps. This makes the `disableBoardApprovalOnNewCompanies` setting meaningful: left `false`, the wizard's hires land as pending approvals the CEO works through this issue.
18
+
19
+ ### Added
20
+
21
+ - `scripts/patch-active-company.mjs` — idempotent maintenance script that patches an already-provisioned company in place to the current defaults: sets worker agents to `medium` thinking and assigns the Board Operations / Hiring Plan issues to the CEO. Supports `--dry-run` and `--thinking=<level>`.
22
+
23
+ ---
24
+ ## [0.4.2] - 2026-06-15
25
+
26
+ ### Fixed
27
+
28
+ - **Existing-company provisioning no longer fails while creating governance records.** Board Operations and Hiring Plan are now created as unassigned `todo` issues because Paperclip rejects unassigned `in_progress` issues.
29
+
7
30
  ---
8
31
  ## [0.4.1] - 2026-06-15
9
32
 
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ---
17
17
 
18
- > **Fork:** This is a community-maintained fork of [yesterday-AI/paperclip-plugin-company-wizard](https://github.com/yesterday-AI/paperclip-plugin-company-wizard), updated for the current Paperclip API (`>=2026.529.0`) with substantial bug fixes. End-to-end company setup is governed through current Paperclip workflows as of v0.4.1.
18
+ > **Fork:** This is a community-maintained fork of [yesterday-AI/paperclip-plugin-company-wizard](https://github.com/yesterday-AI/paperclip-plugin-company-wizard), updated for the current Paperclip API (`>=2026.529.0`) with substantial bug fixes. End-to-end company setup is governed through current Paperclip workflows as of v0.4.3.
19
19
 
20
20
  <details>
21
21
  <summary><strong>What changed vs. upstream</strong></summary>
package/dist/manifest.js CHANGED
@@ -2,7 +2,7 @@
2
2
  var manifest = {
3
3
  id: "starlein.paperclip-plugin-company-wizard",
4
4
  apiVersion: 1,
5
- version: "0.4.1",
5
+ version: "0.4.3",
6
6
  displayName: "Company Wizard",
7
7
  description: "AI-powered wizard to bootstrap agent companies from composable templates",
8
8
  author: "Sascha Pietrowski <sp@speednetwork.de>",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/manifest.ts"],
4
- "sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.4.1',\n displayName: 'Company Wizard',\n description: 'AI-powered wizard to bootstrap agent companies from composable templates',\n author: 'Sascha Pietrowski <sp@speednetwork.de>',\n categories: ['workspace', 'ui'],\n capabilities: [\n 'companies.read',\n 'issues.create',\n 'issues.read',\n 'issues.update',\n 'goals.create',\n 'goals.read',\n 'agents.read',\n 'projects.read',\n 'plugin.state.read',\n 'plugin.state.write',\n 'secrets.read-ref',\n 'events.subscribe',\n 'ui.page.register',\n 'ui.sidebar.register',\n ],\n instanceConfigSchema: {\n type: 'object',\n properties: {\n companiesDir: {\n type: 'string',\n description:\n 'Directory where assembled company workspaces are written. Defaults to ~/.paperclip/instances/default/companies. Override for Docker setups (e.g. /paperclip/instances/default/companies).',\n },\n templatesPath: {\n type: 'string',\n description:\n 'Path to the templates directory. Defaults to ~/.paperclip/plugin-templates (auto-downloaded from templatesRepoUrl if missing). Override for Docker setups (e.g. /paperclip/plugin-templates).',\n },\n templatesRepoUrl: {\n type: 'string',\n default: 'https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates',\n description:\n 'GitHub tree URL to pull templates from when the templates directory does not exist.',\n },\n anthropicApiKey: {\n type: 'string',\n description:\n 'Anthropic API key for the AI wizard (e.g. sk-ant-...). Required to use the AI-powered company setup path.',\n },\n paperclipUrl: {\n type: 'string',\n description:\n 'Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var.',\n },\n paperclipEmail: {\n type: 'string',\n description: 'Board login email (for authenticated instances).',\n },\n paperclipPassword: {\n type: 'string',\n description: 'Board login password (for authenticated instances).',\n },\n disableBoardApprovalOnNewCompanies: {\n type: 'boolean',\n default: false,\n description:\n 'Optional. If true, the wizard will PATCH new companies to set requireBoardApprovalForNewAgents=false during provisioning. Leave false to preserve approval-gated hiring policies.',\n },\n },\n },\n entrypoints: {\n worker: './dist/worker.js',\n ui: './dist/ui',\n },\n ui: {\n slots: [\n {\n type: 'page',\n id: 'company-wizard',\n displayName: 'Company Wizard',\n exportName: 'WizardPage',\n routePath: 'company-creator',\n },\n {\n type: 'sidebar',\n id: 'company-wizard-link',\n displayName: 'Create Company',\n exportName: 'SidebarLink',\n },\n ],\n },\n};\n\nexport default manifest;\n"],
4
+ "sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.4.3',\n displayName: 'Company Wizard',\n description: 'AI-powered wizard to bootstrap agent companies from composable templates',\n author: 'Sascha Pietrowski <sp@speednetwork.de>',\n categories: ['workspace', 'ui'],\n capabilities: [\n 'companies.read',\n 'issues.create',\n 'issues.read',\n 'issues.update',\n 'goals.create',\n 'goals.read',\n 'agents.read',\n 'projects.read',\n 'plugin.state.read',\n 'plugin.state.write',\n 'secrets.read-ref',\n 'events.subscribe',\n 'ui.page.register',\n 'ui.sidebar.register',\n ],\n instanceConfigSchema: {\n type: 'object',\n properties: {\n companiesDir: {\n type: 'string',\n description:\n 'Directory where assembled company workspaces are written. Defaults to ~/.paperclip/instances/default/companies. Override for Docker setups (e.g. /paperclip/instances/default/companies).',\n },\n templatesPath: {\n type: 'string',\n description:\n 'Path to the templates directory. Defaults to ~/.paperclip/plugin-templates (auto-downloaded from templatesRepoUrl if missing). Override for Docker setups (e.g. /paperclip/plugin-templates).',\n },\n templatesRepoUrl: {\n type: 'string',\n default: 'https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates',\n description:\n 'GitHub tree URL to pull templates from when the templates directory does not exist.',\n },\n anthropicApiKey: {\n type: 'string',\n description:\n 'Anthropic API key for the AI wizard (e.g. sk-ant-...). Required to use the AI-powered company setup path.',\n },\n paperclipUrl: {\n type: 'string',\n description:\n 'Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var.',\n },\n paperclipEmail: {\n type: 'string',\n description: 'Board login email (for authenticated instances).',\n },\n paperclipPassword: {\n type: 'string',\n description: 'Board login password (for authenticated instances).',\n },\n disableBoardApprovalOnNewCompanies: {\n type: 'boolean',\n default: false,\n description:\n 'Optional. If true, the wizard will PATCH new companies to set requireBoardApprovalForNewAgents=false during provisioning. Leave false to preserve approval-gated hiring policies.',\n },\n },\n },\n entrypoints: {\n worker: './dist/worker.js',\n ui: './dist/ui',\n },\n ui: {\n slots: [\n {\n type: 'page',\n id: 'company-wizard',\n displayName: 'Company Wizard',\n exportName: 'WizardPage',\n routePath: 'company-creator',\n },\n {\n type: 'sidebar',\n id: 'company-wizard-link',\n displayName: 'Create Company',\n exportName: 'SidebarLink',\n },\n ],\n },\n};\n\nexport default manifest;\n"],
5
5
  "mappings": ";AAEA,IAAM,WAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY,CAAC,aAAa,IAAI;AAAA,EAC9B,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,MACA,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,oCAAoC;AAAA,QAClC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,mBAAQ;",
6
6
  "names": []
7
7
  }
package/dist/worker.js CHANGED
@@ -9282,6 +9282,7 @@ import { join } from "node:path";
9282
9282
  var DEFAULT_CEO_ADAPTER_TYPE = "codex_local";
9283
9283
  var DEFAULT_CEO_MODEL = "gpt-5.5";
9284
9284
  var DEFAULT_CEO_THINKING_LEVEL = "high";
9285
+ var DEFAULT_WORKER_THINKING_LEVEL = "medium";
9285
9286
  var DEFAULT_CEO_MAX_CONCURRENT_RUNS = 1;
9286
9287
  var DEFAULT_CEO_HEARTBEAT_INTERVAL_SEC = 3600;
9287
9288
  var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-6";
@@ -9291,10 +9292,12 @@ function asTrimmedString(value) {
9291
9292
  function normalizeCeoAdapterType(userCeoAdapter = {}) {
9292
9293
  return asTrimmedString(userCeoAdapter.type) || DEFAULT_CEO_ADAPTER_TYPE;
9293
9294
  }
9294
- function buildCeoAdapterConfig({
9295
+ function buildAdapterConfig({
9295
9296
  userCeoAdapter = {},
9296
9297
  companyDir,
9297
- roleAdapterOverrides = {}
9298
+ roleAdapterOverrides = {},
9299
+ defaultThinkingLevel = DEFAULT_CEO_THINKING_LEVEL,
9300
+ inheritUserThinking = true
9298
9301
  } = {}) {
9299
9302
  const adapterType = normalizeCeoAdapterType(userCeoAdapter);
9300
9303
  const userCwd = asTrimmedString(userCeoAdapter.cwd);
@@ -9302,7 +9305,8 @@ function buildCeoAdapterConfig({
9302
9305
  const overrideModel = asTrimmedString(roleAdapterOverrides.model);
9303
9306
  const defaultModel = adapterType === "claude_local" ? DEFAULT_CLAUDE_CEO_MODEL : DEFAULT_CEO_MODEL;
9304
9307
  const model = userModel || overrideModel || defaultModel;
9305
- const thinkingLevel = asTrimmedString(userCeoAdapter.thinkingLevel) || asTrimmedString(userCeoAdapter.modelReasoningEffort) || asTrimmedString(userCeoAdapter.reasoningEffort) || asTrimmedString(roleAdapterOverrides.thinkingLevel) || asTrimmedString(roleAdapterOverrides.modelReasoningEffort) || asTrimmedString(roleAdapterOverrides.reasoningEffort) || DEFAULT_CEO_THINKING_LEVEL;
9308
+ const userThinking = inheritUserThinking ? asTrimmedString(userCeoAdapter.thinkingLevel) || asTrimmedString(userCeoAdapter.modelReasoningEffort) || asTrimmedString(userCeoAdapter.reasoningEffort) : "";
9309
+ const thinkingLevel = userThinking || asTrimmedString(roleAdapterOverrides.thinkingLevel) || asTrimmedString(roleAdapterOverrides.modelReasoningEffort) || asTrimmedString(roleAdapterOverrides.reasoningEffort) || defaultThinkingLevel;
9306
9310
  const adapterConfig = {
9307
9311
  ...roleAdapterOverrides,
9308
9312
  cwd: userCwd || companyDir,
@@ -9319,6 +9323,20 @@ function buildCeoAdapterConfig({
9319
9323
  }
9320
9324
  return adapterConfig;
9321
9325
  }
9326
+ function buildCeoAdapterConfig(opts = {}) {
9327
+ return buildAdapterConfig({
9328
+ ...opts,
9329
+ defaultThinkingLevel: DEFAULT_CEO_THINKING_LEVEL,
9330
+ inheritUserThinking: true
9331
+ });
9332
+ }
9333
+ function buildWorkerAdapterConfig(opts = {}) {
9334
+ return buildAdapterConfig({
9335
+ ...opts,
9336
+ defaultThinkingLevel: DEFAULT_WORKER_THINKING_LEVEL,
9337
+ inheritUserThinking: false
9338
+ });
9339
+ }
9322
9340
  function buildCeoAgentRuntimeConfig() {
9323
9341
  return {
9324
9342
  heartbeat: {
@@ -10939,7 +10957,7 @@ var __dirname = path2.dirname(fileURLToPath2(import.meta.url));
10939
10957
  var DEFAULT_TEMPLATES_REPO_URL = "https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates";
10940
10958
  var BUNDLED_TEMPLATES_DIR = path2.resolve(__dirname, "..", "templates");
10941
10959
  var PLUGIN_PACKAGE_NAME = "@starlein/paperclip-plugin-company-wizard";
10942
- var CURRENT_PLUGIN_VERSION = "0.4.1";
10960
+ var CURRENT_PLUGIN_VERSION = "0.4.2";
10943
10961
  var NPM_LATEST_URL = "https://registry.npmjs.org/@starlein%2Fpaperclip-plugin-company-wizard/latest";
10944
10962
  function copyDirSync(src, dest) {
10945
10963
  fs2.mkdirSync(dest, { recursive: true });
@@ -11266,23 +11284,36 @@ function buildHiringPlanBody({
11266
11284
 
11267
11285
  Generated by Company Wizard on ${today}.
11268
11286
 
11269
- ## Instruction Source
11287
+ ## Status: initial team already provisioned
11288
+
11289
+ Company Wizard has already submitted the initial team below as **governed hires**
11290
+ via \`/agent-hires\` (each with a full instruction bundle assembled from curated role
11291
+ templates). Where the board requires approval, those hires are pending your approval \u2014
11292
+ they were **not** auto-approved.
11293
+
11294
+ **This issue is your review checkpoint \u2014 not a re-hiring task.** Do not create the
11295
+ roles below again.
11296
+
11297
+ ## Your tasks
11270
11298
 
11271
- Company Wizard uses curated role templates from its template library. When proposing additional hires after bootstrap, follow the Paperclip \`paperclip-create-agent\` workflow: choose an exact, adjacent, or generic template; run the draft-review checklist; submit via \`/agent-hires\`; link this issue as \`sourceIssueId\`; and wait for board approval when required.
11299
+ 1. **Review each provisioned agent against the draft-review checklist** (Paperclip
11300
+ \`paperclip-create-agent\` \u2192 \`references/draft-review-checklist.md\`): instruction
11301
+ quality, correct adapter/model/thinking level, escalation/reportsTo path, and
11302
+ desiredSkills justification. Note any corrections in the decision log.
11303
+ 2. **Approve or reject** the pending hires accordingly.
11304
+ 3. **Only hire for genuine gaps.** If a capability is missing after the first
11305
+ roadmap/backlog pass, follow the \`paperclip-create-agent\` workflow: pick an exact,
11306
+ adjacent, or generic template, run the draft-review checklist, submit via
11307
+ \`/agent-hires\` with a concrete AGENTS.md draft + adapter config + desiredSkills
11308
+ justification, and set \`sourceIssueId\` to this issue.
11272
11309
 
11273
- ## Initial Roles
11310
+ ## Initial Roles (already provisioned)
11274
11311
 
11275
11312
  ${roles.map((role) => `- ${formatRoleName(role)}`).join("\n")}
11276
11313
 
11277
11314
  ## Selected Modules
11278
11315
 
11279
11316
  ${moduleNames.length > 0 ? moduleNames.map((mod) => `- ${mod}`).join("\n") : "- none"}
11280
-
11281
- ## Follow-up Review
11282
-
11283
- - Reassess capacity after the first roadmap/backlog pass.
11284
- - Do not hire for capabilities already covered by existing roles.
11285
- - If a gap remains, submit a governed hire request with a concrete AGENTS.md draft, adapter config, desiredSkills justification, and sourceIssueId pointing to this hiring plan issue.
11286
11317
  `;
11287
11318
  }
11288
11319
  var plugin = definePlugin({
@@ -11628,7 +11659,10 @@ var plugin = definePlugin({
11628
11659
  const createdBoardOperationsIssue = await client.createIssue(companyId, {
11629
11660
  title: "Board Operations",
11630
11661
  description: "Standing issue for board decision log and operations tracking.",
11631
- status: "in_progress",
11662
+ // These governance records are created before the CEO is guaranteed to exist.
11663
+ // Paperclip requires an assignee for in_progress issues, so keep them unassigned
11664
+ // and actionable later rather than failing existing-company provisioning.
11665
+ status: "todo",
11632
11666
  priority: "medium"
11633
11667
  });
11634
11668
  boardOperationsIssue = createdBoardOperationsIssue;
@@ -11651,7 +11685,7 @@ var plugin = definePlugin({
11651
11685
  const createdHiringPlanIssue = await client.createIssue(companyId, {
11652
11686
  title: "Hiring Plan",
11653
11687
  description: "Develop and execute the governed team hiring plan.",
11654
- status: "in_progress",
11688
+ status: "todo",
11655
11689
  priority: "high"
11656
11690
  });
11657
11691
  hiringPlanIssue = createdHiringPlanIssue;
@@ -11771,6 +11805,20 @@ var plugin = definePlugin({
11771
11805
  fallbackEntryContent: ceoPromptTemplate,
11772
11806
  log
11773
11807
  });
11808
+ for (const govIssue of [
11809
+ { issue: boardOperationsIssue, label: "Board Operations" },
11810
+ { issue: hiringPlanIssue, label: "Hiring Plan" }
11811
+ ]) {
11812
+ if (!govIssue.issue?.id) continue;
11813
+ try {
11814
+ await client.updateIssue(govIssue.issue.id, { assigneeAgentId: ceoAgentId });
11815
+ log(`\u2713 Assigned ${govIssue.label} issue to CEO`);
11816
+ } catch (assignErr) {
11817
+ log(
11818
+ `\u26A0 Could not assign ${govIssue.label} issue to CEO: ${assignErr instanceof Error ? assignErr.message : String(assignErr)}`
11819
+ );
11820
+ }
11821
+ }
11774
11822
  const teamRoles = [...assembleResult.allRoles ?? []].filter(
11775
11823
  (r) => r && r !== "ceo"
11776
11824
  );
@@ -11796,7 +11844,7 @@ var plugin = definePlugin({
11796
11844
  ...roleDescription ? { description: roleDescription } : {}
11797
11845
  };
11798
11846
  const roleRuntimeConfig = buildWorkerAgentRuntimeConfig();
11799
- const roleAdapterConfig = buildCeoAdapterConfig({
11847
+ const roleAdapterConfig = buildWorkerAdapterConfig({
11800
11848
  userCeoAdapter,
11801
11849
  companyDir,
11802
11850
  roleAdapterOverrides: assembleResult.roleAdapterOverrides?.get(roleName) ?? {}