Hey Freelancer, good to see you still at it

You have a bracket missing @ line 10-11 and an extra one @ line 15-16.
It's cool to use some global variables like this to keep track of important things in a script, but I'm not sure about making a whole script out of it. It's going to slow down mirc's reaction time if you add too many. Also there is an issue with using one variable (%commands) to keep track of the commands. Up until the latest releases of mirc, the variable length has been just over 900 characters. So, after you exceed that you would just get a, /set line too long, error. The new mirc will hold over 4000. Weeeeeeeeee. You will still eventually run out of variable even with 4000 though. You really need to look into hashtables

Awesome job, with a very limited command set. Very creative

I would have did it something like this
on *:TEXT:!*:#: {
if ($nick isop $chan) {
if ($1 == !add) {
if (!%command_ [ $+ [ $2 ] ] ) {
set %commands %commands $2
set %command_ $+ $2 $3-
.notice $nick Command added successfully.
}
else { .notice $nick $2 already exists as [ %command_ [ $+ [ $2 ] ] ] $+ . You must first !remove $2 $+ . }
}
}
if ($1 == !append) {
if (%command_ [ $+ [ $2 ] ] ) {
set %command_ $+ $2 [ %command_ [ $+ [ $2 ] ] ] $3-
.notice $nick Command appended successfully.
}
else { .notice $nick Can't append $2 $+ . It doesn't exist. Try !add !triggername some text here }
}
if ($1 == !remove) {
if (%command_ [ $+ [ $2 ] ] ) {
set %commands $remove(%commands,$2)
unset %command_ $+ $2
.notice $nick Command deleted successfully.
}
else { .notice $nick Can't remove $2 $+ . $2 doesn't exist! }
}
;You didn't make any changes to %commands in !del so this will get an error on deleted records
if ($1 isin %commands) {
.notice $nick %command_ [ $+ [ $1 ] ]
}
}
You didn't need all the %tem variables and I added some error lines and a line to remove the command from %commands, when you do !del. Which I renamed to !remove
