@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.
- package/CHANGELOG.md +155 -0
- package/dist/cli/commands/check-version.d.mts.map +1 -1
- package/dist/cli/commands/check-version.mjs +76 -1
- package/dist/cli/commands/check-version.mjs.map +1 -1
- package/dist/cli/commands/ci-watch.d.mts.map +1 -1
- package/dist/cli/commands/ci-watch.mjs +34 -4
- package/dist/cli/commands/ci-watch.mjs.map +1 -1
- package/dist/cli/commands/init.d.mts +8 -1
- package/dist/cli/commands/init.d.mts.map +1 -1
- package/dist/cli/commands/init.mjs +91 -9
- package/dist/cli/commands/init.mjs.map +1 -1
- package/dist/cli/commands/release-notes.d.mts +11 -0
- package/dist/cli/commands/release-notes.d.mts.map +1 -0
- package/dist/cli/commands/release-notes.mjs +173 -0
- package/dist/cli/commands/release-notes.mjs.map +1 -0
- package/dist/cli/config/load.d.mts +14 -0
- package/dist/cli/config/load.d.mts.map +1 -1
- package/dist/cli/config/load.mjs +40 -0
- package/dist/cli/config/load.mjs.map +1 -1
- package/dist/cli/config/upgrade-gitignore.d.mts.map +1 -1
- package/dist/cli/config/upgrade-gitignore.mjs +6 -0
- package/dist/cli/config/upgrade-gitignore.mjs.map +1 -1
- package/dist/cli/consistency/parse-review.d.mts.map +1 -1
- package/dist/cli/consistency/parse-review.mjs +4 -1
- package/dist/cli/consistency/parse-review.mjs.map +1 -1
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +2 -0
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
- package/dist/cli/gate/gates/review-clean.mjs +4 -2
- package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
- package/dist/cli/install/update-chips.d.mts +23 -0
- package/dist/cli/install/update-chips.d.mts.map +1 -1
- package/dist/cli/install/update-chips.mjs +60 -0
- package/dist/cli/install/update-chips.mjs.map +1 -1
- package/dist/cli/release-notes/compile.d.mts +38 -0
- package/dist/cli/release-notes/compile.d.mts.map +1 -0
- package/dist/cli/release-notes/compile.mjs +244 -0
- package/dist/cli/release-notes/compile.mjs.map +1 -0
- package/dist/cli/release-notes/draft.d.mts +73 -0
- package/dist/cli/release-notes/draft.d.mts.map +1 -0
- package/dist/cli/release-notes/draft.mjs +120 -0
- package/dist/cli/release-notes/draft.mjs.map +1 -0
- package/dist/cli/release-notes/output-dir.d.mts +20 -0
- package/dist/cli/release-notes/output-dir.d.mts.map +1 -0
- package/dist/cli/release-notes/output-dir.mjs +42 -0
- package/dist/cli/release-notes/output-dir.mjs.map +1 -0
- package/dist/cli/release-notes/persona-filter.d.mts +51 -0
- package/dist/cli/release-notes/persona-filter.d.mts.map +1 -0
- package/dist/cli/release-notes/persona-filter.mjs +127 -0
- package/dist/cli/release-notes/persona-filter.mjs.map +1 -0
- package/dist/cli/release-notes/publish.d.mts +23 -0
- package/dist/cli/release-notes/publish.d.mts.map +1 -0
- package/dist/cli/release-notes/publish.mjs +125 -0
- package/dist/cli/release-notes/publish.mjs.map +1 -0
- package/dist/cli/release-notes/ship-autodraft.d.mts +37 -0
- package/dist/cli/release-notes/ship-autodraft.d.mts.map +1 -0
- package/dist/cli/release-notes/ship-autodraft.mjs +97 -0
- package/dist/cli/release-notes/ship-autodraft.mjs.map +1 -0
- package/dist/types/config.d.ts +11 -7
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +133 -133
- package/skills/apt-close-task/SKILL.md +25 -0
- package/skills/apt-diagram/SKILL.md +45 -9
- package/skills/apt-release-notes/SKILL.md +193 -0
- package/skills/apt-release-notes/appendices/persona-voice.md +59 -0
- package/skills/apt-setup/SKILL.md +146 -3
- package/skills/apt-ship/SKILL.md +47 -0
- package/skills/apt-update/SKILL.md +51 -9
- package/skills/apt-watch-ci/SKILL.md +2 -2
- package/src/cli/commands/check-version.mjs +73 -1
- package/src/cli/commands/ci-watch.mjs +35 -4
- package/src/cli/commands/init.mjs +101 -9
- package/src/cli/commands/release-notes.mjs +187 -0
- package/src/cli/config/load.mjs +37 -0
- package/src/cli/config/upgrade-gitignore.mjs +6 -0
- package/src/cli/consistency/parse-review.mjs +3 -1
- package/src/cli/dispatch.mjs +2 -0
- package/src/cli/gate/gates/review-clean.mjs +4 -2
- package/src/cli/install/update-chips.mjs +57 -0
- package/src/cli/release-notes/compile.mjs +261 -0
- package/src/cli/release-notes/draft.mjs +133 -0
- package/src/cli/release-notes/output-dir.mjs +52 -0
- package/src/cli/release-notes/persona-filter.mjs +126 -0
- package/src/cli/release-notes/publish.mjs +128 -0
- package/src/cli/release-notes/ship-autodraft.mjs +106 -0
- package/templates/config.json +28 -3
- 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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -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.
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
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;
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
|
210
|
-
`.aperant/config.json`
|
|
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: {
|
|
255
|
+
let cfg = { diagram: { mcpConsent: null } };
|
|
224
256
|
try { cfg = JSON.parse(fs.readFileSync(cfgPath, "utf-8")); } catch {}
|
|
225
|
-
cfg.diagram = cfg.diagram || {
|
|
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.
|