diff --git a/w5/codes/dsh_cli.c b/w5/codes/dsh_cli.c
new file mode 100644
index 0000000000000000000000000000000000000000..c8b0c8e8e84e889f4145db1d0555db6483dd912b
--- /dev/null
+++ b/w5/codes/dsh_cli.c
@@ -0,0 +1,108 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dshlib.h"
+
+/*
+ * Implement your main function by building a loop that prompts the
+ * user for input.  Use the SH_PROMPT constant from dshlib.h and then
+ * use fgets to accept user input.  Since we want fgets to also handle
+ * end of file so we can run this headless for testing we need to check
+ * the return code of fgets.  I have provided an example below of how
+ * to do this assuming you are storing user input inside of the cmd_buff
+ * variable.
+ *
+ *      while(1){
+ *        printf("%s", SH_PROMPT);
+ *        if (fgets(cmd_buff, ARG_MAX, stdin) == NULL){
+ *           printf("\n");
+ *           break;
+ *        }
+ *        //remove the trailing \n from cmd_buff
+ *        cmd_buff[strcspn(cmd_buff,"\n")] = '\0';
+ *
+ *        //IMPLEMENT THE REST OF THE REQUIREMENTS
+ *      }
+ *
+ *   Also, use the constants in the dshlib.h in this code.
+ *      SH_CMD_MAX              maximum buffer size for user input
+ *      EXIT_CMD                constant that terminates the dsh program
+ *      SH_PROMPT               the shell prompt
+ *      OK                      the command was parsed properly
+ *      WARN_NO_CMDS            the user command was empty
+ *      ERR_TOO_MANY_COMMANDS   too many pipes used
+ *
+ *   Expected output:
+ *
+ *      CMD_OK_HEADER      if the command parses properly. You will
+ *                         follow this by the command details
+ *
+ *      CMD_WARN_NO_CMD    if the user entered a blank command
+ *      CMD_ERR_PIPE_LIMIT if the user entered too many commands using
+ *                         the pipe feature, e.g., cmd1 | cmd2 | ... |
+ *
+ *  See the provided test cases for output expectations.
+ */
+int main()
+{
+    char cmd_buff[SH_CMD_MAX]; // Buffer for user input
+    int rc = 0;
+    command_list_t clist;
+
+
+    while (1) {
+        // Display the shell prompt
+        printf("%s", SH_PROMPT);
+        fflush(stdout);  // Ensure prompt is displayed before user input
+
+        // Read input from user
+        if (fgets(cmd_buff, SH_CMD_MAX, stdin) == NULL) {
+            printf("\n"); // Handle EOF
+            //rc = 0;
+            break;
+        }
+
+        // Remove trailing newline character
+        cmd_buff[strcspn(cmd_buff, "\n")] = '\0';
+
+        // Check for empty input
+        if (strlen(cmd_buff) == 0) {
+            printf(CMD_WARN_NO_CMD);
+            continue;
+        }
+
+        // Exit command handling
+        if (strcmp(cmd_buff, EXIT_CMD) == 0) {
+            break;
+        }
+
+        // Parse the input into command list
+        rc = build_cmd_list(cmd_buff, &clist);
+
+        // Handle possible errors
+        if (rc == WARN_NO_CMDS) {
+            printf(CMD_WARN_NO_CMD);
+            rc =0; // Reset error code 
+        } else if (rc == ERR_TOO_MANY_COMMANDS) {
+            printf(CMD_ERR_PIPE_LIMIT, CMD_MAX);
+            rc =0; // Reset error code 
+        } else {
+            // Print parsed output
+            printf(CMD_OK_HEADER, clist.num);
+            for (int i = 0; i < clist.num; i++) {
+                if (strlen(clist.commands[i].args) > 0) {
+                    printf("<%d>%s[%s]\n", i + 1, clist.commands[i].exe, clist.commands[i].args);
+                } else {
+                    printf("<%d>%s\n", i + 1, clist.commands[i].exe);
+                }
+            }
+        }
+    }
+
+    return 0;
+
+
+    //printf(M_NOT_IMPL);
+    //exit(EXIT_NOT_IMPL);
+}
\ No newline at end of file