avtc-pi-featyard 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +194 -0
- package/agents/fy-design-reviewer.md +77 -0
- package/agents/fy-feature-verifier.md +24 -0
- package/agents/fy-general-reviewer.md +81 -0
- package/agents/fy-guidelines-reviewer.md +46 -0
- package/agents/fy-implementer.md +20 -0
- package/agents/fy-performance-reviewer.md +46 -0
- package/agents/fy-plan-reviewer.md +74 -0
- package/agents/fy-plan-verifier.md +44 -0
- package/agents/fy-quality-reviewer.md +50 -0
- package/agents/fy-requirements-reviewer.md +46 -0
- package/agents/fy-researcher.md +6 -0
- package/agents/fy-security-reviewer.md +46 -0
- package/agents/fy-task-verifier.md +42 -0
- package/agents/fy-testing-reviewer.md +60 -0
- package/assets/images/kanban-board.png +0 -0
- package/assets/images/settings-dropdown.png +0 -0
- package/assets/images/settings.png +0 -0
- package/assets/images/widget.png +0 -0
- package/docs/CONFIGURATION.md +266 -0
- package/index.ts +8 -0
- package/package.json +85 -0
- package/skills/fy-design/SKILL.md +108 -0
- package/skills/fy-design-review/SKILL.md +45 -0
- package/skills/fy-finish/SKILL.md +28 -0
- package/skills/fy-implement/SKILL.md +36 -0
- package/skills/fy-plan/SKILL.md +77 -0
- package/skills/fy-plan-review/SKILL.md +45 -0
- package/skills/fy-research/SKILL.md +38 -0
- package/skills/fy-review/SKILL.md +88 -0
- package/skills/fy-verify/SKILL.md +23 -0
- package/src/commands/auto-agent-commands.ts +748 -0
- package/src/commands/kanban-commands.ts +278 -0
- package/src/commands/workflow-commands.ts +531 -0
- package/src/compaction/compact-handler.ts +371 -0
- package/src/compaction/compact-message.ts +52 -0
- package/src/compaction/compact-trigger.ts +121 -0
- package/src/compaction/safe-editor-write.ts +18 -0
- package/src/events/agent/agent-end.ts +19 -0
- package/src/events/agent/agent-settled.ts +20 -0
- package/src/events/agent/agent-start.ts +18 -0
- package/src/events/agent/turn-end.ts +20 -0
- package/src/events/agent/turn-start.ts +19 -0
- package/src/events/event-deps.ts +33 -0
- package/src/events/index.ts +91 -0
- package/src/events/input/input.ts +143 -0
- package/src/events/session/context.ts +68 -0
- package/src/events/session/model-select.ts +20 -0
- package/src/events/session/session-compact.ts +20 -0
- package/src/events/session/session-shutdown.ts +26 -0
- package/src/events/session/session-start.ts +45 -0
- package/src/events/session/session-tree.ts +17 -0
- package/src/events/tool/tool-call.ts +58 -0
- package/src/events/tool/tool-result.ts +54 -0
- package/src/git/git-queries.ts +154 -0
- package/src/git/resolve-base-branch.ts +173 -0
- package/src/git/worktrees/worktree-helpers.ts +142 -0
- package/src/git/worktrees/worktree-interception.ts +66 -0
- package/src/git/worktrees/worktree-lifecycle.ts +380 -0
- package/src/guardrails/completion-gating.ts +63 -0
- package/src/guardrails/file-classifier.ts +461 -0
- package/src/guardrails/force-add-guard.ts +312 -0
- package/src/guardrails/guardrail-tracker.ts +73 -0
- package/src/guardrails/guardrail-violations.ts +47 -0
- package/src/guardrails/guardrails-engine.ts +663 -0
- package/src/guardrails/session-guardrails.ts +75 -0
- package/src/guardrails/shell-decompose.ts +285 -0
- package/src/guardrails/tdd-enforcement.ts +122 -0
- package/src/guardrails/test-output.ts +272 -0
- package/src/index.ts +598 -0
- package/src/integrations/parallel-work-guardrail-integration.ts +29 -0
- package/src/integrations/subagent-integration.ts +166 -0
- package/src/integrations/todo-integration.ts +58 -0
- package/src/kanban/auto-agent/auto-agent-cleanup.ts +37 -0
- package/src/kanban/auto-agent/auto-agent-events.ts +142 -0
- package/src/kanban/auto-agent/auto-agent-grace-period.ts +83 -0
- package/src/kanban/auto-agent/auto-agent-lifecycle.ts +497 -0
- package/src/kanban/auto-agent/auto-agent-notify.ts +43 -0
- package/src/kanban/auto-agent/auto-agent-pause.ts +44 -0
- package/src/kanban/auto-agent/auto-agent-state-machine.ts +629 -0
- package/src/kanban/data/kanban-database.ts +851 -0
- package/src/kanban/data/kanban-db-schema.ts +137 -0
- package/src/kanban/data/kanban-detect-project.ts +43 -0
- package/src/kanban/data/kanban-move-feature.ts +43 -0
- package/src/kanban/data/kanban-types.ts +64 -0
- package/src/kanban/ensure-feature.ts +226 -0
- package/src/kanban/kanban-board-ui/app.js +1125 -0
- package/src/kanban/kanban-board-ui/csv-parser.d.ts +5 -0
- package/src/kanban/kanban-board-ui/csv-parser.js +80 -0
- package/src/kanban/kanban-board-ui/index.html +127 -0
- package/src/kanban/kanban-board-ui/style.css +820 -0
- package/src/kanban/kanban-bridge.ts +216 -0
- package/src/kanban/kanban-context.ts +43 -0
- package/src/kanban/kanban-events.ts +34 -0
- package/src/kanban/kanban-generate-title.ts +259 -0
- package/src/kanban/kanban-generate-topic.ts +170 -0
- package/src/kanban/kanban-operations.ts +170 -0
- package/src/kanban/kanban-server.ts +931 -0
- package/src/kanban/kanban-turn-handlers.ts +55 -0
- package/src/kanban/model-capture.ts +34 -0
- package/src/log.ts +47 -0
- package/src/phases/env-sync.ts +64 -0
- package/src/phases/execution-mode.ts +79 -0
- package/src/phases/implement-to-verify.ts +31 -0
- package/src/phases/phase-progression.ts +249 -0
- package/src/phases/phase-transitions.ts +226 -0
- package/src/phases/workflow-router.ts +98 -0
- package/src/prompts/finish-instructions.ts +143 -0
- package/src/prompts/skill-block-builder.ts +73 -0
- package/src/prompts/skill-expansion.ts +262 -0
- package/src/prompts/task-gate-skill.ts +83 -0
- package/src/prompts/template-engine.ts +433 -0
- package/src/prompts/text-blocks.ts +279 -0
- package/src/review/review-context.ts +56 -0
- package/src/review/review-counter.ts +66 -0
- package/src/review/review-empty-loop-tracking.ts +52 -0
- package/src/review/review-loops.ts +217 -0
- package/src/review/review-report.ts +101 -0
- package/src/settings/model-overrides.ts +269 -0
- package/src/settings/settings-schema.ts +458 -0
- package/src/settings/settings-types.ts +81 -0
- package/src/settings/settings-ui.ts +222 -0
- package/src/shared/errors.ts +24 -0
- package/src/shared/global.d.ts +22 -0
- package/src/shared/session-entries.ts +24 -0
- package/src/shared/types.ts +195 -0
- package/src/shared/workflow-refs.ts +253 -0
- package/src/shared/workflow-types.ts +180 -0
- package/src/snippets/vendored/subscribe-to-dialog-coordinator.ts +98 -0
- package/src/snippets/vendored/subscribe-to-notifications.ts +150 -0
- package/src/snippets/vendored/subscribe-to-parallel-work-guardrail.ts +35 -0
- package/src/snippets/vendored/subscribe-to-subagent.ts +67 -0
- package/src/snippets/vendored/subscribe-to-todo.ts +63 -0
- package/src/state/archive-artifacts.ts +602 -0
- package/src/state/artifact-junction.ts +462 -0
- package/src/state/artifact-paths.ts +230 -0
- package/src/state/feature-activation.ts +239 -0
- package/src/state/feature-management.ts +325 -0
- package/src/state/feature-record-store.ts +39 -0
- package/src/state/feature-session.ts +263 -0
- package/src/state/feature-state.ts +439 -0
- package/src/state/post-turn-dispatch.ts +106 -0
- package/src/state/session-lifecycle.ts +346 -0
- package/src/state/state-persistence.ts +122 -0
- package/src/state/worth-notes.ts +89 -0
- package/src/tools/add-to-backlog.ts +117 -0
- package/src/tools/phase-ready.ts +742 -0
- package/src/tools/task-ready-advance.ts +235 -0
- package/src/tools/text-result.ts +15 -0
- package/src/ui/featyard-widget.ts +250 -0
- package/src/ui/manage-features-dialog.ts +246 -0
- package/src/ui/select-dialog.ts +27 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 avtc <tarasenkov@gmail.com>
|
|
3
|
+
|
|
4
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
6
|
+
export type GuardrailWhitelistCheck = (categoryId: string) => boolean;
|
|
7
|
+
|
|
8
|
+
/** Pass as `addWhitelistCheck` when no whitelist check is needed. */
|
|
9
|
+
export const NO_GUARDRAIL_WHITELIST_CHECK: GuardrailWhitelistCheck | null = null;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to pi-parallel-work-guardrail:ready and register hooks.
|
|
13
|
+
* Reload-safe: session_shutdown fires before reload, cleaning all listeners.
|
|
14
|
+
* Copy this file into your consumer's src/snippets/vendored/ directory verbatim — no changes needed.
|
|
15
|
+
*/
|
|
16
|
+
export function subscribeToGuardrail(pi: ExtensionAPI, addWhitelistCheck: GuardrailWhitelistCheck | null): void {
|
|
17
|
+
const unsubs: Array<() => void> = [];
|
|
18
|
+
|
|
19
|
+
// On session_shutdown (fires before reload): clean pi.events.on listeners
|
|
20
|
+
// Note: pi.on handlers are auto-cleaned on reload (new Extension objects)
|
|
21
|
+
pi.on("session_shutdown", () => {
|
|
22
|
+
for (const unsub of unsubs) unsub();
|
|
23
|
+
unsubs.length = 0;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Register :ready listener
|
|
27
|
+
unsubs.push(
|
|
28
|
+
pi.events.on("pi-parallel-work-guardrail:ready", (data: unknown) => {
|
|
29
|
+
const api = data as {
|
|
30
|
+
addWhitelistCheck?: (check: GuardrailWhitelistCheck) => void;
|
|
31
|
+
};
|
|
32
|
+
if (addWhitelistCheck) api.addWhitelistCheck?.(addWhitelistCheck);
|
|
33
|
+
}),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 avtc <tarasenkov@gmail.com>
|
|
3
|
+
|
|
4
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
6
|
+
export type SubagentPromptTransformer = (
|
|
7
|
+
systemPrompt: string,
|
|
8
|
+
context: {
|
|
9
|
+
agentName: string;
|
|
10
|
+
task?: string;
|
|
11
|
+
isFork: boolean;
|
|
12
|
+
},
|
|
13
|
+
) => string | Promise<string>;
|
|
14
|
+
export type SubagentModelResolver = (args: {
|
|
15
|
+
agentName: string;
|
|
16
|
+
explicitModel: string | undefined;
|
|
17
|
+
}) => string | undefined;
|
|
18
|
+
|
|
19
|
+
/** Pass as `addPromptTransformer` when no prompt-transformer hook is needed. */
|
|
20
|
+
export const NO_SUBAGENT_PROMPT_TRANSFORMER: SubagentPromptTransformer | null = null;
|
|
21
|
+
/** Pass as `addModelResolver` when no model-resolver hook is needed. */
|
|
22
|
+
export const NO_SUBAGENT_MODEL_RESOLVER: SubagentModelResolver | null = null;
|
|
23
|
+
/** Pass as `addSkillPaths` when no extra skill paths are needed. */
|
|
24
|
+
export const NO_SUBAGENT_SKILL_PATHS: string[] | null = null;
|
|
25
|
+
/** Pass as `addAgentsPaths` when no extra agents paths are needed. */
|
|
26
|
+
export const NO_SUBAGENT_AGENTS_PATHS: string[] | null = null;
|
|
27
|
+
|
|
28
|
+
/** API object emitted on the `pi-subagent:ready` event, exposing registration hooks. */
|
|
29
|
+
interface SubagentReadyApi {
|
|
30
|
+
addPromptTransformer: (transformer: SubagentPromptTransformer) => void;
|
|
31
|
+
addModelResolver: (resolver: SubagentModelResolver) => void;
|
|
32
|
+
addSkillPaths: (paths: string[]) => void;
|
|
33
|
+
addAgentsPaths: (paths: string[], extensionName: string) => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe to pi-subagent:ready and register hooks.
|
|
38
|
+
* Reload-safe: session_shutdown fires before reload, cleaning all listeners.
|
|
39
|
+
* Copy this file into your consumer's src/snippets/vendored/ directory verbatim — no changes needed.
|
|
40
|
+
*/
|
|
41
|
+
export function subscribeToSubagent(
|
|
42
|
+
pi: ExtensionAPI,
|
|
43
|
+
addPromptTransformer: SubagentPromptTransformer | null,
|
|
44
|
+
addModelResolver: SubagentModelResolver | null,
|
|
45
|
+
addSkillPaths: string[] | null,
|
|
46
|
+
addAgentsPaths: string[] | null,
|
|
47
|
+
extensionName: string,
|
|
48
|
+
): void {
|
|
49
|
+
const unsubs: Array<() => void> = [];
|
|
50
|
+
|
|
51
|
+
// On session_shutdown (fires before reload): clean pi.events.on listeners
|
|
52
|
+
pi.on("session_shutdown", () => {
|
|
53
|
+
for (const unsub of unsubs) unsub();
|
|
54
|
+
unsubs.length = 0;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Register :ready listener
|
|
58
|
+
unsubs.push(
|
|
59
|
+
pi.events.on("pi-subagent:ready", (data) => {
|
|
60
|
+
const api = data as SubagentReadyApi;
|
|
61
|
+
if (addPromptTransformer) api.addPromptTransformer(addPromptTransformer);
|
|
62
|
+
if (addModelResolver) api.addModelResolver(addModelResolver);
|
|
63
|
+
if (addSkillPaths) api.addSkillPaths(addSkillPaths);
|
|
64
|
+
if (addAgentsPaths) api.addAgentsPaths(addAgentsPaths, extensionName);
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 avtc <tarasenkov@gmail.com>
|
|
3
|
+
|
|
4
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
6
|
+
/** API object emitted on the `pi-todo:ready` event. */
|
|
7
|
+
export interface TodoReadyApi {
|
|
8
|
+
disableBuiltInFollowUp: () => void;
|
|
9
|
+
getCompletedItemId?: () => string | null;
|
|
10
|
+
getInProgressItem?: () => string | null;
|
|
11
|
+
areAllTodosDone?: () => boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Subscribe to pi-todo:ready and register hooks.
|
|
16
|
+
* Reload-safe: session_shutdown fires before reload, cleaning all listeners.
|
|
17
|
+
* Copy this file into your consumer's src/snippets/vendored/ directory verbatim — no changes needed.
|
|
18
|
+
*
|
|
19
|
+
* Returns sync lazy proxy — getCompletedItemId, getInProgressItem and areAllTodosDone delegate to
|
|
20
|
+
* internal _api ref populated when :ready fires at session_start.
|
|
21
|
+
* disableBuiltInFollowUp is passed as a boolean flag, applied inside :ready handler.
|
|
22
|
+
* No pending queue needed — the flag is evaluated when _api is available.
|
|
23
|
+
*/
|
|
24
|
+
export function subscribeToTodo(
|
|
25
|
+
pi: ExtensionAPI,
|
|
26
|
+
disableBuiltInFollowUp: boolean,
|
|
27
|
+
): {
|
|
28
|
+
getCompletedItemId(): string | null;
|
|
29
|
+
getInProgressItem(): string | null;
|
|
30
|
+
areAllTodosDone(): boolean;
|
|
31
|
+
} {
|
|
32
|
+
const unsubs: Array<() => void> = [];
|
|
33
|
+
|
|
34
|
+
// Internal API ref — populated when :ready fires
|
|
35
|
+
let _api: TodoReadyApi | null = null;
|
|
36
|
+
|
|
37
|
+
// On session_shutdown (fires before reload): clean pi.events.on listeners
|
|
38
|
+
pi.on("session_shutdown", () => {
|
|
39
|
+
for (const unsub of unsubs) unsub();
|
|
40
|
+
unsubs.length = 0;
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Register :ready listener
|
|
44
|
+
unsubs.push(
|
|
45
|
+
pi.events.on("pi-todo:ready", (api: unknown) => {
|
|
46
|
+
_api = api as TodoReadyApi;
|
|
47
|
+
if (disableBuiltInFollowUp) _api.disableBuiltInFollowUp();
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// Return sync lazy proxy — methods delegate to _api when available
|
|
52
|
+
return {
|
|
53
|
+
getCompletedItemId(): string | null {
|
|
54
|
+
return _api?.getCompletedItemId?.() ?? null;
|
|
55
|
+
},
|
|
56
|
+
getInProgressItem(): string | null {
|
|
57
|
+
return _api?.getInProgressItem?.() ?? null;
|
|
58
|
+
},
|
|
59
|
+
areAllTodosDone(): boolean {
|
|
60
|
+
return _api?.areAllTodosDone?.() ?? true;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|