For the mulligan it's pretty obvious. There is either the unconditioned rule: Card;YourClass;EnemyClass;Hold/Discard:Amount;/ and the conditioned rule: Card;YourClass;EnemyClass;Hold:Amount;/ConditionCard
The latter rule holds a certain card if there is the condition card in your hand.
The combo is pretty complicated: ComboCardOne,Penalty;ComboCardTwo,Penalty;bonus:ScoreIfComboCompleted;hero:YourClass
Before each turn the bot calculates the best board by evaluating a score for possible boards. So if it performs a combo from the _combo.txt the bonus score provided in your combo is added on the board score. The penalties are negative scores which are applied if one card from the combo isn't there.
Please keep in mind that these explanations are based on my testing and not guaranteed to be 100% correct.