anchor.diff:  
   (defun rc-file (user-directory)
     (merge-pathnames #p"rc.lisp" user-directory))
  +
  +(defun software-file (user-directory)
  +  (merge-pathnames #p"etc/software.lisp" user-directory))
  +
  +(defun dependencies-file (user-directory)
  +  (merge-pathnames #p"etc/dependencies.lisp" user-directory))
  +
  +(defun read-software-list (user-directory)
  +  (with-open-file (in (software-file user-directory)
  +                      :direction :input
  +                      :if-does-not-exist nil)
  +    (when in
  +      (with-standard-io-syntax
  +        (read in)))))
  +
  +(defun dump-software-list (software user-directory)
  +  (with-open-file (out (ensure-directories-exist (software-file user-directory))
  +                       :direction :output
  +                       :if-exists :supersede)
  +    (with-standard-io-syntax
  +      (print software out))))
  +
  +(defun software-dependencies (software)
  +  (multiple-value-bind (explicit implicit) (loop :for s :in software
  +                                                 :append (rest (assoc :depends-on s)) :into explicit
  +                                                 :append (loop :for d :in (rest (assoc :depends-on s))
  +                                                               :append (asdf:system-depends-on (asdf:find-system d))) :into implicit
  +                                                 :finally (return (values explicit implicit)))
  +    (remove-duplicates (set-difference explicit implicit :test #'equal) :test #'equal)))
  +
  +(defun read-dependencies (user-directory)
  +  (with-open-file (in (dependencies-file user-directory)
  +                      :direction :input
  +                      :if-does-not-exist nil)
  +    (when in
  +      (with-standard-io-syntax
  +        (read in)))))
  +
  +(defun dump-dependencies (list user-directory)
  +  (with-open-file (out (ensure-directories-exist (dependencies-file user-directory))
  +                       :direction :output
  +                       :if-exists :supersede)
  +    (with-standard-io-syntax
  +      (write-line "#+(or)  \"This file has been automatically generated.\"" out)
  +      (print list out))))
   
   (defun script-function (function)
     (lambda (args
  
positive.code:                      :if-exists :supersede)
      (with-standard-io-syntax
        (format o "#!/bin/sh
  lispctl eval ~A `pwd` \"$0\" \"$@\"
  "
                (uiop/run-program:escape-sh-token (write-to-string form)))))
    (uiop/run-program:run-program `("chmod" "+x" ,name)))
  
  (defun install (name &optional (bindir *default-bindir*))
    (unless (probe-file name)
      (error "File ~A does not exist." name))
    (let ((target (merge-pathnames name bindir)))
      (ensure-directories-exist target)
      (uiop/filesystem:rename-file-overwriting-target name target)))
  
negative.code:                     (error "Server ~A does not exist." name))))
      (stop-server server)))
  
  (defun make (name &key
                    (entry (intern "MAIN" (find-package (string-upcase name))))
                    (form `(funcall ',entry uiop:*command-line-arguments*)))
    (with-open-file (o name
                       :direction :output
  