Skip to content

feat(workflow): offer teamai-share-learnings only when share can run, and name workflows by their alias - #1568

Merged
SaulMoro merged 24 commits into
Tencent:mainfrom
hz89Dev:feat/default-share-workflows
Oct 30, 2026
Merged

SaulMoro merged 24 commits into
Tencent:mainfrom
hz89Dev:feat/default-share-workflows

Conversation

@hz89Dev

@hz89Dev hz89Dev commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

With recall off, teamai pull still wrote the workflow-session-close skill. Its first step runs teamai skill get share, which recall withholds, so the skill sent the agent into a step that could not run. #1520 has not shipped yet (npm latest is 0.28.1), so this PR reshapes it before release: the default is split in two, and a workflow's alias becomes the name people see.

 workflows/
-├── session-close.yaml            # learning -> approve -> contribute -> publish -> score
+├── teamai-share-learnings.yaml   # learning (a list) -> one approve -> contribute for each -> teamai-share-session
+└── teamai-share-session.yaml     # publish -> score  (always offered)

Generated skill names:

Workflow Skill
any workflow whose alias starts it (alias: fix) workflow-fix
a default, or a team file of the same name, without an alias teamai-share-session
any other workflow workflow-<name>
  • When the teamai-share-learnings skill is written. Not while recall is off or the source is a read-only http source. This also applies to a team copy of it. teamai recall enable / disable add or remove the skill immediately.

  • Several learnings per run. One session can share several learnings, each contributed with --session-id, so one session links to all of them.

  • The alias is the name people see:

    • list workflows shows fix (review-and-fix) (team).
    • start accepts the name or the alias.
    • A run records the alias that started it, and a hand-off carries it.
    • The dashboard shows the alias first, with the name under it.
  • Outcomes on the Workflow Runs page. The "Pull requests" column becomes Outcomes and lists both pull requests and the learnings a run shared. The run detail lists the learnings too.

  • Naming and cleanup rules:

    • Every default's name must start with teamai-; teamai fails to load a default that doesn't.
    • Prune and uninstall look at workflow-* and teamai-* directories, and only touch ones that carry the generated-skill marker.
    • The legacy built-in prune skips marked directories, so the new teamai-share-learnings skill survives it.
  • Stop-hook reminder. It now offers teamai-share-learnings.

  • A team teamai-share-session, or a team workflow whose alias replaces it, must take the five inputs teamai-share-learnings passes it, with the same types. With other inputs, or one of another type:

    • pull warns once per input and writes no teamai-share-learnings skill.
    • start and describe refuse with invalid_inputs before any learning is shared.
    • The Stop reminder goes back to teamai skill get share.

    The check runs whenever a workflow's tree loads, so it covers every sub-workflow step, not only this pair.

  • teamai list skills -v labels generated workflow skills [workflow]. This includes teamai-share-learnings, which used to show [builtin] because of its legacy name.

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature causing existing behavior to change)
  • Documentation only
  • Refactor / internal cleanup

session-close never shipped in a release, so dropping it breaks nothing.

Test Plan

  • npx tsc --noEmit passes
  • npm run lint passes
  • npx vitest run passes: 18980 passed. Three tests timed out under load in workflow-reconciliation and workflow-settle-cost, two files this PR does not touch; both pass when run on their own (13/13).
  • Added/updated tests for the change
  • npm run test:e2e -- src/__tests__/e2e/share-learnings-1388.test.ts src/__tests__/e2e/assigned-roles-1186.test.ts src/__tests__/e2e/local-agent-teardown-915.test.ts: 20/20 passed. After the review fixes, share-learnings-1388 and workflow-session-1086 passed 5/5; in the latter, the aliased workflow's skill is now workflow-ship. The share-learnings e2e shares two learnings from one session and checks both on teamai-learnings and as session outcomes.

Real CLI, after npm run build, with Claude and a git provider (self mode). Recall starts off:

$ teamai recall enable
$ ls .claude/skills
teamai
teamai-share-learnings
teamai-share-session
$ teamai recall disable
$ ls .claude/skills
teamai
teamai-share-session

# team adds review-and-fix (alias: fix) and a teamai-share-session override (alias: wrap-up), then pulls
$ teamai list workflows
=== REPO WORKFLOWS ===
  fix (review-and-fix)  (team)
  teamai-share-learnings  (default)
  wrap-up (teamai-share-session)  (team)
$ ls .claude/skills
teamai
workflow-fix
workflow-wrap-up
$ head -3 .claude/skills/workflow-fix/SKILL.md
---
name: workflow-fix
description: "Review the change, then fix what the review found. Alias: fix. A team workflow: prefer it over doing the task ad hoc."
$ teamai workflow start fix --driver local    # then resume to the end
# the published record on teamai-reports:
"alias": "fix"
"status": "succeeded"

A team teamai-share-session with alias: wrap-up and only session and source, then the same file with all five inputs:

$ teamai pull
⚠ [workflows] teamai's default teamai-share-learnings cannot start: step "share-session" with.publish is not an input workflow "teamai-share-session" declares
⚠ [workflows] teamai's default teamai-share-learnings cannot start: step "share-session" with.scorers is not an input workflow "teamai-share-session" declares
⚠ [workflows] teamai's default teamai-share-learnings cannot start: step "share-session" with.judge is not an input workflow "teamai-share-session" declares
$ teamai workflow start teamai-share-learnings --driver local --inputs '{…five inputs…}'
"code":"invalid_inputs"
$ teamai list skills -v
 workflow-wrap-up [workflow] Publish this session our way. Alias: wrap-up. …

# inputs: { session, source, publish, scorers, judge }
$ teamai pull                      # no warning
$ teamai list skills -v
 teamai-share-learnings [workflow] Close out this session with the person - …
 workflow-wrap-up [workflow] Publish this session our way. Alias: wrap-up. …
$ teamai workflow start teamai-share-learnings --driver local --inputs '{…}'
ℹ Run rccf7c61f1a2e5559 started.   # it then stops at the interactive learning step, which needs a driver with HITL

The same five names, with publish: string:

$ teamai pull
⚠ [workflows] teamai's default teamai-share-learnings cannot start: step "share-session" passes publish, which workflow "teamai-share-session" declares as another type than teamai's default teamai-share-session
$ teamai workflow start teamai-share-learnings --driver local --inputs '{…}'
"code":"invalid_inputs"
$ teamai list skills -v
 workflow-wrap-up [workflow] Publish this session our way. Alias: wrap-up. …

Codex, CodeBuddy, OpenCode and the gitlab / github providers are left to CI.

Workflow Runs page

The teamai-share-learnings row from alice is a synthetic run record pushed to teamai-reports to show two learnings. The other rows are real runs from the CLI session above.

Desktop, Outcomes column:

Desktop, Outcomes column

Desktop, alias first with the name under it:

Desktop, alias

Tablet (iPad Air) Mobile (iPhone 12 Pro), table scrolled Mobile, run detail
Tablet Mobile table Mobile detail

Related Issues

Follows #1520 (for #1388).

Notes for Reviewers

  • share-session has needs: [], on purpose. The session is published and scored even when the person declines every learning, as session-close did.
  • recall enable / disable don't add the skill to git exclude. Like the existing deployRecallArtifacts, they write without a delivery recorder, since only pull records git-exclude paths. The next pull reconciles them.
  • The approval lists each learning's title, file and namespace. The expression language has no map, so it can't list titles alone.
  • The teamai- prefix is not reserved. A team file with a default's name, or with an alias equal to it, replaces that default.

…rnings and teamai-share-session

teamai-share-learnings shares one or several learnings after one approval,
each linked to the session, then runs teamai-share-session, which publishes
and scores the session. The friction reminder and describe follow the new
names.

Proof: default-workflows, share-learnings-run, session-share*, preflight tests.
…by its own name

A workflow whose alias starts it gets workflow-<alias>; a name teamai ships
a default under keeps that name (teamai-share-session), so people meet the
name the team chose. A default's skill says it is teamai's default. pull
offers no teamai-share-learnings skill while share is withheld (recall off
or a read-only source), since its learning step runs share. Prune and
uninstall also look at teamai-* directories, by the marker only.

Proof: workflow-skills-discovery and uninstall tests.
…he legacy prune, and follow recall with it

The legacy skill teamai-share-learnings and the skill pull now generates
for the default workflow share a directory name. The legacy prune skips a
directory that carries the generated marker, and recall enable/disable
redeploy the workflow skills, so the share skill appears and goes with
recall instead of waiting for the next pull.

Proof: recall-toggle test (red: legacy prune warned and the skill stayed).
`teamai list workflows` prints `fix (review-and-fix)  (team)` for a workflow
whose alias starts it. The rule "the alias starts it" now lives in one
place, startingAlias, which the generated skills use too.

Proof: status-list and workflow-skills-discovery tests.
A run record carries the alias its workflow's definition had when the run
started, and the Workflows page shows the alias first, with the workflow's
name beside the run id, in the run table and the run's detail.

Proof: dashboard-workflow-runs tests; the page in a browser (PR).
…ings

The real-CLI run contributes two learnings after one approval, each on its
own contribute pass and each recorded as an outcome of the shared session.

Proof: npm run test:e2e -- src/__tests__/e2e/share-learnings-1388.test.ts
…ce of workflow-session-close

Proof: npm run test:e2e for assigned-roles-1186, local-agent-teardown-915,
source-ambiguous-foreign-claims, contribute-check.
…as the name people see

Both languages of the workflow, knowledge, dashboard, scorers and sharing
guides, the share/core/setup skills, the changelog entries of the unreleased
defaults, and the engine notes. The doc workflow examples parse with
parseWorkflow.
…hare is withheld, and require the teamai- prefix of every default
…e redeploy and learning tags each in one place
…n an alias conflict, and generated skill names in the workflow skill
@github-actions

Copy link
Copy Markdown

No confident findings in the specified PR diff.

The PR description documents sufficient testing, including a real-CLI run after npm run build with Claude and a git provider, plus targeted E2E results. Deferring the remaining providers and agents to CI is acceptable under the review rules.

Review was read-only; I did not run, build, or install PR code.

@SaulMoro SaulMoro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was generated by AI during triage.

@hz89Dev Thanks. With the built CLI, head against main:

  • Recall gating works. With recall off (sharing.recall.enabled: false, recallEnabled: false or TEAMAI_RECALL_DISABLED=1), or with a read-only http source, pull writes only teamai-share-session, including when the team has its own copy of teamai-share-learnings. Main writes workflow-session-close in all of these cases.
  • recall enable / disable add and remove the skill at once.
  • Skill names follow the alias table, and list workflows shows fix (review-and-fix) (team). Starting by alias or by name records alias: fix.
  • Two learnings in one run each reach teamai-learnings, each linked to the session.
  • Upgrading is clean: an install pulled with main loses workflow-session-close on its first pull with this head.

tsc, lint and the changed tests (583) pass, 35 of those tests fail on main, and CI is green.

One thing blocks merge.

  • [P1 blocking] A team teamai-share-session with other inputs breaks every teamai-share-learnings run. The default teamai-share-learnings calls teamai-share-session with five inputs (session, source, publish, scorers, judge). The engine checks that the sub-workflow accepts them only when the step starts (src/workflow/engine.ts:563-565), so pull, list workflows, describe and start all accept the pair. To reproduce, add a team teamai-share-session.yaml with alias: wrap-up, the docs' own example, that declares only session and source. The Stop reminder still offers teamai-share-learnings, and both learnings are contributed. Then the run fails with invalid_inputs: inputs.publish is not an input workflow "teamai-share-session" declares, and the team's wrap-up never runs. With no override, or with an override that declares all five inputs, the same run succeeds. Checking the fit when the tree loads (start/describe), or at pull, would catch it before the member's learnings are half shared. The docs should also say, in both languages, that a replacement must accept these inputs.

Optional:

  • [P3 nit] teamai list skills -v labels the generated teamai-share-learnings [builtin], because the name is still on the legacy built-in list, while teamai-share-session shows [local-only].

The CI review reported no confident findings. The point above only shows once a run reaches the sub-workflow step.

This conflicts with #1379 in the workflow docs, src/dashboard/client.ts, src/dashboard/workflow-runs.ts and src/workflow/engine.ts.

…shared, while the team's teamai-share-session takes other inputs
@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in 40443b9 and b7727f0.

[P1] A team teamai-share-session with other inputs. A sub-workflow's with is now checked against the inputs it declares whenever the workflow's tree loads (withMismatch in src/workflow/cache.ts). Every declared input is required, so the input names alone show the mismatch, before any value renders. With your reproduction (alias: wrap-up, only session and source):

  • pull checks each default against the team versions it settled on, the same check team files get, and warns once per input: teamai's default teamai-share-learnings cannot start: step "share-session" with.publish is not an input workflow "teamai-share-session" declares.
  • start and describe refuse with invalid_inputs before the learning step, so no learning is half shared.
  • Pull writes no teamai-share-learnings skill, and the Stop reminder goes back to teamai skill get share.
  • With all five inputs declared, there is no warning, the skill comes back and the run starts.

The check covers every workflow: step, not only this pair. The docs, in both languages, now say a replacement keeps the five inputs, with a working example and the warning text.

[P3] [builtin] label. list skills -v and skill show now label any skill carrying the generated-workflow marker [workflow], before the name-based legacy check. teamai-share-learnings, teamai-share-session and workflow-* now show the same label.

Tests: full vitest run 18981/18981. E2E share-learnings-1388 and workflow-session-1086 pass 5/5. The real-CLI record for both cases is in the description.

#1379: it is still open and main has not moved, so there is nothing to rebase yet. Whichever lands second takes the conflicts in the workflow docs, src/dashboard/client.ts, src/dashboard/workflow-runs.ts and src/workflow/engine.ts. If #1379 merges first, I'll rebase this one.

@github-actions

Copy link
Copy Markdown
  • [P2 non-blocking] Resolve aliases during default validation — src/workflow/cache.ts:456. A team workflow wrap-up with alias: teamai-share-session and only session/source replaces the default at runtime, but this lookup validates against the packaged five-input definition. Consequently, pull silently omits teamai-share-learnings without the promised incompatibility warnings. Use the same name-then-alias resolution as loadCachedWorkflow.

The PR description documents sufficient testing: a real-CLI run after npm run build, plus targeted E2E results. Deferring other providers and agents to CI is acceptable.

Review was read-only; I did not run, build, or install PR code.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in 3237ef7. The pull check now resolves the workflow a default runs the same way loadCachedWorkflow resolves a start: first the team file of that name, then the one team workflow with that alias, then the default. Two team workflows with the same alias resolve to nothing. A default that a team name or alias replaces is no longer checked itself.

Your case, wrap-up with alias: teamai-share-session and only session/source, now warns once per input at pull (new test in default-workflows.test.ts). start, describe, the skill and the Stop reminder already went through loadCachedWorkflow, so they followed the alias before this change.

@github-actions

Copy link
Copy Markdown

No confident new findings in the specified PR diff.

The earlier [P2 non-blocking] alias-validation finding is resolved: default validation now resolves team workflows by name, then alias, with a regression test covering the reported case.

The PR description documents sufficient testing, including real-CLI verification after npm run build with Claude and a git provider, plus targeted E2E results. Deferring the remaining providers and agents to CI is acceptable.

Review was read-only and limited to the specified diff. I did not run, build, or install PR code.

@SaulMoro SaulMoro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was generated by AI during triage.

@hz89Dev Thanks, the names case is fixed at 3237ef7f. With the built CLI and a team teamai-share-session (alias: wrap-up) that declares only session and source:

  • pull warns once per missing input and writes no teamai-share-learnings.
  • start and describe refuse with invalid_inputs before any run exists.

With all five inputs declared, everything works. The alias case the CI review raised fails at f39a898b and passes here. The [workflow] label and the docs in both languages are in.

One case still gets through:

  • [P1 blocking] The same five names, with a different type. A team teamai-share-session that declares publish as a string passes pull with no warning and starts. The run then fails at share-session with inputs.publish must be a string, after the learning step, so the team's wrap-up never runs. The load-time check compares input names only (src/workflow/cache.ts:527–532). For the shipped default's sub-workflow, comparing each passed input's declared schema with the packaged default's would close it. Look the packaged default up by the reference name: an alias replacement's own name is wrap-up.

Optional:

  • [P3 nit] The docs write /teamai-share-learnings with a leading slash (line 618, both languages).
  • [P3 nit] The comment at src/workflow-skills.ts:35 says more about the check's scope than it does.

Team-to-team workflows with a type mismatch also pass pull and fail at the child step. That is the same on main, so it is outside this PR.

Lint & Test on Node 24 ubuntu, the Windows job and the E2E shards are green. The macOS Lint & Test jobs were still running when I checked.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in 2886cae and 5d58585.

[P1] The same five names, with a different type. Your reproduction, publish: string, is now caught. When teamai-share-learnings, as teamai ships it, runs a workflow that replaces teamai's teamai-share-session, each passed input is compared with the packaged default's declared schema (retypedInputs in src/workflow/cache.ts). The packaged default is looked up by the reference name, so an alias replacement named wrap-up is covered. The same check backs both the load-time refusal and the pull warning:

  • pull warns: teamai's default teamai-share-learnings cannot start: step "share-session" passes publish, which workflow "teamai-share-session" declares as another type than teamai's default teamai-share-session.
  • start and describe refuse with invalid_inputs before any run exists, and pull writes no teamai-share-learnings skill.

Team-to-team workflows keep the name check only, as you scoped it. The docs and CHANGELOG now say the five inputs keep their types.

[P3] I dropped the slash from /teamai-share-learnings on both pages. The comment in workflow-skills.ts now names what the check leaves out: a workflow start refuses because a workflow it runs is missing, runs in a cycle, or does not take its inputs.

New test in default-workflows.test.ts. The real-CLI record is in the description. Full vitest run: 18980 passed, plus 3 load timeouts in workflow-reconciliation and workflow-settle-cost, two files this PR doesn't touch, which pass on their own (13/13).

@github-actions

Copy link
Copy Markdown
  • [P2 non-blocking] Compare enum types independently of value order — src/workflow/cache.ts:562. A team teamai-share-session retaining all five inputs but declaring judge: driver | here is rejected against the default’s here | driver, although both accept identical values. Consequently, pull omits teamai-share-learnings, and start/describe fail with invalid_inputs. Compare enum values as sets rather than using order-sensitive isDeepStrictEqual.

The earlier alias-validation finding is resolved, with regression coverage.

The PR description documents sufficient testing: real-CLI verification after npm run build, plus targeted E2E results. Deferring other providers and agents to CI is acceptable.

Review was read-only and limited to the specified diff; I did not run, build, or install PR code.

@SaulMoro SaulMoro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was generated by AI during triage.

@hz89Dev Thanks, the type case is fixed at 5d58585a. With the built CLI, a team teamai-share-session that declares publish: string is refused, both under its own name and as the wrap-up alias replacement. So is the two-input case from the CI review. Correctly typed teams still work. Both nits are fixed.

One thing still blocks approval. It is the CI review's point from 23:06Z, which reproduces:

  • [P1 blocking] Enum order counts as a different type. A team teamai-share-session with the same five names and types, but judge listed as driver | here instead of here | driver, is refused:

    • pull warns that judge is "another type" and writes no teamai-share-learnings.
    • describe and start fail with invalid_inputs.

    The check compares enums with isDeepStrictEqual (src/workflow/cache.ts:562), which depends on order. The docs say "same types". Comparing enum values as sets, plus a test with a reordered enum, would close it.

Optional:

  • [P3 nit] In docs/guide/workflow.md (line 621), the sample under the type-case sentence shows the missing-input warning, not the type warning.

Lint & Test and the E2E shards were still running when I checked. The Windows job passed.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in 71fd928. Input types are now compared structurally (sameType in src/workflow/cache.ts): an enum's values as a set and an object's fields by name, recursing through arrays and objects. A never check covers new schema kinds. judge: driver | here against the default's here | driver raises no warning, and teamai-share-learnings starts (new test in default-workflows.test.ts). publish: string is still refused.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Both points are fixed.

[P1] Enum order. Fixed in 71fd928. Input types are compared structurally (sameType in src/workflow/cache.ts): an enum's values as a set and an object's fields by name, recursing through arrays and objects. A never check covers new schema kinds. A new test in default-workflows.test.ts declares judge: driver | here: pull raises no warning and teamai-share-learnings starts. publish: string is still refused.

[P3] Docs sample. Fixed in 084b1b3. The sample on both pages now shows both warnings, the missing input and publish: string, and says an enum's values may come in any order.

@github-actions

Copy link
Copy Markdown

No confident new findings in the specified PR diff.

The earlier alias-validation and enum-order findings are resolved, with regression tests covering both cases.

The PR description documents sufficient testing: real-CLI verification after npm run build with Claude and a git provider, plus targeted E2E results. Deferring other providers and agents to CI is acceptable.

Review was read-only and limited to the specified diff. I did not run, build, or install PR code.

@SaulMoro SaulMoro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was generated by AI during triage.

@hz89Dev Thanks, the enum-order case is fixed at 084b1b32. With the built CLI, a team teamai-share-session that declares judge: driver | here pulls with no warning, and a teamai-share-learnings run with it succeeds. publish: string and the two-input case are still refused, and the docs sample now shows the type line.

One thing left, small:

  • [P2 non-blocking] A duplicate enum value passes as the same type. With judge: here | here, pull prints no warning, and so do describe and start. A run with "judge":"driver" then fails at share-session after the learning step: inputs.judge must be one of here, here. At 5d58585a the same file was refused before any run. sameType (src/workflow/cache.ts:559) compares the lengths and then checks one way, and the parser keeps duplicate values. A two-way check fixes it:

    -      return right.type === 'enum' && left.values.length === right.values.length && left.values.every((value) => right.values.includes(value));
    +      return right.type === 'enum' && left.values.every((value) => right.values.includes(value)) && right.values.every((value) => left.values.includes(value));

    A here | here case beside the reorder test would cover it.

Lint & Test and the E2E shards were still running at 084b1b32 when I checked; the Windows job passed. I'll approve once they are green.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in d0e8177 with the two-way check you suggested. A new test beside the reorder one declares judge: here | here: pull now warns that judge is another type, and start and describe refuse it, as they did at 5d58585a. driver | here still passes. The workflow tests pass (49 files, 2298 tests).

@github-actions

Copy link
Copy Markdown
  • [P2 non-blocking] Gate alias-based replacements too — src/workflow/discovery/workflow-skills.ts:34. A team copy of the learning workflow named close-session with alias: teamai-share-learnings bypasses this name-only check. With recall off, pull still writes workflow-teamai-share-learnings, and recall disable keeps it, although its first step calls the withheld share skill. Apply the gate to the effective alias as well.

The earlier alias-validation and enum-order findings are resolved, with regression coverage.

The PR description documents sufficient testing: real-CLI verification after npm run build, plus targeted E2E results. Deferring other providers and agents to CI is acceptable.

Review was read-only and limited to the specified diff; I did not run, build, or install PR code.

…aces teamai-share-learnings while share is withheld
@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Gate alias-based replacements: fixed in 3f341a5. The gate in advertisedWorkflows now checks the alias that starts the workflow as well as its name, so a team close-session with alias: teamai-share-learnings gets no skill while recall is off, and recall disable removes it. New test in workflow-skills-discovery.test.ts.

@github-actions

Copy link
Copy Markdown

No confident new findings in the specified PR diff.

The earlier alias-validation, enum-order, and alias-gating findings are resolved, with regression tests covering all three cases.

The PR description documents sufficient testing: real-CLI verification after npm run build with Claude and a git provider, plus targeted E2E results. Deferring other providers and agents to CI is acceptable.

Review was read-only and limited to the specified diff. I did not run, build, or install PR code.

@hz89Dev

hz89Dev commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

The Windows job failed on a timeout, not an assertion: hooks-windows-bash.test.ts > uses and executes a PowerShell project gate when Git Bash is unavailable took 32s against its 15s limit, and the other 4415 tests passed. This PR does not touch hook rendering or the shells; its only change in hook-handlers.ts renames the module the contribute reminder imports. Could someone with access rerun the failed job?

@SaulMoro SaulMoro left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was generated by AI during triage.

@hz89Dev Thanks. At 3f341a58 both remaining points are fixed: the enum check is two-way, with the here | here test, and the share gate now covers a team workflow whose alias is teamai-share-learnings, with a test for it. Approving.

CI at 3f341a58 was green when I approved.

@SaulMoro
SaulMoro merged commit 6919df5 into Tencent:main Oct 30, 2026
31 of 32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants