@aperant/framework 0.7.0 → 0.7.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 +180 -0
- package/agents/apt-planner.md +12 -0
- package/agents/apt-pr-review-fixer.md +13 -9
- package/bin/apt-tools.mjs +7 -0
- package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -1
- package/dist/cli/ci-watch/stop-matrix.mjs +16 -0
- package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -1
- package/dist/cli/commands/ci-watch.d.mts +11 -0
- package/dist/cli/commands/ci-watch.d.mts.map +1 -1
- package/dist/cli/commands/ci-watch.mjs +108 -2
- package/dist/cli/commands/ci-watch.mjs.map +1 -1
- package/dist/cli/commands/features-audit.d.mts +24 -0
- package/dist/cli/commands/features-audit.d.mts.map +1 -1
- package/dist/cli/commands/features-audit.mjs +159 -5
- package/dist/cli/commands/features-audit.mjs.map +1 -1
- package/dist/cli/commands/health-check.d.mts +16 -0
- package/dist/cli/commands/health-check.d.mts.map +1 -1
- package/dist/cli/commands/health-check.mjs +118 -2
- package/dist/cli/commands/health-check.mjs.map +1 -1
- package/dist/cli/commands/init.d.mts +9 -0
- package/dist/cli/commands/init.d.mts.map +1 -1
- package/dist/cli/commands/init.mjs +49 -4
- package/dist/cli/commands/init.mjs.map +1 -1
- package/dist/cli/commands/modes.d.mts.map +1 -1
- package/dist/cli/commands/modes.mjs +11 -0
- package/dist/cli/commands/modes.mjs.map +1 -1
- package/dist/cli/commands/pr-review-audit-fixer.d.mts +13 -0
- package/dist/cli/commands/pr-review-audit-fixer.d.mts.map +1 -1
- package/dist/cli/commands/pr-review-audit-fixer.mjs +18 -5
- package/dist/cli/commands/pr-review-audit-fixer.mjs.map +1 -1
- package/dist/cli/commands/task.d.mts.map +1 -1
- package/dist/cli/commands/task.mjs +84 -5
- package/dist/cli/commands/task.mjs.map +1 -1
- package/dist/cli/commands/validate-evidence.d.mts +24 -2
- package/dist/cli/commands/validate-evidence.d.mts.map +1 -1
- package/dist/cli/commands/validate-evidence.mjs +154 -17
- package/dist/cli/commands/validate-evidence.mjs.map +1 -1
- package/dist/cli/commands/vitest-doctor.d.mts +2 -0
- package/dist/cli/commands/vitest-doctor.d.mts.map +1 -0
- package/dist/cli/commands/vitest-doctor.mjs +168 -0
- package/dist/cli/commands/vitest-doctor.mjs.map +1 -0
- package/dist/cli/config/gitignore-drift.d.mts +23 -1
- package/dist/cli/config/gitignore-drift.d.mts.map +1 -1
- package/dist/cli/config/gitignore-drift.mjs +81 -3
- package/dist/cli/config/gitignore-drift.mjs.map +1 -1
- package/dist/cli/config/load.d.mts +56 -2
- package/dist/cli/config/load.d.mts.map +1 -1
- package/dist/cli/config/load.mjs +192 -2
- package/dist/cli/config/load.mjs.map +1 -1
- package/dist/cli/consistency/parse-review.mjs +7 -0
- package/dist/cli/consistency/parse-review.mjs.map +1 -1
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +24 -2
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.d.mts +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.d.mts.map +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.mjs +5 -2
- package/dist/cli/gate/gates/gitignore-in-sync.mjs.map +1 -1
- package/dist/cli/gate/gates/review-clean.d.mts +5 -1
- package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
- package/dist/cli/gate/gates/review-clean.mjs +23 -18
- package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
- package/dist/cli/gate/gates/verify-approved.d.mts +49 -1
- package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
- package/dist/cli/gate/gates/verify-approved.mjs +93 -14
- package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
- package/dist/cli/help.d.mts.map +1 -1
- package/dist/cli/help.mjs +7 -2
- package/dist/cli/help.mjs.map +1 -1
- package/dist/cli/install/runtime-detect.d.mts +13 -0
- package/dist/cli/install/runtime-detect.d.mts.map +1 -1
- package/dist/cli/install/runtime-detect.mjs +9 -0
- package/dist/cli/install/runtime-detect.mjs.map +1 -1
- package/dist/cli/task/index-md.d.mts.map +1 -1
- package/dist/cli/task/index-md.mjs +14 -2
- package/dist/cli/task/index-md.mjs.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +11 -2
- package/dist/plugin/agents/apt-improver.md +99 -0
- package/dist/plugin/agents/apt-planner.md +127 -10
- package/dist/plugin/agents/apt-pr-review-fixer.md +13 -9
- package/dist/plugin/skills/apt/SKILL.md +1 -0
- package/dist/plugin/skills/apt-close-task/SKILL.md +63 -1
- package/dist/plugin/skills/apt-debug/SKILL.md +39 -6
- package/dist/plugin/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
- package/dist/plugin/skills/apt-diagram/SKILL.md +378 -0
- package/dist/plugin/skills/apt-diagram/appendices/design-discipline.md +97 -0
- package/dist/plugin/skills/apt-discuss/SKILL.md +72 -5
- package/dist/plugin/skills/apt-discuss/appendices/grill-discipline.md +104 -0
- package/dist/plugin/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
- package/dist/plugin/skills/apt-execute/SKILL.md +57 -5
- package/dist/plugin/skills/apt-execute/appendices/tdd-mode.md +107 -0
- package/dist/plugin/skills/apt-improve/DEEPENING.md +84 -0
- package/dist/plugin/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
- package/dist/plugin/skills/apt-improve/LANGUAGE.md +104 -0
- package/dist/plugin/skills/apt-improve/SKILL.md +141 -0
- package/dist/plugin/skills/apt-plan/SKILL.md +171 -4
- package/dist/plugin/skills/apt-plan/adapters/conductor.md +98 -0
- package/dist/plugin/skills/apt-pr-review/SKILL.md +57 -18
- package/dist/plugin/skills/apt-prototype/LOGIC.md +109 -0
- package/dist/plugin/skills/apt-prototype/SKILL.md +143 -0
- package/dist/plugin/skills/apt-prototype/UI.md +90 -0
- package/dist/plugin/skills/apt-quick/SKILL.md +49 -8
- package/dist/plugin/skills/apt-release-notes/SKILL.md +193 -0
- package/dist/plugin/skills/apt-release-notes/appendices/persona-voice.md +59 -0
- package/dist/plugin/skills/apt-review/SKILL.md +2 -0
- package/dist/plugin/skills/apt-run/SKILL.md +32 -4
- package/dist/plugin/skills/apt-setup/SKILL.md +308 -6
- package/dist/plugin/skills/apt-ship/SKILL.md +122 -1
- package/dist/plugin/skills/apt-spar/SKILL.md +315 -0
- package/dist/plugin/skills/apt-triage/AGENT-BRIEF.md +84 -0
- package/dist/plugin/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
- package/dist/plugin/skills/apt-triage/SKILL.md +169 -0
- package/dist/plugin/skills/apt-update/SKILL.md +77 -10
- package/dist/plugin/skills/apt-verify/SKILL.md +3 -0
- package/dist/plugin/skills/apt-verify-proof/SKILL.md +10 -5
- package/dist/plugin/skills/apt-watch-ci/SKILL.md +166 -0
- package/dist/plugin/skills/apt-zoom-out/SKILL.md +130 -0
- package/package.json +133 -133
- package/prompts/conductor-framework-context.md +63 -0
- package/prompts/conductor-system.md +11 -0
- package/skills/apt-close-task/SKILL.md +1 -0
- package/skills/apt-discuss/SKILL.md +47 -5
- package/skills/apt-execute/SKILL.md +9 -0
- package/skills/apt-plan/SKILL.md +12 -0
- package/skills/apt-pr-review/SKILL.md +11 -2
- package/skills/apt-quick/SKILL.md +19 -8
- package/skills/apt-researcher.md +1 -0
- package/skills/apt-setup/SKILL.md +33 -2
- package/skills/apt-verify-proof/SKILL.md +7 -5
- package/src/cli/ci-watch/stop-matrix.mjs +17 -0
- package/src/cli/commands/ci-watch.mjs +113 -2
- package/src/cli/commands/features-audit.mjs +164 -5
- package/src/cli/commands/health-check.mjs +115 -2
- package/src/cli/commands/init.mjs +52 -4
- package/src/cli/commands/modes.mjs +11 -0
- package/src/cli/commands/pr-review-audit-fixer.mjs +18 -5
- package/src/cli/commands/task.mjs +83 -5
- package/src/cli/commands/validate-evidence.mjs +158 -17
- package/src/cli/commands/vitest-doctor.mjs +173 -0
- package/src/cli/config/gitignore-drift.mjs +74 -3
- package/src/cli/config/load.mjs +188 -2
- package/src/cli/consistency/parse-review.mjs +6 -0
- package/src/cli/dispatch.mjs +23 -2
- package/src/cli/gate/gates/gitignore-in-sync.mjs +5 -2
- package/src/cli/gate/gates/review-clean.mjs +24 -19
- package/src/cli/gate/gates/verify-approved.mjs +97 -14
- package/src/cli/help.mjs +7 -2
- package/src/cli/install/runtime-detect.mjs +9 -0
- package/src/cli/task/index-md.mjs +15 -2
- package/templates/config.json +2 -7
- package/workflows/verify-proof.md +8 -3
|
@@ -3,20 +3,53 @@
|
|
|
3
3
|
* G4 verify-approved — blocking gate for `apt:ship`.
|
|
4
4
|
*
|
|
5
5
|
* Requires {task_dir}/qa_signoff.json to exist, parse, and carry
|
|
6
|
-
* verdict === "approved"
|
|
7
|
-
*
|
|
6
|
+
* verdict === "approved" (BUG-013: normalized via parseQaSignoff — case
|
|
7
|
+
* and underscore/hyphen variants collapse to canonical). BUG-012: also
|
|
8
|
+
* accepts `approved-with-notes` when config.qa.approved_with_notes_threshold
|
|
9
|
+
* is set AND every dimension score meets the threshold (best-effort when
|
|
10
|
+
* dimensions are missing or in an unknown shape).
|
|
8
11
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* but only the string "approved" passes — "approved-with-notes" fails
|
|
12
|
-
* because ship-time deserves the strongest signal.
|
|
12
|
+
* Accepts both `verdict` (newer) and `status` (older) field names — that
|
|
13
|
+
* normalization is delegated to parseQaSignoff.
|
|
13
14
|
*/
|
|
14
15
|
import { existsSync, readFileSync } from 'node:fs';
|
|
15
16
|
import { join } from 'node:path';
|
|
17
|
+
import { parseQaSignoff } from '../../consistency/parse-qa.mjs';
|
|
16
18
|
import { registerGate } from '../registry.mjs';
|
|
19
|
+
/**
|
|
20
|
+
* Extract dimension scores from the qa_signoff.json shape. We've seen two
|
|
21
|
+
* shapes in the wild:
|
|
22
|
+
* - Array: `dimensions: [{name: 'security', score: 0.9}, ...]`
|
|
23
|
+
* - Object: `dimensions: {security: 0.9, performance: 0.85}` OR
|
|
24
|
+
* `dimensions: {security: {score: 0.9}, ...}`
|
|
25
|
+
* Returns an array of numeric scores, or null when no recognizable shape
|
|
26
|
+
* is present (best-effort accept per brief).
|
|
27
|
+
*/
|
|
28
|
+
function extractDimensionScores(doc) {
|
|
29
|
+
const dims = doc.dimensions ?? doc.qa?.dimensions ?? null;
|
|
30
|
+
if (!dims)
|
|
31
|
+
return null;
|
|
32
|
+
if (Array.isArray(dims)) {
|
|
33
|
+
const scores = dims
|
|
34
|
+
.map((d) => (typeof d?.score === 'number' ? d.score : null))
|
|
35
|
+
.filter((s) => s !== null);
|
|
36
|
+
return scores.length > 0 ? scores : null;
|
|
37
|
+
}
|
|
38
|
+
if (typeof dims === 'object') {
|
|
39
|
+
const scores = [];
|
|
40
|
+
for (const v of Object.values(dims)) {
|
|
41
|
+
if (typeof v === 'number')
|
|
42
|
+
scores.push(v);
|
|
43
|
+
else if (typeof v?.score === 'number')
|
|
44
|
+
scores.push(v.score);
|
|
45
|
+
}
|
|
46
|
+
return scores.length > 0 ? scores : null;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
17
50
|
const gate = {
|
|
18
51
|
id: 'verify-approved',
|
|
19
|
-
description: 'qa_signoff.json exists with verdict === "approved"',
|
|
52
|
+
description: 'qa_signoff.json exists with verdict === "approved" (or "approved-with-notes" when configured)',
|
|
20
53
|
severity: 'blocking',
|
|
21
54
|
skills: ['ship'],
|
|
22
55
|
async check(ctx) {
|
|
@@ -40,18 +73,64 @@ const gate = {
|
|
|
40
73
|
inputs,
|
|
41
74
|
};
|
|
42
75
|
}
|
|
43
|
-
|
|
44
|
-
|
|
76
|
+
// BUG-013: route through parseQaSignoff so the verdict is
|
|
77
|
+
// case-insensitive AND tolerates `_↔-` (so 'APPROVED', 'Approved',
|
|
78
|
+
// ' approved ', 'APPROVED_WITH_NOTES' all behave canonically). The
|
|
79
|
+
// pre-fix gate compared the raw string against `'approved'` which
|
|
80
|
+
// false-rejected every legitimate variant.
|
|
81
|
+
const { verdict } = parseQaSignoff(doc);
|
|
82
|
+
if (verdict === 'approved') {
|
|
45
83
|
return {
|
|
46
|
-
status: '
|
|
47
|
-
reason:
|
|
48
|
-
|
|
84
|
+
status: 'pass',
|
|
85
|
+
reason: 'qa_signoff.json verdict normalized to "approved"',
|
|
86
|
+
inputs,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// BUG-012: accept `approved-with-notes` when the project has opted
|
|
90
|
+
// in via config.qa.approved_with_notes_threshold. The threshold is
|
|
91
|
+
// the minimum per-dimension score required. Best-effort: when
|
|
92
|
+
// dimensions are missing / in an unknown shape we still accept and
|
|
93
|
+
// log, rather than hard-failing, so projects that haven't started
|
|
94
|
+
// scoring dimensions yet aren't blocked.
|
|
95
|
+
if (verdict === 'approved-with-notes') {
|
|
96
|
+
const threshold = ctx.config?.qa?.approved_with_notes_threshold;
|
|
97
|
+
if (typeof threshold !== 'number') {
|
|
98
|
+
return {
|
|
99
|
+
status: 'fail',
|
|
100
|
+
reason: 'qa_signoff.json verdict is "approved-with-notes" but config.qa.approved_with_notes_threshold is not set',
|
|
101
|
+
evidence: { verdict, threshold: threshold ?? null },
|
|
102
|
+
inputs,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const scores = extractDimensionScores(doc);
|
|
106
|
+
if (scores === null) {
|
|
107
|
+
return {
|
|
108
|
+
status: 'pass',
|
|
109
|
+
reason: `qa_signoff.json verdict is "approved-with-notes" and threshold ${threshold} is enabled; dimensions missing or unknown-shape — accepting best-effort`,
|
|
110
|
+
evidence: { verdict, threshold, dimensions_present: false },
|
|
111
|
+
inputs,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const failing = scores.filter((s) => s < threshold);
|
|
115
|
+
if (failing.length > 0) {
|
|
116
|
+
return {
|
|
117
|
+
status: 'fail',
|
|
118
|
+
reason: `qa_signoff.json verdict is "approved-with-notes" but ${failing.length}/${scores.length} dimension score(s) below threshold ${threshold}`,
|
|
119
|
+
evidence: { verdict, threshold, scores, failing },
|
|
120
|
+
inputs,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
status: 'pass',
|
|
125
|
+
reason: `qa_signoff.json verdict is "approved-with-notes" and all ${scores.length} dimension score(s) meet threshold ${threshold}`,
|
|
126
|
+
evidence: { verdict, threshold, scores },
|
|
49
127
|
inputs,
|
|
50
128
|
};
|
|
51
129
|
}
|
|
52
130
|
return {
|
|
53
|
-
status: '
|
|
54
|
-
reason:
|
|
131
|
+
status: 'fail',
|
|
132
|
+
reason: `qa_signoff.json verdict is "${verdict}" (expected "approved" or "approved-with-notes" with threshold)`,
|
|
133
|
+
evidence: { verdict },
|
|
55
134
|
inputs,
|
|
56
135
|
};
|
|
57
136
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-approved.mjs","sourceRoot":"","sources":["../../../../src/cli/gate/gates/verify-approved.mjs"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify-approved.mjs","sourceRoot":"","sources":["../../../../src/cli/gate/gates/verify-approved.mjs"],"names":[],"mappings":"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"}
|
package/dist/cli/help.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.mts","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAMA,
|
|
1
|
+
{"version":3,"file":"help.d.mts","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAMA,kCAsIC"}
|
package/dist/cli/help.mjs
CHANGED
|
@@ -32,7 +32,7 @@ Commands:
|
|
|
32
32
|
task close-merged <dir> [--task <id>] [--narrate-only] [--dry-run] Sweep shipped-pending-merge tasks for confirmed merges (--narrate-only returns pending_narration[] entries read-only without closing).
|
|
33
33
|
task narration-drain <dir> --task <task-id> Remove a row from state.pending_narration[] under withFileLock (called by /apt:close-task --narrate-only after a successful narrator spawn)
|
|
34
34
|
task complete-subtask <dir> --task-id <id> --subtask-id <sid|a+b+c> [--commit <sha>] [--notes <text>] Atomic plan ↔ build-progress sync
|
|
35
|
-
features-audit <dir> [--diff-files <csv>|--since <ref>] [--apply-stubs] [--format json|md] Audit features registry for unregistered feature-qualifying files
|
|
35
|
+
features-audit <dir> [--task-id <id>] [--no-worktree-redirect] [--diff-files <csv>|--since <ref>] [--apply-stubs] [--format json|md] Audit features registry for unregistered feature-qualifying files (BUG-025b: --task-id redirects writes to active task's worktree)
|
|
36
36
|
docs-audit <dir> [--diff-files <csv>|--since <ref>|--dry-run] [--policy <path>] [--format json|md] Audit documented surfaces for docs-drift
|
|
37
37
|
|
|
38
38
|
lock claim <dir> --subtask <id> Claim exclusive lock on a subtask
|
|
@@ -108,7 +108,9 @@ Commands:
|
|
|
108
108
|
|
|
109
109
|
migrate-pr-reviews <project-dir> Migrate legacy .aperant/reviews/ → .aperant/pr-reviews/pr-{N}/rounds/{R}/ (idempotent)
|
|
110
110
|
|
|
111
|
-
validate-evidence <findings-dir> --worktree <path> Enforce the Evidence Rule (literal substring + multi-file check); mutates findings markdown in place
|
|
111
|
+
validate-evidence <findings-dir> --worktree <path> [--allow-approx-evidence] [--approx-floor <n>] [--llm-validator-confirmed] Enforce the Evidence Rule (literal substring + multi-file check); mutates findings markdown in place. BUG-014: --allow-approx-evidence opts into Jaccard + line-anchor fallback (downgrade to dismissed_evidence_approx_confirmed unless --llm-validator-confirmed promotes to confirmed_valid_approx).
|
|
112
|
+
|
|
113
|
+
vitest doctor <project-dir> [--format json|md] BUG-026: walk vitest.config.{ts,js,mjs} files, report NODE_ENV/jsxAutomaticShim matrix, warn when JSX-rendering tests lack jsxAutomaticShim coverage (exits 1 on warnings)
|
|
112
114
|
|
|
113
115
|
wfrun validate <workflow.yaml> C17: parse + schema-check a declarative YAML workflow (exits 0 on success)
|
|
114
116
|
wfrun plan <workflow.yaml> [--input k=v …] C17: resolve DAG waves + inputs, emit run-plan JSON (no side effects)
|
|
@@ -124,6 +126,9 @@ Commands:
|
|
|
124
126
|
pr-review record-comment <dir> --pr <N> --round <R> --url <url> --body-hash <sha256> [--review-id <id>] [--posted-at <iso>] Append entry to comment_timeline (Phase 6b)
|
|
125
127
|
pr-review audit-fixer <dir> --review-dir <path> --iteration <N> --fixer <name> --worktree <path> --status-line <str> Audit fixer output against git state; exits 0 with JSON envelope (verdict: verified|hallucinated|skipped)
|
|
126
128
|
|
|
129
|
+
ci-watch start|stop|status|tick <dir> [--pr <N>] [...] /apt:watch-ci primitives — see SKILL.md for full flag matrix
|
|
130
|
+
ci-watch sweep <dir> --orphaned [--dry-run] BUG-027: enumerate ci-watches state files, query gh per PR, remove terminal-state (MERGED|CLOSED) entries (manual GC; rate-limited)
|
|
131
|
+
|
|
127
132
|
Flags:
|
|
128
133
|
--version Print version and exit
|
|
129
134
|
--help Print usage and exit
|
package/dist/cli/help.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.mjs","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,UAAU,SAAS;IACxB,MAAM,IAAI,GAAG,GAAG,UAAU,EAAE
|
|
1
|
+
{"version":3,"file":"help.mjs","sourceRoot":"","sources":["../../src/cli/help.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,UAAU,SAAS;IACxB,MAAM,IAAI,GAAG,GAAG,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAkIT,CAAA;IAEnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -39,6 +39,11 @@ export function detectInstalledRuntimes(targetDir: string): RuntimeDescriptor[];
|
|
|
39
39
|
* target mapped to a host CLI (e.g. `pi`,
|
|
40
40
|
* which has a detectable host but no apt
|
|
41
41
|
* install root of its own).
|
|
42
|
+
* @property {string} [displayLabel] Optional user-facing label (e.g. "Kilo Code").
|
|
43
|
+
* When unset, callers fall back to the
|
|
44
|
+
* capitalized form of `id`. Use for runtimes
|
|
45
|
+
* whose product branding differs from the
|
|
46
|
+
* internal id (C58: `kilo` → "Kilo Code").
|
|
42
47
|
*/
|
|
43
48
|
/** @type {RuntimeDescriptor[]} */
|
|
44
49
|
export const RUNTIMES: RuntimeDescriptor[];
|
|
@@ -73,5 +78,13 @@ export type RuntimeDescriptor = {
|
|
|
73
78
|
* install root of its own).
|
|
74
79
|
*/
|
|
75
80
|
cliId: string | null;
|
|
81
|
+
/**
|
|
82
|
+
* Optional user-facing label (e.g. "Kilo Code").
|
|
83
|
+
* When unset, callers fall back to the
|
|
84
|
+
* capitalized form of `id`. Use for runtimes
|
|
85
|
+
* whose product branding differs from the
|
|
86
|
+
* internal id (C58: `kilo` → "Kilo Code").
|
|
87
|
+
*/
|
|
88
|
+
displayLabel?: string | undefined;
|
|
76
89
|
};
|
|
77
90
|
//# sourceMappingURL=runtime-detect.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-detect.d.mts","sourceRoot":"","sources":["../../../src/cli/install/runtime-detect.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime-detect.d.mts","sourceRoot":"","sources":["../../../src/cli/install/runtime-detect.mjs"],"names":[],"mappings":"AAuJA;;;;;GAKG;AACH,+BAHW,MAAM,GACJ,iBAAiB,GAAC,IAAI,CAIlC;AAED;;;;;;;;;GASG;AACH,2CAHW,MAAM,GACJ,MAAM,EAAE,CAcpB;AAED;;;;;;GAMG;AACH,mDAHW,MAAM,GACJ,iBAAiB,EAAE,CAc/B;AAxLD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,kCAAkC;AAClC,uBADW,iBAAiB,EAAE,CAwG5B;AAEF,0BAA0B;AAC1B,0BADW,GAAG,CAAC,MAAM,CAAC,CACuC;;;;;QA/H/C,MAAM;;;;UACN,MAAM;;;;;iBACN,MAAM;;;;;;aAEN,MAAM,EAAE;;;;;;;;;WAGR,MAAM,GAAC,IAAI"}
|
|
@@ -31,6 +31,11 @@ import { MANIFEST_FILENAME } from './manifest.mjs';
|
|
|
31
31
|
* target mapped to a host CLI (e.g. `pi`,
|
|
32
32
|
* which has a detectable host but no apt
|
|
33
33
|
* install root of its own).
|
|
34
|
+
* @property {string} [displayLabel] Optional user-facing label (e.g. "Kilo Code").
|
|
35
|
+
* When unset, callers fall back to the
|
|
36
|
+
* capitalized form of `id`. Use for runtimes
|
|
37
|
+
* whose product branding differs from the
|
|
38
|
+
* internal id (C58: `kilo` → "Kilo Code").
|
|
34
39
|
*/
|
|
35
40
|
/** @type {RuntimeDescriptor[]} */
|
|
36
41
|
export const RUNTIMES = Object.freeze([
|
|
@@ -75,6 +80,10 @@ export const RUNTIMES = Object.freeze([
|
|
|
75
80
|
installRoot: '.kilo',
|
|
76
81
|
markers: ['.kilo/config.json'],
|
|
77
82
|
cliId: 'kilo',
|
|
83
|
+
// C58 (0.7.2): user-visible label. Internal id stays `kilo` (zero
|
|
84
|
+
// migration per spec ID-01). `--kilocode` is also accepted as a
|
|
85
|
+
// deprecated alias of `--kilo` at the CLI flag parser layer.
|
|
86
|
+
displayLabel: 'Kilo Code',
|
|
78
87
|
},
|
|
79
88
|
{
|
|
80
89
|
id: 'copilot',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-detect.mjs","sourceRoot":"","sources":["../../../src/cli/install/runtime-detect.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD
|
|
1
|
+
{"version":3,"file":"runtime-detect.mjs","sourceRoot":"","sources":["../../../src/cli/install/runtime-detect.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-md.d.mts","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index-md.d.mts","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"AAUA;;;GAGG;AACH,0DAwFC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
+
import { loadMergedProjectConfig } from '../config/load.mjs';
|
|
6
7
|
import { withFileLock } from '../util/fs-lock.mjs';
|
|
7
8
|
import { formatDateDisplay, formatTimeDisplay } from './format.mjs';
|
|
8
9
|
/**
|
|
@@ -13,8 +14,19 @@ export function regenerateTaskIndex(targetDir) {
|
|
|
13
14
|
const statePath = join(targetDir, '.aperant', 'state.json');
|
|
14
15
|
if (!existsSync(statePath))
|
|
15
16
|
return;
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
// AUDIT-001: read through the merged loader so per-device
|
|
18
|
+
// preferences.date_format / preferences.time_format overrides land
|
|
19
|
+
// even when the shared config.json no longer carries those fields.
|
|
20
|
+
// Guard: malformed config.local.json must not crash every task state
|
|
21
|
+
// transition — fall back to shared-config-only read and warn on stderr.
|
|
22
|
+
let config;
|
|
23
|
+
try {
|
|
24
|
+
config = loadMergedProjectConfig(targetDir) ?? {};
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
process.stderr.write(`[index-md] config.local.json parse error — using shared config only: ${e.message}\n`);
|
|
28
|
+
config = {};
|
|
29
|
+
}
|
|
18
30
|
if (config.preferences?.task_index === false)
|
|
19
31
|
return;
|
|
20
32
|
const state = JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-md.mjs","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEnE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAS;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAC3D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAM;IAElC,
|
|
1
|
+
{"version":3,"file":"index-md.mjs","sourceRoot":"","sources":["../../../src/cli/task/index-md.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aperant",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.3",
|
|
4
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
5
|
"author": {
|
|
6
6
|
"name": "Mikalsen AI",
|
|
@@ -30,15 +30,19 @@
|
|
|
30
30
|
"skills/apt-create-docs",
|
|
31
31
|
"skills/apt-debug",
|
|
32
32
|
"skills/apt-design",
|
|
33
|
+
"skills/apt-diagram",
|
|
33
34
|
"skills/apt-discuss",
|
|
34
35
|
"skills/apt-docs",
|
|
35
36
|
"skills/apt-execute",
|
|
37
|
+
"skills/apt-improve",
|
|
36
38
|
"skills/apt-mockup",
|
|
37
39
|
"skills/apt-pause",
|
|
38
40
|
"skills/apt-personas",
|
|
39
41
|
"skills/apt-plan",
|
|
40
42
|
"skills/apt-pr-review",
|
|
43
|
+
"skills/apt-prototype",
|
|
41
44
|
"skills/apt-quick",
|
|
45
|
+
"skills/apt-release-notes",
|
|
42
46
|
"skills/apt-resume",
|
|
43
47
|
"skills/apt-review",
|
|
44
48
|
"skills/apt-roadmap",
|
|
@@ -47,15 +51,20 @@
|
|
|
47
51
|
"skills/apt-scan",
|
|
48
52
|
"skills/apt-setup",
|
|
49
53
|
"skills/apt-ship",
|
|
54
|
+
"skills/apt-spar",
|
|
50
55
|
"skills/apt-stress-test",
|
|
51
56
|
"skills/apt-terminal",
|
|
57
|
+
"skills/apt-triage",
|
|
52
58
|
"skills/apt-update",
|
|
53
59
|
"skills/apt-verify",
|
|
54
|
-
"skills/apt-verify-proof"
|
|
60
|
+
"skills/apt-verify-proof",
|
|
61
|
+
"skills/apt-watch-ci",
|
|
62
|
+
"skills/apt-zoom-out"
|
|
55
63
|
],
|
|
56
64
|
"agents": [
|
|
57
65
|
"agents/apt-docs-author.md",
|
|
58
66
|
"agents/apt-executor.md",
|
|
67
|
+
"agents/apt-improver.md",
|
|
59
68
|
"agents/apt-planner.md",
|
|
60
69
|
"agents/apt-pr-review-codebase-fit.md",
|
|
61
70
|
"agents/apt-pr-review-fixer.md",
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apt-improver
|
|
3
|
+
description: Proactive refactor discovery agent — runs apt:improve Phase 1 (explore a named area through DEEPENING / INTERFACE-DESIGN / LANGUAGE lenses) and outputs a candidate refactor inventory. Read-only, no code changes.
|
|
4
|
+
apt-skill-version: {{APT_VERSION}}
|
|
5
|
+
tools: Read, Bash, Grep, Glob
|
|
6
|
+
color: orange
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<role>
|
|
10
|
+
You are an Aperant Framework proactive-refactor agent. You scan a named
|
|
11
|
+
area of the codebase through three lenses (DEEPENING, INTERFACE-DESIGN,
|
|
12
|
+
LANGUAGE) and produce a candidate refactor inventory.
|
|
13
|
+
|
|
14
|
+
Spawned by `/apt:improve` for Phase 1 (Explore). Phases 2 (Present
|
|
15
|
+
candidates) and 3 (Deepen via grill loop) run in the parent agent
|
|
16
|
+
context because they require user interaction.
|
|
17
|
+
|
|
18
|
+
Your job: read the area, apply the three lenses, output a candidate
|
|
19
|
+
inventory. You are READ-ONLY — no code changes, no decisions locked.
|
|
20
|
+
|
|
21
|
+
**CRITICAL: Mandatory Initial Read**
|
|
22
|
+
If the prompt contains a `<files_to_read>` block, you MUST use the `Read`
|
|
23
|
+
tool to load every file listed there before performing any other actions.
|
|
24
|
+
</role>
|
|
25
|
+
|
|
26
|
+
<project_context>
|
|
27
|
+
**Project instructions:** Read `./CLAUDE.md` if it exists for project structure and conventions.
|
|
28
|
+
**Constitution:** Read `AGENTS.md` if it exists for architecture overview.
|
|
29
|
+
**Glossary:** Read `CONTEXT.md` if it exists — its term-blocks (especially `Aliases to avoid` fields) are direct inputs to the LANGUAGE lens.
|
|
30
|
+
|
|
31
|
+
**Rationalizations (R4):** Read `.aperant/rationalizations/claude-opus-4-6.md` once at session start. Pay particular attention to R-2 (skipping pre-read investigation) and R-5 ("I already verified this implicitly"). As an improver, you only have value if your candidate inventory is grounded in actually-read code — drift here ships hallucinated refactor candidates.
|
|
32
|
+
</project_context>
|
|
33
|
+
|
|
34
|
+
<environment>
|
|
35
|
+
- **Working directory:** The project root
|
|
36
|
+
- **Note:** You have NO write/edit tools. You investigate and report findings only. Phase 2 (filter + present) and Phase 3 (deepen + lock) run in the parent agent's context.
|
|
37
|
+
</environment>
|
|
38
|
+
|
|
39
|
+
<process>
|
|
40
|
+
|
|
41
|
+
## 1. Parse the area name
|
|
42
|
+
|
|
43
|
+
Extract the area from the spawn prompt. Areas are noun phrases ("sparring engine", "feature registry", "auth flow") — not file paths.
|
|
44
|
+
|
|
45
|
+
If the area is ambiguous, ask the parent ONE clarifying question via your report — do NOT enter a multi-turn interview.
|
|
46
|
+
|
|
47
|
+
## 2. Load CONTEXT.md (if present)
|
|
48
|
+
|
|
49
|
+
If `CONTEXT.md` exists at the project root, read it and extract:
|
|
50
|
+
|
|
51
|
+
- Term-blocks whose canonical term, definition, or aliases-to-avoid match keywords in the area
|
|
52
|
+
- The full alias list (LANGUAGE lens grep source)
|
|
53
|
+
|
|
54
|
+
If CONTEXT.md does not exist, skip silently — the LANGUAGE lens runs without the alias grep but still catches in-file conflations.
|
|
55
|
+
|
|
56
|
+
## 3. Apply the three lenses
|
|
57
|
+
|
|
58
|
+
Read the lens descriptions (the parent has them in context; if you don't, read them from disk).
|
|
59
|
+
Paths below are relative to the project root (monorepo: `<repo>/packages/framework/` is the
|
|
60
|
+
framework root; standalone install: the project root IS the framework root, so use
|
|
61
|
+
`skills/apt-improve/` directly):
|
|
62
|
+
|
|
63
|
+
- `packages/framework/skills/apt-improve/DEEPENING.md` (monorepo) or `skills/apt-improve/DEEPENING.md` (standalone)
|
|
64
|
+
- `packages/framework/skills/apt-improve/INTERFACE-DESIGN.md` (monorepo) or `skills/apt-improve/INTERFACE-DESIGN.md` (standalone)
|
|
65
|
+
- `packages/framework/skills/apt-improve/LANGUAGE.md` (monorepo) or `skills/apt-improve/LANGUAGE.md` (standalone)
|
|
66
|
+
|
|
67
|
+
For each lens, walk the area's files and flag candidates per the lens's red-flag list.
|
|
68
|
+
|
|
69
|
+
## 4. Output the candidate inventory
|
|
70
|
+
|
|
71
|
+
Produce a structured report:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# apt:improve Phase-1 inventory — {area}
|
|
75
|
+
|
|
76
|
+
## DEEPENING candidates
|
|
77
|
+
- `{File}:{Symbol}` — shallow ({reason}); deletion-test target.
|
|
78
|
+
- ...
|
|
79
|
+
|
|
80
|
+
## INTERFACE-DESIGN candidates
|
|
81
|
+
- `{Module A}` ↔ `{Module B}` — {red-flag name} ({one-line evidence}).
|
|
82
|
+
- ...
|
|
83
|
+
|
|
84
|
+
## LANGUAGE candidates
|
|
85
|
+
- `{File}:{Line}` — uses `{wrong-term}` for `{canonical}` ({CONTEXT.md reference if applicable}).
|
|
86
|
+
- ...
|
|
87
|
+
|
|
88
|
+
## Files read
|
|
89
|
+
- {file1}
|
|
90
|
+
- ...
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Keep the inventory grounded — every candidate must cite a file + symbol the user can grep for. No speculation; no candidates inferred from filenames alone.
|
|
94
|
+
|
|
95
|
+
## 5. Hand back to parent for Phase 2/3
|
|
96
|
+
|
|
97
|
+
Your output is the input to Phase 2 (the parent agent's filter step). Do NOT enter Phase 2 yourself — your role ends here.
|
|
98
|
+
|
|
99
|
+
</process>
|