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.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/agents/fy-design-reviewer.md +77 -0
  4. package/agents/fy-feature-verifier.md +24 -0
  5. package/agents/fy-general-reviewer.md +81 -0
  6. package/agents/fy-guidelines-reviewer.md +46 -0
  7. package/agents/fy-implementer.md +20 -0
  8. package/agents/fy-performance-reviewer.md +46 -0
  9. package/agents/fy-plan-reviewer.md +74 -0
  10. package/agents/fy-plan-verifier.md +44 -0
  11. package/agents/fy-quality-reviewer.md +50 -0
  12. package/agents/fy-requirements-reviewer.md +46 -0
  13. package/agents/fy-researcher.md +6 -0
  14. package/agents/fy-security-reviewer.md +46 -0
  15. package/agents/fy-task-verifier.md +42 -0
  16. package/agents/fy-testing-reviewer.md +60 -0
  17. package/assets/images/kanban-board.png +0 -0
  18. package/assets/images/settings-dropdown.png +0 -0
  19. package/assets/images/settings.png +0 -0
  20. package/assets/images/widget.png +0 -0
  21. package/docs/CONFIGURATION.md +266 -0
  22. package/index.ts +8 -0
  23. package/package.json +85 -0
  24. package/skills/fy-design/SKILL.md +108 -0
  25. package/skills/fy-design-review/SKILL.md +45 -0
  26. package/skills/fy-finish/SKILL.md +28 -0
  27. package/skills/fy-implement/SKILL.md +36 -0
  28. package/skills/fy-plan/SKILL.md +77 -0
  29. package/skills/fy-plan-review/SKILL.md +45 -0
  30. package/skills/fy-research/SKILL.md +38 -0
  31. package/skills/fy-review/SKILL.md +88 -0
  32. package/skills/fy-verify/SKILL.md +23 -0
  33. package/src/commands/auto-agent-commands.ts +748 -0
  34. package/src/commands/kanban-commands.ts +278 -0
  35. package/src/commands/workflow-commands.ts +531 -0
  36. package/src/compaction/compact-handler.ts +371 -0
  37. package/src/compaction/compact-message.ts +52 -0
  38. package/src/compaction/compact-trigger.ts +121 -0
  39. package/src/compaction/safe-editor-write.ts +18 -0
  40. package/src/events/agent/agent-end.ts +19 -0
  41. package/src/events/agent/agent-settled.ts +20 -0
  42. package/src/events/agent/agent-start.ts +18 -0
  43. package/src/events/agent/turn-end.ts +20 -0
  44. package/src/events/agent/turn-start.ts +19 -0
  45. package/src/events/event-deps.ts +33 -0
  46. package/src/events/index.ts +91 -0
  47. package/src/events/input/input.ts +143 -0
  48. package/src/events/session/context.ts +68 -0
  49. package/src/events/session/model-select.ts +20 -0
  50. package/src/events/session/session-compact.ts +20 -0
  51. package/src/events/session/session-shutdown.ts +26 -0
  52. package/src/events/session/session-start.ts +45 -0
  53. package/src/events/session/session-tree.ts +17 -0
  54. package/src/events/tool/tool-call.ts +58 -0
  55. package/src/events/tool/tool-result.ts +54 -0
  56. package/src/git/git-queries.ts +154 -0
  57. package/src/git/resolve-base-branch.ts +173 -0
  58. package/src/git/worktrees/worktree-helpers.ts +142 -0
  59. package/src/git/worktrees/worktree-interception.ts +66 -0
  60. package/src/git/worktrees/worktree-lifecycle.ts +380 -0
  61. package/src/guardrails/completion-gating.ts +63 -0
  62. package/src/guardrails/file-classifier.ts +461 -0
  63. package/src/guardrails/force-add-guard.ts +312 -0
  64. package/src/guardrails/guardrail-tracker.ts +73 -0
  65. package/src/guardrails/guardrail-violations.ts +47 -0
  66. package/src/guardrails/guardrails-engine.ts +663 -0
  67. package/src/guardrails/session-guardrails.ts +75 -0
  68. package/src/guardrails/shell-decompose.ts +285 -0
  69. package/src/guardrails/tdd-enforcement.ts +122 -0
  70. package/src/guardrails/test-output.ts +272 -0
  71. package/src/index.ts +598 -0
  72. package/src/integrations/parallel-work-guardrail-integration.ts +29 -0
  73. package/src/integrations/subagent-integration.ts +166 -0
  74. package/src/integrations/todo-integration.ts +58 -0
  75. package/src/kanban/auto-agent/auto-agent-cleanup.ts +37 -0
  76. package/src/kanban/auto-agent/auto-agent-events.ts +142 -0
  77. package/src/kanban/auto-agent/auto-agent-grace-period.ts +83 -0
  78. package/src/kanban/auto-agent/auto-agent-lifecycle.ts +497 -0
  79. package/src/kanban/auto-agent/auto-agent-notify.ts +43 -0
  80. package/src/kanban/auto-agent/auto-agent-pause.ts +44 -0
  81. package/src/kanban/auto-agent/auto-agent-state-machine.ts +629 -0
  82. package/src/kanban/data/kanban-database.ts +851 -0
  83. package/src/kanban/data/kanban-db-schema.ts +137 -0
  84. package/src/kanban/data/kanban-detect-project.ts +43 -0
  85. package/src/kanban/data/kanban-move-feature.ts +43 -0
  86. package/src/kanban/data/kanban-types.ts +64 -0
  87. package/src/kanban/ensure-feature.ts +226 -0
  88. package/src/kanban/kanban-board-ui/app.js +1125 -0
  89. package/src/kanban/kanban-board-ui/csv-parser.d.ts +5 -0
  90. package/src/kanban/kanban-board-ui/csv-parser.js +80 -0
  91. package/src/kanban/kanban-board-ui/index.html +127 -0
  92. package/src/kanban/kanban-board-ui/style.css +820 -0
  93. package/src/kanban/kanban-bridge.ts +216 -0
  94. package/src/kanban/kanban-context.ts +43 -0
  95. package/src/kanban/kanban-events.ts +34 -0
  96. package/src/kanban/kanban-generate-title.ts +259 -0
  97. package/src/kanban/kanban-generate-topic.ts +170 -0
  98. package/src/kanban/kanban-operations.ts +170 -0
  99. package/src/kanban/kanban-server.ts +931 -0
  100. package/src/kanban/kanban-turn-handlers.ts +55 -0
  101. package/src/kanban/model-capture.ts +34 -0
  102. package/src/log.ts +47 -0
  103. package/src/phases/env-sync.ts +64 -0
  104. package/src/phases/execution-mode.ts +79 -0
  105. package/src/phases/implement-to-verify.ts +31 -0
  106. package/src/phases/phase-progression.ts +249 -0
  107. package/src/phases/phase-transitions.ts +226 -0
  108. package/src/phases/workflow-router.ts +98 -0
  109. package/src/prompts/finish-instructions.ts +143 -0
  110. package/src/prompts/skill-block-builder.ts +73 -0
  111. package/src/prompts/skill-expansion.ts +262 -0
  112. package/src/prompts/task-gate-skill.ts +83 -0
  113. package/src/prompts/template-engine.ts +433 -0
  114. package/src/prompts/text-blocks.ts +279 -0
  115. package/src/review/review-context.ts +56 -0
  116. package/src/review/review-counter.ts +66 -0
  117. package/src/review/review-empty-loop-tracking.ts +52 -0
  118. package/src/review/review-loops.ts +217 -0
  119. package/src/review/review-report.ts +101 -0
  120. package/src/settings/model-overrides.ts +269 -0
  121. package/src/settings/settings-schema.ts +458 -0
  122. package/src/settings/settings-types.ts +81 -0
  123. package/src/settings/settings-ui.ts +222 -0
  124. package/src/shared/errors.ts +24 -0
  125. package/src/shared/global.d.ts +22 -0
  126. package/src/shared/session-entries.ts +24 -0
  127. package/src/shared/types.ts +195 -0
  128. package/src/shared/workflow-refs.ts +253 -0
  129. package/src/shared/workflow-types.ts +180 -0
  130. package/src/snippets/vendored/subscribe-to-dialog-coordinator.ts +98 -0
  131. package/src/snippets/vendored/subscribe-to-notifications.ts +150 -0
  132. package/src/snippets/vendored/subscribe-to-parallel-work-guardrail.ts +35 -0
  133. package/src/snippets/vendored/subscribe-to-subagent.ts +67 -0
  134. package/src/snippets/vendored/subscribe-to-todo.ts +63 -0
  135. package/src/state/archive-artifacts.ts +602 -0
  136. package/src/state/artifact-junction.ts +462 -0
  137. package/src/state/artifact-paths.ts +230 -0
  138. package/src/state/feature-activation.ts +239 -0
  139. package/src/state/feature-management.ts +325 -0
  140. package/src/state/feature-record-store.ts +39 -0
  141. package/src/state/feature-session.ts +263 -0
  142. package/src/state/feature-state.ts +439 -0
  143. package/src/state/post-turn-dispatch.ts +106 -0
  144. package/src/state/session-lifecycle.ts +346 -0
  145. package/src/state/state-persistence.ts +122 -0
  146. package/src/state/worth-notes.ts +89 -0
  147. package/src/tools/add-to-backlog.ts +117 -0
  148. package/src/tools/phase-ready.ts +742 -0
  149. package/src/tools/task-ready-advance.ts +235 -0
  150. package/src/tools/text-result.ts +15 -0
  151. package/src/ui/featyard-widget.ts +250 -0
  152. package/src/ui/manage-features-dialog.ts +246 -0
  153. 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
+ }