Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
098e32e
perf+fix: wallet batch loading, quantum-safe asset issuance, auto-sweep
ALENOC Apr 11, 2026
65ba193
fix: prevent zero-balance flash and index reset on app restart
ALENOC Apr 11, 2026
3feeee4
perf: batch UTXO+tx fetches and merge key derivation for send/transfe…
ALENOC Apr 12, 2026
60d8636
fix: show assets loading spinner while wallet balance is still loading
ALENOC Apr 12, 2026
1d4ffac
perf: keep WalletScreen alive across tab switches to eliminate compos…
ALENOC Apr 12, 2026
6dfcd5b
fix: correct asset tx output order, dust calc, fee calc, and signing key
ALENOC Apr 12, 2026
51e36ef
fix: preserve balance and assets on transient network failures
ALENOC Apr 12, 2026
385c70b
fix: multi-address asset transfer, no connection storms, correct balance
ALENOC Apr 12, 2026
4d8ce3e
refactor: simplify address reconciliation and remove redundant clean …
ALENOC Apr 12, 2026
765cc9b
feat: add portfolio scanning with automatic fund consolidation
ALENOC Apr 12, 2026
574ec8d
fix: rewrite consolidation to use sweepOldAddresses with proper funding
ALENOC Apr 12, 2026
4bc2b01
fix(wallet): optimize consolidation logic and network throughput
ALENOC Apr 12, 2026
4111087
fix(wallet): discoverCurrentIndex stays at funded address if key not …
ALENOC Apr 12, 2026
143a47e
fix(wallet): hide address and balance during mnemonic import discovery
ALENOC Apr 12, 2026
9934e4c
perf(wallet): batch network calls, fix runBlocking, drop hardcoded 10…
ALENOC Apr 12, 2026
f328d50
perf(wallet): cache asset list in SharedPreferences for instant start…
ALENOC Apr 12, 2026
2d31dab
perf(wallet): cache IPFS images after enrichment completes
ALENOC Apr 12, 2026
f40eb20
fix(wallet): include swept-asset satoshis in issue tx change calculation
ALENOC Apr 12, 2026
d22113f
fix(wallet): detect and sweep asset UTXOs invisible to listunspent
ALENOC Apr 13, 2026
2ba7aed
feat(wallet): sync currentIndex on refresh for multi-app consistency
ALENOC Apr 13, 2026
96025fe
feat(wallet): refresh immediately on foreground resume
ALENOC Apr 13, 2026
e2dd9f8
fix(wallet): suppress asset spinner when list already has data
ALENOC Apr 13, 2026
b704793
chore(planning): add codebase map to .planning/codebase/
ALENOC Apr 13, 2026
10efa14
docs: initialize project
ALENOC Apr 13, 2026
843ddaa
chore: add project config
ALENOC Apr 13, 2026
a4c7e61
docs: start milestone v1.0 Security Performance Reliability
ALENOC Apr 13, 2026
3a6a3c3
docs(10): add validation strategy
ALENOC Apr 13, 2026
2a1f3cf
docs(10): UI design contract
ALENOC Apr 13, 2026
6ef67d5
docs(10): UI design contract
ALENOC Apr 13, 2026
3a29df0
docs(10): create phase 10 security hardening plans
ALENOC Apr 13, 2026
1cf639f
docs(10): fix plan issues - add requirements mapping, fix validation …
ALENOC Apr 13, 2026
11f1130
feat(10-01): create AdminKeyStorage class with AES-256-GCM encryption
ALENOC Apr 13, 2026
cc02469
feat(10-01): migrate AssetManager to use AdminKeyStorage
ALENOC Apr 13, 2026
749b29f
feat(10-01): add validateAdminKey function to MainViewModel
ALENOC Apr 13, 2026
6a3a73c
feat(10-01): add admin key input section to Settings screen
ALENOC Apr 13, 2026
10a2457
feat(10-01): wire admin key save flow in MainActivity
ALENOC Apr 13, 2026
ffbfb1c
feat(10-01): remove ADMIN_KEY from BuildConfig
ALENOC Apr 13, 2026
323ab3c
feat(10-03): replace SELECT * with explicit column list in admin.ts
ALENOC Apr 13, 2026
e01fc7b
feat(10-03): replace SELECT * with explicit column lists in cache.ts
ALENOC Apr 13, 2026
b553e84
fix(10-04): remove sensitive logging from Android AssetManager derive…
ALENOC Apr 13, 2026
0ae07d0
docs(10-04): document backend logging policy in logger.ts
ALENOC Apr 13, 2026
9f51e01
test(10-04): create logging verification tests
ALENOC Apr 13, 2026
e3cf1e9
fix(10-04): remove sensitive logging from Android AssetManager regist…
ALENOC Apr 13, 2026
04000d6
chore: merge executor worktree (worktree-agent-a7c1cdf9)
ALENOC Apr 13, 2026
40494a6
feat(10-02): create TofuFingerprintDao for SQLite persistence
ALENOC Apr 13, 2026
d2d90fc
feat(10-02): integrate SQLite TOFU persistence into TofuTrustManager
ALENOC Apr 13, 2026
865adbc
docs(10): add code review report
ALENOC Apr 13, 2026
c162271
docs(phase-10): complete phase execution
ALENOC Apr 13, 2026
8b491c2
docs(phase-10): evolve PROJECT.md after phase completion
ALENOC Apr 13, 2026
6bd04f3
docs(10-02): create SUMMARY.md for TOFU certificate fingerprint persi…
ALENOC Apr 13, 2026
fbe4d0e
docs(20): capture phase context
ALENOC Apr 13, 2026
d80fb42
docs(state): record phase 20 context session
ALENOC Apr 13, 2026
47951f6
docs(20): research Android performance optimization domain
ALENOC Apr 13, 2026
9329eae
docs(20): UI design contract
ALENOC Apr 13, 2026
667e41b
docs(20): fix checker issues - D-07 implementation and notification i…
ALENOC Apr 13, 2026
7b90f2f
fix(20): revise plans based on checker feedback
ALENOC Apr 13, 2026
71d5d67
feat(20-03): add RetryUtils with exponential backoff
ALENOC Apr 14, 2026
3c859c0
feat(20-02): create TransactionNotificationHelper with notification c…
ALENOC Apr 14, 2026
485f47e
feat(20-02): initialize TransactionNotificationHelper channel in Main…
ALENOC Apr 14, 2026
6943029
docs(20-03): complete RetryUtils plan
ALENOC Apr 14, 2026
e23e8f5
feat(20-02): create TransactionDetailsScreen with full implementation…
ALENOC Apr 14, 2026
a986abc
test(20-01): add failing test for OkHttp suspend wrapper extension fu…
ALENOC Apr 14, 2026
2d647c1
feat(20-02): add intent handler for VIEW_TRANSACTION action (D-04)
ALENOC Apr 14, 2026
a195dd3
docs(20-02): complete plan summary - TransactionNotificationHelper an…
ALENOC Apr 14, 2026
71c9a0e
feat(20-01): implement OkHttp suspend wrapper extension function
ALENOC Apr 14, 2026
cc4900e
feat(20-01): add OkHttp suspend wrapper using suspendCancellableCorou…
ALENOC Apr 14, 2026
5be25d3
feat(20-01): convert getAssetData() to suspend function with executeS…
ALENOC Apr 14, 2026
b7509c5
feat(20-01): convert all OkHttp execute() calls to suspend functions
ALENOC Apr 15, 2026
a018ca0
docs(20-01): complete plan summary - convert OkHttp execute() calls t…
ALENOC Apr 15, 2026
90cce39
docs(20-01): add self-check to SUMMARY.md
ALENOC Apr 15, 2026
5976672
feat(20-04): add parallel wallet restore with async/awaitAll
ALENOC Apr 15, 2026
c4ba76e
feat(20-04): add getOwnedAssets() and getTransactionHistory() suspend…
ALENOC Apr 15, 2026
ea7f9a2
docs(20-04): complete plan summary - parallel wallet restore with asy…
ALENOC Apr 15, 2026
1bea5ae
feat(20-05): add estimatedFee parameter to SendRvnScreen confirmation…
ALENOC Apr 15, 2026
25810c3
feat(20-05): integrate notifications and retry for RVN and asset send…
ALENOC Apr 15, 2026
89e3a99
fix(android): resolve nested IPFS CIDs and add multi-gateway fallback…
ALENOC Apr 15, 2026
0dbe9cd
fix(20-05): use getApplication() in AndroidViewModel and add send err…
ALENOC Apr 16, 2026
5caeb0b
docs(20-05): complete plan summary - notifications and retry for send…
ALENOC Apr 16, 2026
199ac31
docs(10): add plan summaries, research, and Nyquist validation
ALENOC Apr 16, 2026
23dc274
docs(20): add missing plans and Nyquist validation
ALENOC Apr 16, 2026
38fb014
fix(wallet): pass context to RavencoinPublicNode in consolidateAllFun…
ALENOC Apr 16, 2026
947bdfc
chore(planning): sync STATE.md to reality and persist config flags
ALENOC Apr 16, 2026
5305e28
feat(20-06): add full-screen loading and error banner to WalletScreen
ALENOC Apr 16, 2026
fb7e52f
docs(20-06): annotate IssueAssetScreen SubmitButton with UI-SPEC load…
ALENOC Apr 16, 2026
8b515d0
feat(20-06): add transient banner and critical dialog error patterns
ALENOC Apr 16, 2026
e42b8db
docs(20-06): complete plan summary - loading UI patterns and error ha…
ALENOC Apr 17, 2026
d5005ec
chore(planning): mark Phase 20 complete, 20-06 plan done
ALENOC Apr 17, 2026
9eef243
docs(30): capture phase context
ALENOC Apr 17, 2026
ebfabfd
docs(state): record phase 30 context session
ALENOC Apr 17, 2026
61b06b9
docs(30): UI design contract
ALENOC Apr 17, 2026
679fbd1
docs(30): add validation strategy .planning/phases/30-wallet-reliabil…
ALENOC Apr 18, 2026
475811c
docs(30): map existing-code analogs for planning .planning/phases/30-…
ALENOC Apr 18, 2026
d791dfe
test(30-01): add Wave 0 test scaffolding for cache, subscription, and…
ALENOC Apr 20, 2026
66ac302
test(30-01): add mnemonic safety tests and fix compilation errors
ALENOC Apr 20, 2026
f140d68
docs(30-01): complete Wave 0 test scaffolding plan summary
ALENOC Apr 20, 2026
b93d623
feat(30-02): create WalletReliabilityDb, WalletCacheDao, and Reserved…
ALENOC Apr 20, 2026
d1142c7
feat(30-02): create TxHistoryDao, PendingConsolidationDao, Quarantine…
ALENOC Apr 20, 2026
49e851a
docs(30-02): complete wallet cache DB DAOs plan
ALENOC Apr 20, 2026
bd7ba0c
feat(30-03): extract TofuTrustManager, add subscribe/estimatefee RPC …
ALENOC Apr 20, 2026
0ad9de9
fix(30-03): fix unresolved coroutineContext reference in Subscription…
ALENOC Apr 21, 2026
394e320
feat(30-04): implement FeeEstimator with retry + fallback, add EN/IT …
ALENOC Apr 21, 2026
454f177
feat(30-04): wire FeeEstimator into SendRvnScreen and TransferScreen …
ALENOC Apr 21, 2026
6275005
docs(30-04): complete fee estimation plan summary
ALENOC Apr 21, 2026
6de86b1
feat(30-05): create RebroadcastWorker with D-25 ladder and 5-attempt cap
ALENOC Apr 21, 2026
3b94976
feat(30-05): extend WalletManager send paths with UTXO reservation, p…
ALENOC Apr 21, 2026
887d197
docs(30-05): complete consolidation reliability plan summary
ALENOC Apr 21, 2026
fd5a0fb
docs(30): commit phase 30 plan artifacts
ALENOC Apr 23, 2026
66afcf0
feat(30-06): add BiometricGate with CryptoObject-bound decrypt (D-15)
ALENOC Apr 23, 2026
2124e5b
feat(30-06): extend WalletManager with HMAC integrity, validation, ba…
ALENOC Apr 23, 2026
5191bb8
feat(30-06): add MnemonicExporter zero-fill CharArray reveal wrapper
ALENOC Apr 23, 2026
a51a991
feat(30-06): extend MnemonicBackupScreen with biometric cover card, F…
ALENOC Apr 23, 2026
bee7a01
feat(30-06): add RestoreWalletConfirmDialog + forced-backup gate on W…
ALENOC Apr 23, 2026
a39dbad
docs(30-06): complete mnemonic safety plan summary
ALENOC Apr 23, 2026
b0169a7
feat(30-07): create NodeHealthMonitor with quarantine policy + Connec…
ALENOC Apr 24, 2026
f9067e6
feat(30-07): wire RavencoinPublicNode and SubscriptionManager through…
ALENOC Apr 24, 2026
46623aa
fix(30-07): remove NetworkModule duplicate timeouts and wire NodeHeal…
ALENOC Apr 24, 2026
3bc5c1e
docs(30-07): complete node-reliability plan summary
ALENOC Apr 24, 2026
145ccbc
feat(30-08): create IncomingTxNotificationHelper for incoming_tx channel
ALENOC Apr 24, 2026
2b9a27a
feat(30-08): register incoming_tx notification channel in MainActivity
ALENOC Apr 24, 2026
5869d71
feat(30-08): extend WalletPollingWorker with D-06 scripthash-status diff
ALENOC Apr 24, 2026
a56e064
feat(30-08): add EN + IT strings for Phase 30 WalletScreen and Receiv…
ALENOC Apr 24, 2026
1379196
feat(30-08): extend WalletScreen with cached banner, connection pill,…
ALENOC Apr 24, 2026
244f004
feat(30-08): add D-18 main+sub labels and 200ms cross-fade to Receive…
ALENOC Apr 24, 2026
5bce043
style(30-08): replace em dashes with colon/comma in MainActivity comm…
ALENOC Apr 24, 2026
7023d0d
docs(30-08): complete walletscreen-refresh-and-receive-ux plan summary
ALENOC Apr 24, 2026
09ae52c
feat(30-09): add getHistoryPaged and RavencoinTxHistoryMath helpers
ALENOC Apr 24, 2026
955e1a3
feat(30-09): add TxHistoryDao.getPage(offset, limit) alias
ALENOC Apr 24, 2026
0999a5f
feat(30-09): add AppConfig.EXPLORER_URL const in both flavors
ALENOC Apr 24, 2026
8e1c899
feat(30-09): add EN and IT strings for three-value tx row + Load more
ALENOC Apr 24, 2026
0aa07d0
feat(30-09): WalletScreen TxCard three-value row + empty state + Load…
ALENOC Apr 24, 2026
17b967a
feat(30-09): TransactionDetailsScreen three-value breakdown + View on…
ALENOC Apr 24, 2026
4ab1121
docs(30-09): complete tx-history-3value plan summary
ALENOC Apr 24, 2026
8f1b87f
chore(30-10): em-dash audit sweep passes; log out-of-scope hits
ALENOC Apr 24, 2026
55c6023
feat(30-10): add accessibility contentDescription labels (EN + IT)
ALENOC Apr 24, 2026
b7829fa
docs(30-10): complete Phase 30 wallet-reliability (10/10 plans)
ALENOC Apr 24, 2026
480eeb9
docs(30): add phase 30 verification report
ALENOC Apr 24, 2026
0e643c2
fix(wallet): post-Phase-30 UAT fixes from emulator testing
ALENOC Apr 25, 2026
5860652
fix(wallet): asset tx classification, list persistence and balance do…
ALENOC Apr 25, 2026
2ec2dde
fix(wallet): asset send classification and multi-asset cycling display
ALENOC Apr 25, 2026
3c8273a
fix(wallet): cold start cache, delete-then-restore flow, brand IPFS, …
ALENOC Apr 25, 2026
3c46bb5
chore(network): refresh ElectrumX mainnet server list
ALENOC Apr 25, 2026
5cb5849
docs(40): capture phase context (discuss)
ALENOC Apr 25, 2026
e4d1857
docs(state): record phase 40 context session
ALENOC Apr 25, 2026
91fe28f
docs(40): research phase domain for asset emission UX
ALENOC Apr 25, 2026
fbd3d93
docs(40): UI design contract for asset emission UX
ALENOC Apr 25, 2026
5dee715
docs(40): UI design contract for asset emission UX
ALENOC Apr 25, 2026
78a548e
docs(40): add validation strategy
ALENOC Apr 25, 2026
8af5d53
docs(40): create phase plan
ALENOC Apr 25, 2026
a0b163a
docs(40): research resolution markers + plan verification passed
ALENOC Apr 25, 2026
9f4934b
test(40-01): add IssueErrorClassificationTest with 23 test cases
ALENOC Apr 25, 2026
b910e74
test(40-01): add ConfirmationPollingTest with 10 test cases
ALENOC Apr 25, 2026
7144377
feat(40-01): add 32 Phase 40 string keys to AppStrings.kt
ALENOC Apr 25, 2026
781c256
docs(40-01): add SUMMARY.md for Plan 01 test scaffolding and localiza…
ALENOC Apr 25, 2026
8667966
feat(40-02): add IssueStep sealed class, WarningType enum, classifyIs…
ALENOC Apr 25, 2026
ca097df
feat(40-02): enhance issuance callbacks with pre-flight validation, c…
ALENOC Apr 25, 2026
b0eedbb
docs(40-02): add SUMMARY.md for Plan 02 ViewModel error handling core
ALENOC Apr 25, 2026
d473a49
feat(40-03): add multi-step progress indicator, pre-issuance warnings…
ALENOC Apr 25, 2026
e5611a0
docs(40-03): add SUMMARY.md for Plan 03 IssueAssetScreen UI changes
ALENOC Apr 25, 2026
a4e6744
feat(40-04): add confirmation polling and enhance combined flow
ALENOC Apr 25, 2026
6d0160b
docs(40-04): add SUMMARY.md for Plan 04 confirmation polling and comb…
ALENOC Apr 25, 2026
0fc28d2
docs(40): add VERIFICATION.md — all must_haves passed, phase complete
ALENOC Apr 25, 2026
725c27f
docs(40): update STATE.md — Phase 40 complete, milestone v1.0 100%
ALENOC Apr 25, 2026
04680cf
feat(i18n): complete 9-language translation coverage and fix hardcode…
ALENOC Apr 25, 2026
f6d4a00
fix(i18n): localize hardcoded "Ciclati N asset" string and dialog tit…
ALENOC Apr 25, 2026
5a1f064
feat(wallet): cold-start cache seeding, nullable balance, faster fail…
ALENOC Apr 25, 2026
fe6dbdf
docs(50): capture phase context
ALENOC Apr 25, 2026
e4b5ce8
docs(state): record phase 50 context session
ALENOC Apr 25, 2026
17174e7
docs(50): add technical research for backend stability phase
ALENOC Apr 25, 2026
2211741
docs(50): add Nyquist validation strategy
ALENOC Apr 25, 2026
fc875de
feat(50): add 6 execution plans for backend stability phase
ALENOC Apr 25, 2026
6336394
feat(50-01): add unhandledRejection and uncaughtException handlers
ALENOC Apr 25, 2026
1311570
feat(50-02): replace sequential loop with chunked Promise.allSettled …
ALENOC Apr 25, 2026
f621954
feat(50-03): add limit/offset pagination to listSubAssets and hierarc…
ALENOC Apr 25, 2026
8ae8a27
feat(50-04): add periodic cleanup of request_logs and rate_limit_events
ALENOC Apr 25, 2026
9780b65
feat(50-05): add SQLite backup via .backup() API and update Docker ba…
ALENOC Apr 25, 2026
70ea9c0
feat(50-06): add read-only CLI database explorer
ALENOC Apr 25, 2026
7f49398
docs(50): add SUMMARY.md for all 6 execution plans
ALENOC Apr 25, 2026
dcb0ddc
docs(50): mark Phase 50 complete with VERIFICATION.md
ALENOC Apr 25, 2026
5f3551f
docs(50): evolve PROJECT.md after Phase 50 completion
ALENOC Apr 25, 2026
2e7d67e
chore: archive v1.0 milestone — Security, Performance & Reliability
ALENOC Apr 25, 2026
fcca04d
chore: add .claude/ to .gitignore, fix config.json trailing newline
ALENOC Apr 25, 2026
5d6050d
chore: remove .planning/ from tracking, add to .gitignore
ALENOC Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
204 changes: 204 additions & 0 deletions .github/workflows/qwen-dispatch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
name: '🔀 Qwen Code Dispatch'

on:
pull_request_review_comment:
types:
- 'created'
pull_request_review:
types:
- 'submitted'
pull_request:
types:
- 'opened'
issues:
types:
- 'opened'
- 'reopened'
issue_comment:
types:
- 'created'

defaults:
run:
shell: 'bash'

jobs:
debugger:
if: |-
${{ fromJSON(vars.DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
steps:
- name: 'Print context for debugging'
env:
DEBUG_event_name: '${{ github.event_name }}'
DEBUG_event__action: '${{ github.event.action }}'
DEBUG_event__comment__author_association: '${{ github.event.comment.author_association }}'
DEBUG_event__issue__author_association: '${{ github.event.issue.author_association }}'
DEBUG_event__pull_request__author_association: '${{ github.event.pull_request.author_association }}'
DEBUG_event__review__author_association: '${{ github.event.review.author_association }}'
DEBUG_event: '${{ toJSON(github.event) }}'
run: |-
env | grep '^DEBUG_'

dispatch:
# For PRs: only if not from a fork
# For issues: only on open/reopen
# For comments: only if user types @gemini-cli and is OWNER/MEMBER/COLLABORATOR
if: |-
(
github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.fork == false
) || (
github.event_name == 'issues' &&
contains(fromJSON('["opened", "reopened"]'), github.event.action)
) || (
github.event.sender.type == 'User' &&
startsWith(github.event.comment.body || github.event.review.body || github.event.issue.body, '@qwen-code') &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association || github.event.issue.author_association)
)
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
issues: 'write'
pull-requests: 'write'
outputs:
command: '${{ steps.extract_command.outputs.command }}'
request: '${{ steps.extract_command.outputs.request }}'
additional_context: '${{ steps.extract_command.outputs.additional_context }}'
issue_number: '${{ github.event.pull_request.number || github.event.issue.number }}'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Extract command'
id: 'extract_command'
uses: 'actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea' # ratchet:actions/github-script@v7
env:
EVENT_TYPE: '${{ github.event_name }}.${{ github.event.action }}'
REQUEST: '${{ github.event.comment.body || github.event.review.body || github.event.issue.body }}'
with:
script: |
const eventType = process.env.EVENT_TYPE;
const request = process.env.REQUEST;
core.setOutput('request', request);

if (eventType === 'pull_request.opened') {
core.setOutput('command', 'review');
} else if (['issues.opened', 'issues.reopened'].includes(eventType)) {
core.setOutput('command', 'triage');
} else if (request.startsWith("@qwen-code /review")) {
core.setOutput('command', 'review');
const additionalContext = request.replace(/^@qwen-code \/review/, '').trim();
core.setOutput('additional_context', additionalContext);
} else if (request.startsWith("@qwen-code /triage")) {
core.setOutput('command', 'triage');
} else if (request.startsWith("@qwen-code")) {
const additionalContext = request.replace(/^@qwen-code/, '').trim();
core.setOutput('command', 'invoke');
core.setOutput('additional_context', additionalContext);
} else {
core.setOutput('command', 'fallthrough');
}

- name: 'Acknowledge request'
env:
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
MESSAGE: |-
🤖 Hi @${{ github.actor }}, I've received your request, and I'm working on it now! You can track my progress [in the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: '${{ github.repository }}'
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"

review:
needs: 'dispatch'
if: |-
${{ needs.dispatch.outputs.command == 'review' }}
uses: './.github/workflows/qwen-review.yml'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
with:
additional_context: '${{ needs.dispatch.outputs.additional_context }}'
secrets: 'inherit'

triage:
needs: 'dispatch'
if: |-
${{ needs.dispatch.outputs.command == 'triage' }}
uses: './.github/workflows/qwen-triage.yml'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
with:
additional_context: '${{ needs.dispatch.outputs.additional_context }}'
secrets: 'inherit'

invoke:
needs: 'dispatch'
if: |-
${{ needs.dispatch.outputs.command == 'invoke' }}
uses: './.github/workflows/qwen-invoke.yml'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
with:
additional_context: '${{ needs.dispatch.outputs.additional_context }}'
secrets: 'inherit'

fallthrough:
needs:
- 'dispatch'
- 'review'
- 'triage'
- 'invoke'
if: |-
${{ always() && !cancelled() && (failure() || needs.dispatch.outputs.command == 'fallthrough') }}
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
issues: 'write'
pull-requests: 'write'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Send failure comment'
env:
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
MESSAGE: |-
🤖 I'm sorry @${{ github.actor }}, but I was unable to process your request. Please [see the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: '${{ github.repository }}'
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"
116 changes: 116 additions & 0 deletions .github/workflows/qwen-invoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: '▶️ Qwen Code Invoke'

on:
workflow_call:
inputs:
additional_context:
type: 'string'
description: 'Any additional context from the request'
required: false

concurrency:
group: '${{ github.workflow }}-invoke-${{ github.event_name }}-${{ github.event.pull_request.number || github.event.issue.number }}'
cancel-in-progress: false

defaults:
run:
shell: 'bash'

jobs:
invoke:
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Run Qwen Code CLI'
id: 'run_qwen'
uses: 'QwenLM/qwen-code-action@v1' # ratchet:exclude
env:
TITLE: '${{ github.event.pull_request.title || github.event.issue.title }}'
DESCRIPTION: '${{ github.event.pull_request.body || github.event.issue.body }}'
EVENT_NAME: '${{ github.event_name }}'
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
IS_PULL_REQUEST: '${{ !!github.event.pull_request }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
REPOSITORY: '${{ github.repository }}'
ADDITIONAL_CONTEXT: '${{ inputs.additional_context }}'
with:
openai_api_key: '${{ secrets.QWEN_API_KEY }}'
openai_base_url: '${{ vars.QWEN_BASE_URL }}'
openai_model: '${{ vars.QWEN_MODEL }}'
qwen_cli_version: '${{ vars.QWEN_CLI_VERSION }}'
qwen_debug: '${{ fromJSON(vars.DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}'
upload_artifacts: '${{ vars.UPLOAD_ARTIFACTS }}'
workflow_name: 'qwen-invoke'
settings: |-
{
"model": {
"maxSessionTurns": 25
},
"telemetry": {
"enabled": true,
"target": "local",
"outfile": ".qwen/telemetry.log"
},
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server:v0.18.0"
],
"includeTools": [
"add_issue_comment",
"get_issue",
"get_issue_comments",
"list_issues",
"search_issues",
"create_pull_request",
"pull_request_read",
"list_pull_requests",
"search_pull_requests",
"create_branch",
"create_or_update_file",
"delete_file",
"fork_repository",
"get_commit",
"get_file_contents",
"list_commits",
"push_files",
"search_code"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
},
"tools": {
"core": [
"run_shell_command(cat)",
"run_shell_command(echo)",
"run_shell_command(grep)",
"run_shell_command(head)",
"run_shell_command(tail)"
]
}
}
prompt: '/qwen-invoke'
Loading
Loading