@ -3,35 +3,42 @@
export const CARDS = {
export const CARDS = {
strike : {
strike : {
id : "strike" , name : "Strike" , cost : 1 , type : "attack" , text : "Deal 6." , target : "enemy" ,
id : "strike" , name : "Strike" , cost : 1 , type : "attack" , text : "Deal 6." , target : "enemy" ,
art : "Monk_1.png" ,
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ,
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ,
upgrades : "strike+"
upgrades : "strike+"
} ,
} ,
"strike+" : {
"strike+" : {
id : "strike+" , name : "Strike+" , cost : 1 , type : "attack" , text : "Deal 9." , target : "enemy" ,
id : "strike+" , name : "Strike+" , cost : 1 , type : "attack" , text : "Deal 9." , target : "enemy" ,
art : "Monk_2.png" ,
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 9 ) )
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 9 ) )
} ,
} ,
defend : {
defend : {
id : "defend" , name : "Defend" , cost : 1 , type : "skill" , text : "Gain 5 Block." , target : "self" ,
id : "defend" , name : "Defend" , cost : 1 , type : "skill" , text : "Gain 5 Block." , target : "self" ,
art : "Monk_3.png" ,
effect : ( ctx ) => ctx . player . block += 5 ,
effect : ( ctx ) => ctx . player . block += 5 ,
upgrades : "defend+"
upgrades : "defend+"
} ,
} ,
"defend+" : {
"defend+" : {
id : "defend+" , name : "Defend+" , cost : 1 , type : "skill" , text : "Gain 8 Block." , target : "self" ,
id : "defend+" , name : "Defend+" , cost : 1 , type : "skill" , text : "Gain 8 Block." , target : "self" ,
art : "Monk_4.png" ,
effect : ( ctx ) => ctx . player . block += 8
effect : ( ctx ) => ctx . player . block += 8
} ,
} ,
coffee _rush : {
coffee _rush : {
id : "coffee_rush" , name : "Terminal Coffee Rush" , cost : 0 , type : "skill" , text : "+2 Energy (this turn)." ,
id : "coffee_rush" , name : "Terminal Coffee Rush" , cost : 0 , type : "skill" , text : "+2 Energy (this turn)." ,
art : "Monk_5.png" ,
effect : ( ctx ) => ctx . player . energy += 2 ,
effect : ( ctx ) => ctx . player . energy += 2 ,
upgrades : "coffee_rush+"
upgrades : "coffee_rush+"
} ,
} ,
"coffee_rush+" : {
"coffee_rush+" : {
id : "coffee_rush+" , name : "Terminal Coffee Rush+" , cost : 0 , type : "skill" , text : "+3 Energy (this turn)." ,
id : "coffee_rush+" , name : "Terminal Coffee Rush+" , cost : 0 , type : "skill" , text : "+3 Energy (this turn)." ,
art : "Monk_6.png" ,
effect : ( ctx ) => ctx . player . energy += 3
effect : ( ctx ) => ctx . player . energy += 3
} ,
} ,
macro : {
macro : {
id : "macro" , name : "Macrobation" , cost : 1 , type : "skill" , text : "Replay last card for free (once/fight)." ,
id : "macro" , name : "Macrobation" , cost : 1 , type : "skill" , text : "Replay last card for free (once/fight)." ,
art : "Monk_7.png" ,
oncePerFight : true ,
oncePerFight : true ,
effect : ( ctx ) => {
effect : ( ctx ) => {
if ( ctx . lastCard && ctx . lastCard !== "macro" ) {
if ( ctx . lastCard && ctx . lastCard !== "macro" ) {
@ -51,26 +58,31 @@ export const CARDS = {
segfault : {
segfault : {
id : "segfault" , name : "Segfault" , cost : 2 , type : "attack" , text : "Deal 7. Draw 1." ,
id : "segfault" , name : "Segfault" , cost : 2 , type : "attack" , text : "Deal 7. Draw 1." ,
art : "Monk_8.png" ,
effect : ( ctx ) => { ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 7 ) ) ; ctx . draw ( 1 ) ; }
effect : ( ctx ) => { ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 7 ) ) ; ctx . draw ( 1 ) ; }
} ,
} ,
skill _issue : {
skill _issue : {
id : "skill_issue" , name : "Skill Issue" , cost : 1 , type : "skill" , text : "Gain 6 Block. If enemy intends attack → apply Weak(1)." ,
id : "skill_issue" , name : "Skill Issue" , cost : 1 , type : "skill" , text : "Gain 6 Block. If enemy intends attack → apply Weak(1)." ,
art : "Monk_9.png" ,
effect : ( ctx ) => { ctx . player . block += 6 ; if ( ctx . intentIsAttack ( ) ) ctx . applyWeak ( ctx . enemy , 1 ) ; }
effect : ( ctx ) => { ctx . player . block += 6 ; if ( ctx . intentIsAttack ( ) ) ctx . applyWeak ( ctx . enemy , 1 ) ; }
} ,
} ,
"404" : {
"404" : {
id : "404" , name : "404" , cost : 1 , type : "skill" , text : "Apply Weak(2)." ,
id : "404" , name : "404" , cost : 1 , type : "skill" , text : "Apply Weak(2)." ,
art : "Monk_10.png" ,
effect : ( ctx ) => ctx . applyWeak ( ctx . enemy , 2 )
effect : ( ctx ) => ctx . applyWeak ( ctx . enemy , 2 )
} ,
} ,
dark _mode : {
dark _mode : {
id : "dark_mode" , name : "Dark Mode" , cost : 2 , type : "attack" , text : "Deal 20. End your turn." ,
id : "dark_mode" , name : "Dark Mode" , cost : 2 , type : "attack" , text : "Deal 20. End your turn." ,
art : "Monk_11.png" ,
effect : ( ctx ) => { ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 20 ) ) ; ctx . forceEndTurn ( ) }
effect : ( ctx ) => { ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 20 ) ) ; ctx . forceEndTurn ( ) }
} ,
} ,
object _object : {
object _object : {
id : "object_object" , name : "[object Object]" , cost : 1 , type : "skill" , text : "Exhaust 1 card, draw 2." ,
id : "object_object" , name : "[object Object]" , cost : 1 , type : "skill" , text : "Exhaust 1 card, draw 2." ,
art : "Monk_17.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . promptExhaust ( 1 ) ;
ctx . promptExhaust ( 1 ) ;
ctx . draw ( 2 ) ;
ctx . draw ( 2 ) ;
@ -79,27 +91,32 @@ export const CARDS = {
just _one _game : {
just _one _game : {
id : "just_one_game" , name : "Just One Game" , cost : 1 , type : "power" , text : "Skip this turn. Next turn +2 Energy." ,
id : "just_one_game" , name : "Just One Game" , cost : 1 , type : "power" , text : "Skip this turn. Next turn +2 Energy." ,
art : "Monk_18.png" ,
effect : ( ctx ) => { ctx . flags . skipThisTurn = true ; ctx . flags . nextTurnEnergyBonus = ( ctx . flags . nextTurnEnergyBonus || 0 ) + 2 ; }
effect : ( ctx ) => { ctx . flags . skipThisTurn = true ; ctx . flags . nextTurnEnergyBonus = ( ctx . flags . nextTurnEnergyBonus || 0 ) + 2 ; }
} ,
} ,
colon _q : {
colon _q : {
id : "colon_q" , name : "Colon Q" , cost : 2 , type : "attack" , text : "Deal 1 per card in discard." ,
id : "colon_q" , name : "Colon Q" , cost : 2 , type : "attack" , text : "Deal 1 per card in discard." ,
art : "Monk_19.png" ,
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( Math . max ( 0 , ctx . discard . length ) ) )
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( Math . max ( 0 , ctx . discard . length ) ) )
} ,
} ,
vibe _code : {
vibe _code : {
id : "vibe_code" , name : "Vibe Code" , cost : 1 , type : "skill" , text : "Next card costs 0." ,
id : "vibe_code" , name : "Vibe Code" , cost : 1 , type : "skill" , text : "Next card costs 0." ,
art : "Monk_20.png" ,
effect : ( ctx ) => ctx . flags . nextCardFree = true
effect : ( ctx ) => ctx . flags . nextCardFree = true
} ,
} ,
raw _dog : {
raw _dog : {
id : "raw_dog" , name : "Raw Dog" , cost : 0 , type : "skill" , text : "Draw 2. Exhaust." ,
id : "raw_dog" , name : "Raw Dog" , cost : 0 , type : "skill" , text : "Draw 2. Exhaust." ,
art : "Monk_21.png" ,
exhaust : true ,
exhaust : true ,
effect : ( ctx ) => ctx . draw ( 2 )
effect : ( ctx ) => ctx . draw ( 2 )
} ,
} ,
task _failed _successfully : {
task _failed _successfully : {
id : "task_failed_successfully" , name : "Task failed successfully" , cost : 2 , type : "attack" , text : "Deal 8. If enemy has no Block, deal 4 more." ,
id : "task_failed_successfully" , name : "Task failed successfully" , cost : 2 , type : "attack" , text : "Deal 8. If enemy has no Block, deal 4 more." ,
art : "Monk_12.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
let dmg = ctx . scalarFromWeak ( 8 ) ;
let dmg = ctx . scalarFromWeak ( 8 ) ;
if ( ctx . enemy . block === 0 ) dmg += ctx . scalarFromWeak ( 4 ) ;
if ( ctx . enemy . block === 0 ) dmg += ctx . scalarFromWeak ( 4 ) ;
@ -109,6 +126,7 @@ export const CARDS = {
recursion : {
recursion : {
id : "recursion" , name : "Recursion" , cost : 2 , type : "attack" , text : "Deal 5. If this kills enemy, play again." ,
id : "recursion" , name : "Recursion" , cost : 2 , type : "attack" , text : "Deal 5. If this kills enemy, play again." ,
art : "Monk_13.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
const prevHp = ctx . enemy . hp ;
const prevHp = ctx . enemy . hp ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 5 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 5 ) ) ;
@ -123,11 +141,13 @@ export const CARDS = {
git _commit : {
git _commit : {
id : "git_commit" , name : "Git Commit" , cost : 1 , type : "skill" , text : "Gain 4 Block. Draw 1." ,
id : "git_commit" , name : "Git Commit" , cost : 1 , type : "skill" , text : "Gain 4 Block. Draw 1." ,
art : "Monk_22.png" ,
effect : ( ctx ) => { ctx . player . block += 4 ; ctx . draw ( 1 ) ; }
effect : ( ctx ) => { ctx . player . block += 4 ; ctx . draw ( 1 ) ; }
} ,
} ,
memory _leak : {
memory _leak : {
id : "memory_leak" , name : "Memory Leak" , cost : 0 , type : "skill" , text : "Gain 1 Energy. Next turn -1 Energy." ,
id : "memory_leak" , name : "Memory Leak" , cost : 0 , type : "skill" , text : "Gain 1 Energy. Next turn -1 Energy." ,
art : "Monk_23.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . player . energy += 1 ;
ctx . player . energy += 1 ;
ctx . flags . nextTurnEnergyPenalty = ( ctx . flags . nextTurnEnergyPenalty || 0 ) + 1 ;
ctx . flags . nextTurnEnergyPenalty = ( ctx . flags . nextTurnEnergyPenalty || 0 ) + 1 ;
@ -136,6 +156,7 @@ export const CARDS = {
code _review : {
code _review : {
id : "code_review" , name : "Code Review" , cost : 1 , type : "skill" , text : "Look at top 3 cards. Put 1 in hand, rest on bottom of deck." ,
id : "code_review" , name : "Code Review" , cost : 1 , type : "skill" , text : "Look at top 3 cards. Put 1 in hand, rest on bottom of deck." ,
art : "Monk_24.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . draw ( 1 ) ;
ctx . draw ( 1 ) ;
@ -145,11 +166,13 @@ export const CARDS = {
pair _programming : {
pair _programming : {
id : "pair_programming" , name : "Pair Programming" , cost : 2 , type : "skill" , text : "Double next card's effect." ,
id : "pair_programming" , name : "Pair Programming" , cost : 2 , type : "skill" , text : "Double next card's effect." ,
art : "Monk_25.png" ,
effect : ( ctx ) => ctx . flags . doubleNextCard = true
effect : ( ctx ) => ctx . flags . doubleNextCard = true
} ,
} ,
hotfix : {
hotfix : {
id : "hotfix" , name : "Hotfix" , cost : 2 , type : "attack" , text : "Deal 10. Can only be played if HP < 50%." ,
id : "hotfix" , name : "Hotfix" , cost : 2 , type : "attack" , text : "Deal 10. Can only be played if HP < 50%." ,
art : "Monk_15.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
if ( ctx . player . hp <= ctx . player . maxHp * 0.5 ) {
if ( ctx . player . hp <= ctx . player . maxHp * 0.5 ) {
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 10 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 10 ) ) ;
@ -161,6 +184,7 @@ export const CARDS = {
ligma : {
ligma : {
id : "ligma" , name : "Ligma" , cost : 0 , type : "skill" , text : "Unalive yourself with -69 hit points. Courtesy of Defysall." ,
id : "ligma" , name : "Ligma" , cost : 0 , type : "skill" , text : "Unalive yourself with -69 hit points. Courtesy of Defysall." ,
art : "Monk_26.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . player . hp = Math . max ( 0 , ctx . player . hp - 69 ) ;
ctx . player . hp = Math . max ( 0 , ctx . player . hp - 69 ) ;
ctx . draw ( 1 ) ;
ctx . draw ( 1 ) ;
@ -170,6 +194,7 @@ export const CARDS = {
merge _conflict : {
merge _conflict : {
id : "merge_conflict" , name : "Merge Conflict" , cost : 2 , type : "attack" , text : "Deal 6 damage twice." ,
id : "merge_conflict" , name : "Merge Conflict" , cost : 2 , type : "attack" , text : "Deal 6 damage twice." ,
art : "Monk_14.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 6 ) ) ;
@ -178,6 +203,7 @@ export const CARDS = {
virgin : {
virgin : {
id : "virgin" , name : "Virgin" , cost : 1 , type : "skill" , text : "If enemy intends to attack, gain 8 Block." ,
id : "virgin" , name : "Virgin" , cost : 1 , type : "skill" , text : "If enemy intends to attack, gain 8 Block." ,
art : "Monk_27.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
if ( ctx . intentIsAttack ( ) ) {
if ( ctx . intentIsAttack ( ) ) {
ctx . player . block += 8 ;
ctx . player . block += 8 ;
@ -188,6 +214,7 @@ export const CARDS = {
production _deploy : {
production _deploy : {
id : "production_deploy" , name : "Production Deploy" , cost : 2 , type : "attack" , text : "Deal 25. Lose 5 HP." ,
id : "production_deploy" , name : "Production Deploy" , cost : 2 , type : "attack" , text : "Deal 25. Lose 5 HP." ,
art : "Monk_16.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 25 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 25 ) ) ;
ctx . player . hp = Math . max ( 1 , ctx . player . hp - 5 ) ;
ctx . player . hp = Math . max ( 1 , ctx . player . hp - 5 ) ;
@ -198,6 +225,7 @@ export const CARDS = {
sugar _crash : {
sugar _crash : {
id : "sugar_crash" , name : "Sugar Crash" , cost : 1 , type : "curse" , text : "Unplayable. -1 Energy when drawn." ,
id : "sugar_crash" , name : "Sugar Crash" , cost : 1 , type : "curse" , text : "Unplayable. -1 Energy when drawn." ,
art : "Monk_28.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . player . energy = Math . max ( 0 , ctx . player . energy - 1 ) ;
ctx . player . energy = Math . max ( 0 , ctx . player . energy - 1 ) ;
ctx . log ( "The sugar crash hits hard, draining your energy!" ) ;
ctx . log ( "The sugar crash hits hard, draining your energy!" ) ;
@ -206,11 +234,13 @@ export const CARDS = {
stack _overflow : {
stack _overflow : {
id : "stack_overflow" , name : "Stack Overflow" , cost : 1 , type : "attack" , text : "Deal damage equal to cards in hand." ,
id : "stack_overflow" , name : "Stack Overflow" , cost : 1 , type : "attack" , text : "Deal damage equal to cards in hand." ,
art : "Monk_29.png" ,
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( ctx . player . hand . length ) )
effect : ( ctx ) => ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( ctx . player . hand . length ) )
} ,
} ,
ctrl _z : {
ctrl _z : {
id : "ctrl_z" , name : "Ctrl+Z" , cost : 1 , type : "skill" , text : "Return a random card from discard to hand." ,
id : "ctrl_z" , name : "Ctrl+Z" , cost : 1 , type : "skill" , text : "Return a random card from discard to hand." ,
art : "Monk_30.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
if ( ctx . player . discard . length > 0 ) {
if ( ctx . player . discard . length > 0 ) {
const randomId = ctx . player . discard [ Math . floor ( Math . random ( ) * ctx . player . discard . length ) ] ;
const randomId = ctx . player . discard [ Math . floor ( Math . random ( ) * ctx . player . discard . length ) ] ;
@ -227,6 +257,7 @@ export const CARDS = {
rubber _duck : {
rubber _duck : {
id : "rubber_duck" , name : "Rubber Duck Debug" , cost : 0 , type : "skill" , text : "Draw 1. Reveal enemy intent." ,
id : "rubber_duck" , name : "Rubber Duck Debug" , cost : 0 , type : "skill" , text : "Draw 1. Reveal enemy intent." ,
art : "Monk_31.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . draw ( 1 ) ;
ctx . draw ( 1 ) ;
const intent = ctx . enemy . intent ;
const intent = ctx . enemy . intent ;
@ -236,6 +267,7 @@ export const CARDS = {
infinite _loop : {
infinite _loop : {
id : "infinite_loop" , name : "Infinite Loop" , cost : 2 , type : "skill" , text : "Play the same card twice this turn. Exhaust." ,
id : "infinite_loop" , name : "Infinite Loop" , cost : 2 , type : "skill" , text : "Play the same card twice this turn. Exhaust." ,
art : "Monk_32.png" ,
exhaust : true ,
exhaust : true ,
effect : ( ctx ) => {
effect : ( ctx ) => {
if ( ctx . lastCard && ctx . lastCard !== "infinite_loop" ) {
if ( ctx . lastCard && ctx . lastCard !== "infinite_loop" ) {
@ -253,6 +285,7 @@ export const CARDS = {
npm _audit : {
npm _audit : {
id : "npm_audit" , name : "npm audit" , cost : 1 , type : "skill" , text : "Gain 3 Block per curse in deck." ,
id : "npm_audit" , name : "npm audit" , cost : 1 , type : "skill" , text : "Gain 3 Block per curse in deck." ,
art : "Monk_33.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
const curseCount = ctx . countCardType ( "curse" ) ;
const curseCount = ctx . countCardType ( "curse" ) ;
const blockGain = curseCount * 3 ;
const blockGain = curseCount * 3 ;
@ -263,6 +296,7 @@ export const CARDS = {
git _push _force : {
git _push _force : {
id : "git_push_force" , name : "git push --force" , cost : 0 , type : "attack" , text : "Deal 15. Put random card from hand on top of draw pile." ,
id : "git_push_force" , name : "git push --force" , cost : 0 , type : "attack" , text : "Deal 15. Put random card from hand on top of draw pile." ,
art : "Monk_34.png" ,
effect : ( ctx ) => {
effect : ( ctx ) => {
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 15 ) ) ;
ctx . deal ( ctx . enemy , ctx . scalarFromWeak ( 15 ) ) ;
if ( ctx . player . hand . length > 1 ) { // Don't remove this card itself
if ( ctx . player . hand . length > 1 ) { // Don't remove this card itself
@ -277,13 +311,34 @@ export const CARDS = {
}
}
}
}
} ,
} ,
stack _trace : {
id : "stack_trace" , name : "Stack Trace" , cost : 1 , type : "skill" , text : "Heal 5 HP." ,
art : "Monk_35.png" ,
effect : ( ctx ) => {
const healAmount = 5 ;
ctx . player . hp = Math . min ( ctx . player . maxHp , ctx . player . hp + healAmount ) ;
ctx . log ( ` Stack trace reveals the bug! Heal ${ healAmount } HP. ` ) ;
}
} ,
refactor : {
id : "refactor" , name : "Refactor" , cost : 2 , type : "skill" , text : "Heal 8 HP. Draw 1 card." ,
art : "Monk_36.png" ,
effect : ( ctx ) => {
const healAmount = 8 ;
ctx . player . hp = Math . min ( ctx . player . maxHp , ctx . player . hp + healAmount ) ;
ctx . draw ( 1 ) ;
ctx . log ( ` Clean code heals the soul! Heal ${ healAmount } HP and draw 1. ` ) ;
}
} ,
} ;
} ;
export const STARTER _DECK = [
export const STARTER _DECK = [
"strike" , "strike" , "defend" , "defend" ,
"strike" , "strike" , "defend" , "defend" ,
"segfault" , "coffee_rush" , "skill_issue" , "git_commit" ,
"segfault" , "coffee_rush" , "skill_issue" , "git_commit" ,
"ligma" , "raw_dog"
"stack_trace " , "raw_dog"
] ;
] ;
export const CARD _POOL = [
export const CARD _POOL = [
@ -292,5 +347,5 @@ export const CARD_POOL = [
"raw_dog" , "task_failed_successfully" , "recursion" , "git_commit" , "memory_leak" ,
"raw_dog" , "task_failed_successfully" , "recursion" , "git_commit" , "memory_leak" ,
"code_review" , "pair_programming" , "hotfix" , "ligma" , "merge_conflict" ,
"code_review" , "pair_programming" , "hotfix" , "ligma" , "merge_conflict" ,
"virgin" , "production_deploy" , "stack_overflow" , "ctrl_z" , "rubber_duck" ,
"virgin" , "production_deploy" , "stack_overflow" , "ctrl_z" , "rubber_duck" ,
"infinite_loop" , "npm_audit" , "git_push_force"
"infinite_loop" , "npm_audit" , "git_push_force" , "stack_trace" , "refactor"
] ;
] ;