@aperant/framework 0.6.6 → 0.6.7

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 (88) hide show
  1. package/CHANGELOG.md +155 -0
  2. package/dist/cli/commands/check-version.d.mts.map +1 -1
  3. package/dist/cli/commands/check-version.mjs +76 -1
  4. package/dist/cli/commands/check-version.mjs.map +1 -1
  5. package/dist/cli/commands/ci-watch.d.mts.map +1 -1
  6. package/dist/cli/commands/ci-watch.mjs +34 -4
  7. package/dist/cli/commands/ci-watch.mjs.map +1 -1
  8. package/dist/cli/commands/init.d.mts +8 -1
  9. package/dist/cli/commands/init.d.mts.map +1 -1
  10. package/dist/cli/commands/init.mjs +91 -9
  11. package/dist/cli/commands/init.mjs.map +1 -1
  12. package/dist/cli/commands/release-notes.d.mts +11 -0
  13. package/dist/cli/commands/release-notes.d.mts.map +1 -0
  14. package/dist/cli/commands/release-notes.mjs +173 -0
  15. package/dist/cli/commands/release-notes.mjs.map +1 -0
  16. package/dist/cli/config/load.d.mts +14 -0
  17. package/dist/cli/config/load.d.mts.map +1 -1
  18. package/dist/cli/config/load.mjs +40 -0
  19. package/dist/cli/config/load.mjs.map +1 -1
  20. package/dist/cli/config/upgrade-gitignore.d.mts.map +1 -1
  21. package/dist/cli/config/upgrade-gitignore.mjs +6 -0
  22. package/dist/cli/config/upgrade-gitignore.mjs.map +1 -1
  23. package/dist/cli/consistency/parse-review.d.mts.map +1 -1
  24. package/dist/cli/consistency/parse-review.mjs +4 -1
  25. package/dist/cli/consistency/parse-review.mjs.map +1 -1
  26. package/dist/cli/dispatch.d.mts.map +1 -1
  27. package/dist/cli/dispatch.mjs +2 -0
  28. package/dist/cli/dispatch.mjs.map +1 -1
  29. package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
  30. package/dist/cli/gate/gates/review-clean.mjs +4 -2
  31. package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
  32. package/dist/cli/install/update-chips.d.mts +23 -0
  33. package/dist/cli/install/update-chips.d.mts.map +1 -1
  34. package/dist/cli/install/update-chips.mjs +60 -0
  35. package/dist/cli/install/update-chips.mjs.map +1 -1
  36. package/dist/cli/release-notes/compile.d.mts +38 -0
  37. package/dist/cli/release-notes/compile.d.mts.map +1 -0
  38. package/dist/cli/release-notes/compile.mjs +244 -0
  39. package/dist/cli/release-notes/compile.mjs.map +1 -0
  40. package/dist/cli/release-notes/draft.d.mts +73 -0
  41. package/dist/cli/release-notes/draft.d.mts.map +1 -0
  42. package/dist/cli/release-notes/draft.mjs +120 -0
  43. package/dist/cli/release-notes/draft.mjs.map +1 -0
  44. package/dist/cli/release-notes/output-dir.d.mts +20 -0
  45. package/dist/cli/release-notes/output-dir.d.mts.map +1 -0
  46. package/dist/cli/release-notes/output-dir.mjs +42 -0
  47. package/dist/cli/release-notes/output-dir.mjs.map +1 -0
  48. package/dist/cli/release-notes/persona-filter.d.mts +51 -0
  49. package/dist/cli/release-notes/persona-filter.d.mts.map +1 -0
  50. package/dist/cli/release-notes/persona-filter.mjs +127 -0
  51. package/dist/cli/release-notes/persona-filter.mjs.map +1 -0
  52. package/dist/cli/release-notes/publish.d.mts +23 -0
  53. package/dist/cli/release-notes/publish.d.mts.map +1 -0
  54. package/dist/cli/release-notes/publish.mjs +125 -0
  55. package/dist/cli/release-notes/publish.mjs.map +1 -0
  56. package/dist/cli/release-notes/ship-autodraft.d.mts +37 -0
  57. package/dist/cli/release-notes/ship-autodraft.d.mts.map +1 -0
  58. package/dist/cli/release-notes/ship-autodraft.mjs +97 -0
  59. package/dist/cli/release-notes/ship-autodraft.mjs.map +1 -0
  60. package/dist/types/config.d.ts +11 -7
  61. package/dist/types/config.d.ts.map +1 -1
  62. package/package.json +133 -133
  63. package/skills/apt-close-task/SKILL.md +25 -0
  64. package/skills/apt-diagram/SKILL.md +45 -9
  65. package/skills/apt-release-notes/SKILL.md +193 -0
  66. package/skills/apt-release-notes/appendices/persona-voice.md +59 -0
  67. package/skills/apt-setup/SKILL.md +146 -3
  68. package/skills/apt-ship/SKILL.md +47 -0
  69. package/skills/apt-update/SKILL.md +51 -9
  70. package/skills/apt-watch-ci/SKILL.md +2 -2
  71. package/src/cli/commands/check-version.mjs +73 -1
  72. package/src/cli/commands/ci-watch.mjs +35 -4
  73. package/src/cli/commands/init.mjs +101 -9
  74. package/src/cli/commands/release-notes.mjs +187 -0
  75. package/src/cli/config/load.mjs +37 -0
  76. package/src/cli/config/upgrade-gitignore.mjs +6 -0
  77. package/src/cli/consistency/parse-review.mjs +3 -1
  78. package/src/cli/dispatch.mjs +2 -0
  79. package/src/cli/gate/gates/review-clean.mjs +4 -2
  80. package/src/cli/install/update-chips.mjs +57 -0
  81. package/src/cli/release-notes/compile.mjs +261 -0
  82. package/src/cli/release-notes/draft.mjs +133 -0
  83. package/src/cli/release-notes/output-dir.mjs +52 -0
  84. package/src/cli/release-notes/persona-filter.mjs +126 -0
  85. package/src/cli/release-notes/publish.mjs +128 -0
  86. package/src/cli/release-notes/ship-autodraft.mjs +106 -0
  87. package/templates/config.json +28 -3
  88. package/workflows/docs.md +12 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * release-notes/ship-autodraft.mjs — apt-ship Section 2.6 helper.
3
+ *
4
+ * Deterministic, unit-testable shape: given a feature-registry diff +
5
+ * personas envelope + persona_filter mode, decide whether the PR body
6
+ * should grow a `Release note: …` line OR ship should block.
7
+ *
8
+ * This module is intentionally pure — the apt-ship SKILL.md body shells
9
+ * `apt-tools features-audit . --diff-since <base> --json` and feeds the
10
+ * envelope here. Keeping the decision pure makes TD-4 trivial: fixture in,
11
+ * decision out, no I/O.
12
+ */
13
+ import { buildPersonaTierMap, classifyFragment } from './persona-filter.mjs';
14
+ /**
15
+ * @typedef {Object} FeatureDiffEntry
16
+ * @property {string} feature_id
17
+ * @property {string} [area]
18
+ * @property {string[]} [personas]
19
+ */
20
+ /**
21
+ * @typedef {Object} AutodraftInput
22
+ * @property {FeatureDiffEntry[]} featureDiff
23
+ * @property {{ personas?: Array<{ ui_json?: unknown }> } | null} personasEnvelope
24
+ * @property {'primary' | 'primary+secondary' | 'all'} personaFilter
25
+ * @property {boolean} requirePrField
26
+ */
27
+ /**
28
+ * @typedef {{
29
+ * status: 'draft',
30
+ * line: string,
31
+ * persona: string,
32
+ * matchedFeatures: string[],
33
+ * } | {
34
+ * status: 'block',
35
+ * reason: 'no-feature-match' | 'no-persona-signal',
36
+ * message: string,
37
+ * } | {
38
+ * status: 'warn',
39
+ * reason: 'no-feature-match' | 'no-persona-signal',
40
+ * message: string,
41
+ * }} AutodraftResult
42
+ */
43
+ const BLOCK_MESSAGE = '[APT] No release-note signal found — author manual note in PR body or label PR no-notes';
44
+ /**
45
+ * Compute the autodraft decision.
46
+ *
47
+ * @param {AutodraftInput} input
48
+ * @returns {AutodraftResult}
49
+ */
50
+ export function decideAutodraft(input) {
51
+ const tierMap = buildPersonaTierMap(input.personasEnvelope);
52
+ if (!Array.isArray(input.featureDiff) || input.featureDiff.length === 0) {
53
+ return failClassify(input, 'no-feature-match');
54
+ }
55
+ // Walk the diff; the first feature whose persona resolves into the
56
+ // filter mode wins. (Multi-persona dispatch is intentionally out of
57
+ // scope here — host LLM-side narrative can refine per persona; the
58
+ // CLI just picks a clean signal so ship is decisive.)
59
+ for (const feature of input.featureDiff) {
60
+ if (!Array.isArray(feature.personas) || feature.personas.length === 0)
61
+ continue;
62
+ for (const personaTag of feature.personas) {
63
+ const decision = classifyFragment(personaTag, tierMap, input.personaFilter);
64
+ if (decision.bucket === 'body' && decision.resolvedTier) {
65
+ return {
66
+ status: 'draft',
67
+ line: `Release note: ${feature.feature_id} — ships for ${personaTag}.`,
68
+ persona: personaTag,
69
+ matchedFeatures: [feature.feature_id],
70
+ };
71
+ }
72
+ }
73
+ }
74
+ // No persona signal anywhere — features exist but none carry a tag
75
+ // that the roster + filter accept.
76
+ return failClassify(input, 'no-persona-signal');
77
+ }
78
+ /**
79
+ * Translate a failure reason into the right envelope shape based on
80
+ * `require_pr_field`. require=true → block; require=false → warn (skill
81
+ * proceeds without the line).
82
+ *
83
+ * @param {AutodraftInput} input
84
+ * @param {'no-feature-match' | 'no-persona-signal'} reason
85
+ * @returns {AutodraftResult}
86
+ */
87
+ function failClassify(input, reason) {
88
+ if (input.requirePrField) {
89
+ return { status: 'block', reason, message: BLOCK_MESSAGE };
90
+ }
91
+ return {
92
+ status: 'warn',
93
+ reason,
94
+ message: `[APT] auto-draft skipped (${reason}) — release_notes.require_pr_field is false; proceeding without a Release note line.`,
95
+ };
96
+ }
97
+ //# sourceMappingURL=ship-autodraft.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-autodraft.mjs","sourceRoot":"","sources":["../../../src/cli/release-notes/ship-autodraft.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5E;;;;;GAKG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,aAAa,GAClB,yFAAyF,CAAA;AAE1F;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAK;IACpC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAE3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,YAAY,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;IAC/C,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,sDAAsD;IACtD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC/E,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;YAC3E,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACzD,OAAO;oBACN,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,iBAAiB,OAAO,CAAC,UAAU,gBAAgB,UAAU,GAAG;oBACtE,OAAO,EAAE,UAAU;oBACnB,eAAe,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;iBACrC,CAAA;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,mEAAmE;IACnE,mCAAmC;IACnC,OAAO,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM;IAClC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO;QACN,MAAM,EAAE,MAAM;QACd,MAAM;QACN,OAAO,EAAE,6BAA6B,MAAM,sFAAsF;KAClI,CAAA;AACF,CAAC"}
@@ -194,18 +194,22 @@ export interface TddConfig {
194
194
  * `mode` is the persisted default render mode — `file` writes a local
195
195
  * `.excalidraw` JSON, `mcp` dispatches to a live Excalidraw MCP canvas.
196
196
  * The skill's `--mode=...` invocation flag overrides this at call time.
197
+ * Lives in the shared `.aperant/config.json` (team-shared policy).
197
198
  *
198
- * `mcpConsent` is the per-host consent record for MCP mode. Default
199
- * `null` means no host has been granted consent yet — the skill must
200
- * prompt and persist on the first MCP-mode invocation. The same host
201
- * does not re-prompt; a different host invalidates the existing record
202
- * and re-prompts.
199
+ * `mcpConsent` is the per-host consent record for MCP mode. Per
200
+ * FRAMEWORK-AUDIT-001, this field is per-user state and is persisted to
201
+ * the gitignored `.aperant/config.local.json` NOT the shared
202
+ * `config.json`. It surfaces on `DiagramConfig` because callers read the
203
+ * MERGED config (via `loadMergedProjectConfig`); the optional `?` marks
204
+ * that the field is absent until the user records a consent decision.
205
+ * The same host does not re-prompt; a different host invalidates the
206
+ * existing record and re-prompts.
203
207
  */
204
208
  export interface DiagramConfig {
205
209
  /** Resolved default render mode (overridable per-call by --mode=...) */
206
210
  mode: 'file' | 'mcp';
207
- /** Per-host MCP consent record; null means not yet asked */
208
- mcpConsent: {
211
+ /** Per-host MCP consent record from config.local.json; absent until first decision */
212
+ mcpConsent?: {
209
213
  host: string;
210
214
  decision: 'granted' | 'denied';
211
215
  grantedAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,134 +1,134 @@
1
1
  {
2
- "name": "@aperant/framework",
3
- "version": "0.6.6",
4
- "description": "AI coding framework — composable skills for planning, executing, verifying, and reviewing code with any LLM provider. Works as Claude Code commands, Codex tasks, or programmatically.",
5
- "author": "Mikalsen AI <hello@mikalsen.ai>",
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "bin": {
10
- "framework": "./bin/apt-tools.mjs",
11
- "apt-tools": "./bin/apt-tools.mjs",
12
- "apt-proof-video": "./bin/apt-proof-video.mjs"
13
- },
14
- "exports": {
15
- ".": {
16
- "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
18
- },
19
- "./types": {
20
- "types": "./dist/types/index.d.ts",
21
- "import": "./dist/types/index.js"
22
- },
23
- "./cost": {
24
- "types": "./dist/cost/index.d.ts",
25
- "import": "./dist/cost/index.js"
26
- },
27
- "./mappers": {
28
- "types": "./dist/mappers/index.d.ts",
29
- "import": "./dist/mappers/index.js"
30
- },
31
- "./schemas": {
32
- "types": "./dist/schemas/index.d.ts",
33
- "import": "./dist/schemas/index.js"
34
- },
35
- "./standalone": {
36
- "types": "./dist/standalone/index.d.ts",
37
- "import": "./dist/standalone/index.js"
38
- },
39
- "./coordination/event-schema": {
40
- "types": "./src/cli/coordination/event-schema.d.ts",
41
- "import": "./src/cli/coordination/event-schema.mjs"
42
- },
43
- "./roadmap/conductor-view": {
44
- "types": "./src/cli/roadmap/conductor-view.d.ts",
45
- "import": "./src/cli/roadmap/conductor-view.mjs"
46
- },
47
- "./design/scan": {
48
- "import": "./src/cli/design/scan.mjs"
49
- },
50
- "./design/extract-repo": {
51
- "import": "./src/cli/design/extract-repo.mjs"
52
- },
53
- "./design/synthesize": {
54
- "import": "./src/cli/design/synthesize.mjs"
55
- }
56
- },
57
- "scripts": {
58
- "build": "tsc && node scripts/extract-personas-schema.mjs",
59
- "dev": "tsc --watch --preserveWatchOutput",
60
- "typecheck": "tsc --noEmit",
61
- "lint": "biome check . --diagnostic-level=error",
62
- "lint:fix": "biome check --write . --diagnostic-level=error",
63
- "clean": "rm -rf dist",
64
- "test": "vitest run",
65
- "c28:cutover": "node scripts/c28-cutover.mjs",
66
- "build-plugin": "node scripts/build-plugin.mjs",
67
- "publish-plugin": "node scripts/publish-plugin.mjs",
68
- "publish:verdaccio": "node scripts/publish-verdaccio.mjs",
69
- "release:verdaccio": "pnpm build && pnpm publish:verdaccio",
70
- "ship:verdaccio": "npm version patch --no-git-tag-version && pnpm build && pnpm publish:verdaccio"
71
- },
72
- "files": [
73
- "dist/",
74
- "bin/",
75
- "src/cli/",
76
- "src/cost/",
77
- "commands/",
78
- "skills/",
79
- "agents/",
80
- "prompts/",
81
- "templates/",
82
- "context/",
83
- "workflows/",
84
- "examples/",
85
- "LICENSE",
86
- "README.md",
87
- "CHANGELOG.md",
88
- "!**/__tests__/**",
89
- "!**/*.test.*",
90
- "!**/*.spec.*",
91
- "!**/*.test.d.ts.map",
92
- "!**/*.test.js.map"
93
- ],
94
- "keywords": [
95
- "ai",
96
- "framework",
97
- "coding-assistant",
98
- "claude-code",
99
- "codex",
100
- "aperant"
101
- ],
102
- "license": "AGPL-3.0-only",
103
- "homepage": "https://github.com/Mikalsen-AI/aperant-cloud-desktop/tree/main/packages/framework#readme",
104
- "bugs": {
105
- "url": "https://github.com/Mikalsen-AI/aperant-cloud-desktop/issues"
106
- },
107
- "repository": {
108
- "type": "git",
109
- "url": "https://github.com/Mikalsen-AI/aperant-cloud-desktop.git",
110
- "directory": "packages/framework"
111
- },
112
- "engines": {
113
- "node": ">=18.0.0"
114
- },
115
- "publishConfig": {
116
- "access": "public"
117
- },
118
- "dependencies": {
119
- "@clack/prompts": "^1.2.0",
120
- "proper-lockfile": "^4.1.2",
121
- "yaml": "^2.8.3",
122
- "zod": "^4.3.6"
123
- },
124
- "optionalDependencies": {
125
- "@babel/parser": "^7.29.2",
126
- "@babel/traverse": "^7.29.0",
127
- "@google/genai": "^1.50.1",
128
- "css-tree": "^3.2.1",
129
- "playwright": "^1.59.1"
130
- },
131
- "devDependencies": {
132
- "@vitest/coverage-v8": "^4.1.5"
133
- }
134
- }
2
+ "name": "@aperant/framework",
3
+ "version": "0.6.7",
4
+ "description": "AI coding framework — composable skills for planning, executing, verifying, and reviewing code with any LLM provider. Works as Claude Code commands, Codex tasks, or programmatically.",
5
+ "author": "Mikalsen AI <hello@mikalsen.ai>",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "framework": "./bin/apt-tools.mjs",
11
+ "apt-tools": "./bin/apt-tools.mjs",
12
+ "apt-proof-video": "./bin/apt-proof-video.mjs"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./types": {
20
+ "types": "./dist/types/index.d.ts",
21
+ "import": "./dist/types/index.js"
22
+ },
23
+ "./cost": {
24
+ "types": "./dist/cost/index.d.ts",
25
+ "import": "./dist/cost/index.js"
26
+ },
27
+ "./mappers": {
28
+ "types": "./dist/mappers/index.d.ts",
29
+ "import": "./dist/mappers/index.js"
30
+ },
31
+ "./schemas": {
32
+ "types": "./dist/schemas/index.d.ts",
33
+ "import": "./dist/schemas/index.js"
34
+ },
35
+ "./standalone": {
36
+ "types": "./dist/standalone/index.d.ts",
37
+ "import": "./dist/standalone/index.js"
38
+ },
39
+ "./coordination/event-schema": {
40
+ "types": "./src/cli/coordination/event-schema.d.ts",
41
+ "import": "./src/cli/coordination/event-schema.mjs"
42
+ },
43
+ "./roadmap/conductor-view": {
44
+ "types": "./src/cli/roadmap/conductor-view.d.ts",
45
+ "import": "./src/cli/roadmap/conductor-view.mjs"
46
+ },
47
+ "./design/scan": {
48
+ "import": "./src/cli/design/scan.mjs"
49
+ },
50
+ "./design/extract-repo": {
51
+ "import": "./src/cli/design/extract-repo.mjs"
52
+ },
53
+ "./design/synthesize": {
54
+ "import": "./src/cli/design/synthesize.mjs"
55
+ }
56
+ },
57
+ "files": [
58
+ "dist/",
59
+ "bin/",
60
+ "src/cli/",
61
+ "src/cost/",
62
+ "commands/",
63
+ "skills/",
64
+ "agents/",
65
+ "prompts/",
66
+ "templates/",
67
+ "context/",
68
+ "workflows/",
69
+ "examples/",
70
+ "LICENSE",
71
+ "README.md",
72
+ "CHANGELOG.md",
73
+ "!**/__tests__/**",
74
+ "!**/*.test.*",
75
+ "!**/*.spec.*",
76
+ "!**/*.test.d.ts.map",
77
+ "!**/*.test.js.map"
78
+ ],
79
+ "keywords": [
80
+ "ai",
81
+ "framework",
82
+ "coding-assistant",
83
+ "claude-code",
84
+ "codex",
85
+ "aperant"
86
+ ],
87
+ "license": "AGPL-3.0-only",
88
+ "homepage": "https://github.com/Mikalsen-AI/aperant-cloud-desktop/tree/main/packages/framework#readme",
89
+ "bugs": {
90
+ "url": "https://github.com/Mikalsen-AI/aperant-cloud-desktop/issues"
91
+ },
92
+ "repository": {
93
+ "type": "git",
94
+ "url": "https://github.com/Mikalsen-AI/aperant-cloud-desktop.git",
95
+ "directory": "packages/framework"
96
+ },
97
+ "engines": {
98
+ "node": ">=18.0.0"
99
+ },
100
+ "publishConfig": {
101
+ "access": "public"
102
+ },
103
+ "dependencies": {
104
+ "@clack/prompts": "^1.2.0",
105
+ "proper-lockfile": "^4.1.2",
106
+ "yaml": "^2.8.3",
107
+ "zod": "^4.3.6"
108
+ },
109
+ "optionalDependencies": {
110
+ "@babel/parser": "^7.29.2",
111
+ "@babel/traverse": "^7.29.0",
112
+ "@google/genai": "^1.50.1",
113
+ "css-tree": "^3.2.1",
114
+ "playwright": "^1.59.1"
115
+ },
116
+ "devDependencies": {
117
+ "@vitest/coverage-v8": "^4.1.5"
118
+ },
119
+ "scripts": {
120
+ "build": "tsc && node scripts/extract-personas-schema.mjs",
121
+ "dev": "tsc --watch --preserveWatchOutput",
122
+ "typecheck": "tsc --noEmit",
123
+ "lint": "biome check . --diagnostic-level=error",
124
+ "lint:fix": "biome check --write . --diagnostic-level=error",
125
+ "clean": "rm -rf dist",
126
+ "test": "vitest run",
127
+ "c28:cutover": "node scripts/c28-cutover.mjs",
128
+ "build-plugin": "node scripts/build-plugin.mjs",
129
+ "publish-plugin": "node scripts/publish-plugin.mjs",
130
+ "publish:verdaccio": "node scripts/publish-verdaccio.mjs",
131
+ "release:verdaccio": "pnpm build && pnpm publish:verdaccio",
132
+ "ship:verdaccio": "npm version patch --no-git-tag-version && pnpm build && pnpm publish:verdaccio"
133
+ }
134
+ }
@@ -88,6 +88,31 @@ Do NOT wait on the narrator. Its status lands in `.aperant/digests/.last-run.jso
88
88
 
89
89
  After step 2.5 spawns narrators for the just-closed candidates, the skill ALSO drains `state.pending_narration[]` (entries the passive sweep parked there) — see §4.
90
90
 
91
+ ## 2.6 Drop user-facing release-note fragment (persona-aware release-notes opt-in)
92
+
93
+ This step is additive bookkeeping — it must NEVER block the close path or surface a destructive failure. Runs ONLY when `.aperant/config.json` has `changelog.release_notes.enabled === true`. When the toggle is `false` (the default for projects that don't publish user-facing notes), skip the section entirely.
94
+
95
+ For each entry in the close-merged envelope's `closed[]`:
96
+
97
+ 1. Read the merged PR body via `gh pr view <pr_number> --json body`. Look for a single `Release note:` line (case-insensitive). The line is what `/apt:ship` Section 2.6 auto-drafted (or a manual edit by the author).
98
+ 2. Look for a persona tag in the PR body or in commits. Reasonable sources: the `Release note:` line itself if the author included one (e.g. `Release note: [Maya] …`), a `release-note-persona:` trailer in the most recent commit, or the persona name embedded in the auto-drafted line by §2.6.2 of /apt:ship.
99
+ 3. Invoke the deterministic drafter:
100
+
101
+ ```bash
102
+ node packages/framework/bin/apt-tools.mjs release-notes draft . \
103
+ --pr <pr_number> \
104
+ --note "<release-note-line-text>" \
105
+ [--persona <persona-name>]
106
+ ```
107
+
108
+ This call is synchronous, sub-100ms, and idempotent per subtask 2 — re-running close-task does not duplicate the fragment.
109
+
110
+ 4. On non-zero exit from `release-notes draft`, append a `pending_release_note[]` row to `.aperant/state.json` so a manual re-run can recover. Do NOT block close-merged on this — it is additive bookkeeping, not core lifecycle. Use `apt-tools state-update . --append-pending-release-note '{"task_id": "<id>", "pr_number": <n>, "reason": "<error>"}'` if such a helper exists, otherwise call `apt-tools state-artifacts . --note '<msg>'` or write a one-line warning to stderr.
111
+
112
+ Skip the section quietly when:
113
+ - The PR body has no `Release note:` line AND no auto-draft signal (intentional infra-only PR, or the `no-notes` label was applied at ship time).
114
+ - The CLI returns `{status: 'ok', written: false, reason: 'no-change'}` — already idempotent-handled by subtask 2's contract; treat as success.
115
+
91
116
  ## 3. Summary
92
117
 
93
118
  close-merged emits an envelope with:
@@ -174,8 +174,38 @@ order: (a) consent gate, (b) renderer dispatch, (c) failure handling.
174
174
 
175
175
  ### 5a. Consent gate
176
176
 
177
- Read `.aperant/config.json` and look at `diagram.mcpConsent`. The
178
- shape is:
177
+ Per FRAMEWORK-AUDIT-001, `mcpConsent` is per-user state and lives in
178
+ `.aperant/config.local.json` (gitignored), NOT the shared
179
+ `.aperant/config.json`. The `diagram.mode` field stays in `config.json` as
180
+ team policy. Read the MERGED config (config.json deep-merged with
181
+ config.local.json — local wins on collision) and look at
182
+ `diagram.mcpConsent` via the same in-skill `node -e` pattern Step 2 uses:
183
+
184
+ ```bash
185
+ node -e '
186
+ const fs = require("fs");
187
+ const path = require("path");
188
+ const aperantDir = path.join(process.cwd(), ".aperant");
189
+ function readJson(p) {
190
+ try { return JSON.parse(fs.readFileSync(p, "utf-8")); } catch { return null; }
191
+ }
192
+ const shared = readJson(path.join(aperantDir, "config.json")) || {};
193
+ const local = readJson(path.join(aperantDir, "config.local.json")) || {};
194
+ // Deep-merge — local wins on collision; matches loadMergedProjectConfig semantics.
195
+ function merge(a, b) {
196
+ if (a === null || typeof a !== "object" || Array.isArray(a)) return b;
197
+ if (b === null || typeof b !== "object" || Array.isArray(b)) return b;
198
+ const out = { ...a };
199
+ for (const k of Object.keys(b)) out[k] = (k in a) ? merge(a[k], b[k]) : b[k];
200
+ return out;
201
+ }
202
+ const cfg = merge(shared, local);
203
+ const consent = cfg && cfg.diagram ? cfg.diagram.mcpConsent : null;
204
+ process.stdout.write(JSON.stringify(consent || null));
205
+ '
206
+ ```
207
+
208
+ The shape is:
179
209
 
180
210
  ```json
181
211
  { "host": "<host string>", "decision": "granted" | "denied", "grantedAt": "<ISO 8601 timestamp>" }
@@ -196,7 +226,7 @@ Decide whether to prompt:
196
226
  - If `diagram.mcpConsent.host !== <configured MCP host>` → prompt.
197
227
  - If `diagram.mcpConsent.host === <configured MCP host>` AND `diagram.mcpConsent.decision === "denied"` → hard-error immediately with the exact denied text (no re-prompt):
198
228
  ```
199
- diagram MCP consent denied; re-run with `--mode=file` or change diagram.mcpConsent in .aperant/config.json
229
+ diagram MCP consent denied; re-run with `--mode=file` or change diagram.mcpConsent in .aperant/config.local.json
200
230
  ```
201
231
  - Otherwise (host matches AND decision is `"granted"`) → the existing consent applies; proceed to 5b.
202
232
 
@@ -206,23 +236,25 @@ When prompting, print a single line naming the host and ask `granted / denied`:
206
236
  apt:diagram is about to send diagram data to the Excalidraw MCP server at <host>. Type `granted` to allow, `denied` to refuse.
207
237
  ```
208
238
 
209
- Read one line of input. Persist the decision back to
210
- `.aperant/config.json` with a read-mutate-write JSON pattern:
239
+ Read one line of input. Persist the decision to
240
+ `.aperant/config.local.json` (NOT `config.json` `mcpConsent` is per-user
241
+ state per FRAMEWORK-AUDIT-001; the local file is gitignored). The
242
+ read-mutate-write JSON pattern targets the local file only:
211
243
 
212
244
  ```bash
213
245
  node -e '
214
246
  const fs = require("fs");
215
247
  const path = require("path");
216
- const cfgPath = path.join(process.cwd(), ".aperant/config.json");
248
+ const cfgPath = path.join(process.cwd(), ".aperant/config.local.json");
217
249
  const decision = process.env.APT_DIAGRAM_DECISION; // "granted" | "denied"
218
250
  if (decision !== "granted" && decision !== "denied") {
219
251
  process.stderr.write("invalid decision\n");
220
252
  process.exit(1);
221
253
  }
222
254
  const host = process.env.APT_DIAGRAM_HOST;
223
- let cfg = { diagram: { mode: "mcp", mcpConsent: null } };
255
+ let cfg = { diagram: { mcpConsent: null } };
224
256
  try { cfg = JSON.parse(fs.readFileSync(cfgPath, "utf-8")); } catch {}
225
- cfg.diagram = cfg.diagram || { mode: "mcp", mcpConsent: null };
257
+ cfg.diagram = cfg.diagram || { mcpConsent: null };
226
258
  cfg.diagram.mcpConsent = {
227
259
  host,
228
260
  decision,
@@ -232,11 +264,15 @@ node -e '
232
264
  '
233
265
  ```
234
266
 
267
+ Note: the write target above is `config.local.json` (gitignored, per-user).
268
+ The shared `config.json` is not touched — `diagram.mode` lives there and
269
+ stays team-shared policy.
270
+
235
271
  If the decision is `"denied"`, exit with EXACTLY this text (verbatim,
236
272
  no rewording, no extra punctuation):
237
273
 
238
274
  ```
239
- diagram MCP consent denied; re-run with `--mode=file` or change diagram.mcpConsent in .aperant/config.json
275
+ diagram MCP consent denied; re-run with `--mode=file` or change diagram.mcpConsent in .aperant/config.local.json
240
276
  ```
241
277
 
242
278
  If the decision is `"granted"`, proceed to 5b.