aw-ecc 1.4.32 → 1.4.47
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/.claude-plugin/plugin.json +1 -1
- package/.codex/hooks/aw-post-tool-use.sh +8 -2
- package/.codex/hooks/aw-session-start.sh +11 -4
- package/.codex/hooks/aw-stop.sh +8 -2
- package/.codex/hooks/aw-user-prompt-submit.sh +10 -2
- package/.codex/hooks.json +8 -8
- package/.cursor/INSTALL.md +7 -5
- package/.cursor/hooks/adapter.js +41 -4
- package/.cursor/hooks/after-agent-response.js +62 -0
- package/.cursor/hooks/before-submit-prompt.js +7 -1
- package/.cursor/hooks/post-tool-use-failure.js +21 -0
- package/.cursor/hooks/post-tool-use.js +39 -0
- package/.cursor/hooks/shared/aw-phase-definitions.js +53 -0
- package/.cursor/hooks/shared/aw-phase-runner.js +3 -1
- package/.cursor/hooks/subagent-start.js +22 -4
- package/.cursor/hooks/subagent-stop.js +18 -1
- package/.cursor/hooks.json +23 -2
- package/.opencode/package.json +1 -1
- package/AGENTS.md +3 -3
- package/README.md +5 -5
- package/commands/adk.md +52 -0
- package/commands/build.md +22 -9
- package/commands/deploy.md +12 -0
- package/commands/execute.md +9 -0
- package/commands/feature.md +333 -0
- package/commands/investigate.md +18 -5
- package/commands/plan.md +23 -9
- package/commands/publish.md +65 -0
- package/commands/review.md +12 -0
- package/commands/ship.md +12 -0
- package/commands/test.md +12 -0
- package/commands/verify.md +9 -0
- package/hooks/hooks.json +36 -0
- package/manifests/install-components.json +8 -0
- package/manifests/install-modules.json +83 -0
- package/manifests/install-profiles.json +7 -0
- package/package.json +1 -1
- package/scripts/ci/validate-rules.js +51 -0
- package/scripts/cursor-aw-home/hooks.json +23 -2
- package/scripts/cursor-aw-hooks/adapter.js +41 -4
- package/scripts/cursor-aw-hooks/before-submit-prompt.js +7 -1
- package/scripts/hooks/aw-usage-commit-created.js +32 -0
- package/scripts/hooks/aw-usage-post-tool-use-failure.js +56 -0
- package/scripts/hooks/aw-usage-post-tool-use.js +242 -0
- package/scripts/hooks/aw-usage-prompt-submit.js +112 -0
- package/scripts/hooks/aw-usage-session-start.js +48 -0
- package/scripts/hooks/aw-usage-stop.js +182 -0
- package/scripts/hooks/aw-usage-telemetry-send.js +84 -0
- package/scripts/hooks/cost-tracker.js +3 -23
- package/scripts/hooks/shared/aw-phase-definitions.js +53 -0
- package/scripts/hooks/shared/aw-phase-runner.js +3 -1
- package/scripts/lib/aw-hook-contract.js +2 -2
- package/scripts/lib/aw-pricing.js +306 -0
- package/scripts/lib/aw-usage-telemetry.js +472 -0
- package/scripts/lib/codex-hook-config.js +8 -8
- package/scripts/lib/cursor-hook-config.js +25 -10
- package/scripts/lib/install-targets/cursor-project.js +3 -0
- package/scripts/lib/install-targets/helpers.js +20 -3
- package/skills/aw-adk/SKILL.md +317 -0
- package/skills/aw-adk/agents/analyzer.md +113 -0
- package/skills/aw-adk/agents/comparator.md +113 -0
- package/skills/aw-adk/agents/grader.md +115 -0
- package/skills/aw-adk/assets/eval_review.html +76 -0
- package/skills/aw-adk/eval-viewer/generate_review.py +164 -0
- package/skills/aw-adk/eval-viewer/viewer.html +181 -0
- package/skills/aw-adk/evals/eval-colocated-placement.md +84 -0
- package/skills/aw-adk/evals/eval-create-agent.md +90 -0
- package/skills/aw-adk/evals/eval-create-command.md +98 -0
- package/skills/aw-adk/evals/eval-create-eval.md +89 -0
- package/skills/aw-adk/evals/eval-create-rule.md +99 -0
- package/skills/aw-adk/evals/eval-create-skill.md +97 -0
- package/skills/aw-adk/evals/eval-delete-agent.md +79 -0
- package/skills/aw-adk/evals/eval-delete-command.md +89 -0
- package/skills/aw-adk/evals/eval-delete-rule.md +86 -0
- package/skills/aw-adk/evals/eval-delete-skill.md +90 -0
- package/skills/aw-adk/evals/eval-meta-eval-coverage.md +78 -0
- package/skills/aw-adk/evals/eval-meta-eval-determinism.md +81 -0
- package/skills/aw-adk/evals/eval-meta-eval-false-pass.md +81 -0
- package/skills/aw-adk/evals/eval-score-accuracy.md +95 -0
- package/skills/aw-adk/evals/eval-type-redirect.md +68 -0
- package/skills/aw-adk/evals/evals.json +96 -0
- package/skills/aw-adk/references/artifact-wiring.md +162 -0
- package/skills/aw-adk/references/cross-ide-mapping.md +71 -0
- package/skills/aw-adk/references/eval-placement-guide.md +183 -0
- package/skills/aw-adk/references/external-resources.md +75 -0
- package/skills/aw-adk/references/getting-started.md +66 -0
- package/skills/aw-adk/references/registry-structure.md +152 -0
- package/skills/aw-adk/references/rubric-agent.md +36 -0
- package/skills/aw-adk/references/rubric-command.md +36 -0
- package/skills/aw-adk/references/rubric-eval.md +36 -0
- package/skills/aw-adk/references/rubric-meta-eval.md +132 -0
- package/skills/aw-adk/references/rubric-rule.md +36 -0
- package/skills/aw-adk/references/rubric-skill.md +36 -0
- package/skills/aw-adk/references/schemas.md +222 -0
- package/skills/aw-adk/references/template-agent.md +251 -0
- package/skills/aw-adk/references/template-command.md +279 -0
- package/skills/aw-adk/references/template-eval.md +176 -0
- package/skills/aw-adk/references/template-rule.md +119 -0
- package/skills/aw-adk/references/template-skill.md +123 -0
- package/skills/aw-adk/references/type-classifier.md +98 -0
- package/skills/aw-adk/references/writing-good-agents.md +227 -0
- package/skills/aw-adk/references/writing-good-commands.md +258 -0
- package/skills/aw-adk/references/writing-good-evals.md +271 -0
- package/skills/aw-adk/references/writing-good-rules.md +214 -0
- package/skills/aw-adk/references/writing-good-skills.md +159 -0
- package/skills/aw-adk/scripts/aggregate-benchmark.py +190 -0
- package/skills/aw-adk/scripts/lint-artifact.sh +211 -0
- package/skills/aw-adk/scripts/score-artifact.sh +179 -0
- package/skills/aw-adk/scripts/trigger-eval.py +192 -0
- package/skills/aw-build/SKILL.md +19 -2
- package/skills/aw-deploy/SKILL.md +65 -3
- package/skills/aw-design/SKILL.md +156 -0
- package/skills/aw-design/references/highrise-tokens.md +394 -0
- package/skills/aw-design/references/micro-interactions.md +76 -0
- package/skills/aw-design/references/prompt-template.md +160 -0
- package/skills/aw-design/references/quality-checklist.md +70 -0
- package/skills/aw-design/references/self-review.md +497 -0
- package/skills/aw-design/references/stitch-workflow.md +127 -0
- package/skills/aw-feature/SKILL.md +293 -0
- package/skills/aw-investigate/SKILL.md +17 -0
- package/skills/aw-plan/SKILL.md +34 -3
- package/skills/aw-publish/SKILL.md +300 -0
- package/skills/aw-publish/evals/eval-confirmation-gate.md +60 -0
- package/skills/aw-publish/evals/eval-intent-detection.md +111 -0
- package/skills/aw-publish/evals/eval-push-modes.md +67 -0
- package/skills/aw-publish/evals/eval-rules-push.md +60 -0
- package/skills/aw-publish/evals/evals.json +29 -0
- package/skills/aw-publish/references/push-modes.md +38 -0
- package/skills/aw-review/SKILL.md +88 -9
- package/skills/aw-rules-review/SKILL.md +124 -0
- package/skills/aw-rules-review/agents/openai.yaml +3 -0
- package/skills/aw-rules-review/scripts/generate-review-template.mjs +323 -0
- package/skills/aw-ship/SKILL.md +16 -0
- package/skills/aw-spec/SKILL.md +15 -0
- package/skills/aw-tasks/SKILL.md +15 -0
- package/skills/aw-test/SKILL.md +16 -0
- package/skills/aw-yolo/SKILL.md +4 -0
- package/skills/diagnose/SKILL.md +121 -0
- package/skills/diagnose/scripts/hitl-loop.template.sh +41 -0
- package/skills/finish-only-when-green/SKILL.md +265 -0
- package/skills/grill-me/SKILL.md +24 -0
- package/skills/grill-with-docs/SKILL.md +92 -0
- package/skills/grill-with-docs/adr-format.md +47 -0
- package/skills/grill-with-docs/context-format.md +67 -0
- package/skills/improve-codebase-architecture/SKILL.md +75 -0
- package/skills/improve-codebase-architecture/deepening.md +37 -0
- package/skills/improve-codebase-architecture/interface-design.md +44 -0
- package/skills/improve-codebase-architecture/language.md +53 -0
- package/skills/local-ghl-setup-from-screenshot/SKILL.md +538 -0
- package/skills/tdd/SKILL.md +115 -0
- package/skills/tdd/deep-modules.md +33 -0
- package/skills/tdd/interface-design.md +31 -0
- package/skills/tdd/mocking.md +59 -0
- package/skills/tdd/refactoring.md +10 -0
- package/skills/tdd/tests.md +61 -0
- package/skills/to-issues/SKILL.md +62 -0
- package/skills/to-prd/SKILL.md +75 -0
- package/skills/using-aw-skills/SKILL.md +170 -237
- package/skills/using-aw-skills/hooks/session-start.sh +11 -41
- package/skills/zoom-out/SKILL.md +24 -0
- package/.cursor/rules/common-agents.md +0 -53
- package/.cursor/rules/common-aw-routing.md +0 -43
- package/.cursor/rules/common-coding-style.md +0 -52
- package/.cursor/rules/common-development-workflow.md +0 -33
- package/.cursor/rules/common-git-workflow.md +0 -28
- package/.cursor/rules/common-hooks.md +0 -34
- package/.cursor/rules/common-patterns.md +0 -35
- package/.cursor/rules/common-performance.md +0 -59
- package/.cursor/rules/common-security.md +0 -33
- package/.cursor/rules/common-testing.md +0 -33
- package/.cursor/skills/api-and-interface-design/SKILL.md +0 -75
- package/.cursor/skills/article-writing/SKILL.md +0 -85
- package/.cursor/skills/aw-brainstorm/SKILL.md +0 -115
- package/.cursor/skills/aw-build/SKILL.md +0 -152
- package/.cursor/skills/aw-build/evals/build-stage-cases.json +0 -28
- package/.cursor/skills/aw-debug/SKILL.md +0 -49
- package/.cursor/skills/aw-deploy/SKILL.md +0 -101
- package/.cursor/skills/aw-deploy/evals/deploy-stage-cases.json +0 -32
- package/.cursor/skills/aw-execute/SKILL.md +0 -47
- package/.cursor/skills/aw-execute/references/mode-code.md +0 -47
- package/.cursor/skills/aw-execute/references/mode-docs.md +0 -28
- package/.cursor/skills/aw-execute/references/mode-infra.md +0 -44
- package/.cursor/skills/aw-execute/references/mode-migration.md +0 -58
- package/.cursor/skills/aw-execute/references/worker-implementer.md +0 -26
- package/.cursor/skills/aw-execute/references/worker-parallel-worker.md +0 -23
- package/.cursor/skills/aw-execute/references/worker-quality-reviewer.md +0 -23
- package/.cursor/skills/aw-execute/references/worker-spec-reviewer.md +0 -23
- package/.cursor/skills/aw-execute/scripts/build-worker-bundle.js +0 -229
- package/.cursor/skills/aw-finish/SKILL.md +0 -111
- package/.cursor/skills/aw-investigate/SKILL.md +0 -109
- package/.cursor/skills/aw-plan/SKILL.md +0 -368
- package/.cursor/skills/aw-prepare/SKILL.md +0 -118
- package/.cursor/skills/aw-review/SKILL.md +0 -118
- package/.cursor/skills/aw-ship/SKILL.md +0 -115
- package/.cursor/skills/aw-spec/SKILL.md +0 -104
- package/.cursor/skills/aw-tasks/SKILL.md +0 -138
- package/.cursor/skills/aw-test/SKILL.md +0 -118
- package/.cursor/skills/aw-verify/SKILL.md +0 -51
- package/.cursor/skills/aw-yolo/SKILL.md +0 -111
- package/.cursor/skills/browser-testing-with-devtools/SKILL.md +0 -81
- package/.cursor/skills/bun-runtime/SKILL.md +0 -84
- package/.cursor/skills/ci-cd-and-automation/SKILL.md +0 -71
- package/.cursor/skills/code-simplification/SKILL.md +0 -74
- package/.cursor/skills/content-engine/SKILL.md +0 -88
- package/.cursor/skills/context-engineering/SKILL.md +0 -74
- package/.cursor/skills/deprecation-and-migration/SKILL.md +0 -75
- package/.cursor/skills/documentation-and-adrs/SKILL.md +0 -75
- package/.cursor/skills/documentation-lookup/SKILL.md +0 -90
- package/.cursor/skills/frontend-slides/SKILL.md +0 -184
- package/.cursor/skills/frontend-slides/STYLE_PRESETS.md +0 -330
- package/.cursor/skills/frontend-ui-engineering/SKILL.md +0 -68
- package/.cursor/skills/git-workflow-and-versioning/SKILL.md +0 -75
- package/.cursor/skills/idea-refine/SKILL.md +0 -84
- package/.cursor/skills/incremental-implementation/SKILL.md +0 -75
- package/.cursor/skills/investor-materials/SKILL.md +0 -96
- package/.cursor/skills/investor-outreach/SKILL.md +0 -76
- package/.cursor/skills/market-research/SKILL.md +0 -75
- package/.cursor/skills/mcp-server-patterns/SKILL.md +0 -67
- package/.cursor/skills/nextjs-turbopack/SKILL.md +0 -44
- package/.cursor/skills/performance-optimization/SKILL.md +0 -77
- package/.cursor/skills/security-and-hardening/SKILL.md +0 -70
- package/.cursor/skills/using-aw-skills/SKILL.md +0 -290
- package/.cursor/skills/using-aw-skills/evals/skill-trigger-cases.tsv +0 -25
- package/.cursor/skills/using-aw-skills/evals/test-skill-triggers.sh +0 -171
- package/.cursor/skills/using-aw-skills/hooks/hooks.json +0 -9
- package/.cursor/skills/using-aw-skills/hooks/session-start.sh +0 -67
- package/.cursor/skills/using-platform-skills/SKILL.md +0 -163
- package/.cursor/skills/using-platform-skills/evals/platform-selection-cases.json +0 -52
- /package/.cursor/rules/{golang-coding-style.md → golang-coding-style.mdc} +0 -0
- /package/.cursor/rules/{golang-hooks.md → golang-hooks.mdc} +0 -0
- /package/.cursor/rules/{golang-patterns.md → golang-patterns.mdc} +0 -0
- /package/.cursor/rules/{golang-security.md → golang-security.mdc} +0 -0
- /package/.cursor/rules/{golang-testing.md → golang-testing.mdc} +0 -0
- /package/.cursor/rules/{kotlin-coding-style.md → kotlin-coding-style.mdc} +0 -0
- /package/.cursor/rules/{kotlin-hooks.md → kotlin-hooks.mdc} +0 -0
- /package/.cursor/rules/{kotlin-patterns.md → kotlin-patterns.mdc} +0 -0
- /package/.cursor/rules/{kotlin-security.md → kotlin-security.mdc} +0 -0
- /package/.cursor/rules/{kotlin-testing.md → kotlin-testing.mdc} +0 -0
- /package/.cursor/rules/{php-coding-style.md → php-coding-style.mdc} +0 -0
- /package/.cursor/rules/{php-hooks.md → php-hooks.mdc} +0 -0
- /package/.cursor/rules/{php-patterns.md → php-patterns.mdc} +0 -0
- /package/.cursor/rules/{php-security.md → php-security.mdc} +0 -0
- /package/.cursor/rules/{php-testing.md → php-testing.mdc} +0 -0
- /package/.cursor/rules/{python-coding-style.md → python-coding-style.mdc} +0 -0
- /package/.cursor/rules/{python-hooks.md → python-hooks.mdc} +0 -0
- /package/.cursor/rules/{python-patterns.md → python-patterns.mdc} +0 -0
- /package/.cursor/rules/{python-security.md → python-security.mdc} +0 -0
- /package/.cursor/rules/{python-testing.md → python-testing.mdc} +0 -0
- /package/.cursor/rules/{swift-coding-style.md → swift-coding-style.mdc} +0 -0
- /package/.cursor/rules/{swift-hooks.md → swift-hooks.mdc} +0 -0
- /package/.cursor/rules/{swift-patterns.md → swift-patterns.mdc} +0 -0
- /package/.cursor/rules/{swift-security.md → swift-security.mdc} +0 -0
- /package/.cursor/rules/{swift-testing.md → swift-testing.mdc} +0 -0
- /package/.cursor/rules/{typescript-coding-style.md → typescript-coding-style.mdc} +0 -0
- /package/.cursor/rules/{typescript-hooks.md → typescript-hooks.mdc} +0 -0
- /package/.cursor/rules/{typescript-patterns.md → typescript-patterns.mdc} +0 -0
- /package/.cursor/rules/{typescript-security.md → typescript-security.mdc} +0 -0
- /package/.cursor/rules/{typescript-testing.md → typescript-testing.mdc} +0 -0
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
#
|
|
5
|
-
cat
|
|
4
|
+
# Capture stdin before invoking the non-blocking telemetry sidecar.
|
|
5
|
+
STDIN=$(cat)
|
|
6
|
+
|
|
7
|
+
TELEMETRY_HOOK="$HOME/.aw-ecc/scripts/hooks/aw-usage-post-tool-use.js"
|
|
8
|
+
if [[ -f "$TELEMETRY_HOOK" ]] && command -v node >/dev/null 2>&1; then
|
|
9
|
+
printf '%s' "$STDIN" | AW_HARNESS=codex node "$TELEMETRY_HOOK" >/dev/null 2>&1 || true
|
|
10
|
+
fi
|
|
11
|
+
|
|
6
12
|
exit 0
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
# aw-managed: codex-global-session-start
|
|
2
3
|
set -euo pipefail
|
|
3
4
|
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
# Capture stdin so we can feed it to both telemetry and the AW router delegate.
|
|
6
|
+
STDIN=$(cat)
|
|
7
|
+
|
|
8
|
+
# Fire session_start telemetry (non-blocking, all output suppressed).
|
|
9
|
+
TELEMETRY_HOOK="$HOME/.aw-ecc/scripts/hooks/aw-usage-session-start.js"
|
|
10
|
+
if [[ -f "$TELEMETRY_HOOK" ]] && command -v node >/dev/null 2>&1; then
|
|
11
|
+
printf '%s' "$STDIN" | AW_HARNESS=codex node "$TELEMETRY_HOOK" >/dev/null 2>&1 || true
|
|
12
|
+
fi
|
|
7
13
|
|
|
8
14
|
TARGETS=(
|
|
9
15
|
"$HOME/.aw_registry/platform/core/skills/using-aw-skills/hooks/session-start.sh"
|
|
@@ -12,7 +18,8 @@ TARGETS=(
|
|
|
12
18
|
|
|
13
19
|
for target in "${TARGETS[@]}"; do
|
|
14
20
|
if [[ -f "$target" ]]; then
|
|
15
|
-
|
|
21
|
+
printf '%s' "$STDIN" | bash "$target"
|
|
22
|
+
exit $?
|
|
16
23
|
fi
|
|
17
24
|
done
|
|
18
25
|
|
package/.codex/hooks/aw-stop.sh
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
#
|
|
5
|
-
cat
|
|
4
|
+
# Capture stdin before invoking the non-blocking telemetry sidecar.
|
|
5
|
+
STDIN=$(cat)
|
|
6
|
+
|
|
7
|
+
TELEMETRY_HOOK="$HOME/.aw-ecc/scripts/hooks/aw-usage-stop.js"
|
|
8
|
+
if [[ -f "$TELEMETRY_HOOK" ]] && command -v node >/dev/null 2>&1; then
|
|
9
|
+
printf '%s' "$STDIN" | AW_HARNESS=codex node "$TELEMETRY_HOOK" >/dev/null 2>&1 || true
|
|
10
|
+
fi
|
|
11
|
+
|
|
6
12
|
exit 0
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
+
# Capture stdin so we can feed it to both telemetry and the reminder delegate.
|
|
5
|
+
STDIN=$(cat)
|
|
6
|
+
|
|
7
|
+
TELEMETRY_HOOK="$HOME/.aw-ecc/scripts/hooks/aw-usage-prompt-submit.js"
|
|
8
|
+
if [[ -f "$TELEMETRY_HOOK" ]] && command -v node >/dev/null 2>&1; then
|
|
9
|
+
printf '%s' "$STDIN" | AW_HARNESS=codex node "$TELEMETRY_HOOK" >/dev/null 2>&1 || true
|
|
10
|
+
fi
|
|
11
|
+
|
|
4
12
|
TARGET="$HOME/.aw-ecc/scripts/hooks/session-start-rules-context.sh"
|
|
5
13
|
if [[ -f "$TARGET" ]]; then
|
|
6
|
-
|
|
14
|
+
printf '%s' "$STDIN" | bash "$TARGET"
|
|
15
|
+
exit $?
|
|
7
16
|
fi
|
|
8
17
|
|
|
9
|
-
cat >/dev/null || true
|
|
10
18
|
exit 0
|
package/.codex/hooks.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "bash
|
|
9
|
+
"command": "bash \"$HOME/.codex/hooks/aw-session-start.sh\""
|
|
10
10
|
}
|
|
11
11
|
],
|
|
12
12
|
"description": "Load AW routing context at session start"
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"hooks": [
|
|
18
18
|
{
|
|
19
19
|
"type": "command",
|
|
20
|
-
"command": "bash
|
|
20
|
+
"command": "bash \"$HOME/.codex/hooks/aw-user-prompt-submit.sh\""
|
|
21
21
|
}
|
|
22
22
|
],
|
|
23
|
-
"description": "
|
|
23
|
+
"description": "Emit Codex prompt telemetry and inject compact AW routing reminders on each prompt"
|
|
24
24
|
}
|
|
25
25
|
],
|
|
26
26
|
"PreToolUse": [
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"hooks": [
|
|
30
30
|
{
|
|
31
31
|
"type": "command",
|
|
32
|
-
"command": "bash
|
|
32
|
+
"command": "bash \"$HOME/.codex/hooks/aw-pre-tool-use.sh\""
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"description": "Reserved AW pre-tool-use phase for Codex home installs"
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"hooks": [
|
|
42
42
|
{
|
|
43
43
|
"type": "command",
|
|
44
|
-
"command": "bash
|
|
44
|
+
"command": "bash \"$HOME/.codex/hooks/aw-post-tool-use.sh\""
|
|
45
45
|
}
|
|
46
46
|
],
|
|
47
|
-
"description": "
|
|
47
|
+
"description": "Emit Codex post-tool-use telemetry for supported Bash-backed events"
|
|
48
48
|
}
|
|
49
49
|
],
|
|
50
50
|
"Stop": [
|
|
@@ -52,10 +52,10 @@
|
|
|
52
52
|
"hooks": [
|
|
53
53
|
{
|
|
54
54
|
"type": "command",
|
|
55
|
-
"command": "bash
|
|
55
|
+
"command": "bash \"$HOME/.codex/hooks/aw-stop.sh\""
|
|
56
56
|
}
|
|
57
57
|
],
|
|
58
|
-
"description": "
|
|
58
|
+
"description": "Emit Codex stop telemetry for response_completed events"
|
|
59
59
|
}
|
|
60
60
|
]
|
|
61
61
|
}
|
package/.cursor/INSTALL.md
CHANGED
|
@@ -20,11 +20,13 @@ Cursor-facing rules or prompts should point at:
|
|
|
20
20
|
|
|
21
21
|
Map intent to the same public stage surface:
|
|
22
22
|
|
|
23
|
-
- `/aw
|
|
24
|
-
- `/aw
|
|
25
|
-
- `/aw
|
|
26
|
-
- `/aw
|
|
27
|
-
- `/aw
|
|
23
|
+
- `/aw-adk` — create, improve, fix, score, audit CASRE artifacts in .aw_registry/
|
|
24
|
+
- `/aw-publish` — push registry content to remote platform-docs via PR
|
|
25
|
+
- `/aw-plan`
|
|
26
|
+
- `/aw-execute`
|
|
27
|
+
- `/aw-verify`
|
|
28
|
+
- `/aw-deploy`
|
|
29
|
+
- `/aw-ship`
|
|
28
30
|
|
|
29
31
|
## Contract Rule
|
|
30
32
|
|
package/.cursor/hooks/adapter.js
CHANGED
|
@@ -23,8 +23,9 @@ function readStdin() {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
function getPluginRoot() {
|
|
26
|
-
const
|
|
26
|
+
const os = require('os');
|
|
27
27
|
const repoStyleRoot = path.resolve(__dirname, '..', '..');
|
|
28
|
+
const awEccHome = path.join(os.homedir(), '.aw-ecc');
|
|
28
29
|
|
|
29
30
|
if (
|
|
30
31
|
fs.existsSync(path.join(repoStyleRoot, 'package.json'))
|
|
@@ -34,7 +35,11 @@ function getPluginRoot() {
|
|
|
34
35
|
return repoStyleRoot;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
if (fs.existsSync(path.join(awEccHome, 'scripts', 'lib', 'aw-usage-telemetry.js'))) {
|
|
39
|
+
return awEccHome;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return path.resolve(__dirname, '..');
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
function transformToClaude(cursorInput, overrides = {}) {
|
|
@@ -43,12 +48,17 @@ function transformToClaude(cursorInput, overrides = {}) {
|
|
|
43
48
|
const inferredToolName = cursorInput.tool_name
|
|
44
49
|
|| (server && tool ? `mcp__${server}__${tool}` : '');
|
|
45
50
|
|
|
51
|
+
// Preserve original tool_input fields (skill, subagent_type, description, etc.)
|
|
52
|
+
const originalToolInput = cursorInput.tool_input || {};
|
|
53
|
+
|
|
46
54
|
return {
|
|
47
55
|
tool_name: inferredToolName,
|
|
48
56
|
server,
|
|
49
57
|
tool,
|
|
58
|
+
exit_code: cursorInput.exit_code,
|
|
50
59
|
tool_input: {
|
|
51
|
-
|
|
60
|
+
...originalToolInput,
|
|
61
|
+
command: cursorInput.command || cursorInput.args?.command || originalToolInput.command || '',
|
|
52
62
|
file_path: cursorInput.path || cursorInput.file || cursorInput.args?.filePath || '',
|
|
53
63
|
server,
|
|
54
64
|
mcp_server: server,
|
|
@@ -60,7 +70,28 @@ function transformToClaude(cursorInput, overrides = {}) {
|
|
|
60
70
|
output: cursorInput.output || cursorInput.result || '',
|
|
61
71
|
...overrides.tool_output,
|
|
62
72
|
},
|
|
73
|
+
tool_response: {
|
|
74
|
+
exit_code: cursorInput.exit_code,
|
|
75
|
+
output: cursorInput.output || cursorInput.result || '',
|
|
76
|
+
},
|
|
63
77
|
transcript_path: cursorInput.transcript_path || cursorInput.transcriptPath || cursorInput.session?.transcript_path || '',
|
|
78
|
+
// Cursor common schema fields surfaced at top level for buildEvent()
|
|
79
|
+
generation_id: cursorInput.generation_id,
|
|
80
|
+
conversation_id: cursorInput.conversation_id,
|
|
81
|
+
workspace_roots: cursorInput.workspace_roots,
|
|
82
|
+
model: cursorInput.model,
|
|
83
|
+
user_email: cursorInput.user_email,
|
|
84
|
+
cursor_version: cursorInput.cursor_version,
|
|
85
|
+
status: cursorInput.status,
|
|
86
|
+
reason: cursorInput.reason,
|
|
87
|
+
// Token fields — Cursor sends these on afterAgentResponse and stop hooks
|
|
88
|
+
input_tokens: cursorInput.input_tokens,
|
|
89
|
+
output_tokens: cursorInput.output_tokens,
|
|
90
|
+
cache_read_tokens: cursorInput.cache_read_tokens,
|
|
91
|
+
cache_write_tokens: cursorInput.cache_write_tokens,
|
|
92
|
+
// Subagent fields
|
|
93
|
+
task: cursorInput.task,
|
|
94
|
+
description: cursorInput.description,
|
|
64
95
|
_cursor: {
|
|
65
96
|
conversation_id: cursorInput.conversation_id,
|
|
66
97
|
hook_event_name: cursorInput.hook_event_name,
|
|
@@ -100,7 +131,13 @@ function runExistingHook(scriptName, stdinData) {
|
|
|
100
131
|
path.join(root, 'scripts', 'hooks', scriptName),
|
|
101
132
|
path.join(root, 'hooks', scriptName),
|
|
102
133
|
];
|
|
103
|
-
const scriptPath = candidates.find(candidate => fs.existsSync(candidate))
|
|
134
|
+
const scriptPath = candidates.find(candidate => fs.existsSync(candidate));
|
|
135
|
+
if (!scriptPath) {
|
|
136
|
+
if (process.env.AW_HOOK_DEBUG === '1') {
|
|
137
|
+
process.stderr.write(`[aw] Cannot find hook script: ${scriptName}\n`);
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
104
141
|
return runManagedCommand('node', [scriptPath], stdinData);
|
|
105
142
|
}
|
|
106
143
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cursor afterAgentResponse hook.
|
|
4
|
+
*
|
|
5
|
+
* Fires after EVERY assistant response with token counts directly in the
|
|
6
|
+
* payload. Emits a `response_completed` telemetry event with tokens, cost,
|
|
7
|
+
* and the full common schema fields surfaced by adapter.js.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { readStdin, transformToClaude, getPluginRoot } = require('./adapter');
|
|
14
|
+
|
|
15
|
+
readStdin().then(raw => {
|
|
16
|
+
try {
|
|
17
|
+
const root = getPluginRoot();
|
|
18
|
+
const { buildEvent, sendAsync } = require(path.join(root, 'scripts', 'lib', 'aw-usage-telemetry'));
|
|
19
|
+
const { estimateCost, toNumber } = require(path.join(root, 'scripts', 'lib', 'aw-pricing'));
|
|
20
|
+
|
|
21
|
+
const input = JSON.parse(raw);
|
|
22
|
+
const claudeInput = transformToClaude(input);
|
|
23
|
+
|
|
24
|
+
const model = input.model || claudeInput.model || null;
|
|
25
|
+
const inputTokens = toNumber(input.input_tokens);
|
|
26
|
+
const outputTokens = toNumber(input.output_tokens);
|
|
27
|
+
const cacheReadTokens = toNumber(input.cache_read_tokens);
|
|
28
|
+
const cacheWriteTokens = toNumber(input.cache_write_tokens);
|
|
29
|
+
|
|
30
|
+
const payload = {
|
|
31
|
+
stop_reason: input.status || 'end_turn',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
if (model) {
|
|
35
|
+
payload.model = model;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (inputTokens || outputTokens) {
|
|
39
|
+
payload.input_tokens = inputTokens;
|
|
40
|
+
payload.output_tokens = outputTokens;
|
|
41
|
+
payload.estimated_cost_usd = estimateCost(model, inputTokens, outputTokens, {
|
|
42
|
+
cacheReadTokens: cacheReadTokens,
|
|
43
|
+
cacheWriteTokens: cacheWriteTokens,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (cacheReadTokens || cacheWriteTokens) {
|
|
48
|
+
payload.cache_read_tokens = cacheReadTokens;
|
|
49
|
+
payload.cache_create_tokens = cacheWriteTokens;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const event = buildEvent(claudeInput, 'response_completed', payload);
|
|
53
|
+
if (model && !event.model) {
|
|
54
|
+
event.model = model;
|
|
55
|
+
}
|
|
56
|
+
sendAsync(event);
|
|
57
|
+
} catch {
|
|
58
|
+
// Telemetry is non-blocking.
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
process.stdout.write('{}');
|
|
62
|
+
}).catch(() => process.exit(0));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const { readStdin, runManagedShellHook } = require('./adapter');
|
|
2
|
+
const { readStdin, runManagedShellHook, runExistingHook, transformToClaude } = require('./adapter');
|
|
3
3
|
|
|
4
4
|
function emitAwPromptReminder(raw) {
|
|
5
5
|
const result = runManagedShellHook('scripts/hooks/shared/user-prompt-submit.sh', raw);
|
|
@@ -37,5 +37,11 @@ readStdin().then(raw => {
|
|
|
37
37
|
} catch (_error) {
|
|
38
38
|
// Reminder emission is advisory and should not break the prompt flow.
|
|
39
39
|
}
|
|
40
|
+
try {
|
|
41
|
+
const claudePayload = transformToClaude(JSON.parse(raw));
|
|
42
|
+
runExistingHook('aw-usage-prompt-submit.js', JSON.stringify(claudePayload));
|
|
43
|
+
} catch (_error) {
|
|
44
|
+
// Telemetry is best-effort and should not block prompt submission.
|
|
45
|
+
}
|
|
40
46
|
process.stdout.write(raw);
|
|
41
47
|
}).catch(() => process.exit(0));
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cursor postToolUseFailure hook — fires when any tool fails, times out, or is denied.
|
|
4
|
+
*
|
|
5
|
+
* Cursor payload: tool_name, tool_input, error_message, failure_type, duration
|
|
6
|
+
* Routes to the shared aw-usage-post-tool-use-failure.js telemetry handler.
|
|
7
|
+
*/
|
|
8
|
+
const { readStdin, transformToClaude, runExistingHook } = require('./adapter');
|
|
9
|
+
|
|
10
|
+
readStdin().then(raw => {
|
|
11
|
+
try {
|
|
12
|
+
const input = JSON.parse(raw);
|
|
13
|
+
const claudePayload = transformToClaude(input);
|
|
14
|
+
// Pass through Cursor's native error fields — the shared handler normalizes them
|
|
15
|
+
claudePayload.tool_name = input.tool_name || 'unknown';
|
|
16
|
+
claudePayload.error_message = input.error_message || '';
|
|
17
|
+
claudePayload.failure_type = input.failure_type || 'error';
|
|
18
|
+
runExistingHook('aw-usage-post-tool-use-failure.js', JSON.stringify(claudePayload));
|
|
19
|
+
} catch {}
|
|
20
|
+
process.stdout.write(raw);
|
|
21
|
+
}).catch(() => process.exit(0));
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cursor postToolUse hook — fires after ALL tool completions.
|
|
4
|
+
*
|
|
5
|
+
* Shell/Edit/MCP are already handled by afterShellExecution, afterFileEdit,
|
|
6
|
+
* afterMCPExecution via the phase adapter. This handler covers tools those
|
|
7
|
+
* miss — primarily Read (for skill_invoked detection).
|
|
8
|
+
*/
|
|
9
|
+
const { readStdin, transformToClaude, runExistingHook } = require('./adapter');
|
|
10
|
+
|
|
11
|
+
// Tools already covered by specific after* hooks — skip to avoid duplicates
|
|
12
|
+
const COVERED_TOOLS = new Set([
|
|
13
|
+
'shell', 'bash', 'terminal', // afterShellExecution
|
|
14
|
+
'edit', 'write', 'file_edit', // afterFileEdit
|
|
15
|
+
'mcp', 'mcp_tool', // afterMCPExecution
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
readStdin().then(raw => {
|
|
19
|
+
try {
|
|
20
|
+
const input = JSON.parse(raw);
|
|
21
|
+
const toolName = (input.tool_name || '').toLowerCase();
|
|
22
|
+
|
|
23
|
+
// Skip tools already covered by specific hooks
|
|
24
|
+
if (COVERED_TOOLS.has(toolName)) {
|
|
25
|
+
process.stdout.write(raw);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Transform and route to the shared telemetry handler
|
|
30
|
+
const claudePayload = transformToClaude(input);
|
|
31
|
+
claudePayload.tool_name = input.tool_name || 'Read';
|
|
32
|
+
claudePayload.tool_input = {
|
|
33
|
+
...claudePayload.tool_input,
|
|
34
|
+
file_path: input.tool_input?.file_path || input.tool_input?.path || '',
|
|
35
|
+
};
|
|
36
|
+
runExistingHook('aw-usage-post-tool-use.js', JSON.stringify(claudePayload));
|
|
37
|
+
} catch {}
|
|
38
|
+
process.stdout.write(raw);
|
|
39
|
+
}).catch(() => process.exit(0));
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
const PHASE_NAMES = Object.freeze({
|
|
2
|
+
SESSION_START: 'session-start',
|
|
3
|
+
USER_PROMPT_SUBMIT: 'user-prompt-submit',
|
|
4
|
+
PRE_TOOL_USE_SHELL: 'pre-tool-use-shell',
|
|
5
|
+
PRE_TOOL_USE_MCP: 'pre-tool-use-mcp',
|
|
6
|
+
POST_TOOL_USE_SHELL: 'post-tool-use-shell',
|
|
7
|
+
POST_TOOL_USE_FILE_EDIT: 'post-tool-use-file-edit',
|
|
8
|
+
POST_TOOL_USE_MCP: 'post-tool-use-mcp',
|
|
9
|
+
PRE_COMPACT: 'pre-compact',
|
|
10
|
+
SESSION_END: 'session-end',
|
|
11
|
+
STOP: 'stop',
|
|
12
|
+
});
|
|
13
|
+
|
|
1
14
|
const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
2
15
|
'session-start': [
|
|
3
16
|
{
|
|
@@ -8,6 +21,13 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
8
21
|
payloadMode: 'raw',
|
|
9
22
|
outputMode: 'cursor-session-start',
|
|
10
23
|
},
|
|
24
|
+
{
|
|
25
|
+
hookId: 'telemetry:session-start',
|
|
26
|
+
allowedProfiles: ['minimal', 'standard', 'strict'],
|
|
27
|
+
runner: 'node',
|
|
28
|
+
relativeScriptPath: 'scripts/hooks/aw-usage-session-start.js',
|
|
29
|
+
payloadMode: 'claude',
|
|
30
|
+
},
|
|
11
31
|
],
|
|
12
32
|
'user-prompt-submit': [
|
|
13
33
|
{
|
|
@@ -15,6 +35,13 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
15
35
|
relativeScriptPath: '.cursor/hooks/shared/user-prompt-submit.sh',
|
|
16
36
|
payloadMode: 'raw',
|
|
17
37
|
},
|
|
38
|
+
{
|
|
39
|
+
hookId: 'telemetry:prompt-submit',
|
|
40
|
+
allowedProfiles: ['minimal', 'standard', 'strict'],
|
|
41
|
+
runner: 'node',
|
|
42
|
+
relativeScriptPath: 'scripts/hooks/aw-usage-prompt-submit.js',
|
|
43
|
+
payloadMode: 'claude',
|
|
44
|
+
},
|
|
18
45
|
],
|
|
19
46
|
'pre-tool-use-shell': [
|
|
20
47
|
{
|
|
@@ -70,6 +97,13 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
70
97
|
relativeScriptPath: 'scripts/hooks/post-bash-build-complete.js',
|
|
71
98
|
payloadMode: 'claude',
|
|
72
99
|
},
|
|
100
|
+
{
|
|
101
|
+
hookId: 'telemetry:post-tool-use',
|
|
102
|
+
allowedProfiles: ['minimal', 'standard', 'strict'],
|
|
103
|
+
runner: 'node',
|
|
104
|
+
relativeScriptPath: 'scripts/hooks/aw-usage-post-tool-use.js',
|
|
105
|
+
payloadMode: 'claude',
|
|
106
|
+
},
|
|
73
107
|
],
|
|
74
108
|
'post-tool-use-file-edit': [
|
|
75
109
|
{
|
|
@@ -100,6 +134,13 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
100
134
|
relativeScriptPath: 'scripts/hooks/post-edit-console-warn.js',
|
|
101
135
|
payloadMode: 'claude',
|
|
102
136
|
},
|
|
137
|
+
{
|
|
138
|
+
hookId: 'telemetry:post-tool-use',
|
|
139
|
+
allowedProfiles: ['minimal', 'standard', 'strict'],
|
|
140
|
+
runner: 'node',
|
|
141
|
+
relativeScriptPath: 'scripts/hooks/aw-usage-post-tool-use.js',
|
|
142
|
+
payloadMode: 'claude',
|
|
143
|
+
},
|
|
103
144
|
],
|
|
104
145
|
'post-tool-use-mcp': [
|
|
105
146
|
{
|
|
@@ -109,6 +150,13 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
109
150
|
relativeScriptPath: 'scripts/hooks/post-mcp-log.js',
|
|
110
151
|
payloadMode: 'raw',
|
|
111
152
|
},
|
|
153
|
+
{
|
|
154
|
+
hookId: 'telemetry:post-tool-use',
|
|
155
|
+
allowedProfiles: ['minimal', 'standard', 'strict'],
|
|
156
|
+
runner: 'node',
|
|
157
|
+
relativeScriptPath: 'scripts/hooks/aw-usage-post-tool-use.js',
|
|
158
|
+
payloadMode: 'claude',
|
|
159
|
+
},
|
|
112
160
|
],
|
|
113
161
|
'pre-compact': [
|
|
114
162
|
{
|
|
@@ -125,6 +173,8 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
125
173
|
relativeScriptPath: 'scripts/hooks/session-end-marker.js',
|
|
126
174
|
payloadMode: 'claude',
|
|
127
175
|
},
|
|
176
|
+
// telemetry:session-end removed — afterAgentResponse hook now emits
|
|
177
|
+
// response_completed per turn with direct token/cost data from Cursor.
|
|
128
178
|
],
|
|
129
179
|
stop: [
|
|
130
180
|
{
|
|
@@ -155,6 +205,8 @@ const SHARED_AW_PHASE_STEPS = Object.freeze({
|
|
|
155
205
|
relativeScriptPath: 'scripts/hooks/cost-tracker.js',
|
|
156
206
|
payloadMode: 'claude',
|
|
157
207
|
},
|
|
208
|
+
// telemetry:stop removed — Cursor fires both sessionEnd and stop,
|
|
209
|
+
// causing duplicate session_ended events. Telemetry is in session-end phase only.
|
|
158
210
|
],
|
|
159
211
|
});
|
|
160
212
|
|
|
@@ -167,6 +219,7 @@ function getSharedAwPhaseSteps(phaseName) {
|
|
|
167
219
|
}
|
|
168
220
|
|
|
169
221
|
module.exports = {
|
|
222
|
+
PHASE_NAMES,
|
|
170
223
|
SHARED_AW_PHASE_STEPS,
|
|
171
224
|
getSharedAwPhaseSteps,
|
|
172
225
|
};
|
|
@@ -39,7 +39,9 @@ function formatCursorSessionStartOutput(stdout, fallbackRaw) {
|
|
|
39
39
|
if (typeof additionalContext === 'string' && additionalContext.trim() !== '') {
|
|
40
40
|
return `${JSON.stringify({ additional_context: additionalContext }, null, 2)}\n`;
|
|
41
41
|
}
|
|
42
|
-
} catch {
|
|
42
|
+
} catch (_error) {
|
|
43
|
+
return fallbackRaw;
|
|
44
|
+
}
|
|
43
45
|
|
|
44
46
|
return fallbackRaw;
|
|
45
47
|
}
|
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const { readStdin } = require('./adapter');
|
|
2
|
+
const { readStdin, transformToClaude, runExistingHook } = require('./adapter');
|
|
3
3
|
readStdin().then(raw => {
|
|
4
4
|
try {
|
|
5
5
|
const input = JSON.parse(raw);
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
// Cursor subagentStart payload fields (from docs):
|
|
7
|
+
// subagent_id, subagent_type, task, parent_conversation_id, subagent_model, is_parallel_worker
|
|
8
|
+
const agentType = input.subagent_type || 'general-purpose';
|
|
9
|
+
const task = input.task || input.description || '';
|
|
10
|
+
console.error(`[ECC] Agent spawned: ${agentType} (${task.slice(0, 80)})`);
|
|
11
|
+
|
|
12
|
+
// Dispatch agent_spawned telemetry
|
|
13
|
+
const claudePayload = transformToClaude(input);
|
|
14
|
+
claudePayload.tool_name = 'Agent';
|
|
15
|
+
claudePayload.tool_input = {
|
|
16
|
+
...claudePayload.tool_input,
|
|
17
|
+
subagent_type: agentType,
|
|
18
|
+
description: task.slice(0, 200),
|
|
19
|
+
subagent_id: input.subagent_id || '',
|
|
20
|
+
subagent_model: input.subagent_model || '',
|
|
21
|
+
is_parallel_worker: input.is_parallel_worker || false,
|
|
22
|
+
};
|
|
23
|
+
runExistingHook('aw-usage-post-tool-use.js', JSON.stringify(claudePayload));
|
|
24
|
+
} catch {
|
|
25
|
+
// Telemetry is best-effort
|
|
26
|
+
}
|
|
9
27
|
process.stdout.write(raw);
|
|
10
28
|
}).catch(() => process.exit(0));
|
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { readStdin, transformToClaude, getPluginRoot } = require('./adapter');
|
|
3
4
|
readStdin().then(raw => {
|
|
4
5
|
try {
|
|
5
6
|
const input = JSON.parse(raw);
|
|
6
7
|
const agent = input.agent_name || input.agent || 'unknown';
|
|
7
8
|
console.error(`[ECC] Agent completed: ${agent}`);
|
|
9
|
+
|
|
10
|
+
// Usage telemetry — Cursor-only rich agent_completed event.
|
|
11
|
+
try {
|
|
12
|
+
const root = getPluginRoot();
|
|
13
|
+
const { buildEvent, sendAsync } = require(path.join(root, 'scripts', 'lib', 'aw-usage-telemetry'));
|
|
14
|
+
const claudeInput = transformToClaude(input);
|
|
15
|
+
sendAsync(buildEvent(claudeInput, 'agent_completed', {
|
|
16
|
+
agent_type: input.subagent_type || input.agent_name || agent,
|
|
17
|
+
status: input.status || 'unknown',
|
|
18
|
+
duration_ms: input.duration_ms || null,
|
|
19
|
+
tool_call_count: input.tool_call_count || null,
|
|
20
|
+
modified_files: input.modified_files || [],
|
|
21
|
+
}));
|
|
22
|
+
} catch {
|
|
23
|
+
// Telemetry is non-blocking.
|
|
24
|
+
}
|
|
8
25
|
} catch {}
|
|
9
26
|
process.stdout.write(raw);
|
|
10
27
|
}).catch(() => process.exit(0));
|
package/.cursor/hooks.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"hooks": {
|
|
4
4
|
"sessionStart": [
|
|
5
5
|
{
|
|
6
|
-
"command": "bash -
|
|
6
|
+
"command": "bash -c 'f=\"$PWD/.cursor/hooks/session-start.sh\"; [ -f \"$f\" ] || f=\"$HOME/.cursor/hooks/session-start.sh\"; exec bash \"$f\"'",
|
|
7
7
|
"event": "sessionStart",
|
|
8
8
|
"description": "Load previous context and detect environment"
|
|
9
9
|
}
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
],
|
|
65
65
|
"beforeSubmitPrompt": [
|
|
66
66
|
{
|
|
67
|
-
"command": "bash -
|
|
67
|
+
"command": "bash -c 'f=\"$PWD/.cursor/hooks/before-submit-prompt.sh\"; [ -f \"$f\" ] || f=\"$HOME/.cursor/hooks/before-submit-prompt.sh\"; exec bash \"$f\"'",
|
|
68
68
|
"event": "beforeSubmitPrompt",
|
|
69
69
|
"description": "Detect secrets in prompts (sk-, ghp_, AKIA patterns)"
|
|
70
70
|
}
|
|
@@ -83,6 +83,20 @@
|
|
|
83
83
|
"description": "Log agent completion"
|
|
84
84
|
}
|
|
85
85
|
],
|
|
86
|
+
"postToolUse": [
|
|
87
|
+
{
|
|
88
|
+
"command": "node -e \"const fs=require('fs');const path=require('path');const os=require('os');const scriptName=\\\"post-tool-use.js\\\";const candidates=[path.join(process.cwd(), '.cursor', 'hooks', scriptName),path.join(os.homedir(), '.cursor', 'hooks', scriptName)];const target=candidates.find(candidate => fs.existsSync(candidate));if(!target) process.exit(0);require(target)\"",
|
|
89
|
+
"event": "postToolUse",
|
|
90
|
+
"description": "Telemetry: skill_invoked detection for Read tool and other non-shell/edit/MCP tools"
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"postToolUseFailure": [
|
|
94
|
+
{
|
|
95
|
+
"command": "node -e \"const fs=require('fs');const path=require('path');const os=require('os');const scriptName=\\\"post-tool-use-failure.js\\\";const candidates=[path.join(process.cwd(), '.cursor', 'hooks', scriptName),path.join(os.homedir(), '.cursor', 'hooks', scriptName)];const target=candidates.find(candidate => fs.existsSync(candidate));if(!target) process.exit(0);require(target)\"",
|
|
96
|
+
"event": "postToolUseFailure",
|
|
97
|
+
"description": "Telemetry: tool_error detection on tool failure/timeout/denial"
|
|
98
|
+
}
|
|
99
|
+
],
|
|
86
100
|
"beforeTabFileRead": [
|
|
87
101
|
{
|
|
88
102
|
"command": "node -e \"const fs=require('fs');const path=require('path');const os=require('os');const scriptName=\\\"before-tab-file-read.js\\\";const candidates=[path.join(process.cwd(), '.cursor', 'hooks', scriptName),path.join(os.homedir(), '.cursor', 'hooks', scriptName)];const target=candidates.find(candidate => fs.existsSync(candidate));if(!target) process.exit(0);require(target)\"",
|
|
@@ -104,6 +118,13 @@
|
|
|
104
118
|
"description": "Save state before context compaction"
|
|
105
119
|
}
|
|
106
120
|
],
|
|
121
|
+
"afterAgentResponse": [
|
|
122
|
+
{
|
|
123
|
+
"command": "node -e \"const fs=require('fs');const path=require('path');const os=require('os');const scriptName=\\\"after-agent-response.js\\\";const candidates=[path.join(process.cwd(), '.cursor', 'hooks', scriptName),path.join(os.homedir(), '.cursor', 'hooks', scriptName)];const target=candidates.find(candidate => fs.existsSync(candidate));if(!target) process.exit(0);require(target)\"",
|
|
124
|
+
"event": "afterAgentResponse",
|
|
125
|
+
"description": "Telemetry: response_completed with tokens and cost per turn"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
107
128
|
"stop": [
|
|
108
129
|
{
|
|
109
130
|
"command": "node -e \"const fs=require('fs');const path=require('path');const os=require('os');const scriptName=\\\"stop.js\\\";const candidates=[path.join(process.cwd(), '.cursor', 'hooks', scriptName),path.join(os.homedir(), '.cursor', 'hooks', scriptName)];const target=candidates.find(candidate => fs.existsSync(candidate));if(!target) process.exit(0);require(target)\"",
|
package/.opencode/package.json
CHANGED
package/AGENTS.md
CHANGED
|
@@ -4,11 +4,11 @@ Use the repo-local AW SDLC files as the source of truth for routing and stage be
|
|
|
4
4
|
|
|
5
5
|
## Catalog Snapshot
|
|
6
6
|
|
|
7
|
-
Catalog snapshot: providing 28 specialized agents,
|
|
7
|
+
Catalog snapshot: providing 28 specialized agents, 173 skills, 72 commands for repo-local AW SDLC routing.
|
|
8
8
|
|
|
9
9
|
agents/ - 28 specialized subagents
|
|
10
|
-
skills/ -
|
|
11
|
-
commands/ -
|
|
10
|
+
skills/ - 173 workflow skills and domain knowledge
|
|
11
|
+
commands/ - 72 slash commands
|
|
12
12
|
|
|
13
13
|
## Public Surface
|
|
14
14
|
|